{"id":17172094,"url":"https://github.com/lieryan/vim-jumpsuite","last_synced_at":"2025-04-13T16:11:36.309Z","repository":{"id":148139081,"uuid":"248798912","full_name":"lieryan/vim-jumpsuite","owner":"lieryan","description":"Jump to \"interesting\" line of code from your test suite.","archived":false,"fork":false,"pushed_at":"2024-03-08T12:30:38.000Z","size":85,"stargazers_count":6,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-27T07:03:41.918Z","etag":null,"topics":["pytest","quickfix","unittest","unittest-xml-reporting","vim"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lieryan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2020-03-20T16:12:30.000Z","updated_at":"2024-11-13T00:36:19.000Z","dependencies_parsed_at":"2023-05-19T07:19:14.523Z","dependency_job_id":null,"html_url":"https://github.com/lieryan/vim-jumpsuite","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lieryan%2Fvim-jumpsuite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lieryan%2Fvim-jumpsuite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lieryan%2Fvim-jumpsuite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lieryan%2Fvim-jumpsuite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lieryan","download_url":"https://codeload.github.com/lieryan/vim-jumpsuite/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248741199,"owners_count":21154255,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pytest","quickfix","unittest","unittest-xml-reporting","vim"],"created_at":"2024-10-14T23:36:06.462Z","updated_at":"2025-04-13T16:11:36.288Z","avatar_url":"https://github.com/lieryan.png","language":"Python","readme":"# vim-jumpsuite\n\nJump to \"interesting\" line of code from your test suite.\n\njumpsuite parses tracebacks from a JUnit-style XML unittest reports generated\nby [unittest-xml-reporting](https://pypi.org/project/unittest-xml-reporting/)\nor [pytest](https://github.com/xmlrunner/unittest-xml-reporting), and picks a\nfew of the \"most interesting\" line for each failing test to populate the\nquickfix list with locations that you will most likely need to go to while\nfixing the test.\n\n\nFor example, jumpsuite will turn [this long and tedious traceback](jumpsuite/tests/10.xml):\n    \n    Traceback (most recent call last):\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/backends/utils.py\", line 86, in _execute\n        return self.cursor.execute(sql, params)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py\", line 396, in execute\n        return Database.Cursor.execute(self, query, params)\n    sqlite3.IntegrityError: CHECK constraint failed: comments_rating\n    \n    The above exception was the direct cause of the following exception:\n    \n    Traceback (most recent call last):\n      File \"/home/user/Projects/myapp/myapp/comments/tests.py\", line 8, in test_adding_comment\n        resp1 = self.client.post('/comment/', {'text': 'hello world'})\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/test/client.py\", line 526, in post\n        response = super().post(path, data=data, content_type=content_type, secure=secure, **extra)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/test/client.py\", line 356, in post\n        secure=secure, **extra)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/test/client.py\", line 421, in generic\n        return self.request(**r)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/test/client.py\", line 496, in request\n        raise exc_value\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/core/handlers/exception.py\", line 34, in inner\n        response = get_response(request)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/core/handlers/base.py\", line 115, in _get_response\n        response = self.process_exception_by_middleware(e, request)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/core/handlers/base.py\", line 113, in _get_response\n        response = wrapped_callback(request, *callback_args, **callback_kwargs)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/views/generic/base.py\", line 71, in view\n        return self.dispatch(request, *args, **kwargs)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/views/generic/base.py\", line 97, in dispatch\n        return handler(request, *args, **kwargs)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/views/generic/edit.py\", line 172, in post\n        return super().post(request, *args, **kwargs)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/views/generic/edit.py\", line 142, in post\n        return self.form_valid(form)\n      File \"/home/user/Projects/myapp/myapp/comments/views.py\", line 14, in form_valid\n        obj.save_rating()\n      File \"/home/user/Projects/myapp/myapp/comments/models.py\", line 12, in save_rating\n        return Rating.objects.calculate_rating(self)\n      File \"/home/user/Projects/myapp/myapp/comments/models.py\", line 17, in calculate_rating\n        return Rating.objects.create(value=len(comment.text) - 100)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/models/manager.py\", line 82, in manager_method\n        return getattr(self.get_queryset(), name)(*args, **kwargs)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/models/query.py\", line 433, in create\n        obj.save(force_insert=True, using=self.db)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/models/base.py\", line 746, in save\n        force_update=force_update, update_fields=update_fields)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/models/base.py\", line 784, in save_base\n        force_update, using, update_fields,\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/models/base.py\", line 887, in _save_table\n        results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/models/base.py\", line 926, in _do_insert\n        using=using, raw=raw,\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/models/manager.py\", line 82, in manager_method\n        return getattr(self.get_queryset(), name)(*args, **kwargs)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/models/query.py\", line 1204, in _insert\n        return query.get_compiler(using=using).execute_sql(returning_fields)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/models/sql/compiler.py\", line 1391, in execute_sql\n        cursor.execute(sql, params)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/backends/utils.py\", line 68, in execute\n        return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/backends/utils.py\", line 77, in _execute_with_wrappers\n        return executor(sql, params, many, context)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/backends/utils.py\", line 86, in _execute\n        return self.cursor.execute(sql, params)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/utils.py\", line 90, in __exit__\n        raise dj_exc_value.with_traceback(traceback) from exc_value\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/backends/utils.py\", line 86, in _execute\n        return self.cursor.execute(sql, params)\n      File \"/home/user/.virtualenvs/myenv/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py\", line 396, in execute\n        return Database.Cursor.execute(self, query, params)\n    django.db.utils.IntegrityError: CHECK constraint failed: comments_rating\n\n\ninto this quickfix jumplist:\n\n    FAILED. Ran 1 tests in 0.028s (errors=1, failures=0, skipped=0)\n    /home/user/Projects/myapp/myapp/comments/tests.py:8: test_adding_comment : django.db.utils.IntegrityError: CHECK constraint failed: comments_rating : resp1 = self.client.post('/comment/', {'text': 'hello world'})\n    /home/user/Projects/myapp/myapp/comments/views.py:14:`-  form_valid :  : obj.save_rating()\n    /home/user/Projects/myapp/myapp/comments/models.py:17:`-  calculate_rating :  : return Rating.objects.create(value=len(comment.text) - 100)\n\n\n# Installation\n\n## As vim plugin\n\nInstall this repository with your favorite plugin manager.\n\nYou have available a command:\n\n    :JumpSuite path/to/junit-xml-report.xml\n\nIf XML filename is not provided, it'll use `g:jumpsuite_filename`.\n\nYou can map that command to your preferred key mapping.\n\nThis plugin will also set makeprg, so if you have vim-dispatch, you can just\nrun `m\u003cEnter\u003e`.\n\n\n## Manual integration\n\nSet `'makeprg'` so you can run with `:make`/`:lmake`, or if you have\nvim-dispatch, with `m\u003cEnter\u003e`\n\n    set makeprg=python\\ /path/to/jumpsuite.py\\ /path/to/test-report.xml\n\nOr configure a mapping like so: \n\n    nnoremap \u003cLeader\u003ejs :cexpr system('python jumpsuite.py')\\|copen\u003cEnter\u003e\n\nYou can also use locationlist:\n\n    nnoremap \u003cLeader\u003ejs :lexpr system('python jumpsuite.py')\\|lopen\u003cEnter\u003e\n\n\n# Configuring your project\n\n\n## unittest\n\nInstall dependency:\n\n    pip install unittest-xml-reporting\n\nRun xmlrunner, for example, from CLI:\n\n    python -m xmlrunner discover --output-file test-report.xml\n    \nFor more configuration options, see unittest-xml-reporting.\n\n\n## pytest\n\npytest has native support for XML report, no need to install additional dependency.\nCurrently, we don't support parsing pytest-style traceback, you have to use\nnative-style traceback by passing `--tb=native`.\n\nRun pytest with flags:\n\n    pytest --junitxml=test-report.xml --tb=native\n\nOr make it permanent by adding in your pytest.ini\n\n    [pytest]\n    addopts=--junitxml=test-report.xml --tb=native\n\n\n## Django \n\nInstall dependency:\n\n     pip install unittest-xml-reporting\n\nAdd to your settings.py:\n\n    TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner'\n    TEST_OUTPUT_DIR = os.path.join(BASE_DIR, 'test-reports')\n    TEST_OUTPUT_FILE_NAME = 'test-report.xml'\n\n\n# Configuring what jumpsuite filters out\n\nThere is a config file to fine tune the traceback lines that vim-jumpsuite \nfilters out from the summarized quickfix list. You can use shell/glob pattern\nto specify a pattern of file names or function names that jumpsuite should\nskip when finding files to jump to. The config file is in:\n\n    ~/.config/jumpsuite/exclude\n\nExample exclude file:\n\n    dont_care_about_this_file.py\n    or_this_file.py\n\n    lib/functions.py\n       validate\n       prevent\n\n    myapp/*.py\n        # some comment\n        some_function_to_ignore\n        another_function\n\n    *\n        validate_*\n\nBy default, jumpsuite already ignores a number of files that you are unlikely\nto be interested to jump to such as third party libraries installed in\nsite-package.\n\n# Troubleshooting\n\n 1. I use pytest, why is traceback is not parsed correctly?\n\n    Make sure you use --tb=native traceback format, this script does not support\n    parsing pytest default traceback format.\n\n 2. Why is the quickfix list not jumpable?\n\n    Check your 'errorformat', reset them to default or add the pattern we depend\n    on: \n\n        set errorformat+=%f:%l:%m\n        set errorformat+=%f:%l:%c:%m\n\n\n# TODO and BUGS\n\n1. 'g:jumpsuite_filename' cannot be changed interactively, currently it must be\n   set from .vimrc before the plugin is loaded\n2. More languages?\n3. More tests. There is some tests, but it's a shame that a plugin to make\n   unittest easier doesn't have extensive test coverage.\n4. Write vim docs\n5. Add ways to disable setting global settings like makeprg.\n6. We should have an option to auto-open jumpsuite when vim-test finished\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flieryan%2Fvim-jumpsuite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flieryan%2Fvim-jumpsuite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flieryan%2Fvim-jumpsuite/lists"}