196 Commits

Author SHA1 Message Date
Dave Halter
338af171ea Merge pull request #1112 from jgb/master
update jedi to v0.19.0
2023-07-31 22:39:54 +00:00
Jan Geboers
c0c01ede07 update jedi to v0.19.0 2023-07-31 10:12:14 +02:00
Dave Halter
42c2af1812 Merge pull request #1106 from jgb/master
update jedi to v0.18.2
2023-04-11 15:55:50 +00:00
Jan Geboers
1198e4cfa3 update jedi to v0.18.2 2023-04-11 10:27:08 +02:00
Dave Halter
c5d5d2e3b4 Merge pull request #1105 from hawkins/patch-1
Remove mention of Python 2.7 support in installation instructions
2023-04-10 21:25:51 +00:00
Josh Hawkins
0d245f3287 Remove mention of Python 2.7 support in installation instructions 2023-04-10 14:13:51 -04:00
Dave Halter
be483a2dcb Merge pull request #1097 from jamescherti/rename-that-do-not-delete-word
Add a keyboard mapping to rename  variables/functions/classes without deleting the word under the cursor
2022-12-28 19:46:41 +00:00
James Cherti
f286f9e4b6 Key mapping <Leader>R: Rename vars/functions/classes without deleting the word under the cursor
This pull request also adds the support for 'set selection=exclusive' to
the function 'rename_visual()' (bug fix).

'<Leader>R' in Normal mode:
---------------------------
Jedi-vim keeps the word under the cursor, moves the cursor to the end of the
word, and puts Vim in insert mode, where the user is expected to enter the
new variable name.

'<Leader>R' in Visual mode:
---------------------------
Use the selected text as the default answer to the prompt.
2022-12-26 13:43:42 -05:00
Dave Halter
e073385976 Merge pull request #1088 from Jakuje/patch-1
Update link to Fedora package
2022-12-24 23:40:23 +00:00
Dave Halter
6b8013c480 Merge pull request #1095 from Konfekt/popup
fix typo
2022-11-23 09:11:09 +00:00
Konfekt
c381156dd4 fix typo 2022-11-23 08:23:42 +01:00
Dave Halter
28a6765ecc Merge pull request #1093 from Konfekt/popup
prefer popup over preview window
2022-11-21 22:50:46 +00:00
Konfekt
df261c0a3e remove slash to pass check for code quality 2022-11-12 10:32:44 +01:00
Konfekt
40c7f6d09d split code line to pass check for line length 2022-11-11 10:29:45 +01:00
Konfekt
8c7161f4e9 prefer popup over preview window 2022-11-10 15:55:13 +01:00
Jakub Jelen
27db7160a5 Update link to Fedora packages 2022-05-30 20:27:13 +02:00
Dave Halter
e82d07faa1 Merge pull request #1082 from jamescherti/buffer_jedi_added_sys_path
Add the buffer-local option 'b:jedi_added_sys_path'
2022-04-08 15:07:48 +02:00
James Cherti
50dfac448a Add 'g:jedi#added_sys_path' and 'b:jedi_added_sys_path' to the cache (cache_key). 2022-04-05 15:59:09 -04:00
James Cherti
0a27795d76 Add the buffer-local option 'b:jedi_added_sys_path' (to add additional sys_path). 2022-04-05 13:04:19 -04:00
Dave Halter
32d05f7742 Merge pull request #1076 from jamescherti/case-insensitive
Add option to enable/disable case insensitive completion
2022-01-30 12:33:41 +01:00
James Cherti
873ee9325d Add an option to enable/disable case insensitive completion.
Options:
- Global option: g:jedi#case_insensitive_completion
- Buffer-local option: b:jedi_case_insensitive_completion

Values:
- 0 to disable case insensitive completion.
- 1 to enable case insensitive completion (default).
2022-01-29 17:54:33 -05:00
Dave Halter
08ad42efed Merge pull request #1074 from blueyed/bump-parso
Update parso submodule to 0.8.3 (from 0.8.2)
2022-01-17 19:26:34 +01:00
Dave Halter
f5aad68bec Merge pull request #1073 from blueyed/fixup-1059
get_project: simplify getting b:jedi_environment_path override
2022-01-17 19:22:23 +01:00
Daniel Hahler
2c99d7377f Update submodule pythonx/parso 5edab04...ee5edaf
* pythonx/parso 5edab04...ee5edaf (13):
      > Prepare Release 0.8.3
      > Add a Python 3.12 grammar, because that is probably going to be needed in a year from now
      > Merge pull request #199 from sobolevn/patch-1
      > Merge pull request #195 from sturmianseq/fix
      > Jedi still has an import dependency on search_ancestor
      > Merge pull request #194 from mgorny/python310
      > Merge pull request #188 from davidhalter/line-ending
      > Fix flaky test_cache_last_used_update again (#189)
      > Add `NodeOrLeaf.dump()` and `NodeOrLeaf.search_ancestor()` (#187)
      > Add a grammar for Python 3.11 (just copied 3.10), so the core devs can work with it
      > Relax a test regex to match new enum repr in Python 3.10.0a7+ (#186)
      > Merge pull request #185 from davidhalter/switch-to-github-actions
      > Merge pull request #184 from davidhalter/remove-nocond-39
2022-01-17 17:21:36 +01:00
Daniel Hahler
7d2fc14f4f get_project: simplify getting b:jedi_environment_path override
- the common case is having an exception here (with no buffer setting),
  which results in the exception handler always
- vim_eval has overhead, especially with Neovim, so the less calls the
  better

This patch changes it to query the `b:` dict, using the (always
set/initialized) global setting as the default.
2022-01-17 14:56:29 +01:00
Dave Halter
e1afc904e4 Merge pull request #1072 from ThomasBlauth/default_setting
Fix added_sys_path default setting
2022-01-17 09:23:57 +01:00
Thomas Blauth
64c92771be Fix added_sys_path default setting
This commit removes the inner string quotation of the default value for the
added_sys_path setting. The inner quotes cause the value of the resulting
variable g:jedi#added_sys_path to be the sting "[]" instead of an empty list.
2022-01-17 08:40:54 +01:00
Dave Halter
030211555d Merge pull request #1068 from jgb/master
Update jedi to v0.18.1 and parso to v0.8.2
2021-11-17 22:33:56 +01:00
Jan Geboers
ab2550ef29 Update jedi to v0.18.1 and parso to v0.8.2 2021-11-17 15:45:26 +01:00
Volodymyr Kozachynskyi
7ac81cb880 doc: Add hint about python 2 support (#1060)
* doc: Add hint about python 2 support

* Update README.rst

Co-authored-by: Dave Halter <davidhalter88@gmail.com>
2021-06-22 22:45:23 +02:00
Dave Halter
6812ce11b7 Merge pull request #1059 from jamescherti/buffer_jedi_environment_path
The buffer-local variable `b:jedi_environment_path`
2021-06-22 21:34:08 +02:00
James Cherti
81002ed6e7 This commit fixes the exception: jedi_vim.VimError: Vim(let):E121: Undefined variable: b:jedi_environment_path; created by 'b:jedi_environment_path' 2021-06-22 13:42:11 -04:00
James Cherti
81e1e9ca34 The buffer-local variable b:jedi_environment_path was added to override the global variable g:jedi#environment_path. 2021-06-21 14:58:57 -04:00
Dave Halter
8763462331 Merge pull request #1049 from SeungChan92/master
Add missing item in manual index
2021-03-17 23:32:13 +01:00
Seung-Chan Ahn
760120240f Add missing item in manual index 2021-03-17 09:59:43 +09:00
Dave Halter
6e6738758f Merge pull request #1048 from SeungChan92/master
Support adding extra sys_path
2021-03-16 23:38:49 +01:00
Seung-Chan Ahn
ff9a0afbda Support adding extra sys_path 2021-03-15 14:36:20 +09:00
Dave Halter
088469a8ee Merge pull request #1045 from Konstantin-Glukhov/master
Use helper function relpath() instead of os.path.relpath()
2021-02-26 11:18:52 +01:00
Konstantin-Glukhov
8730095b89 Use helper function relpath() instead of os.path.relpath() to address
issue #1044 ("path is on mount %r, start on mount %r" exception thrown
on Windows if Python and jedi-vim are installed on different drives)
2021-02-16 04:25:02 +09:00
Dave Halter
5d4615707f Fix a refactoring error, fixes #1041 2021-01-30 15:38:01 +01:00
Dave Halter
960eaa8053 Typo
Co-authored-by: Daniel Hahler <git@thequod.de>
2021-01-03 03:06:44 +01:00
Dave Halter
acd9182131 Fix some comments in signature test 2021-01-03 03:06:44 +01:00
Dave Halter
04c708cbfc Useful examples for environment_path 2021-01-03 03:06:44 +01:00
Dave Halter
91312f1755 Run CI on pull requests 2021-01-03 03:06:44 +01:00
Dave Halter
e02fa9dc10 Upgrade Jedi to 8ef2ce232cebf6f30b41b28b2677d84666a97d55 2021-01-03 03:06:44 +01:00
Dave Halter
d7be014c54 Namespaces cannot be shown properly, fixes #815
This only works with Jedi commit 2ec3d72151d1072fa22861aef07ba6fc170e3781
Once using that commit, namespaces will be used properly.
2021-01-02 12:15:25 +01:00
Dave Halter
e96eba9f53 Use relative paths when accessing a buffer 2021-01-02 04:05:46 +01:00
Dave Halter
e4daf7a74c Fix a test around signatures that was failing sometimes 2021-01-02 04:05:24 +01:00
Dave Halter
3a1c900a26 Remove Python 2 stuff 2020-12-27 00:44:17 +01:00
Dave Halter
57757bd334 Merge pull request #1025 from davidhalter/jedi-api
Use the new Jedi API
2020-12-26 23:47:32 +01:00
Dave Halter
ea52ca5305 Try to use GitHub Actions 2020-12-26 23:38:46 +01:00
Dave Halter
04ba9a2430 A small fix 2020-12-25 17:44:22 +01:00
Dave Halter
dc0fdc55cb Updated jedi and parso 2020-12-25 12:45:23 +01:00
Dave Halter
a76965238a Fix the project choice 2020-10-23 17:45:40 +02:00
Dave Halter
6193c9fd95 Remove the Python 2 support
It should mostly still work (except for :Pyimport), but it won't pass all the tests anymore.
Since I'm dropping Python 2 in Jedi anyways, it makes sense to also remove it here.
2020-08-04 15:22:38 +02:00
Dave Halter
acbb712906 Try and update the CI from Ubuntu 16.04 to 18.04 2020-08-04 15:11:30 +02:00
Dave Halter
48b3e5c0e7 In older versions of VIM bufname needs an argument 2020-08-04 15:07:39 +02:00
Dave Halter
74fd73d017 Added an undocumented JediLoadProject for now 2020-08-01 13:32:48 +02:00
Dave Halter
6efd966481 Remove multi definition tests that are not really working anymore because of changes in Jedi 2020-08-01 12:01:54 +02:00
Dave Halter
862fbbc8a9 Add a choose-venv test 2020-08-01 11:16:57 +02:00
Dave Halter
87abaf0781 Fix goto issues 2020-08-01 00:30:54 +02:00
Dave Halter
01e6e6bcf7 Fix debug info 2020-08-01 00:15:46 +02:00
Dave Halter
2c157e323e Fix documentation tests 2020-08-01 00:12:24 +02:00
Dave Halter
6edda9063a Make choose environment buffer disappear if it's not visible anymore 2020-07-31 20:25:12 +02:00
Dave Halter
e23687462b Implement :JediChooseEnvironment 2020-07-31 15:06:09 +02:00
Dave Halter
104d817f0c environment_path needs to be defined properly 2020-07-30 18:37:27 +02:00
Dave Halter
2949389be4 Describe the environment_path option properly 2020-07-30 18:16:35 +02:00
Dave Halter
c4fc2cde8c Use projects instead of environments 2020-07-30 15:45:12 +02:00
Dave Halter
5858a999de Unify Pyimport and goto 2020-07-30 14:36:40 +02:00
Dave Halter
1e9bdc863a definition -> name, because Jedi calls it name now 2020-07-30 14:18:33 +02:00
Dave Halter
3a27747773 Use the project.search function 2020-07-30 14:00:16 +02:00
Dave Halter
4ca918e830 Use the new API instead of the deprecated one 2020-07-30 13:47:53 +02:00
Daniel Hahler
a17b033303 Update Jedi to v0.17.2 (#1023)
* pythonx/jedi 3ad3dc08...3b7106ae (203):
      > Fix a typo
      > Prepare for 0.17.2
      > Fix a Python 3.9 issue on travis
      > Properly negate with Interpreter, fixes #1636
      > Fix issues with generators, fixes #1624
      > Introduce py__next__ to have more clear way to use __next__
      > Merge pull request #1633 from mrclary/mrclary-fix-wingkinl-patch-python-environ
      > Fix dict completions for inherited dicts, fixes #1631
      > Refactor Interpeter completions a bit
      > Make sure the interpreter completions work better in Jupyter Notebook, fixes #1628
      > Fix an issue with interpreter completion, see also #1628
      > Making sure to note that Python 2 will not be supported after 0.17.2
      > Mention in Changelog that 3.9 is now supported
      > Add download badge
      > Some test skips
      > Revert some of the Decoratee changes
      > Some more signature adjustments
      > Change Decoratee slightly
      > Fix an issue with decoratee names
      > Add Project.path, fixes #1622
      > Fix the of a signature with a decorator
      > Fix docstrings for method decorators, fixes #1621
      > Make partial use the __doc__ of its function, fixes #1621
      > Merge pull request #1614 from PeterJCLaw/fix-decorator-factory-passthrough
      > Merge pull request #1623 from mallamanis/master
      > Remove a print
      > Typeshed third party libraries should not be loaded if they don't actually exist in the environment, fixes #1620
      > Add the env_vars change to CHANGELOG
      > Merge pull request #1619 from mrclary/subprocess-env-vars
      > Make sure that Callables are properly represented
      > Add Python 3.8 to the tox env list (#1618)
      > Use Python 3 in the deployment script
      > Prepare release 0.17.1
      > Make sure the current version doesn't install a parso version that is new
      > Small changelog improvement
      > Mention Django Manager support for managers/querysets in changelog
      > Add SyntaxError.get_message
      > Mention 3.9 support better
      > Fix decorator param completion
      > Merge branch 'django'
      > Merge branch 'master' of github.com:davidhalter/jedi
      > Fix some issues with sub class matching, fixes #1560
      > Better debugging output for is_sub_class_of
      > Ignore runtime_checkable, because we don't really need it
      > Fix a small extract_variable issue, fixes #1611
      > Try to get get the tests for Python 3.9 passing, fixes #1608
      > Make it possible to use inheritance on generics without always specifying type vars, see also discussion in #1593
      > Update MANIFEST.in
      > Make sure that scopes can only be exact values, see #1590
      > Merge pull request #1590 from muffinmad/references-scope
      > Fix a small issue with doctest completions, fixes #1585
      > Exclude more Linux constants in test_import
      > Merge pull request #1601 from yuan-xy/patch_3
      > Refactoring about checking \r\n (#1603)
      > fix typo (#1602)
      > fix typo
      > Merge pull request #1599 from isidentical/py38-plus-setuppy
      > Merge pull request #1595 from PeterJCLaw/operator-not-in
      > Import FileNotFoundError from jedi._compatibility
      > Merge pull request #1586 from PeterJCLaw/django-more-fields
      > Fix potential AttributeError in get_defintion_start_position/get_defintion_end_position, see #1584
      > Fix an error of get_definition_end_pos, see #1584
      > Refactor test_definition_start_end_position to use parametrize
      > definition_end_position -> get_definition_end_position, same for start, see #1584
      > Merge pull request #1584 from pappasam/get_definition_position
      > Fix tests in Python 2
      > Fix a small issue
      > Magic methods fixes for reverse methods
      > lists and tuples should not be added
      > Use __truediv__ instead of __div__
      > Fix an issue with Tuple generics
      > A few class renames
      > Better debugging
      > Skip another non-important Python 2 test that fails on Windows
      > Fix a namespace issue when getting references
      > Fix an about dict completions
      > Fix a None issue
      > Implement magic method return values, fixes #1577
      > Remove an unused cache method
      > Undefined api types should not return a random value
      > Add support for generic optional parameters (#1559)
      > Fix inline case where a name was removed without the code being used, fixes #1582
      > Make the diff nicer if there is no ending newline, fixes #1581
      > Merge pull request #1579 from muffinmad/pseudotreenameclass
      > Merge pull request #1572 from davidhalter/classvar
      > Reduce noise in signatures of compiled params (#1564)
      > Fix #1573 again; a tree_node can be None
      > Fix argument clinic unpacking, remove dynamic bullshit
      > This fixes two issues with the caching on Windows:
      > Fix getattr completions on very weird cases, fixes #1573
      > Fix tests
      > Remove the common folder and move it to a common file
      > Remove common.value
      > Move infer_type_vars to base_value
      > Merge pull request #1554 from PeterJCLaw/fix-nested-tuple-argument
      > Add .venv to _IGNORE_FOLDERS
      > Correct a test
      > Speed up signature fetching for MixedName, see discussion in #1422
      > Test that the actual signature of a function is used in Interpreter
      > Very small refactoring
      > Tell sith that goto_assignments is now goto
      > Merge pull request #1561 from PeterJCLaw/newtype-pyclass
      > Merge pull request #1553 from PeterJCLaw/generic-tuple-return
      > Allow files for get_default_project, fixes #1552
      > Don't display unnecessary help, fixes #1557
      > Pin Django in a different way so tests can work everywhere
      > Make sure that Django's values/values_list is tested (though not implemented
      > Properly implement inheritance for Django models
      > Make sure Django User inference works
      > Pin the Django test dependency
      > Mention django stubs support in README
      > Include Django stubs license in Jedi package
      > Some more django query tests
      > Infer many to many fields
      > Include Django stubs as a third party repo
      > Make sure that infering the Django User model works
      > Fix a recursion error issue
      > Remove unused imports
      > Fix typos in api.classes docstrings
      > Remove a redundant check from Name.desc_with_module
      > Actually fix #1556, forgot to add this in 94d374c9ceeb16ea1c6fe49b8e039d415c7dbe5a
      > Start changelog for 0.17.1
      > Fix a small issue with the help method, fixes #1556
      > Django is not supported for Python 2
      > Work with a NameWrapper, so Django goto works better
      > Fix another django modelfield issue
      > Some nitpicks
      > Fix another issue with foreign keys
      > Fix ForeignKey issues with invalid values
      > Some other small refactorings
      > Refactor a few things for django
      > Remove old third party django tests
      > Use debug instead of print for Django and fix indentation, see #1467
      > Make Django test optional
      > Merge branch 'master' of https://github.com/ANtlord/jedi
      > Better developer tools
      > Make the linter completely private
      > Make sure that calling Jedi with a random argument in CLI results in errors
      > Fix a small _get_annotated_class_object, fixes #1550
      > Also don't complete keywords if kwargs only are allowed, see #1541
      > Completion: Don't suggest variables when only kwargs are legal, fixes #1541
      > fix #1548
      > * Use an explicit environment for subprocess to ensure that existing environment variables are not inherited. This ensures more reliable results, see issue #1540. * Attempt to send SYSTEMROOT variable to Windows subprocess
      > Sort test_project::test_search results to fix failures
      > Inc difference limit in TestSetupReadline::test_import for py3.8
      > Project._python_path -> Project.environment_path
      > Set the release date in Changelog
      > Some README improvements
      > Extract now properly validates line/column and those two params are required
      > Some minor CHANGELOG changes
      > Upgrade parso version
      > Fix a small issue
      > Some more code quality fixes
      > Some code cleanups
      > Don't reuse a variable
      > Remove unreachable code
      > _convert_names kwargs are not needed
      > Add pyproject.toml to the list of files to search for projects
      > Use the interpreter environment if the executable is not available, fixes #1531
      > Fix a potential AttributeError
      > Add a comment to clarify the Type case
      > Avoid AttributeErrors for generics when a module is passed
      > Merge branch 'improve-type-annotation-inference-refactors' of https://github.com/PeterJCLaw/jedi
      > Merge branch 'improve-type-annotation-inference' of https://github.com/PeterJCLaw/jedi
      > If branch inference should not trigger for things we don't know, fixes #1530
      > Fix string completion issue, fixes #1528
      > Fix wrong types for iterate, fixes #1524
      > Fix stub conversion for Decoratee, so docstrings work, see #117
      > Remove unused environment param
      > Fix a Python 2 test
      > Merge branch 'refactor'
      > Merge branch 'project'
      > Included statement as a possible return type for BaseDefinition.type
      > Fix partialmethod issues
      > Make sure partialmethod tests are only executed for Python 3
      > Merge branch 'add-partialmethod' of https://github.com/ffe4/jedi
      > Merge branch 'expandtab' of https://github.com/Carreau/jedi
      > Changed semantics of ClassVar attributes in classes, fixes #1502
      > Avoid duplicate definitions for goto, fixes #1514
      > Merge _remove_statements and infer_expr_stmt, fixes #1504
      > Fix namedtuple docstring/signature issues, fixes #1506
      > Fix a getattr_static issue, fixes #1517
      > Disable some more tests for Python 2
      > Make InterpreterEnvironment public
      > is_typeddict should be part of ClassMixin
      > Don't continue searching for values if an annotation is found
      > TypedDict checking should be at a later point
      > Simplify tests a bit
      > Merge branch 'typeddict' of https://github.com/pappasam/jedi
      > Update sith's module docstring to match the available operations
      > Remove the word 'class' from annotation_string
      > Add a couple of docstrings
      > Tell sith that 'completions' became 'complete'
      > Add venv to .gitignore
      > Remove additional prefix which seems incorrect
      > Update use of _source which no longer exists to _code
      > Make sure to move up VSCode, because it's used a lot
      > Revert "Make sure to mention that VSCode is using Jedi"
      > Make sure to mention that VSCode is using Jedi
      > Fix a test issue
      > Actually use follow_builtin_imports and improve the goto docstring, fixes #1492
      > Catch an error with illegal class instances, fixes #1491
      > Make Ellipsis without list in Callable work, fixes #1475
2020-07-17 23:14:17 +02:00
Dave Halter
a0207fadf9 Instead of zip completions (for tests) use something else, see discussions in #1020 2020-06-30 09:24:28 +02:00
Maxim Belkin
e83112f9aa doc/jedi-vim.txt: fix apostrophe (#1002) 2020-03-07 21:38:13 +01:00
Daniel Hahler
b2e8c65e35 Improve/harden jedi#setup_python_imports
In particular it should not try to import `jedi_vim_debug` during error
handling "unprotected", which might hide the real error on Python 2 at
least.

Ref: https://github.com/davidhalter/jedi-vim/issues/998#issuecomment-592305240
2020-03-05 21:06:06 +01:00
Daniel Hahler
686f39ac00 Fix jedi#add_goto_window: use :copen to go to the qf window always
Without this it would not go there with an already open qf window, and
would go to an unexpected buffer line instead of selecting the entry.

This is a follow-up to b689409, where it was decided that it should
always require the user to select an entry.

An exception is when the same usages are used again: then it will select
the nearest/current entry only (via ":cc").
2020-02-27 20:41:45 +01:00
Daniel Hahler
055199f2aa show_goto_multi_results: handle full_name=None
Seen with `<Definition name='key', description='param key'>` (using
usages on an function argument) [1].

1: https://github.com/pytest-dev/py/blob/2b6bd2925/py/_vendored_packages/iniconfig.py#L32-L33
2020-02-27 20:40:11 +01:00
Daniel Hahler
8d24b83754 Merge pull request #993 from blueyed/cover-jedi_debug_info
tests: cover jedi_debug_info
2020-02-03 01:43:09 +01:00
Daniel Hahler
a3696bee36 ci: upload coverage always 2020-02-03 01:37:10 +01:00
Daniel Hahler
5d4658f989 tests: cover jedi_debug_info 2020-02-03 01:37:10 +01:00
Daniel Hahler
18b1a519b0 Update parso/jedi (v0.6.0, v0.16.0+) (#991) 2020-02-03 01:36:04 +01:00
Daniel Hahler
acb98fc706 show_call_signatures: doc, default to 2 without 'conceal' (#994)
It basically allows to give a warning when '1' is used / set explicitly, and
the 'conceal' feature is not available.

Also defaulting to '2' (cmdline mode) then seems better than not using
it.

This is just some minor clean up before
https://github.com/davidhalter/jedi-vim/pull/652.
2020-02-03 01:31:10 +01:00
Daniel Hahler
e99cfd32de Update submodule pythonx/jedi afbd8cad...3ad3dc08
* pythonx/jedi afbd8cad...3ad3dc08 (197):
      > Run get_type_hint tests only for 3.6+
      > Stubs should not become stubs again in the conversion function, fixes #1475
      > Make sure to print errors in __main__ completions
      > Make sure param hints are working for functions
      > Generate type hints, fixes #987
      > Bump version to 0.16.1
      > Make sure to be able to deal with all kinds of loaders, fixes #1487
      > Make generators return more correct values with while loops, fixes #683
      > Avoid aborting search for yields when they are still reachable, see #683
      > Jedi understand now when you use del, fixes #313
      > Remove dead code
      > Remove Python 3.3 from environment tests
      > Make sure to skip some tests for Python 3.5
      > Small Changelog updates
      > Fix a small signature issue
      > Create a private helper to test completions
      > Fix an issue with names
      > compiled_object -> compiled_value
      > Remove dead code
      > CompiledObject -> CompiledValue
      > CompiledValue -> ExactValue
      > Revisit caching of mixed
      > Make MixedName a Namewrapper instead of inheritance
      > Remove underscore_memoization caching method
      > Refactor MixedName quite a bit
      > Fix issue with mixed objects, fixes #1480
      > Remove some dead code
      > Prepare a test for #1479
      > Avoid a print in tests
      > Fix value/context mixup in mixed, fixes #1479
      > Clarify that for Python 2 we will not fix bugs anymore
      > Skip a test in Python 2
      > Use is_compiled instead of isinstance checks
      > Create CompiledModule to have a better differentiation between compiled modules and compiles values
      > Make sure that the builtin docstring works again for infer calls
      > Fix a bug with version_info, fixes #1477
      > Make sure that del_stmt as a name can be handled, see #313
      > Remove use_filesystem_cache and additional_dynamic_modules, it hasn't been implemented for a long time
      > Removed settings.no_completion_duplicates
      > Make sure to stop gathering buildout paths at a certain point, fixes #1325
      > Rewrite some whitespace
      > Reformat the changelog a bit
      > Add follow_imports to Definition.goto, fixes #1474
      > Raise a proper exception instead of assert in case only_stubs and prefer_stubs are given
      > Make sure a certain test passes as well with tox
      > Fix a Python 2 issue
      > Rename Script.names to Script.get_names, fixes #1476
      > find_signatures -> get_signatures, see #1476
      > find_references -> get_references, see #1476
      > Fix remaining tests
      > Reduce limits of files to parse by quite a bit
      > Make sure that CompiledObject doesn't have a file_io
      > Use different limits for references and dynamic calls
      > Explain why the references limits were chosen
      > Start limiting opened files and parsed files for references
      > Remove a few imports
      > Make sure to not scan the same directory multiple times
      > Don't search for usages when we are working with params
      > Ignore .gitignore in get_references and therefore make get_references usable again
      > Revisit reference finding, scan a lot of folders
      > Added FolderIO.walk and FolderIO.get_base_name
      > Move get_module_contexts_containing_name to the references module
      > Apparently this one variable is needed
      > Small changelog fix
      > Forgot to use sudo for installing dependencies in travis
      > Another few travis fixes
      > Don't run some usage tests on Python 2
      > Interpreter test fix for travis config
      > Add a few more stub usage tests
      > Disable flow analysis for finding usages
      > Add another stub usage test
      > Fix stub conversion
      > Make sure to find both stubs and non-stubs with usages
      > Use the proper fixture
      > Implement interpreter test on travis
      > Get interpreter environment tests working
      > Make sure tests are proper packages, so that pytest doesn't do shenannigans with sys path
      > Remove NestedImportModule, because it hasn't been used in years
      > Refactor execute_operation a bit
      > Finally get rid of call_of_leaf
      > Refactor the isinstance checks a bit
      > Makes sure examples are excluded from pytest
      > speed test to examples
      > Move not_in_sys_path tests to examples
      > Move namespace tests to examples
      > Moved zipped imports test files
      > Move sample_venvs to examples
      > Move the extension test to examples
      > Move another test to examples
      > Remove unused test code
      > Move implicit namespace package code to example dir
      > Move flask tests to examples folder
      > Move the absolute import test files
      > Avoid a bug that a compiler might have found, fixes #1469
      > Make sure the latest changes work with Python 3.6/3.7
      > Properly convert compiled values to generic classes
      > Make Union/Optional works with compiled objects
      > Make sure that CompiledValue can deal with string annotations
      > Avoid a few warnings
      > Skip a test that doesn't work in Python 2
      > Remove a statement that didn't make sense
      > Remove a method that was not necessary
      > Fix a bug where parent_context was a value
      > Fix some issues with converting names, see #1466
      > Use one single way to convert stubs to Python, see #1466
      > Make sure to use _stub_to_python_value_set for all conversions, see #1466
      > Make sure fixture resolving works in conftest.py, see #791
      > Fix signatures when used for Generic classes, fixes #1468
      > Make sure inheritance works for fixtures, fixes #791
      > Add a test to check if numpy tensorflow stuff is now cached, see #1116
      > Make sure to check the module cache before loading a module (again)
      > Add a completion cache for numpy/tensorflow, fixes #1116
      > Ignore processing param names, fixes #520
      > Avoid using params in tests and use get_signatures().params
      > Make sure params have no name
      > Make sure that kwargs are not repeated when they are inferred
      > Undo finding signatures for everything and only do it for stubs and non-statements for when used in docstrings
      > Fix an issue with the is_big_annoying_library function, see #520
      > Make sure decorators are also not inferred for big annoying libraries, see #520
      > Make sure the repr of compiled access isn't huge
      > Disable some features for big annoying libraries like pandas, tensorflow, see #520
      > Fix a debug message
      > Fix a small issue
      > Little refactoring
      > Remove the old definition tests
      > Remove get_signatures again from names
      > Infer doctests and signatures uniformly, fixes #1466
      > Fix a small pytest fixture bug
      > Raise a deprecation warning on Definition.params
      > Remove a weird assert
      > Make sure coverage works again
      > Use Python 3.7 for calculating test coverage
      > Remoeve dead code
      > Remove unnecessary code
      > Separate getting docstrings and getting signatures for names, see discussion #1466
      > LazyInstanceClassName -> Use NameWrapper
      > Make sure that equals will only be added to keyword arguments and not just randomly
      > Make some test code prettier
      > Remove some skips around attribute docstrings
      > Add some more dict completion tests with whitespace
      > Change ModuleValue param order and add defaults
      > Make sure to pass tests again on Python 3.4
      > Make sure that include_signature always works, fixes #1466
      > Add a test for #1465
      > Skip dict key completion tests for Python 3.5, because it's just annoying with all the f-string stuff
      > Revert "Use the root implementation for get_root_context"
      > Added debug.warning to coveragerc, it's not relevant
      > Remove unused code
      > Use the root implementation for get_root_context
      > Add github sponsor FUNDING.yml file
      > Merge branch 'qa' of https://github.com/blueyed/jedi
      > Get rid of most flake8 errors
      > Get rid of a lot of flake8 errors
      > Make sure to get completions for backticks in docstrings work, see #860
      > Some more clarifications around docstrings, see #860
      > Get doctest completions working, fixes #860
      > Fix tests, skip more Python 2
      > Make sure test prefixed functions are checked for pytest fixtures, see #791
      > Make sure pytester is also used for fixtures, see #791
      > Clarify a sentence around virtualenv security, see #1250
      > Add the CHANGELOG entries for dict completions.
      > Merge branch 'dict', fixes #951
      > Make sure to mention that Jedi understands Pytest fixtures
      > Fix namedtuple issues that were uncovered by the 'self' changes
      > Self manipulations are now more correct, fixes #1392
      > Skip pytest tests when environments is not the same one
      > Make sure pytest stdlib fixtures are completable
      > Make sure the monkeypatch fixture completion works
      > Merge branch 'pytest', fixes parts of #791
      > Make sure py__name__ and name are defined on all values
      > Fix tests
      > Keyword completion after ... should not work, fixes davidhalter/jedi-vim#506
      > Fix python 2 environment finalizing, fixes #1412
      > Remove a function that did nothing anymore
      > Make sure modules for dynamic searches are not checked twice
      > Make sure classmethod param completion works better for the first param
      > Make sure staticmethod params are (mostly) inferred correctly, fixes #735
      > Python 2 test fixes
      > Add the fix for #997 to the changelog
      > Goto on a function/attribute in a class now goes to the definition in its super class, fixes #1175
      > Fix a few tests
      > Add support for completion even when __getattr__ is present, fixes #997
      > Fix an error recovery goto issue, fixes davidhalter/jedi-vim#962
      > Add a test to make sure some renamings work always
      > Refactor references: Matching more names that might be related
      > Catch an additional case for get_context where the cursor is e.g. on the function name
      > Add Script().get_context, fixes #253
      > Fix some issues with Definition.parent()
      > Test parents a bit better
      > Refactor tests a bit
      > Attribute docstrings work now, fixes #138
      > Avoid some duplication of code
      > Remove the _Help class completely
      > Move the docstring checking code to the names
      > Add the Script.help function, fixes #392
      > Add big API changes to Changelog
      > Merge branch 'api', fixes #1166
2020-02-03 01:27:40 +01:00
Daniel Hahler
41ecaa5c15 Update submodule pythonx/parso fb010f2...c864ca6
* pythonx/parso fb010f2...c864ca6 (14):
      > Bump version to 0.6.0
      > Make sure iter_funcdefs includes async functions with decorators, fixes #98
      > Add a bit to the changelog
      > del_stmt is now considered a name definition
      > Forgot to increase the pickle version
      > Revision on fstring issues (#100)
      > Revision on assignment errors (#97)
      > Add a Changelog note about dropping 2.6/3.3
      > Fix a Python 2.7 issue
      > Get rid of Python 3.3 artifacts
      > Remove Python 2.6 grammar
      > Merge branch 'rm-2.6' of https://github.com/hugovk/parso
      > Make sure to limit the amount of cached files parso stores, fixes davidhalter/jedi#1340
      > Fix simple typo: utitilies -> utilities
2020-02-03 01:27:31 +01:00
Dave Halter
5dd5631027 Merge pull request #990 from blueyed/fix-goto
Fix "goto" with multiple results
2020-02-02 18:53:08 +01:00
Daniel Hahler
b689409a2a Do not use :cc, but only select the line in the qf window
Ref: https://github.com/davidhalter/jedi-vim/pull/990#issuecomment-580163737
2020-02-02 07:20:43 +01:00
Daniel Hahler
ea4de13344 Minor CI/test improvements (#992)
* ci: Travis: pip-list, nvim-version

* tests: remove unused fixture argument
2020-02-02 07:10:11 +01:00
Daniel Hahler
1f7bc2a0fb Fix "goto" with multiple results
E.g. with `os.path`.
2020-01-29 19:20:12 +01:00
Aleksandrs Stier
c9bdefca54 doc: goto_stubs mapping <leader>s (#989)
Co-Authored-By: Daniel Hahler <github@thequod.de>
2020-01-24 20:11:02 +01:00
Daniel Hahler
e8790b1d8f minor: rewrite/expand show_documentation (#980)
* minor: rewrite/expand show_documentation

* tests: improve 'documentation docstrings'
2020-01-17 13:48:22 +01:00
Daniel Hahler
e2abec21c5 VimError: include throwpoint
This is helpful information to have in case of errors.
2020-01-14 21:09:35 +01:00
Daniel Hahler
c0ded0baf2 ci: add codecov.yml to disable comments (#981) 2020-01-10 19:59:28 +01:00
Daniel Hahler
7dfc56992a ci: Travis: test with py38 also 2020-01-10 17:51:51 +01:00
Dave Halter
2572136fcb Add a funding button to github (#976) 2020-01-01 14:14:45 +01:00
Daniel Hahler
55120b28e4 Merge pull request #974 from blueyed/update
Update parso and Jedi
2019-12-20 17:27:20 +01:00
Dave Halter
d57edde2e8 Update tests 2019-12-20 17:20:02 +01:00
Daniel Hahler
fab26f4551 Update submodule pythonx/jedi 005f6939...afbd8cad
* pythonx/jedi 005f6939...afbd8cad (208):
      > Don't test Python 3.4 in tox anymore by default
      > Add the release date to Changelog
      > Jedi needs at least parso 0.5.2 now
      > Fix a rb byte literal test
      > Goto definition doesn't work on strings anymore, fixes microsoft/vscode#81520
      > Make sure that sequence literals have the right generic classes, fixes #1416
      > Improved Generic subclass matching
      > Make sure overload checks work for TypeAlias, see #1416
      > Avoid recursion in a specific example, see also #1458
      > Fix simple typo: wheter -> whether (#1460)
      > Completions.complete returns None for fuzzy completions #1409
      > Cleanup fuzzy tests a bit, see #1409
      > Add fuzzy completions to Changelog
      > Merge branch 'feature_827_fuzzy_search' of https://github.com/jmfrank63/jedi
      > Python 2 compatibility
      > Make sure that the definition order in stubs are ignored
      > Make sure that a goto on stubs even without the implementation is possible
      > Fix a goto case with nested pyi files
      > Catch some cases were _sqlite3.Connection was misidentified as sqlite3.Connection
      > Rename goto_changes to options
      > Fix: Stubs in typeshed weren't loaded properly sometimes, fixes #1434
      > Files bigger than one MB (about 20kLOC) get cropped to avoid getting stuck completely
      > Upgrade typeshed, fixes #1084
      > Add a typeshed README
      > Make sure param annotation completions work
      > Make sure that you can select virtualenvs more precisely, fixes #1407
      > Python 2 compatibility
      > Make sure goto definitions works on with, fixes #1280
      > Make sure that __getattr__ is always working with Interpreter
      > qualified names can be None, so we need to handle it
      > Cleanup some callbacks
      > Make sure that Python 2 passes a test on more systems
      > Make sure warnings are not shown if a property is executed, fixes #1383
      > Fix RecursionError: global statements in modules should just be ignored, fixes #1457
      > Make it possible to infer Callable TypeVars, fixes #1449
      > Account for sys path potentially not being all unicode in typeshed, fixes #1456
      > Make sure docstrings can always be inferred for builtins modules, fixes #1432
      > Forgot to add some test files
      > Get the context of a class name right, fixes #1396
      > Make sure classmethod signatures don't include cls, fixes #1455
      > Add a test to show that type var inference also works for tuples
      > Don't use globals anymore
      > Remove a duplicate method
      > More docstrings
      > A bit better documentation
      > Refactor so typing uses BaseTypingValueWithGenerics
      > Make some more classes private for inference.gradual.base
      > Use _create_instance_with_generics
      > The generics manager is now part of DefineGenericBase
      > Remove get_index_and_execute and use something else
      > _InstanceWrapper to _GenericInstanceWrapper
      > Another rename for readability
      > Merge GenericClass and  _AbstractAnnotatedClass
      > Use the generics manager for all the typing classes
      > Start using generic managers, for #1413
      > Start working on generic managers, see #1413
      > Move iter_over_arguments to a separate file
      > value_of_index -> context_of_index
      > Try to prepare DefineGenericBase for a more general usage
      > Make AbstractAnnotatedClass private
      > Move parts of AbstractAnnotatedClass to the new class DefineGenericBase
      > Formatting
      > Rename two classes to make some things clearer
      > Make some lines shorter
      > Remove an unused InstanceArguments
      > Move more stuff from gradual/typing.py to gradual/base.py
      > Remove TypingName, it looks like it's not used
      > Start splitting up gradual/typing.py
      > Make sure Callable TypeVars are better identified, solves a part of #1413
      > Remove a TODO that was implemented
      > Pin colorama to a version that works for Python 3.4
      > Find active conda environment and set it as default (if there is one) (#1440)
      > Remove Python 3.4 test from appveyor
      > Make sure overload signatures work, see #1417
      > Shorten a line to < 100 chars
      > Fix a tuple test
      > Make sure that Tuple autocompletes properly, fixes #1389
      > Avoid more Python 2
      > Fix issues with interpreter completions on unittest.mock.
      > Start writing the changelog
      > Improve call signature detection by a lot
      > Make sure we use the right context in case of goto with decorators, fixes #1427
      > Python 2 still sucks.
      > Make sure an assert no longer causes unnecessary trouble
      > Make sure that decorator signature completion is working, see #1433
      > Avoid wrong random call signature completion, fixes #1433
      > Make sure py__iter__ has the right signature
      > Remove probably dead code
      > Python 2
      > Make sure execute_function_slots and get_function_slots is defined for all instances
      > Upgrade typeshed to the latest commits
      > Make sure that the differences are calculated a bit more reliable, fixes #1429
      > Unfortunately commited something that should not have been committed
      > Fix Python 2 issues
      > A CompiledInstance is not really compiled, it's an instance of a compiled class value
      > Remove is_package on contexts
      > Fix some more package issues
      > Get rid of py__package__ from contexts
      > Make is_package a function and call it consistently
      > Make sure code_lines works on stubs, even if they are builtins
      > Fix the MixedContext and also use MixedModuleContext
      > Separate CompiledModuleContext from CompiledContext, fixes #1428
      > Fix contextualizing of subscriptlist
      > Fix a globals context issue, fixes #1435
      > Remove Python 2 implicit relative imports feature
      > A small rename of a value that is actually a context
      > Merge pull request #1451 from pappasam/FIX_SHOW_SYSTEM_FOLDERS
      > Add __ne__ to BaseValueSet. Might have caused issues in Python 2, see #1442
      > Avoid finding submodules for compiled objects, because it's at least not implemented
      > Make sure that goto on a subscript colon doesn't crash
      > Fix getitem in compiled
      > Make sure py__get__ is defined on all values
      > Fix file name completions when file name is too long
      > Fix an issue around completions in comments before strings
      > Fix missing inference for typing.Type[typing.TypeVar] (#1448)
      > Remove Python 3.9 dev build from travis, it's not needed
      > Start to use Python 3.8 in the normal CI pipeline
      > Fix the pow test for Python 3.8
      > Fix inference from type comment for function parameter with dot
      > Fix annotation string generated from wrong object
      > Fix a small issue created in #1398
      > fix static analysis test skips with latest pytest
      > Fixed rST in changelog
      > test: test_completion: Dynamically resolve current directory name.
      > Skip Python 2 tests for some array issues
      > Skip some param resolving tests in Python 2/3.4
      > Add a few tests for a previous assertion failure
      > Make sure a compiled instance is is_compiled
      > Reenable a test
      > Disable a test in Python2
      > Remove a few unused imports
      > Move eval_node to one place
      > Avoid creating the same object twice
      > Move inference_state.goto to the name and _follow_error_node_imports_if_possible away from inference_state
      > Make some dynamic array variables private
      > ContextualizedName -> TreeNameDefinition
      > Use create_name instead of duplicated logic
      > Replace obj with value
      > Remove get_object, it's not needed anymore
      > Implement properties properly
      > Make arguments private for instance
      > Refactor dynamic params a bit
      > Revert "Refactor some dynamic function arguments things"
      > Refactor some dynamic function arguments things
      > Move some annotation inferring code to proper functions
      > Remove an unneeded list cast
      > SimpleParamName -> AnonymousParamName
      > Make create_instance_context a lot more understandable (and shorter)
      > Make sure a self variable is only defined in a function not outside
      > get_first_non_keyword_argument_values is not really used anymore
      > A simplification
      > Fix recursion issues about dynamic param lookups and defaults work again
      > Refactor search_param_names interface
      > Use get_executed_param_names if get_executed_param_names_and_issues is not necessary
      > Don't use get_executed_param_names_and_issues as an attribute on arguments
      > Remvoe AnonymousArguments
      > Refactor AnonymousInstance/TreeInstance, so that the anonymous instance doesn't have to use arguments
      > Separate tree/compiled instances better
      > Get rid of create_init_executions
      > Implement super() properly
      > Start using AnonymousMethodExecutionContext instead of the normal function execution context with arguments
      > Prepare instance for AnonymousMethodExecutionContext
      > Use the function execution filters with proper inheritance
      > Deal with inheritance properly when dealing with function executions
      > Separate FunctionExecution and AnonymousFunctionExecution
      > Fix static analysis for params
      > Add get_param_names to the function execution, which is needed to do some filtering
      > Move the normal anonymous arguments case over to names
      > Prefer annotations in SimpleParamName
      > Add some dynamic inference checks for annotations
      > Avoid using arguments.get_executed_param_names_and_issues
      > Remove get_executed_param_names_and_issues from FunctionExecution
      > Use function/arguments intead of execution
      > Make FunctionExecutionContext.arguments private
      > _ArrayInstance -> _DynamicArrayAdditions
      > var_args -> arguments
      > Fix the final issues about parameter arguments
      > Fix infering of dynamic params
      > Remove an unnecessary piece of code from goto
      > Use Context.create_name instead of weird playing with params everywhere
      > Use SimpleParamName everywhere it's needed
      > Refactor params and what execution contexts need
      > Fix a TODO
      > Make the order of overloaded functions correct
      > Get py__simple_getitem__ working on dicts that have a dict as a param, see #1385
      > Move some code from SequenceLiteralValue to DictLiteralValue
      > Fix usages in context of the new parso parameter include_setitem=True
      > execution_allowed should be called with nodes
      > Move a repr function
      > Fix cases where dicts are passed to dicts and generics were not properly applied
      > Small rename
      > Change a test so it works with generics
      > Get py__simple_getitem__ modifications working for list/dict instances
      > Random objects should not be affected by list/dict modifications
      > Add a way how dict setitem can be understood
      > Move the dynamic module to dynamic_params
      > Move the dynamic arrays code
      > Add a comment about how _ArrayInstance is used
      > check_array_additions -> _check_array_additions
      > Remove methods that are not used
      > Create separate classes for FakeSequence
      > Remove _FakeArray, because it's no longer needed
      > Enable a sys path test that is working now
      > Reenable some tests
      > Add a method implementation, that doesn't seem to be used, but it might one day be.
      > Merge branch 'refactoring'
      > Merge branch 'master' of github.com:davidhalter/jedi
      > Bump version
2019-12-20 12:37:26 +01:00
Daniel Hahler
4dcc6437e3 Update submodule pythonx/parso c0ace63...fb010f2
* pythonx/parso c0ace63...fb010f2 (22):
      > Add a release date to the Changelog
      > Prepare the next release v0.5.2
      > Merge pull request #93 from yangyangxcf/fstring_tokenize
      > Add information about named expressions (#90) to the Changelog
      > Use a lower pytest version so python3.4 is able to pass
      > Use Python 3.8 on travis for testing
      > Whitespace changes
      > Fix: Add more cases for named expression errors, see #89, #90
      > Add Python 3.8 to tested environments for tox
      > Fix: Catch some additional cases named expr errors, see #89, #90
      > Make sure that function executions are errors as well, see #90
      > Some minor refactorings for #90
      > Merge https://github.com/JarryShaw/parso into master
      > Fix trailing comma error
      > Remove debug print statement
      > Fix typo (#84)
      > Fix is_definition test
      > Add include_setitem for get_defined_names, is_definition and get_definition
      > Make is_definition work on setitem modifications, see #66
      > ENH: update grammar for py39 (#78)
      > Refactor the ambiguity tests a bit, see #70
      > Make pgen2's grammar ambiguity detection handle more cases
2019-12-20 12:37:23 +01:00
Daniel Hahler
c80a08d983 Fix invalidating cache with jedi#show_call_signatures (#968) 2019-12-08 17:26:24 +01:00
Daniel Hahler
ac6b2f1e3e ci: Travis: slighty improve codecov-bash invocation (#967) 2019-12-05 23:09:19 +01:00
Dave Halter
12e97c7a04 Make sure call signatures are cleared before they are calculated again 2019-12-05 01:02:58 +01:00
Daniel Hahler
08f13af066 completions: skip docstr without preview, handle exceptions (#958)
Closes https://github.com/davidhalter/jedi-vim/issues/948.
2019-10-20 23:56:22 +02:00
Daniel Hahler
5880f2de93 Revisit usage highlighting (#851) 2019-10-16 22:54:29 +02:00
Daniel Hahler
b4b2f3ef54 debug info: catch any errors with PythonJedi commands
Ref: https://github.com/davidhalter/jedi-vim/issues/953
2019-09-28 12:34:54 +02:00
Daniel Hahler
50abb5e95a jedi#debug_info: escape script path for "git" (#950)
Ref: https://github.com/davidhalter/jedi-vim/issues/949
2019-09-24 08:43:48 +02:00
Daniel Hahler
89c995e7d9 display_debug_info: add global sys.executable (#947)
This helps with bug reports in general.
2019-09-19 00:46:16 +02:00
Daniel Hahler
4f2499e4f2 ci/tests: update dependencies 2019-08-19 01:06:32 +02:00
Daniel Hahler
7665d73eae Update submodule pythonx/jedi to v0.15.1: 35e5cf2c...005f6939 (#940)
* pythonx/jedi 35e5cf2c...005f6939 (5):
      > Write the CHANGELOG for 0.15.1
      > Remove forgotten debug/print in filename completion. (#1380)
      > staticmethod and a few other cases might not have properly returned its signatures
      > Remove reference to a file that doesn't exist anymore
      > Bump version to make it clear that it's a different one than the current one
2019-08-18 21:35:09 +02:00
Daniel Hahler
b3d715c5fc Update submodule pythonx/jedi 60415033...35e5cf2c
* pythonx/jedi 60415033...35e5cf2c (106):
      > A small Changelog improvement
      > Cleanup Changelog for the next release
      > Make it possible to access functions that were inherited, see #1347
      > Messed up a Windows test
      > Again a small windows issue fixed.
      > Need to escape the path backslash for windows slashes
      > Make it possible to access properties again
      > A small compatibility fix
      > Fix an issue with type vars that might have been a problem for other things as well
      > Don't add quotes after paths if they are already there
      > A small speed optimization that helps a lot with sys.version_info >= (3, 0) patterns in typeshed
      > Remove an unnecessary isinstance usage
      > Make CompiledValue lazy
      > A python 2 fix
      > Fix an error that occured because of some refactorings
      > Fix one more os.path.join issue
      > Fix more issues with os.path path completion
      > Make join detection much easier
      > Fix some remaining issues with file path completions
      > A few more tests for path completions (join)
      > Fix quote completions for os.path.join path completions
      > Fix first param argument of os.path.join file completions
      > Fix arglist/trailer issues
      > in os.path.join completions, directories should not end in a slash
      > Make some file path completions in os.path.join work
      > Fix os.path.join static value gathering
      > os.path.sep should always have a clear value
      > Fix string name completion for stuff like dirname and abspath
      > Fix bytes issue with file path adding
      > Python 2 compatibility
      > Make __file__ return the correct value
      > Fix string additions when used in certain ways
      > Make string additions work for file path completion
      > Fix interpeter project path
      > Fix the REPL completer for file path completions
      > Fix a few more file name completion cases
      > A first iteration for file path completions
      > Fix a test failure
      > Add Definition.execute, fixes #1076
      > Add tests to show that #516 is not working, yet
      > List possible Definition.type in its docstring, fixes #1069.
      > Start writing the Changelog for 0.15.0
      > 3.8-dev should not be allowed to fail
      > Skip more Python 2 tests
      > Skipping of tests was done the wrong way again
      > Skip the right tests
      > Parameter.kind is not avaialble in Python 3.5
      > Fix Python 2 test issues
      > Add a few docstrings to make some things clearer
      > Add ParamDefinition.kind, fixes #1361
      > Make it possible to format a param to a string, fixes #1074
      > Add another test for signature annotations
      > Add Signature.to_string() with proper tests, fixes #779, fixes #780
      > Test infer_default
      > Use a helper to create definitions
      > Add a execute_annotation option to infer_annotation
      > Test infer_annotation
      > Make it possible for users to infer annotations/defaults
      > A first iteration of adding signatures to the API, fixes #1139
      > Fix a caching issue
      > Forgot the right resolve_stars parameters in one place
      > Cache getting resolved param names
      > Turn around resolve_stars, it shouldn't by default be resolved
      > Remove a class that is not needed anymore
      > Revert "Use __str__ instead of to_string"
      > Fix the last remaining issues with function signature
      > overloaded_functions should be private
      > Use __str__ instead of to_string
      > Better repr for CallSignature
      > Fix some minor signature issues
      > Remove the unused function signature_matches
      > Fix signatures for __init__ calls when used with supers, fixes #1163
      > Fix some issues for args resolving in method calls
      > Remove a bit of code that i sprobably unused
      > Move get_signatures from Function to FunctionMixin
      > Merge the signature changes
      > Remove an import
      > Small refactoring
      > Skipped Python 2 Interpreter tests the wrong way
      > Remove a paragraph in docs that was arguing that stubs and generics (and other things) were not properly supported, fixes #1012
      > Fix partial signatures for MixedObject
      > Fix partial signatures, fixes #1371
      > Make sure with a test that the staticmethod signature is also correct
      > Fix classmethod signature, fixes #498
      > Deal with annotation on *args and **kwargs correctly, fixes #980
      > Use LazyContextWrapper more
      > Very small refactoring
      > Fix for failing assertion on native modules Issue #1354 (#1370)
      > Skip numpydoc tests for Python 2
      > Remove code that didn't mean anything
      > Fix docstrings for wrapped functions, fixes #906
      > Fix an isue about dict ordering in Python before 3.6.
      > Make it clearer when get_param is used.
      > A small dataclass refactoring
      > Evaluate annotations for dataclasses when infer is called on param
      > Get inheritance of dataclass right
      > A first working iteration of dataclass signatures, fixes #1213
      > Remove an unused function
      > Dataclass progress
      > Add enum changes to changelog
      > Fix a recursion error about getting metaclasses
      > One test about recursion issues only applied to Python 2
      > Use class filters in instances differently so metaclass plugins work, fixes #1090
      > First step in working with metaclasses in plugins, see #1090.
      > Refactor the plugin registry
      > Remove classes from plugins and use decorators instead
2019-08-12 00:16:06 +02:00
Daniel Hahler
b9f8317595 Update submodule pythonx/jedi 454447d4...60415033
* pythonx/jedi 454447d4...60415033 (54):
      > Prepare the v0.14.1 release
      > Use fixture names everywhere
      > Cleanup a test file
      > Use parametrize instead of TestCase
      > Remove a TestCase class usage
      > Use pytest.mark.parametrize for something instad of a class
      > Use the names fixture even more
      > Use the names fixture more
      > A small rename
      > Refactor names tests
      > A small refactoring
      > Make sure __wrapped__ works properly when using an Interpreter, fixes #1353
      > Small refactoring
      > Make API param names appear without leading double underscores, fixes #1357 again
      > Fix some call signature tests
      > Make expected index work in Python 3
      > Test both closing brackets and non-closing brackets for CallSignature.index
      > Fix a case with errors
      > Move some code around
      > Fix some kwargs cases
      > Fix some *args issues
      > Deal better with some error nodes
      > Delete unused code
      > Fix some error node handling for call signatures
      > Fix CallSignature index for a looot of cases, fixes #1364,#1363
      > Use recursion rather than other stuff
      > Even more refactorings
      > small name refactoring
      > Refactor some call details
      > Disable a test for Python 2
      > Fix pow() signature, fixes #1357
      > Merge branch 'master' of github.com:davidhalter/jedi
      > Fix signature to_string
      > Fix an issue with keyword params, fixes #1356
      > Simplify some test code for param defaults, see #1356
      > Merge branch 'function_signature_in_interpreter' of https://github.com/linupi/jedi
      > Improve a bit of dataclasses support, so at least the attributes can be seen
      > Make sure in tests that pep 0526 variables are also able to be used when using self, see #933
      > Get typing.NewType working (#1344)
      > Cannot use pytest 5 yet
      > Fix filters for classes and functions
      > Fix some small things to get more tests passing
      > A better repr for Definition
      > Merge branch 'master' of github.com:davidhalter/jedi
      > Fix ClassVar filter for instances
      > Keyword completions are no longer possible directly after a number, fixes #1085
      > Fix super call goto for multiple inheritance, fixes #1311
      > goto should always goto definitions, fixes #1304
      > Fix star imports checks, fixes #1235
      > Actually import IsADirectoryError
      > Add 3.8 to supported versions
      > Fix project search if a directory is called manage.py, fixes #1314
      > Return annotations for compiled objects now help to infer
      > Update parso requirement
2019-07-13 20:21:56 +02:00
Daniel Hahler
d3f40d13ec Update submodule pythonx/parso 59df3fa...c0ace63
* pythonx/parso 59df3fa...c0ace63 (9):
      > For Python 2.7 and 3.4 pytest 5 doesn't work anymore
      > Prepare the 0.5.1 release
      > Fix name tokenizing for Python 2
      > Fix positioning for names that are interleaved with error tokens
      > Merge branch 'master' of github.com:davidhalter/parso
      > Fixed name tokenizing issues for tamil characters, fixes davidhalter/jedi#1368
      > Document that the cache uses pickle files
      > Fix changelog dates, fixes #77
      > Try to use collections.abc.Mapping instead of collections.Mapping
2019-07-13 20:21:56 +02:00
Dave Halter
016fb7c78e Merge pull request #915 from davidhalter/typeshed
With typeshed coming to Jedi, builtin modules should be displayed
2019-06-23 01:13:14 +02:00
Dave Halter
e736eea934 Use staticmethod for call signature tests instead of str
str has different signatures for Python 2 and 3 and is therefore annoying to test.
2019-06-21 00:28:18 +02:00
Dave Halter
6c6b4dcf92 Make sure that formatting happens on unicode 2019-06-20 23:56:46 +02:00
Dave Halter
73289427ba Modules should be accessible if column is not None 2019-06-20 23:46:34 +02:00
Dave Halter
1a053d2a23 Fix some call signature tests 2019-06-20 23:37:43 +02:00
Dave Halter
636ad08d32 Get rid of documentation about pip install jedi
pip install jedi doesn't work with properly with virtualenvs, if jedi-vim is
used.
2019-06-20 23:15:16 +02:00
Dave Halter
d32962f3b2 Upgrade Jedi to 0.14.0 and parso to 0.5.0 2019-06-20 22:38:57 +02:00
Dave Halter
717446dd71 For whatever reason tabs were used as indentation 2019-06-17 20:52:31 +02:00
Dave Halter
9c9a513aaf Add a goto_stubs command 2019-06-16 09:39:50 +02:00
Daniel Hahler
69aa410afa Fix :JediClearCache!
Parso's cache can be cleaned from Jedi now.
2019-04-28 21:19:39 +02:00
Daniel Hahler
914754a04e Disable smart_auto_mappings by default
Ref: https://github.com/davidhalter/jedi-vim/issues/568
2019-04-06 01:02:23 +02:00
Dave Halter
f26b2a8802 Change supported Python version in docs 2019-03-22 12:40:28 +01:00
Daniel Hahler
d879d2f216 jedi#show_documentation: check len of g:jedi#documentation_command 2019-03-22 12:35:43 +01:00
Dave Halter
23c14f6826 With typeshed coming to Jedi, builtin modules should be displayed
(If there's a module_path (which most will have)).

This change is still backwards compatible and can be used with older Jedi
versions (<0.14.0).
2019-03-09 13:35:56 +01:00
Dave Halter
1f7e661d9d Upgrade parso 2019-02-24 18:59:53 +01:00
Dave Halter
c6fe4fee76 Upgrade Jedi to latest 2019-02-24 18:59:29 +01:00
Dave Halter
ea5e87a703 Remove jedi.NotFoundError, because that was removed quite a while ago, see #899 2019-02-17 18:04:15 +01:00
Henré Botha
d02a72e792 Update Python version in README (#911)
As per the author's comment here, Python 2.6 is no longer supported. https://github.com/davidhalter/jedi-vim/issues/866#issuecomment-409852888
2019-02-12 14:30:02 +01:00
Daniel Hahler
42d24387ac Update parso to 0.3.3 (#909)
Update submodule pythonx/parso a2b153e...f1ee761

    * pythonx/parso a2b153e...f1ee761 (6):
      > Release of 0.3.3
      > Rename a test
      > Remove some unused code
      > Fix working with async functions in the diff parser, fixes #56
      > Fix bytes/fstring mixing when using iter_errors, fixes #57.
      > Improve a docstring, fixes #55.
2019-02-06 13:09:45 +01:00
Stevan Milic
ba5915bf26 Fix rename with folds: replace line in buffer directly (#906)
Fixes #789
2019-02-05 20:28:46 +01:00
Daniel Hahler
c5c13d69d6 ci: Travis: Ubuntu Xenial, and pynvim (#908) 2019-02-05 20:03:33 +01:00
Daniel Hahler
f36749776d Update parso to v0.3.2
Update submodule pythonx/parso 930ec08...a2b153e

    * pythonx/parso 930ec08...a2b153e (91):
      > Upgrade the Changelog
      > Escape a backslash properly
      > Bump the parso version to 0.3.2
      > f-string parts are also PythonLeaf instances
      > Fix get_start_pos_of_prefix
      > Remove dead code
      > Refactor f-string support
      > Fix: End detection for strings was mostly wrong, fixes #51
      > Fix f-string escapes, fixes #48
      > Tokenizer: Simplify end of string regexes
      > Add a comment from the Python3.7 code base
      > Fix diff parser: The previous fix was a bit off
      > Change fuzzer: Add ways to not always use correct parse input
      > Fix diff parser: issue with opening brackets
      > Async doesn't work in 3.4
      > Skip some tests for Python2.6 and Python3.3
      > Fix diff parser: DEDENT as error leaves should also be ignored and reparsed
      > Fix diff parser: error dedents in between nodes should be ignored for now when copying
      > Fix diff parser: Don't copy error nodes/leaves in the beginning, leads to strange issues in some cases
      > Diff fuzzer: Create a check to see if the errors make sense.
      > Fix diff parser: Don't copy DEDENT tokens at the beginning
      > Fix diff parser: Skip last leaves for last line offset leaves
      > Fix indentation error tokens
      > Fix diff parser: Avoid side effects for prefix
      > Fix tokenizer: backslashes sometimes led to newline token generation
      > Make lines easier copyable in the fuzzer
      > Fix tokenizer: Carriage returns after backslashes were not properly handled
      > Fix in diff parser: prefix calculation was wrong when copying nodes
      > Replace --print-diff with --print-code
      > Fix diff parser generation for empty files
      > Docopt should not be needed for tests
      > Fix tokenizer: Form feeds and multiline docstrings didn't work together
      > Fix diff parser: Need to calculate the prefix for the diff tokenizer better
      > Remove copied nodes stuff, to simplify some things
      > Fix newline endings and a few parser/copy counts
      > Feature: The diff parser fuzzer is now able to use random Python fragments
      > Fix: The Python 3.8 grammar did not include f-string support
      > Fix tokenizer: Closing parentheses in the wrong place should not lead to strange behavior
      > Fix end positions with error dedents
      > Fix diff parser tests for Python 2
      > Randomize the fuzzer a bit more with inserting characters
      > Simplify the regexes
      > Fix a regex clause that was totally wrong
      > Fix another tokenizer issue
      > Apply \r changes in syntax trees
      > Actually make \r usable
      > Fix split lines for Python code
      > Add \r as a valid linebreak for splitlines
      > Move split_lines tests around
      > Start generating really random strings with the fuzzer
      > Fix tokenizer: Dedents before error tokens are properly done, now.
      > Fix diff parser: Also check async with
      > Make the diff parser use a lot of different files by default
      > Fix diff parser: Forgot that with statments are also flows
      > Fix valid graph asserting for some dedents that are errors
      > Fix diff parser: If funcs are not copied, errors shouldn't either
      > Better documentation for the fuzz diff parser script
      > Rename a test
      > More verbose output for the diff fuzzer
      > Fix diff parser: error dedent issues
      > Fix diff parser: Avoid indentation issues
      > Use the right diff order in debug output
      > Fix diff parser: The prefix was wrong in some copy cases
      > Make fuzz parser compatible with Python 2
      > Make it possible to print all diffs in fuzzer
      > Introduce a redo flag 'only_last' to narrow down issues
      > Add docopt to testing dependencies
      > Rewrite the fuzz diff parser to cache errors (so we can re-run those)
      > Fix diff parser: Decorators were sometimes parsed without their functions
      > Fix tokenizer: Dedents should only happen after newlines
      > Usability for diff parser fuzzing
      > Fix for diff parser: Rewrite prefix logic and don't mutate prematurely
      > Fix diff parser: positioning of functions if decorators were removed
      > Ignore ERROR_DEDENT in graph validation
      > Add a small diff parser fuzzer
      > Fix diff parser: get_last_line was sometimes wrong
      > Fix error reporting order for diff issues
      > Clean up the test diff parser file
      > Avoid nasty side effects in creation of Node
      > Make parso errors even more informative
      > Fix diff parser get_last_line calculation
      > Fix graph asserting for error indents
      > Better checks for checking valid graphs
      > Create better ways for debugging the diff parser
      > Fix diff-parser: Copying parts of if else should not lead to the whole thing being copied
      > Reenable diff parser parser counting in all tests
      > Fix: Make the NodesStack to a NodesTree
      > Fix for diff parser : Make sure that start_pos are growing always The problem was that functions/classes were sometimes not well positioned. Now all diff tests are ensuring that leaves always grow.
      > Add a check to see if leaves have the right start positions
      > Add parso version to an exception
      > MNT: add grammar for python 3.8
2019-01-25 01:21:33 +01:00
Brian Mego
7f4f2db260 Fixes incorrect documentation 2018-12-03 23:51:19 +01:00
Daniel Hahler
2f65c636f8 ftplugin: do not duplicate jedi_usages autocommands (#883)
Fixes https://github.com/davidhalter/jedi-vim/issues/882.
2018-11-08 08:43:28 +01:00
Daniel Hahler
b6dfc5fd49 Update submodule pythonx/parso e6bc924...930ec08
* pythonx/parso e6bc924...930ec08 (7):
      > Use SVG badges
      > tox.ini: simplify deps
      > tox: add pypy to envlist for tox-travis
      > setup.py: add "testing" extras_require
      > Add Python 3.7 stable to test matrix and update classifiers
      > Update usage.rst
      > Don't use invalid escape sequences in regex, see https://github.com/davidhalter/jedi-vim/issues/843
2018-10-14 17:55:56 +02:00
Daniel Hahler
2a43448f3b Update submodule pythonx/jedi a79a1fb...bd1010b
* pythonx/jedi a79a1fb...bd1010b (91):
      > Create a new 0.13.1 release
      > Fixed completions of global vars and tensorflow slowness, fixes #1228, #1116
      > The changelog date was wrong
      > Release notes for 0.13.0
      > Fix tensorflow issues with a few hacks (temporary), fixes #1195
      > If the VIRTUAL_ENV variable changes, need to reload the default environment, fixes #1201, #1200
      > Return SameEnvironment as a default, fixes #1226, #1196
      > Document that using the REPL autocompletion is only available on Linux/Mac, fixes #1184
      > Fix an issue with f-strings, fixes #1224
      > Ignore some errors that are happening when the Python process ends and its subprocesses are cleaned up
      > also remove crashes with pep 448 unpacking of lists and sets
      > Fixed crash (and now recognises correctly) {**d, "b": "b"}["b"]
      > Recognize {**d} as a dict instead of set
      > Add extras_require=testing
      > _get_virtual_env_from_var: use safe=False
      > tests: venv_path: use session scope
      > jedi/api/environment.py: minor flake8 fix
      > jedi.api.environment._SUPPORTED_PYTHONS: add 3.7
      > Removing a test from doctests, becaues it shouldn't be one
      > Refactor argument clinic usage
      > With the recent changes one performance optimization got lost
      > FunctionExecutionContext should use the parent if possible
      > Use anonymous instance arguments in a different way
      > Move some anonymous instance function execution stuff
      > Get rid of InstanceFunctionExecution, because it's really not needed
      > Use the InstanceArguments for super as well
      > Use InstanceArguments directly and not via InstanceFunctionExecution
      > Remove old garbage code
      > Don't use arguments that are not needed
      > Also move the remaining get_params to get_executed_params
      > get_params -> get_executed_params where possible
      > Subprocess error reporting improvements
      > Fix a recursion issue about compiled objects
      > Use a CompiledInstanceNameFilter that wraps the class name as well
      > Prefer Python 3 import over 2
      > Now it's actually possible to specify a pytest environment for the same Python version
      > Note that Python 3.3 support was dropped in Changelog
      > Drop support for EOL Python 3.3 (#1019)
      > Rewrite the pyc test
      > Fix an issue with stderr debugging of subprocesses
      > stderr of the child processes should be printed in debug output
      > Use close_fds for posix.
      > Remove some redundant code
      > Use names of classes to infer names of instances
      > Don't have execute and execute_evaluated on name
      > Fix an issue where __ prefixed variables where not hidden when accessed from a class
      > Bound methods are now working correctly in all Python versions. Therefore a test was wrong.
      > Remove a print in tests
      > BoundMethods now have access to the function that they are using
      > Remove another usage of is_class where it's not needed
      > FunctionContext should be created from a unified interface
      > Don't create a FunctionExecutionContext if it's not used.
      > Use TreeContext in a good way
      > Fix broken link in documentation
      > The implicit namespace package test from 4b276bae87a3170672f7ddb3e00f5851fe24d562 can only be used for Python 3.4+
      > The import resolution for namespace packages was wrong
      > Add a way to use the interpreter environment for tests
      > MergedExecutedParams -> DynamicExecutedParams
      > Fix a recursion error, fixes #1173
      > Remove two recursion tests again that will belong into a commit at a point where it is not failing anymore
      > Don't merge params if it's just one param
      > Add a repr for AnonymousArguments
      > Fix a doctest
      > Some minor flake8 fixes
      > Script.__repr__: include environment
      > Add params to CallSignature.__repr__
      > Environments are now always created on request
      > Improve Environment
      > Add max line length 100 to the config for flake8
      > tests: use monkeypatch.setenv
      > Don't test Python 3.3 on appveyor anymore, it's getting really hard to get all the right dependencies for it, because 3.3 is deprecated everywhere.
      > Mention that it's ok to have a line length of 100 characters in our files.
      > Don't use invalid escape sequences in regex, see https://github.com/davidhalter/jedi-vim/issues/843
      > subprocess: listen: exit normally with EOFError
      > Script: improve ValueError for column
      > The sys path might be lazy or not in a venv
      > The encoding parameter should be used again (includes test), fixes #1167
      > Remove source_encoding from documentation (see #1167)
      > Actually use the fast_parser setting again
      > Use an import name list as long as possible
      > Different _load_module API
      > Directly load modules if possible, with this it's not necessary anymore to use dotted_from_fs_path, also fixes #1013.
      > Don't mutate the sys.path. This is pretty nasty bug that fixes #1148
      > Don't follow builtin imports anymore by default when follow_imports is on (goto)
      > Add a changelog entry for the include_builtins change
      > additional_module_paths in usages never actually worked
      > Add include_builtins to usages, fixes #1131.
      > Finally make it possible to use auto_import_modules for packages
      > Test auto_import_modules in a very basic way
      > Fix a bug about fstring completion
      > Comprehensions are also possible arguments. Fixes 1146
2018-10-14 17:55:56 +02:00
Daniel Hahler
c6f05cd82c .coveragerc: concurrency = greenlet (#874)
Fixes https://github.com/neovim/python-client/issues/354
2018-08-16 16:37:00 +02:00
Daniel Hahler
132d8506ab tests: move/rename/cleanup vspec based tests (#860)
The main motivation is to being able to use normal/other pytest based
tests.

Therefore this moves everything from conftest into test_integration
itself.
2018-08-01 23:57:37 +02:00
Daniel Hahler
399c57ff72 Fix displaying of error information with shortmess+=F
When being initialized via ftplugin `set shortmess+=F` (default in
Neovim by now) causes the additional information (the full traceback) to
be silenced.

This patch uses `:unsilent` to always display it.

Ref: https://github.com/neovim/neovim/issues/8675
2018-08-01 22:50:23 +02:00
Daniel Hahler
1126ffde9b Makefile: make pip-install quiet 2018-08-01 22:50:23 +02:00
Daniel Hahler
88502891ba Report coverage (#863) 2018-07-30 22:45:06 +02:00
Dave Halter
b33392c8c8 Merge pull request #864 from blueyed/nvim (neovim testing)
Testing is now alow possible with Neovim
2018-07-30 18:09:45 +02:00
Daniel Hahler
ffec4d7fc5 Test with Neovim 2018-07-30 14:24:53 +02:00
Daniel Hahler
43a9a9b191 Fix test/signatures.vim: ensure there is no indent (nvim) 2018-07-30 14:24:53 +02:00
Daniel Hahler
e05f34646e Fix test/signatures.vim: take into account &ruler (nvim) 2018-07-30 14:24:53 +02:00
Daniel Hahler
713e78dd39 tests: harden/fix completions with regard to longest/nvim mostly 2018-07-30 14:24:53 +02:00
Daniel Hahler
e49638ffc8 Upgrade vim-vspec to 1.8.1 (#862)
This fixes some tests to make it work with the newer version.
2018-07-30 11:16:51 +02:00
Daniel Hahler
4c430ed536 Improve JediDebugInfo for envs (#858)
Improve JediDebugInfo for envs

This is taken out of https://github.com/davidhalter/jedi-vim/pull/836.
2018-07-28 01:46:12 +02:00
Daniel Hahler
40fc5ab27f test/signatures.vim: remove trailing spaces 2018-07-25 02:21:54 +02:00
Daniel Hahler
9a4a4f4074 Skip duplicate call signatures
I am seeing `p` twice for os.path.dirname, which seems to come from
Lib/posixpath.py and Lib/ntpath.py, as can be seen with `os.path.join`,
where I still see two with this patch:

```
            (path, *paths)
import os   (a, *p)
os.path.join()
```
2018-07-16 13:50:49 +02:00
Daniel Hahler
c6716c6392 Makefile: use a single venv 2018-07-15 21:22:29 +02:00
Daniel Hahler
5123dbbbc7 Fix flake8 issue 2018-07-15 20:57:27 +02:00
Daniel Hahler
ee0f759a2e qa: add flake8 to check make target 2018-07-15 20:57:27 +02:00
Daniel Hahler
66b6a20041 Factor out annotate_description
This uses d.type, but special-cases functions and statements.
2018-07-15 19:26:11 +02:00
Daniel Hahler
8e077adb2f show_goto_multi_results: use relpath
This helps Vim to display the path for unlisted buffers relative to cwd
in the quickfix list.
2018-07-15 19:26:11 +02:00
Dave Halter
e7cb9a186e Also add remove_usages on InsertEnter 2018-07-15 19:26:11 +02:00
Dave Halter
b5774a9554 Add an augroup for usages 2018-07-15 19:26:11 +02:00
Dave Halter
f0d80048f1 Remove usages after text has changed in normal mode 2018-07-15 19:26:11 +02:00
Dave Halter
9e2244c44e Use standout/reverse instead of yellow for jediUsages
It uses cterm=reverse, which is supported by current Neovim, and at
least for xterm and rxvt-unicode reverse and standout are the same.

See `infocmp`:

> smso=\E[7m / rev=\E[7m
2018-07-15 19:26:11 +02:00
Dave Halter
cc087ef463 Somehow show_goto_multi_results was called without arguments
This was obviously wrong and fixed by inserting the obvious param
2018-07-15 19:26:11 +02:00
Dave Halter
efaef9cee3 Rename was in the wrong spot when using it at the end of a line. 2018-07-15 19:26:11 +02:00
Dave Halter
58561d45f1 Fix renaming and also highlight the renamed classes. 2018-07-15 19:26:11 +02:00
Dave Halter
84b8eeb954 Highlight usages
Use matchaddpos to highlight usages in the current file.
2018-07-15 19:26:11 +02:00
Dave Halter
2bb7677b43 Make it clearer which versions make check requires 2018-07-14 15:39:02 +02:00
Dave Halter
81ada14f0b Upgrade jedi to 0.12.1, forgot to upgrade it when upgrading parso
a79a1fb Merge branch 'parso'
58141f1 Don't use requirements for now, and use the git version instead in tox
e0e2be3 Add a better comment about why people need to upgrade parso
1e7662c Prepare release of 0.12.1
68974ae Don't use internal parso APIs if possible
c208d37 Remove code that is no longer used, because parso was refactored.
3847406 Make jedi work with the next parso release
95f835a Force unicode when listing module names
282c6a2 Use highest possible pickle protocol
ea71ded Include stderr with "subprocess has crashed" exception (#1124)
106b11f Set stdout and stdin to binary mode on Python 2 and Windows
f9e90e8 Use system default buffering on Python 2
197aa22 Use cPickle on Python 2 if available
e96ebbe Add tests for DefaultDict support.
55941e5 Add support for DefaultDict on jedi_typing.py.
ff4a773 Parse correct AST attribute for version
70c2fce Replace distutils.spawn.find_executable with shutil.which
5dab97a Add an error message, see also #1139.
e2cd228 Dict comprehension items call should now work, fixes #1129
c1014e0 Fix flow analysis test
62a3f99 Fix a wrong branch check, fixes #1128
6ebe3f8 Drop 3.3 tests from travis
50812b5 A simple yield should not cause an error, fixes #1117
d10eff5 Travis: report coverage also to codecov.io
6748faa Fix _get_numpy_doc_string_cls: use cache
fc14aad Fix namespace autocompletion error
3c909a9 Travis: remove TOXENV=cov from allowed failures
b94b45c Environment._get_version: add msgs with exceptions
a95274d None/False/True are atom non-terminals in the syntax tree, fixes #1103
8d48e74 When searching submodules, use all of __path__, fixes #1105
9149956 Specially crafted docstrings sometimes lead to errors, fixes #1103
ba96c21 Follow up from the last async issue, fixes more related things about #1092.
8494164 Fix an async funcdef issue, fixes 1092.
4075c38 In some very rare cases it was possible to get an interpreter crash
because of this bug. Fixes #1087
0bcd170 Start using our own monkeypatch function for some things
ceb5509 Include function return type annotation in docstring if it is present
88243d2 Don't catch IndexError where we don't have to
5f37d08 Extend create_environment to accept an executable path
aa6857d check_fs: handle FileNotFoundError
2018-07-14 12:31:11 +02:00
Daniel Hahler
7cade1fb62 Update submodule pythonx/parso 6f385bd...e6bc924
* pythonx/parso 6f385bd...e6bc924 (44):
      > Use a setuptools that still supports py33
      > 3.1 release notes
      > Use one simple functions to check for funcdefs in diff parser
      > Make sure to treat async funcdefs the same way as normal funcdefs
      > Fix an issue in the diff parser
      > Asterisks in function definitions may be at the end of a func without a comma, fixes #44
      > Remove some TODOs that were fixed
      > Error recovery should not match the whole line in case of an invalid token, fixes #40
      > docs: enable searchbox
      > Merge branch 'pgen'
      > Merge branch 'master' of github.com:davidhalter/parso
      > Add docstring
      > Add some comments
      > Use a set instead of dict if it's not necessary
      > Simplify some code
      > Some refactorings for simplicity
      > Use NFAArc as a class
      > Some more renames
      > Another rename
      > Rename
      > Move the grammar parsing to a separate module
      > More renames
      > Rename
      > Separate generating dfas from parsing
      > Cleanup some names
      > Remove some code that is not used anymore
      > Some cleanups and documentation
      > Move out some more functions out of classes
      > Some more refactorings for clarification
      > Factor out start_symbol into a better position
      > Refactor out dfas
      > Document pgen grammars a bit better
      > addarc -> add_arc
      > Refactor some things in pgen
      > Move some initializations
      > Change license again. The year shouldn't matter
      > Make first private
      > Change copyright years
      > Remove some code from the grammar
      > Separate the grammar generation from the grammar parsing
      > In pgen now everything is named grammar and not c
      > Better recovery for online classes and functions
      > Fix one-line error recovery for all things that are using a suite
      > Add a debug function for first tokens
2018-07-10 14:46:01 +02:00
Daniel Hahler
1773837a11 syntax: use "hi def" everywhere
This allows for keeping user configuration.
2018-07-10 12:49:48 +02:00
Daniel Hahler
67fd8c6572 s:init_python: fix check for Python 2
Fixes https://github.com/davidhalter/jedi-vim/issues/841.
2018-07-08 04:31:58 +02:00
Daniel Hahler
d3d9a91ae6 init: improve handling of import errors (#840)
* jedi_vim.jedi_import_error: add location

This is useful for debugging.  It contains e.g. the path to parso, if
importing failed from there.

Example:

> Error: jedi-vim failed to initialize Python: jedi#setup_python_imports: could not import jedi: cannot import name 'PythonTokenTypes' (in /…/jedi-vim/pythonx/jedi/jedi/api/completion.py:1). (in function jedi#init_python[3]..<SNR>44_init_python[27]..jedi#setup_python_imports, line 37)

* init: handle jedi_vim.jedi_import_error in Vim plugin

Using `set shortmess+=F` would suppress the `:echom` used in
`jedi_vim.no_jedi_warning` [1].

This patch makes `jedi#setup_python_imports` handle the error instead.

1: https://github.com/neovim/neovim/issues/8675

* Revisit error handling with loading jedi_vim

* jedi#debug_info: display parso submodule separately

* Fix jedi#reinit_python

* fixup! Revisit error handling with loading jedi_vim

* display_debug_info: handle exceptions with environment.get_sys_path

* fixup! Revisit error handling with loading jedi_vim

[ci skip]
2018-07-04 22:12:07 +02:00
Daniel Hahler
0361d6c633 s:init_python: handle g:jedi#force_py_version again (#834)
It was removed previously, since it now refers to the environment being
used.

This brings it back for now.

There could be a separate var for it later, and/or it needs changes
later (or rather the environment needs a new variable name, since it
should refer to the executable really) - but this is good for now I think.

Fixes https://github.com/davidhalter/jedi-vim/issues/833
2018-07-04 17:55:25 +02:00
Dave Halter
a54729ef63 Use the official Jedi goto API instead of multiple calls
Fixes #802.
2018-07-04 00:03:11 +02:00
tobaloidee
5f98bfb62e Add logo (#837)
This has been force-pushed.

See https://github.com/davidhalter/jedi-vim/pull/837 for other variants,
and the reason for force-pushing.
2018-06-26 18:07:14 +02:00
Daniel Hahler
745dc8a559 jedi#setup_python_imports: better SyntaxError handling
Uses `repr` for SyntaxErrors.

Related: https://github.com/neovim/python-client/pull/221
2018-06-23 11:28:41 +02:00
Vivian
84a5299c8f Fix spelling error 2018-05-29 19:33:30 +02:00
Daniel Hahler
d4006ab1bf Fix s:init_python
Just check for `has('python3')` / `has('python')`.

Fixes 72a2643f7c (r28922063).
2018-05-21 23:37:14 +02:00
Daniel Hahler
ed8153ef2b Update submodule pythonx/parso 579146b...6f385bd
* pythonx/parso 579146b...6f385bd (7):
      > Not testing Python 3.3 anymore on travis. It seems to be broken
      > Add a changelog for 0.2.1
      > Push the version
      > The diff parser was slighly off with prefixes, fixes #1121
      > A better repr for the endmarker
      > Merge branch 'master' of github.com:davidhalter/parso
      > Fix a prefix issue with error leafs.
2018-05-21 23:35:42 +02:00
Daniel Hahler
f07ff6a535 Fix flake8 W605: invalid escape sequence '\{w,d}' 2018-05-10 22:40:58 +02:00
Dave Halter
6781eb17da Small documentation change 2018-05-09 16:04:47 +02:00
Dave Halter
5ad782d920 Remove a strange sentence 2018-05-09 16:04:47 +02:00
Daniel Hahler
d75aaa470e Improve jedi_vim.get_environment
- cache current environment
- s/jedi.get_python_environment/jedi.get_system_environment: the former
  does not exist (renamed in https://github.com/davidhalter/jedi/commit/336087f)
- improve error display
2018-05-09 16:04:47 +02:00
Daniel Hahler
56eb0f6d63 Improve display_debug_info 2018-05-09 16:04:47 +02:00
Dave Halter
835e329883 Some improvements for the virtualenv patch 2018-05-09 16:04:47 +02:00
Dave Halter
49fa267e59 The jedi API changed a bit 2018-05-09 16:04:47 +02:00
Dave Halter
fa1aaa10cf Fix the jedi-vim debug tool, fixes #795 2018-05-09 16:04:47 +02:00
Dave Halter
e54a17ec71 Document force_py_version better 2018-05-09 16:04:47 +02:00
Dave Halter
48a9ea085d Force the Python environment correctly 2018-05-09 16:04:47 +02:00
Dave Halter
72a2643f7c Use the environment for completions. 2018-05-09 16:04:47 +02:00
Dave Halter
57cbf1421f Somehow the virtual env prefix is set in VIM.
This basically corrupts VIM's Python, because it might be having a differnet prefix (Python 3.6) than sys path. I don't know who came up with this - probably it's just how Python loads venvs - but it's definitely not good. Fortunately we can just reset it and be happy.
2018-05-09 16:04:47 +02:00
Daniel Hahler
7894b38c0c tests: move .cache to build, rename test/_utils.vim 2018-04-19 21:55:19 +02:00
Daniel Hahler
1c3078e9f9 get_script: additional_dynamic_modules: add only listed buffers
Unlisted buffers might come e.g. from `set viminfo+=%`, and Jedi would
crash on them.

This could additionally check for them to be readable, but this should
be handled in Jedi itself anyway.
2018-04-17 23:55:30 +02:00
Daniel Hahler
79b332a3c6 Update submodule pythonx/jedi 02f238c...bd7c65d
* pythonx/jedi 02f238c...bd7c65d (413):
      > Finally fix all the get_system_environment issues
      > Fix a test
      > There's really no bin/activate needed for an environment to work
      > Document get_sys_path and change the signature of get_system_environment a bit
      > Rework the time cache.
      > Cache default environment
      > Require parso 0.2.0 at least
      > Set a release date
      > Don't install the latest pip version anymore in appveyor
      > Fix some references
      > Mention Virtualenv support in readme and features
      > Title case for Mänu :)
      > Better overview over functions in the documentation
      > A small docs correction
      > Remove the old static analysis stuff. It was never really used
      > Fix a lot of old docs code that doesn't exist anymore
      > Remove the old parser documentation (that's now part of parso)
      > Don't call it the plugin API anymore, that's confusing
      > Reorder some functions
      > Adda  lot of environment documentation to sphinx
      > find_python_environments -> find_system_environments
      > A small refactoring
      > Remove from_executable, were not really using it, yet.
      > For the second time in a row it's called creationflags not creation_flags
      > Refactor something small
      > Remove an unnecessary else
      > CREATE_NO_WINDOW was introduced in Python 3.7 and didn't exist before
      > The SameEnvironment should not load by default if it's a portable
      > Do binary comparisons to get virtualenvs working and not just venvs
      > Use the correct parameter name for creation flags
      > Add a way to generalize Popen
      > Check the windows environments in a better way
      > Fix some issues with the latest changes
      > DefaultEnvironment -> SameEnvironment
      > Better docs for Environment
      > Some docstrings
      > Make the Environment clearly non-public
      > Make some names public
      > Make sure Windows environments are safe
      > Fix the module_name issue again
      > Write a test for #1079 to avoid a regression in the future.
      > Cleanup some of the module cache stuff
      > Do not cache unimportable compiled module (#1079)
      > Merge branch 'master' of github.com:davidhalter/jedi
      > Multiple inheritance completion in Python 2 did not work
      > Give the run.py script an environment parameter
      > Fix an import
      > Merge the environment changes for Windows
      > Better tests for venvs
      > Write a test for venvs
      > Obviously Python 3 syntax cannot be used in Python 2
      > Update the changelog about f-strings
      > Use the latest parso version from master.
      > Better goto definition for fstrings
      > Fix an issue around the new grammar
      > Fix some fstring issues for now
      > Make a few modifications to always use the latest environment available.
      > Better tests for fstrings
      > With the changes in parso, f-strings are now completable
      > With the changes in parso, f-strings are now completable
      > Fix lambda dynamic param searches, fixes #1070
      > Cleanup the namespace lookups so that it also works for Python 3.7
      > Add a note about the fixed Windows tests in the changelog
      > Add micbou to AUTHORS
      > Add a badge for AppVeyor. Running tests for Windows
      > Add comment explaining why test_versions is disabled on Windows
      > Add JEDI_TEST_ENVIRONMENT_EXECUTABLE for AppVeyor
      > Add AppVeyor configuration
      > Improve venv_and_pths test
      > Properly raise broken pipe exception
      > Remove SourceLair from products, because it's a paid product
      > Add a note to the readme.
      > Fix another windows issue
      > Merge branch 'master' of github.com:davidhalter/jedi
      > Merge the windows fixes
      > Some code cleanup
      > Fix another error that surfaced in pandas
      > Fix an issue with docstrings that contain errors
      > Upgrade the wx widgets paths
      > Somehow forgot about subscriptlist. Just ignore those for now.
      > Fix the first issue in #1010
      > colorama should always color, even if it's not a shell
      > os.path.join completion speed test is sometimes slow, so give it a bit more of time
      > Fix some code_lines issues
      > Remove stdout/stderr from subprocesses (redirected to /dev/null)
      > Add the module_path again
      > Clean up the namedtuple test for #1060
      > All modules now have a code_lines attribute, see #1062
      > The release date for 0.12.0 should not be set, yet. See #1061.
      > And now remove a pep0484 function that is no longer needed
      > Some more code to a function
      > More rewriting of the pep0484 logic
      > Start moving some of the pep0484 comment code around
      > Cleanup some instance stuff
      > Better docs for funciton annotations
      > Fix an error in param comments
      > Catch parser errors instead of error recovery when splitting param comments
      > Merge branch 'function_comment' of https://github.com/wilfred/jedi into mypy-comments
      > Fix a few version issues in tests
      > Use inspect.Parameter.kind for better differentiation between param types
      > Fix REPL completion param name completion
      > Add keyword argument test for #292
      > Fix an interpreter test in Python 2
      > Clean up zombie subprocesses, fixes #1048
      > Fix an issue around __dir__ in the interpreter
      > Fix doctest for replstartup
      > Fix shell completion issues and documentation
      > Merge branch 'master' of github.com:davidhalter/jedi
      > Fix issues with default parameters in functions and classes
      > Correct mistakes of lambda names
      > eval_element -> eval_node
      > Use the correct class for params when used in names. Fixes #1006
      > Get rid of a regex warning, where escaping was not properly used in a normal string
      > Get rid of the imp library import in Python3 to avoid warnings, fixes #1001
      > Don't need the tests from #122
      > Refactor the namespace package tests
      > Add a failing test for nested PEP420 namespace packages
      > Include __init__.py files in search for the project directory, fixes #773
      > Add pytest cache to gitignore
      > Improve some documentation/a failing doctest
      > Fix the recursion error with globals
      > Always pop nodes in recursion detector
      > Globals should be looked up with the same priority as other defined nodes.
      > fix set.append syntax error
      > Add a few bits to the changelog
      > Autocompletion in comments should at least not fail
      > Fix the last async issue
      > Fix a few numpydocs tests
      > Fix some more await things
      > Fix a yield from test
      > AbstractIterableMixin -> IterableMixin
      > Support generator returns when used with yield from.
      > Show in a test that something doesn't work properly around async analysis
      > A few documentation improvements
      > Try to make the whole Builtin overwriting more abstract
      > Fix a small remaining issue in Python 2
      > Reorder tests to make the async stuff pass on all python versions
      > Fix for all python versions
      > Getting more edget cases work in 3.6 for async
      > Fix an issue with async for
      > Use the await method properly and just use it instead of some crazy things
      > Refactor the way builtins can be overwritten by jedi's own contexts
      > Move all the asynchronous contexts to a separate module
      > Fix the merge issues. Now async stuff should at least partially work
      > Merge the async branch
      > Get rid of an unused import
      > Add the name always to the script module
      > Add the travere_parents function to a utility directory
      > Fix Python 2 old-school relative imports
      > Use the project path as a prefix, because many times it's used as a higher priority than other stuff
      > Move the buildout_project stuff to a separate examples folder
      > Rename of buildout stuff
      > Small rename
      > Use generators instead of complicated return of lists
      > Some more sys path corrections.
      > Generalize the use of smart import paths
      > Better handling of smart sys path
      > Some simplifications
      > Add comments to implicit namespaces and fix some minor things.
      > Merge the implicit namespace improvement (pkgutils.itermodules modification)
      > Relative imports should be working again even when used in more special occasions. Fixes #973
      > parent_module is not needed for loading modules
      > Try to avoid CachedMetaClass for modules
      > DOn't check the parser cache, that's parso's responsibility
      > Better module loading
      > Try to put all module loading in one place including namespace packages
      > Unify load_module access
      > Prepare a test to eventually solve a relative import problem
      > Add a module cache that has a bit more capabilites
      > print_to_stderr needs to be used with one argument
      > Print errors that happen when importing certain objects
      > Use unicode literals, to avoid potential issues
      > Merge branch 'master' of github.com:davidhalter/jedi
      > Fix some more dict.get/dict.values stuff
      > Implememnt dict.values for FakeDict to avoid a recursion error. Fixes #1014.
      > Add better error reporting
      > Use a better string
      > Add better debugging for an assert, see also #1010
      > Make some things clearer about lazy contexts
      > Finding the autocompletion stack is a bit more complicated than I initially thought
      > Move the ahead of time tests to the pep0526 file
      > Fix an issue where a default value was wrongly used
      > Update the ahead of time tests
      > Fix the last remaining issues with ahead of time annotations, see #982
      > Fix a bug related to a wrong parametrization at one point
      > Merge branch 'master' of https://github.com/johannesmik/jedi
      > Force unicode on django paths
      > Forgot to add the examples folder
      > Fix a goto_assignments issue with a better internal API
      > Merge remote-tracking branch 'origin/master' into virtualenv
      > Disable predefined name analysis (if stmts) for all non-analysis tasks
      > Remove something that obviously never happened
      > Reorder some open flags for Python 2
      > inspect.signature throws weird errors sometimes, just make it a bit simpler
      > Fix the implicit namespace test
      > Undo most of the namespace changes and use module again
      > Differentiate between namespace and module as a type
      > Use Scripts for virtualenvs instead of bin for windows
      > Refactor django path support
      > Fix project path finding
      > Add a repr for Project
      > Use the PathFinder, because the FileFinder doesn't work without suffixes
      > Create the importer stuff Python2.7 and 3.3
      > Trying to use the import machinery to import jedi/parso in python3.4+
      > Better reporting of internal errors
      > Better error handling for subprocesses
      > Another merge with master
      > Get rid of a cwd to tmpdir, because with the subprocess it doesn't behave the same depending on which tests you run first
      > Hopefully the last merge with master
      > Merge with master again
      > Merge with master
      > Get rid of some potential issues when using pandas interactively
      > Clarity
      > Remove the get_default_project caching
      > Add a comment about why the project is None in the subprocess
      > evaluate.project doesn't exist anymore. Eliminated code that used it
      > At the moment, don't allow projects as an input to script
      > Remove the old project
      > Make the new project API fully work in tests
      > Try to migrate to the new project API
      > Refactor to make configuratios of sys paths easier
      > Use the evaluate.project sys path stuff for api.project
      > Cache the default project
      > A possible introduction for projects
      > Check for safe and unsafe environments when searching for them
      > Sith still used NotFoundError which doesn't exist anymore in jedi
      > Ignore pypy in travis for now
      > A path to ignore in coveragerc was wrong
      > Allowing the cov tests did not properly work. Trying again.
      > Somehow previously removed the allowed failurs of TOXENV=cov
      > Try to put env variables on one line
      > Coverage was unfortunately excluded
      > Merge with master
      > Add a comment to refactoring that it's not in active development
      > Change coveragerc a bit
      > Use Python3.4 for coverage.
      > Correct the issue about has_zlib
      > Move the zip tests to the environment
      > Only execute the zipimport tests fully if zlib is available for the environment Python.
      > Some tests that involved jedi were actually a bit wrong and only worked in certain environments.
      > Skip some 3.3 tests for travis
      > Skipping was done wrong
      > Try a bit more if modifying the PATH is now possible.
      > A comparison was wrong
      > A new version of the travis install script
      > Try to use the virtual env that was defined in the VIRTUAL_ENV variable, if possible.
      > If a subprocess gets killed by an OOM killer or whatever it should respawn and raise an InternalError
      > Merge Subprocess and CompiledSubprocess
      > Try to recover from errors that are happening in subprocesses
      > Move the default environment around
      > More travis trying
      > Better debugging for travis
      > Forgot to add the executable bit to the travis installer.
      > Experiment with travis and installing packages differently
      > The tags should be annotated if possible
      > Remove 2.6 from travis
      > Correct the travis file
      > Some refactoring to finally get tests working with py27 and 3 environments
      > Use the parser to check for certain namedtuple features
      > Use unicode strings in test to pass some tests in Python 2
      > Use Script everywhere where cwd_at is used, otherwise Python 2.7 is annoying
      > The given sys_path gets converted to unicode now in py2
      > Try to avoid the pth tests not working because of the created virtualenv in tox
      > Test if virtualenvs and pth files work
      > Move the module name searching to the subprocess
      > Move the last test out of test_regressions and delete the file
      > Move most of the regression tests into other test files
      > Cleanup test_regression tests
      > Move test_integration_keywrod to test_api/test_keyword
      > Cleanup the docstring tests
      > More test_evaluate Script fixtures
      > stdlib fixture conversions
      > More Script fixture conversions in test_evaluate
      > Migrate parso integration to script fixture
      > Use Script in more places
      > Use the Script fixture more generally
      > Differentiate between different Python versions in a specific test
      > Start replacing Script calls with a fixture
      > Monkeypatch the Unpickler in Python3.3
      > Try to pass the environment variable for JEDI_TEST_ENVIRONMENT to pytest over tox
      > Correct the two last unicode issues
      > Some repr went crazy
      > Make it more clear for debugging where dynamic search ended
      > Fix pep0484 comments
      > Better display of descriptors
      > Remove some of the last py27 errors that were caused in combination with 3.6
      > Forgot to cast a map to a list
      > Fixing more py27 stuff
      > More unicode literals
      > Use force_unicode for all sys paths
      > Add a print_to_stderr function in compatibility
      > Some more small improvements for Python 2
      > There were a few bugs in the previous commit
      > Use unicode in way more cases
      > Use unicode always for getting special objects
      > Skip the correct tests
      > Always use the parser of the environment
      > Try to test on travis with different jedi test environment variables
      > Try adding more automated tests to travis
      > Fix potential issues with py2 analysis
      > Check for bytes and unicode in dicts for Python 2
      > Eliminate is_py3 usages
      > Don't use python_version directly on evaluator anymore
      > Use unicode always in getattr
      > Fix an issue with the new behavior of special methods
      > Fix some more py36 to py27 issues
      > Refactor some things regarding Python 2 support
      > Also don't cast do a string for other names
      > Casting to str is not necessary
      > Skip tests according to the current environment
      > Remove unused keyword code
      > Do more comparisons in the subprocess
      > Use unicode in compiled access
      > Remove unused code
      > Refactor allowed_getattr_callback a bit to not raise random errors.
      > The default of one function was not actually used
      > The string_name of a Name should always be unicode
      > Refactor a bit and force unicode in some places and use an appropriate function name for it
      > Fix a test fail because of the unicode changes
      > The environment selection had a bug
      > More unicode conversions
      > Don't use getattr, use the abstractions
      > More unicode conversions
      > Avoid execution of Jedi in test setup
      > Start using a lot more unicode literals for Python 2
      > Make it possible to explicitly state the version in pytest for different envs
      > Use unicode sys paths always
      > Don't cast bytes to strings when unpickling
      > By default enable cross Python version tests in tox
      > Skip more tests if it's necessary.
      > Move the import logic to the subprocess
      > Move even more import stuff to a separate function
      > Move some import parts around to refactor it
      > Make ImplicitNamespaceContext a bit cleaner
      > Change two tests that were written in a strange way
      > Add a way to skip typing tests in non default environments
      > Use better error messages for import errors
      > Start using the new virtualenv code
      > Start using the correct parser for each environment
      > Add a way to specify environments in tox
      > Fix sys_path propagation for builtins load_module
      > A small refactoring
      > Merge branch 'master' into virtualenv
      > evaluate/docstrings.py
      > Don't import numpydoc in the beginning
      > Ignore the build directory for pytest
      > Refactor environments a bit
      > Make it possible to get the right version parser for a certain environment
      > api.virtualenv -> api.environment
      > DefaultEnvironment -> get_default_environment
      > Better support for searching python environments
      > Add an optimization around compiled dir()
      > Fix a potential issue in evaluate/stdlib
      > Cache the subprocess results
      > Remove unit test class from speed tests
      > Make get_repr static in access.
      > There was a bug in creating modules in a subprocess
      > Fix the Python 2.7 tests
      > Don't try to pickle ellipsis
      > Ignore __main__ modules
      > Use builtins_module instead of BUILTINS
      > Don't use the pickler modification anymore. That doesn't work in other python versions and was in general a bit hard to do
      > Remove the last test failures.
      > Get the subprocess mostly working
      > Don't use the create function anymore in compiled
      > Use even more subprocess accesses
      > Use the subprocess access to create acceses
      > Use access handles everywhere
      > Create a way of accessing access objects through a subprocess
      > Use a class instead of a dict in get_special_objects
      > Move get_special_object
      > Move load_module a bit around
      > Move another usage of create to builtin_from_name
      > Use sys.modules instead of __import__
      > Remove unused code
      > Start creating access objects in a different way
      > Use create_simple_object for a lot of use cases
      > Move some of the compiled.create calls to compiled.builtin_from_name
      > Move some stuff from compiled to context
      > Remove stuff from CompiledObject that didn't belong there and wasn't used
      > create_from_access -> _create_from_access
      > Refactor a bit more and remove the parent_context parameter from create_from_access
      > Isolate fake stuff a bit more
      > Simplify an if
      > Rewrite bases
      > Use create only for non access objects
      > Some simplification of _create_from_access
      > Remove the old now unused fake code
      > Fake context python code is now not the base for a lot of things anymore. It just gets executed.
      > Rename SelfNameFilter to SelfAttributeFilter
      > Simplify one if statement
      > Refactor LazyInstanceName -> SelfName
      > Fix all tests except fake docstring stuff
      > Fix a slice test with a better helper function
      > Fix a few more tests
      > Creating objects works now a bit better but is a huge mess.
      > Get a lot of tests passing
      > Make params work with access
      > Add an access abstraction (only array tests work, yet)
      > The check if we should add type completions is now a bit more obvious
      > Eliminate CompiledObject.type
      > Make some faked things private
      > Cleanup some compiled stuff.
      > Progress in executing builtin stuff in submodules.
      > Exceptions now also work over the subprocess.
      > Finally got compiled_objects and the access to them working
      > Progress when working with evaluators
      > Make the subprocesses work and return the right sys paths for the different versions
      > Make it possible to connect to a subprocess to get the sys path
      > Subprocess progress
      > Use types instead of special objects (see also #988)
      > Some subprocess progress
      > virtualenv progress
2018-04-17 23:42:11 +02:00
Daniel Hahler
24a0369d0f Update submodule pythonx/parso 2ca629a...579146b
* pythonx/parso 2ca629a...579146b (22):
      > Don't test python 2.6 in tox by default, because the newer pip versions don't support it anymore
      > Set a release date
      > Fix whitespace issues with prefixes
      > Use proper leafs for fstring start/end
      > Fix a Python 2 related issue.
      > Forgot to delete another print. WTF I'm tired
      > Unfortunately forgot to delete a print
      > Start to write a changelog for 0.2.0
      > Merge branch 'fstrings'
      > A comparison was slightly off
      > Ignore the pytest cache
      > Fix an error message change in Python 3.7
      > Fix an issue in the diff parser about endmarker newlines
      > Remove the copyright for good
      > Remove copyright years from documentation. (Closes: #25)
      > Fix typo: containes→contains
      > tox: use older pytest only for py26/py33
      > Merge branch 'master' of github.com:davidhalter/parso
      > Don't use a newer pytest version
      > The tags should be annotated if possible
      > Bump version for the next release
      > Use 3.7-dev not 3.7 for travis
2018-04-17 23:42:11 +02:00
Daniel Hahler
d430570fd0 pythonx/jedi_vim: flake8 fixes 2018-04-17 23:26:22 +02:00
Daniel Hahler
79c6172be7 Update .gitignore
- add build/ (used in Makefile)
- use .pytest-cache instead of .cache for newer pytest
2018-04-17 23:25:48 +02:00
35 changed files with 1768 additions and 669 deletions

7
.coveragerc Normal file
View File

@@ -0,0 +1,7 @@
[run]
branch = 1
# Used by/for neovim-python-client.
concurrency = greenlet
[report]
include = pythonx/jedi_*.py,test/*

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
github: [davidhalter]

63
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,63 @@
name: ci
on: [push, pull_request]
jobs:
tests:
runs-on: ubuntu-20.04
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
submodules: recursive
- name: Setup
run: |
sudo pip install pytest
vim --version
#- name: Setup tmate session
# uses: mxschmitt/action-tmate@v3
- name: Run tests
run: 'make test'
code-quality:
runs-on: ubuntu-20.04
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
submodules: recursive
- name: Run tests
run: |
vim --version
make check
coverage:
runs-on: ubuntu-20.04
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
submodules: recursive
- name: Install dependencies
run: |
sudo add-apt-repository ppa:neovim-ppa/stable -y
sudo apt-get update -q
sudo apt-get install neovim -y
sudo pip install pynvim pytest-cov
sudo pip list
nvim --version
- name: Run tests
run: |
make --keep-going test_coverage BUILD_VIRTUAL_ENV=$VIRTUAL_ENV
- name: Upload coverage data
run: |
coverage xml
bash <(curl -s https://codecov.io/bash) -X fix -f coverage.xml -F py${TRAVIS_PYTHON_VERSION//./}

4
.gitignore vendored
View File

@@ -3,4 +3,6 @@
*.py[cod]
.ropeproject
doc/tags
.cache
.pytest-cache
build
.coverage*

View File

@@ -1,15 +1,31 @@
sudo: false
dist: bionic
language: python
python: 3.6
python: 3.8
env:
matrix:
- ENV=test
- ENV=check
- ENV=test
- ENV=check
- ENV=test_coverage
install:
- |
if [ "$ENV" = "test" ]; then
python3.6 -m pip install pytest
pip install pytest
elif [ "$ENV" = "test_coverage" ]; then
sudo add-apt-repository ppa:neovim-ppa/stable -y
sudo apt-get update -q
sudo apt-get install neovim -y
pip install pynvim pytest-cov
pip list
nvim --version
else
vim --version
fi
script:
- vim --version
- make "$ENV"
- make --keep-going "$ENV" BUILD_VIRTUAL_ENV=$VIRTUAL_ENV
after_script:
- |
if [ "$ENV" = "test_coverage" ]; then
coverage xml
travis_retry bash <(curl -s https://codecov.io/bash) -X fix -f coverage.xml -F py${TRAVIS_PYTHON_VERSION//./}
fi

View File

@@ -51,5 +51,11 @@ Bagrat Aznauryan (@n9code)
Tomoyuki Kashiro (@kashiro)
Tommy Allen (@tweekmonster)
Mingliang (@Aulddays)
Brian Mego (@brianmego)
Stevan Milic (@stevanmilic) <stevan.milic@yahoo.com>
Konstantin Glukhov (@Konstantin-Glukhov)
Seungchan An (@SeungChan92) <dev.issea1015@gmail.com>
Thomas Blauth (@ThomasBlauth) <thomas.blauth@protonmail.com>
James Cherti (@jamescherti)
@something are github user names.

View File

@@ -1,16 +1,35 @@
test:
py.test
BUILD_VIRTUAL_ENV:=build/venv
build:
mkdir $@
build/vint: | build
virtualenv $@
$@/bin/pip install vim-vint
check: LINT_FILES:=after autoload ftplugin plugin
check: build/vint
build/vint/bin/vint $(LINT_FILES)
test:
pytest
test_nvim:
VSPEC_VIM=nvim pytest
test_coverage: export PYTEST_ADDOPTS:=--cov pythonx --cov test --cov-report=term-missing:skip-covered
test_coverage: test_nvim
$(dir $(BUILD_VIRTUAL_ENV)):
mkdir -p $@
$(BUILD_VIRTUAL_ENV): | $(dir $(BUILD_VIRTUAL_ENV))
python -m venv $@
$(BUILD_VIRTUAL_ENV)/bin/vint: | $(BUILD_VIRTUAL_ENV)
$|/bin/python -m pip install vim-vint==0.3.21
$(BUILD_VIRTUAL_ENV)/bin/flake8: | $(BUILD_VIRTUAL_ENV)
$|/bin/python -m pip install -q flake8==3.7.8
vint: $(BUILD_VIRTUAL_ENV)/bin/vint
$(BUILD_VIRTUAL_ENV)/bin/vint after autoload ftplugin plugin
flake8: $(BUILD_VIRTUAL_ENV)/bin/flake8
$(BUILD_VIRTUAL_ENV)/bin/flake8 pythonx/jedi_*.py
check: vint flake8
clean:
rm -rf .cache build
rm -rf build
.PHONY: test check clean
.PHONY: test check clean vint flake8

View File

@@ -1,3 +1,5 @@
.. image:: https://github.com/davidhalter/jedi-vim/blob/master/doc/logotype-a.svg
#################################################
jedi-vim - awesome Python autocompletion with VIM
#################################################
@@ -56,9 +58,10 @@ generators, there is broad support.
Apart from that, jedi-vim supports the following commands
- Completion ``<C-Space>``
- Goto assignments ``<leader>g`` (typical goto function)
- Goto definitions ``<leader>d`` (follow identifier as far as possible,
- Goto assignment ``<leader>g`` (typical goto function)
- Goto definition ``<leader>d`` (follow identifier as far as possible,
includes imports and statements)
- Goto (typing) stub ``<leader>s``
- Show Documentation/Pydoc ``K`` (shows a popup with assignments)
- Renaming ``<leader>r``
- Usages ``<leader>n`` (shows all the usages of a name)
@@ -70,10 +73,9 @@ Installation
Requirements
------------
You need a VIM version that was compiled with Python 2.6 or later
(``+python`` or ``+python3``), which is typical for most distributions on
Linux. You can check this from within VIM using
``:python3 import sys; print(sys.version)`` (use ``:python`` for Python 2).
You need a VIM version that was compiled with Python 3 or later
(``+python3``). You can check this from within VIM using
``:python3 import sys; print(sys.version)``.
Manual installation
-------------------
@@ -81,9 +83,8 @@ Manual installation
You might want to use `pathogen <https://github.com/tpope/vim-pathogen>`_ or
`Vundle <https://github.com/gmarik/vundle>`_ to install jedi-vim.
The first thing you need after that is an up-to-date version of Jedi. You can
either install it via ``pip install jedi`` or with
``git submodule update --init`` in your jedi-vim repository.
The first thing you need after that is an up-to-date version of Jedi. Install
``git submodule update --init --recursive`` in your jedi-vim repository.
Example installation command using Pathogen:
@@ -99,6 +100,9 @@ Add the following line in your `~/.vimrc`
Plugin 'davidhalter/jedi-vim'
For installing Jedi, ``pip install jedi`` will also work, but you might run
into issues when working in virtual environments. Please use git submodules.
Installation with your distribution
-----------------------------------
@@ -110,7 +114,7 @@ It is also available on
`Ubuntu (≥14.04) <http://packages.ubuntu.com/vim-python-jedi>`__ as
vim-python-jedi.
On Fedora Linux, it is available as
`vim-jedi <https://apps.fedoraproject.org/packages/vim-jedi>`__.
`vim-jedi <https://packages.fedoraproject.org/pkgs/vim-jedi/vim-jedi/>`__.
Please note that this version might be quite old compared to using jedi-vim
from Git.
@@ -178,8 +182,10 @@ and usually saves one keypress.
Jedi displays function call signatures in insert mode in real-time, highlighting
the current argument. The call signatures can be displayed as a pop-up in the
buffer (set to 1, the default), which has the advantage of being easier to refer
to, or in Vim's command line aligned with the function call (set to 2), which
buffer (set to 1 by default (with the conceal feature), 2 otherwise),
which has the advantage of being easier to refer to (but is a hack with
many drawbacks since it changes the buffer's contents),
or in Vim's command line aligned with the function call (set to 2), which
can improve the integrity of Vim's undo history.
.. code-block:: vim
@@ -195,12 +201,26 @@ get more information. If you set them to ``""``, they are not assigned.
let g:jedi#goto_command = "<leader>d"
let g:jedi#goto_assignments_command = "<leader>g"
let g:jedi#goto_stubs_command = "<leader>s"
let g:jedi#goto_definitions_command = ""
let g:jedi#documentation_command = "K"
let g:jedi#usages_command = "<leader>n"
let g:jedi#completions_command = "<C-Space>"
let g:jedi#rename_command = "<leader>r"
let g:jedi#rename_command_keep_name = "<leader>R"
An example for setting up your project:
.. code-block:: vim
let g:jedi#environment_path = "/usr/bin/python3.9"
jedi-vim tries its best to guess your virtual env. If you want to work with a
specific virtual environment however, you can point jedi-vim towards it:
.. code-block:: vim
let g:jedi#environment_path = "venv"
Finally, if you don't want completion, but all the other features, use:
@@ -211,6 +231,12 @@ Finally, if you don't want completion, but all the other features, use:
FAQ
===
I want to use Jedi with a Python 2 Environment, but it's not listed under "Known environments"
----------------------------------------------------------------------------------------------
Starting with version 0.18.0 Jedi dropped support for Python 2.
I don't want the docstring window to popup during completion
------------------------------------------------------------

View File

@@ -26,7 +26,9 @@ if g:jedi#show_call_signatures > 0 && has('conceal')
hi def link jediFunction CursorLine
hi def link jediFat TabLine
else
hi jediFunction term=NONE cterm=NONE ctermfg=6 guifg=Black gui=NONE ctermbg=0 guibg=Grey
hi jediFat term=bold,underline cterm=bold,underline gui=bold,underline ctermbg=0 guibg=#555555
hi def jediFunction term=NONE cterm=NONE ctermfg=6 guifg=Black gui=NONE ctermbg=0 guibg=Grey
hi def jediFat term=bold,underline cterm=bold,underline gui=bold,underline ctermbg=0 guibg=#555555
endif
endif
hi def jediUsage cterm=reverse gui=standout

View File

@@ -19,14 +19,16 @@ let s:default_settings = {
\ 'goto_command': "'<leader>d'",
\ 'goto_assignments_command': "'<leader>g'",
\ 'goto_definitions_command': "''",
\ 'goto_stubs_command': "'<leader>s'",
\ 'completions_command': "'<C-Space>'",
\ 'call_signatures_command': "'<leader>n'",
\ 'usages_command': "'<leader>n'",
\ 'rename_command': "'<leader>r'",
\ 'rename_command_keep_name': "'<leader>R'",
\ 'completions_enabled': 1,
\ 'popup_on_dot': 'g:jedi#completions_enabled',
\ 'documentation_command': "'K'",
\ 'show_call_signatures': 1,
\ 'show_call_signatures': has('conceal') ? 1 : 2,
\ 'show_call_signatures_delay': 500,
\ 'call_signature_escape': "'?!?'",
\ 'auto_close_doc': 1,
@@ -34,7 +36,11 @@ let s:default_settings = {
\ 'popup_select_first': 1,
\ 'quickfix_window_height': 10,
\ 'force_py_version': "'auto'",
\ 'smart_auto_mappings': 1,
\ 'environment_path': "'auto'",
\ 'added_sys_path': '[]',
\ 'project_path': "'auto'",
\ 'smart_auto_mappings': 0,
\ 'case_insensitive_completion': 1,
\ 'use_tag_stack': 1
\ }
@@ -51,86 +57,68 @@ for [s:key, s:val] in items(s:default_settings)
endif
endfor
let s:supports_buffer_usages = has('nvim') || exists('*prop_add')
" ------------------------------------------------------------------------
" Python initialization
" ------------------------------------------------------------------------
let s:script_path = fnameescape(expand('<sfile>:p:h:h'))
let s:script_path = expand('<sfile>:p:h:h')
function! s:init_python() abort
if g:jedi#force_py_version !=# 'auto'
" Always use the user supplied version.
try
return jedi#setup_py_version(g:jedi#force_py_version)
catch
throw 'Could not setup g:jedi#force_py_version: '.v:exception
endtry
endif
" Handle "auto" version.
if has('nvim') || (has('python') && has('python3'))
" Neovim usually has both python providers. Skipping the `has` check
" avoids starting both of them.
" Get default python version from interpreter in $PATH.
let s:def_py = system('python -c '.shellescape('import sys; sys.stdout.write(str(sys.version_info[0]))'))
if v:shell_error != 0 || !len(s:def_py)
if !exists('g:jedi#squelch_py_warning')
echohl WarningMsg
echom 'Warning: jedi-vim failed to get Python version from sys.version_info: ' . s:def_py
echom 'Falling back to version 2.'
echohl None
endif
let s:def_py = 2
elseif &verbose
echom 'jedi-vim: auto-detected Python: '.s:def_py
endif
" Make sure that the auto-detected version is available in Vim.
if !has('nvim') || has('python'.(s:def_py == 2 ? '' : s:def_py))
return jedi#setup_py_version(s:def_py)
endif
" Add a warning in case the auto-detected version is not available,
" usually because of a missing neovim module in a VIRTUAL_ENV.
if has('nvim')
echohl WarningMsg
echom 'jedi-vim: the detected Python version ('.s:def_py.')'
\ 'is not functional.'
\ 'Is the "neovim" module installed?'
\ 'While jedi-vim will work, it might not use the'
\ 'expected Python path.'
echohl None
endif
endif
if has('python')
call jedi#setup_py_version(2)
elseif has('python3')
call jedi#setup_py_version(3)
else
throw 'jedi-vim requires Vim with support for Python 2 or 3.'
" Use g:jedi#force_py_version for loading Jedi, or fall back to using
" `has()` - preferring Python 3.
if !has('python3')
throw 'jedi-vim requires Vim with support for Python 3.'
endif
call jedi#setup_python_imports()
return 1
endfunction
function! jedi#reinit_python() abort
unlet! s:_init_python
let s:_init_python = -1
call jedi#init_python()
endfunction
" This is meant to be called with `:unsilent` (for &shortmess+=F).
function! s:display_exception() abort
let error_lines = split(v:exception, '\n')
let msg = 'Error: jedi-vim failed to initialize Python: '
\ .error_lines[0].' (in '.v:throwpoint.')'
if len(error_lines) > 1
echohl ErrorMsg
echom 'jedi-vim error: '.error_lines[0]
for line in error_lines[1:]
echom line
endfor
echohl None
let help_cmd = ':JediDebugInfo'
if exists(':checkhealth') == 2
let help_cmd .= ' / :checkhealth'
endif
let msg .= printf('. See :messages and/or %s for more information.',
\ help_cmd)
endif
redraw " Redraw to only have the main message by default.
echoerr msg
endfunction
let s:_init_python = -1
function! jedi#init_python() abort
if s:_init_python == -1
let s:_init_python = 0
try
let s:_init_python = s:init_python()
catch
let s:_init_python = 0
let s:_init_python = 1
catch /^jedi/
" Only catch errors from jedi-vim itself here, so that for
" unexpected Python exceptions the traceback will be shown
" (e.g. with NameError in jedi#setup_python_imports's code).
if !exists('g:jedi#squelch_py_warning')
echoerr 'Error: jedi-vim failed to initialize Python: '
\ .v:exception.' (in '.v:throwpoint.')'
unsilent call s:display_exception()
endif
endtry
endif
@@ -138,79 +126,79 @@ function! jedi#init_python() abort
endfunction
let s:python_version = 'null'
function! jedi#setup_py_version(py_version) abort
if a:py_version == 2
let cmd_exec = 'python'
let s:python_version = 2
elseif a:py_version == 3
let cmd_exec = 'python3'
let s:python_version = 3
else
throw 'jedi#setup_py_version: invalid py_version: '.a:py_version
endif
execute 'command! -nargs=1 PythonJedi '.cmd_exec.' <args>'
let s:init_outcome = 0
function! jedi#setup_python_imports() abort
let g:_jedi_init_error = 0
let init_lines = [
\ 'import vim',
\ 'def _jedi_handle_exc(exc_info):',
\ ' try:',
\ ' from jedi_vim_debug import format_exc_info',
\ ' vim.vars["_jedi_init_error"] = format_exc_info(exc_info)',
\ ' except Exception:',
\ ' import traceback',
\ ' vim.vars["_jedi_init_error"] = "\\n".join(traceback.format_exception(*exc_info))',
\ 'try:',
\ ' import jedi_vim',
\ ' if hasattr(jedi_vim, "jedi_import_error"):',
\ ' _jedi_handle_exc(jedi_vim.jedi_import_error)',
\ 'except Exception as exc:',
\ ' vim.command(''let s:init_outcome = "could not import jedi_vim: {0}: {1}"''.format(exc.__class__.__name__, exc))',
\ 'else:',
\ ' vim.command(''let s:init_outcome = 1'')']
try
exe 'PythonJedi exec('''.escape(join(init_lines, '\n'), "'").''')'
catch
throw printf('jedi#setup_py_version: failed to run Python for initialization: %s.', v:exception)
endtry
if s:init_outcome is 0
throw 'jedi#setup_py_version: failed to run Python for initialization.'
elseif s:init_outcome isnot 1
throw printf('jedi#setup_py_version: %s.', s:init_outcome)
\ ' _jedi_handle_exc(sys.exc_info())',
\ ]
exe 'python3 exec('''.escape(join(init_lines, '\n'), "'").''')'
if g:_jedi_init_error isnot 0
throw printf('jedi#setup_python_imports: %s', g:_jedi_init_error)
endif
return 1
endfunction
function! jedi#debug_info() abort
if s:python_version ==# 'null'
try
call s:init_python()
catch
echohl WarningMsg | echom v:exception | echohl None
return
endtry
endif
if &verbose
if &filetype !=# 'python'
echohl WarningMsg | echo 'You should run this in a buffer with filetype "python".' | echohl None
endif
endif
let spath = shellescape(s:script_path)
echo '#### Jedi-vim debug information'
echo 'Using Python version:' s:python_version
let pyeval = s:python_version == 3 ? 'py3eval' : 'pyeval'
echo "\n"
echo '##### jedi-vim version'
echo "\n"
echo ' - jedi-vim git version: '
echon substitute(system('git -C '.spath.' describe --tags --always --dirty'), '\v\n$', '', '')
echo ' - jedi git submodule status: '
echon substitute(system('git -C '.spath.' submodule status pythonx/jedi'), '\v\n$', '', '')
echo ' - parso git submodule status: '
echon substitute(system('git -C '.spath.' submodule status pythonx/parso'), '\v\n$', '', '')
echo "\n"
echo '##### Global Python'
echo "\n"
echo 'Using Python version 3 to access Jedi.'
let s:pythonjedi_called = 0
PythonJedi import vim; vim.command('let s:pythonjedi_called = 1')
try
python3 import vim; vim.command('let s:pythonjedi_called = 1')
catch
echo 'Error when trying to import vim: '.v:exception
endtry
if !s:pythonjedi_called
echohl WarningMsg
echom 'PythonJedi failed to run, likely a Python config issue.'
if exists(':CheckHealth') == 2
echom 'Try :CheckHealth for more information.'
echom 'python3 failed to run, likely a Python config issue.'
if exists(':checkhealth') == 2
echom 'Try :checkhealth for more information.'
endif
echohl None
else
PythonJedi from jedi_vim_debug import display_debug_info
PythonJedi display_debug_info()
try
python3 from jedi_vim_debug import display_debug_info
python3 display_debug_info()
catch
echohl WarningMsg
echo 'Error when running display_debug_info: '.v:exception
echohl None
endtry
endif
echo ' - jedi-vim git version: '
echon substitute(system('git -C '.s:script_path.' describe --tags --always --dirty'), '\v\n$', '', '')
echo ' - jedi git submodule status: '
echon substitute(system('git -C '.s:script_path.' submodule status'), '\v\n$', '', '')
echo "\n"
echo '##### Settings'
echo "\n"
echo '```'
let jedi_settings = items(filter(copy(g:), "v:key =~# '\\v^jedi#'"))
let has_nondefault_settings = 0
@@ -252,23 +240,6 @@ function! jedi#debug_info() abort
endif
endfunction
function! jedi#force_py_version(py_version) abort
let g:jedi#force_py_version = a:py_version
return jedi#setup_py_version(a:py_version)
endfunction
function! jedi#force_py_version_switch() abort
if g:jedi#force_py_version == 2
call jedi#force_py_version(3)
elseif g:jedi#force_py_version == 3
call jedi#force_py_version(2)
else
throw "Don't know how to switch from ".g:jedi#force_py_version.'!'
endif
endfunction
" Helper function instead of `python vim.eval()`, and `.command()` because
" these also return error definitions.
function! jedi#_vim_exceptions(str, is_eval) abort
@@ -293,57 +264,158 @@ call jedi#init_python() " Might throw an error.
" functions that call python code
" ------------------------------------------------------------------------
function! jedi#goto() abort
PythonJedi jedi_vim.goto(mode="goto")
python3 jedi_vim.goto(mode="goto")
endfunction
function! jedi#goto_assignments() abort
PythonJedi jedi_vim.goto(mode="assignment")
python3 jedi_vim.goto(mode="assignment")
endfunction
function! jedi#goto_definitions() abort
PythonJedi jedi_vim.goto(mode="definition")
python3 jedi_vim.goto(mode="definition")
endfunction
function! jedi#goto_stubs() abort
python3 jedi_vim.goto(mode="stubs")
endfunction
function! jedi#usages() abort
PythonJedi jedi_vim.goto(mode="related_name")
if exists('#jedi_usages#BufWinEnter')
call jedi#clear_usages()
endif
python3 jedi_vim.usages()
endfunction
if !s:supports_buffer_usages
" Hide usages in the current window.
" Only handles the current window due to matchdelete() restrictions.
function! jedi#_hide_usages_in_win() abort
let winnr = winnr()
let matchids = getwinvar(winnr, '_jedi_usages_vim_matchids', [])
for matchid in matchids[1:]
call matchdelete(matchid)
endfor
call setwinvar(winnr, '_jedi_usages_vim_matchids', [])
" Remove the autocommands that might have triggered this function.
augroup jedi_usages
exe 'autocmd! * <buffer='.winbufnr(winnr).'>'
augroup END
unlet! b:_jedi_usages_needs_clear
endfunction
" Show usages for current window (Vim without textprops only).
function! jedi#_show_usages_in_win() abort
python3 jedi_vim.highlight_usages_for_vim_win()
if !exists('#jedi_usages#TextChanged#<buffer>')
augroup jedi_usages
" Unset highlights on any changes to this buffer.
" NOTE: Neovim's API handles movement of highlights, but would only
" need to clear highlights that are changed inline.
autocmd TextChanged <buffer> call jedi#_clear_buffer_usages()
" Hide usages when the buffer is removed from the window, or when
" entering insert mode (but keep them for later).
autocmd BufWinLeave,InsertEnter <buffer> call jedi#_hide_usages_in_win()
augroup END
endif
endfunction
" Remove usages for the current buffer (and all its windows).
function! jedi#_clear_buffer_usages() abort
let bufnr = bufnr('%')
let nvim_src_ids = getbufvar(bufnr, '_jedi_usages_src_ids', [])
if !empty(nvim_src_ids)
for src_id in nvim_src_ids
" TODO: could only clear highlights below/after changed line?!
call nvim_buf_clear_highlight(bufnr, src_id, 0, -1)
endfor
else
call jedi#_hide_usages_in_win()
endif
endfunction
endif
" Remove/unset global usages.
function! jedi#clear_usages() abort
augroup jedi_usages
autocmd! BufWinEnter
autocmd! WinEnter
augroup END
if !s:supports_buffer_usages
" Vim without textprops: clear current window,
" autocommands will clean others on demand.
call jedi#_hide_usages_in_win()
" Setup autocommands to clear remaining highlights on WinEnter.
augroup jedi_usages
for b in range(1, bufnr('$'))
if getbufvar(b, '_jedi_usages_needs_clear')
exe 'autocmd WinEnter <buffer='.b.'> call jedi#_hide_usages_in_win()'
endif
endfor
augroup END
endif
python3 jedi_vim.clear_usages()
endfunction
function! jedi#rename(...) abort
PythonJedi jedi_vim.rename()
python3 jedi_vim.rename()
endfunction
function! jedi#rename_visual(...) abort
PythonJedi jedi_vim.rename_visual()
python3 jedi_vim.rename_visual()
endfunction
function! jedi#rename_keep_name(...) abort
python3 jedi_vim.rename(delete_word=False)
endfunction
function! jedi#rename_visual_keep_name(...) abort
python3 jedi_vim.rename_visual(use_selected_text_as_prompt_answer=True)
endfunction
function! jedi#completions(findstart, base) abort
PythonJedi jedi_vim.completions()
python3 jedi_vim.completions()
endfunction
function! jedi#enable_speed_debugging() abort
PythonJedi jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout, speed=True, warnings=False, notices=False)
python3 jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout, speed=True, warnings=False, notices=False)
endfunction
function! jedi#enable_debugging() abort
PythonJedi jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout)
python3 jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout)
endfunction
function! jedi#disable_debugging() abort
PythonJedi jedi_vim.jedi.set_debug_function(None)
python3 jedi_vim.jedi.set_debug_function(None)
endfunction
function! jedi#py_import(args) abort
PythonJedi jedi_vim.py_import()
python3 jedi_vim.py_import()
endfun
function! jedi#choose_environment(args) abort
python3 jedi_vim.choose_environment()
endfun
function! jedi#load_project(args) abort
python3 jedi_vim.load_project()
endfun
function! jedi#py_import_completions(argl, cmdl, pos) abort
PythonJedi jedi_vim.py_import_completions()
python3 jedi_vim.py_import_completions()
endfun
function! jedi#clear_cache(bang) abort
PythonJedi jedi_vim.jedi.cache.clear_time_caches(True)
if a:bang
PythonJedi jedi_vim.jedi.parser.utils.ParserPickling.clear_cache()
python3 jedi_vim.jedi.cache.clear_time_caches(True)
else
python3 jedi_vim.jedi.cache.clear_time_caches(False)
endif
endfunction
@@ -352,7 +424,7 @@ endfunction
" show_documentation
" ------------------------------------------------------------------------
function! jedi#show_documentation() abort
PythonJedi if jedi_vim.show_documentation() is None: vim.command('return')
python3 if jedi_vim.show_documentation() is None: vim.command('return')
let bn = bufnr('__doc__')
if bn > 0
@@ -385,27 +457,57 @@ function! jedi#show_documentation() abort
" quit comands
nnoremap <buffer> q ZQ
execute 'nnoremap <buffer> '.g:jedi#documentation_command.' ZQ'
if len(g:jedi#documentation_command)
execute 'nnoremap <buffer> '.g:jedi#documentation_command.' ZQ'
endif
endfunction
" ------------------------------------------------------------------------
" helper functions
" ------------------------------------------------------------------------
function! jedi#add_goto_window(len) abort
set lazyredraw
cclose
function! jedi#add_goto_window(for_usages, len) abort
let height = min([a:len, g:jedi#quickfix_window_height])
" Use :copen to go to the window always - the user should select an entry.
execute 'belowright copen '.height
set nolazyredraw
if &filetype !=# 'qf'
echoerr printf('jedi-vim: unexpected ft with current window (%s), please report!', &filetype)
endif
if g:jedi#use_tabs_not_buffers == 1
noremap <buffer> <CR> :call jedi#goto_window_on_enter()<CR>
endif
augroup jedi_goto_window
au!
au WinLeave <buffer> q " automatically leave, if an option is chosen
if a:for_usages
autocmd BufWinLeave <buffer> call jedi#clear_usages()
else
autocmd WinLeave <buffer> q " automatically leave, if an option is chosen
endif
augroup END
redraw!
if a:for_usages && !has('nvim')
if s:supports_buffer_usages
" Setup autocommand for pending highlights with Vim's textprops.
" (cannot be added to unlisted buffers)
augroup jedi_usages
autocmd! BufWinEnter * call s:usages_for_pending_buffers()
augroup END
else
" Setup global autocommand to display any usages for a window.
" Gets removed when closing the quickfix window that displays them, or
" when clearing them (e.g. on TextChanged).
augroup jedi_usages
autocmd! BufWinEnter,WinEnter * call jedi#_show_usages_in_win()
augroup END
endif
endif
endfunction
" Highlight usages for a buffer if not done so yet (Neovim only).
function! s:usages_for_pending_buffers() abort
python3 jedi_vim._handle_pending_usages_for_buf()
endfunction
@@ -415,7 +517,7 @@ function! jedi#goto_window_on_enter() abort
if l:data.bufnr
" close goto_window buffer
normal! ZQ
PythonJedi jedi_vim.new_buffer(vim.eval('bufname(l:data.bufnr)'))
python3 jedi_vim.set_buffer(vim.eval('bufname(l:data.bufnr)'))
call cursor(l:data.lnum, l:data.col)
else
echohl WarningMsg | echo 'Builtin module cannot be opened.' | echohl None
@@ -461,22 +563,23 @@ function! jedi#show_call_signatures() abort
" Caching. On the same line only.
if line == s:show_call_signatures_last[0]
" Check if the number of commas and parenthesis before or after the
" Check if the number of special signs before or after the
" cursor has not changed since the last call, which means that the
" argument position was not changed and we can skip repainting.
let prevcol = s:show_call_signatures_last[1]
let prevline = s:show_call_signatures_last[2]
if substitute(curline[:col-2], '[^,()]', '', 'g')
\ == substitute(prevline[:prevcol-2], '[^,()]', '', 'g')
\ && substitute(curline[(col-2):], '[^,()]', '', 'g')
\ == substitute(prevline[(prevcol-2):], '[^,()]', '', 'g')
let no_special = '[^,()=]'
if substitute(curline[:col-2], no_special, '', 'g')
\ == substitute(prevline[:prevcol-2], no_special, '', 'g')
\ && substitute(curline[(col-2):], no_special, '', 'g')
\ == substitute(prevline[(prevcol-2):], no_special, '', 'g')
let reload_signatures = 0
endif
endif
let s:show_call_signatures_last = [line, col, curline]
if reload_signatures
PythonJedi jedi_vim.show_call_signatures()
python3 jedi_vim.show_call_signatures()
endif
endfunction
@@ -487,7 +590,7 @@ function! jedi#clear_call_signatures() abort
endif
let s:show_call_signatures_last = [0, 0, '']
PythonJedi jedi_vim.clear_call_signatures()
python3 jedi_vim.clear_call_signatures()
endfunction
@@ -632,7 +735,7 @@ function! jedi#setup_completion() abort
endif
endfunction
"PythonJedi jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout, speed=True, warnings=False, notices=False)
"PythonJedi jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout)
"python3 jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout, speed=True, warnings=False, notices=False)
"python3 jedi_vim.jedi.set_debug_function(jedi_vim.print_to_stdout)
" vim: set et ts=4:

7
codecov.yml Normal file
View File

@@ -0,0 +1,7 @@
coverage:
status:
project: true
patch: true
changes: true
comment: off

View File

@@ -1,75 +0,0 @@
import os
import subprocess
import urllib.request
import zipfile
import pytest
VSPEC_URL = 'https://github.com/kana/vim-vspec/archive/1.4.1.zip'
CACHE_FOLDER = '.cache'
VSPEC_FOLDER = os.path.join(CACHE_FOLDER, 'vim-vspec-1.4.1')
VSPEC_RUNNER = os.path.join(VSPEC_FOLDER, 'bin/vspec')
TEST_DIR = 'test'
class IntegrationTestFile(object):
def __init__(self, path):
self.path = path
def run(self):
output = subprocess.check_output(
[VSPEC_RUNNER, '.', VSPEC_FOLDER, self.path])
had_ok = False
for line in output.splitlines():
if (line.startswith(b'not ok') or
line.startswith(b'Error') or
line.startswith(b'Bail out!')):
pytest.fail("{0} failed:\n{1}".format(
self.path, output.decode('utf-8')), pytrace=False)
if not had_ok and line.startswith(b'ok'):
had_ok = True
if not had_ok:
pytest.fail("{0} failed: no 'ok' found:\n{1}".format(
self.path, output.decode('utf-8')), pytrace=False)
@property
def name(self):
name = os.path.basename(self.path)
name, _, _ = name.rpartition('.')
return name
def __repr__(self):
return "<%s: %s>" % (type(self), self.path)
def pytest_configure(config):
if not os.path.isdir(CACHE_FOLDER):
os.mkdir(CACHE_FOLDER)
if not os.path.exists(VSPEC_FOLDER):
name, hdrs = urllib.request.urlretrieve(VSPEC_URL)
z = zipfile.ZipFile(name)
for n in z.namelist():
dest = os.path.join(CACHE_FOLDER, n)
destdir = os.path.dirname(dest)
if not os.path.isdir(destdir):
os.makedirs(destdir)
data = z.read(n)
if not os.path.isdir(dest):
with open(dest, 'wb') as f:
f.write(data)
z.close()
os.chmod(VSPEC_RUNNER, 0o777)
def pytest_generate_tests(metafunc):
"""
:type metafunc: _pytest.python.Metafunc
"""
def collect_tests():
for f in os.listdir(TEST_DIR):
if f.endswith('.vim') and f != 'utils.vim':
yield IntegrationTestFile(os.path.join(TEST_DIR, f))
tests = list(collect_tests())
metafunc.parametrize('case', tests, ids=[test.name for test in tests])

View File

@@ -24,11 +24,12 @@ Contents *jedi-vim-contents*
5.1. Start completion |g:jedi#completions_command|
5.2. Go to definition |g:jedi#goto_command|
5.3. Go to assignment |g:jedi#goto_assignments_command|
5.4 Go to definition (deprecated) |g:jedi#goto_definitions_command|
5.4 Go to stub |g:jedi#goto_stubs_command|
5.5. Show documentation |g:jedi#documentation_command|
5.6. Rename variables |g:jedi#rename_command|
5.7. Show name usages |g:jedi#usages_command|
5.8. Open module by name |:Pyimport|
5.7. Rename variables (Reuse name) |g:jedi#rename_command_keep_name|
5.8. Show name usages |g:jedi#usages_command|
5.9. Open module by name |:Pyimport|
6. Configuration |jedi-vim-configuration|
6.1. auto_initialization |g:jedi#auto_initialization|
6.2. auto_vim_configuration |g:jedi#auto_vim_configuration|
@@ -44,6 +45,12 @@ Contents *jedi-vim-contents*
6.12. force_py_version |g:jedi#force_py_version|
6.13. smart_auto_mappings |g:jedi#smart_auto_mappings|
6.14. use_tag_stack |g:jedi#use_tag_stack|
6.15. environment_path |g:jedi#environment_path|
|b:jedi_environment_path|
6.16. added_sys_path |g:jedi#added_sys_path|
|b:jedi_added_sys_path|
6.17. case_insensitive_completion |g:jedi#case_insensitive_completion|
|b:jedi_case_insensitive_completion|
7. Testing |jedi-vim-testing|
8. Contributing |jedi-vim-contributing|
9. License |jedi-vim-license|
@@ -60,7 +67,7 @@ Jedi-vim is a Vim binding to the awesome Python autocompletion library
- Infers function arguments from Sphinx/Epydoc strings
- Doesn't execute Python code
- Supports Virtualenv
- Supports Python 2.5+ and 3.2+
- Supports Python 2.7 and 3.4+
By leveraging this library, jedi-vim adds the following capabilities to Vim:
@@ -78,15 +85,6 @@ By leveraging this library, jedi-vim adds the following capabilities to Vim:
First of all, jedi-vim requires Vim to be compiled with the `+python` option.
The jedi library has to be installed for jedi-vim to work properly. You can
install it first, by using e.g. your distribution's package manager, or by
using pip: >
pip install jedi
However, you can also install it as a git submodule if you don't want to use
jedi for anything but this plugin. How to do this is detailed below.
It is best if you have VIM >= 7.3, compiled with the `+conceal` option. With
older versions, you will probably not see the parameter recommendation list
for functions after typing the open bracket. Some platforms (including OS X
@@ -107,11 +105,7 @@ feature (such as MacVim on OS X, which also contains a console binary).
------------------------------------------------------------------------------
2.1. Installing manually *jedi-vim-installation-manually*
1a. Get the latest repository from Github: >
git clone http://github.com/davidhalter/jedi-vim path/to/bundles/jedi-vim
1b. If you want to install jedi as a submodule instead, issue this command: >
1. If you want to install jedi as a submodule instead, issue this command: >
git clone --recursive http://github.com/davidhalter/jedi-vim
@@ -161,8 +155,8 @@ repositories. On Arch Linux, install vim-jedi. On Debian (8+) or Ubuntu
==============================================================================
3. Supported Python features *jedi-vim-support*
The Jedi library does all the hard work behind the scenes. It supports
completion of a large number of Python features, among them:
The Jedi library does all the hard work behind the scenes. It understands most
Python features, among them:
- Builtins
- Multiple `return`s or `yield`s
@@ -183,12 +177,14 @@ completion of a large number of Python features, among them:
- Class decorators (py3k feature, are being ignored at the moment, but are
parsed)
- Simple/usual `sys.path` modifications
- `isinstance` checks for `if`/`while`/`assert` case, that doesnt work with
- `isinstance` checks for `if`/`while`/`assert` case, that doesn't work with
Jedi
- Stubs
- And more...
Note: This list is not necessarily up to date. For a complete list of
features, please refer to the Jedi documentation at http://jedi.jedidjah.ch.
features, please refer to the Jedi documentation at
http://jedi.readthedocs.io.
==============================================================================
4. Usage *jedi-vim-usage*
@@ -285,12 +281,11 @@ This function finds the first definition of the function/class under the
cursor. It produces an error if the definition is not in a Python file.
------------------------------------------------------------------------------
5.4. `g:jedi#goto_definitions_command` *g:jedi#goto_definitions_command*
Function: `jedi#goto_definitions()`
Default: - Go to original definition
5.4. `g:jedi#goto_stubs_command` *g:jedi#goto_stubs_command*
Function: `jedi#goto_stubs()`
Default: <leader>s Go to stub
NOTE: Deprecated. Use |g:jedi#goto_command| / |jedi#goto()| instead, which
currently uses this internally.
Finds the stub of the function/class under the cursor.
------------------------------------------------------------------------------
5.5. `g:jedi#documentation_command` *g:jedi#documentation_command*
@@ -308,12 +303,24 @@ Default: <leader>r Rename variables
Jedi-vim deletes the word currently under the cursor and puts Vim in insert
mode, where the user is expected to enter the new variable name. Upon leaving
insert mode, jedi-vim then renames all occurences of the old variable name
insert mode, jedi-vim then renames all occurrences of the old variable name
with the new one. The number of performed renames is displayed in the command
line.
------------------------------------------------------------------------------
5.7. `g:jedi#usages_command` *g:jedi#usages_command*
5.7. `g:jedi#rename_command_keep_name` *g:jedi#rename_command_keep_name*
Function: `jedi#rename()`
Default: <leader>R Rename variables
(This key mapping does not delete the word under the cursor)
Jedi-vim keeps the word currently under the cursor, moves the cursor to the end
of the word, and puts Vim in insert mode, where the user is expected to enter
the new variable name. Upon leaving insert mode, Jedi-vim then renames all
occurrences of the old variable name with the new one. The number of performed
renames is displayed in the command line.
------------------------------------------------------------------------------
5.8. `g:jedi#usages_command` *g:jedi#usages_command*
Function: `jedi#usages()`
Default: <leader>n Show usages of a name.
@@ -321,7 +328,7 @@ The quickfix window is populated with a list of all names which point to the
definition of the name under the cursor.
------------------------------------------------------------------------------
5.8. Open module by name *:Pyimport*
5.9. Open module by name *:Pyimport*
Function: `jedi#py_import(args)`
Default: :Pyimport e.g. `:Pyimport os` shows os.py in VIM.
@@ -355,7 +362,8 @@ Default: 1 (Perform automatic initialization)
------------------------------------------------------------------------------
6.2. `g:jedi#auto_vim_configuration` *g:jedi#auto_vim_configuration*
Jedi-vim sets 'completeopt' to `menuone,longest,preview` by default, if
Jedi-vim sets 'completeopt' to `menuone,longest` and `popup` (for Vim version
numbers higher than 8.1.1882) respectively `preview` by default, if
'completeopt' is not changed from Vim's default.
It also remaps <Ctrl-C> to <Esc> in insert mode.
@@ -394,13 +402,15 @@ Default: 1 (Automatically select first completion entry)
------------------------------------------------------------------------------
6.5. `g:jedi#auto_close_doc` *g:jedi#auto_close_doc*
When doing completion, jedi-vim shows the docstring of the currently selected
item in a preview window. By default, this window is being closed after
When doing completion and jedi-vim shows the docstring of the currently selected
item in a preview (not a popup) window, this window is being closed after
insertion of a completion item.
Set this to 0 to leave the preview window open even after leaving insert mode.
This could be useful if you want to browse longer docstrings.
This setting is ignored if a popup instead of a preview window is used.
Options: 0 or 1
Default: 1 (Automatically close preview window upon leaving insert mode)
@@ -439,10 +449,10 @@ Default: 500
You can make jedi-vim open a new tab if you use the "go to", "show
definition", or "related names" commands. When you leave this at the default
(0), they open in the current buffer instead.
(0), they open in the current window instead.
Options: 0 or 1
Default: 0 (Command output is put in a new tab)
Default: 0 (Command output reuses current window)
------------------------------------------------------------------------------
6.9. `g:jedi#squelch_py_warning` *g:jedi#squelch_py_warning*
@@ -480,33 +490,32 @@ small a horizontal split happens.
------------------------------------------------------------------------------
6.12. `g:jedi#force_py_version` *g:jedi#force_py_version*
If you have installed both python 2 and python 3, you can force which one jedi
should use by setting this variable. It forces the internal Vim command, which
will be used for every jedi call to the respective python interpreter.
The variable can be set in the .vimrc like this to force python 3:
If you have installed multiple Python versions, you can force the Python
version that is going to be used.
You don't have to compile VIM with multiple Python versions.
The variable can be set in the .vimrc like this to force python 2:
let g:jedi#force_py_version = 3
let g:jedi#force_py_version = 2
This variable can be switched during runtime using the following function:
Function: `jedi#force_py_version_switch()`
By default jedi loads the latest Python version installed on your system that
can be found.
or set directly using this function, which has the same name as the variable:
Function: `jedi#force_py_version(py_version)`
This variable can be changed during runtime.
Options: 2 or 3
Default: "auto" (will use sys.version_info from "python" in your $PATH)
Options: 2, 2.7, 3, 3.5, 3.6, ...
Default: "auto"
------------------------------------------------------------------------------
6.13. `g:jedi#smart_auto_mappings` *g:jedi#smart_auto_mappings*
When you start typing `from module.name<space>` jedi-vim automatically
adds the "import" statement and displays the autocomplete popup.
can add the "import" statement and trigger the autocompletion popup.
This option can be disabled in the .vimrc:
`let g:jedi#smart_auto_mappings = 0`
You can enable this using: >
let g:jedi#smart_auto_mappings = 1
<
Options: 0 or 1
Default: 1 (enabled by default)
Default: 0 (disabled by default)
------------------------------------------------------------------------------
6.14. `g:jedi#use_tag_stack` *g:jedi#use_tag_stack*
@@ -519,6 +528,46 @@ definition with arbitrary changes to the |jumplist|.
Options: 0 or 1
Default: 1 (enabled by default)
------------------------------------------------------------------------------
6.15. `g:jedi#environment_path` *g:jedi#environment_path*
*b:jedi_environment_path*
To use a specific virtualenv or a specific Python version it is possible to
set an interpreter.
Both setting the directory and setting a project is working.
Examples: "/usr/bin/python3.9", "venv", "../venv", "../venv/bin/python"
The buffer-local variable `b:jedi_environment_path` can be used to override the
global variable `g:jedi#environment_path`.
Default: "auto"
------------------------------------------------------------------------------
6.16. `g:jedi#added_sys_path` *g:jedi#added_sys_path*
*b:jedi_added_sys_path*
To add extra sys_path.
The buffer-local variable `b:jedi_added_sys_path` can be used to add
additional extra sys_path.
Examples: ["../site-packages"]
Default: []
------------------------------------------------------------------------------
6.17. `g:jedi#case_insensitive_completion` *g:jedi#case_insensitive_completion*
*b:jedi_case_insensitive_completion*
0 to disable case insensitive completion.
1 to enable case insensitive completion (default).
The buffer-local variable `b:jedi_case_insensitive_completion` can be used to
override the global variable `g:jedi#case_insensitive_completion`.
Default: 1
==============================================================================
7. Testing *jedi-vim-testing*

140
doc/logotype-a.svg Normal file
View File

@@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="897.845px" height="247.51px" viewBox="0 0 897.845 247.51" enable-background="new 0 0 897.845 247.51"
xml:space="preserve">
<g>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="287.3965" y1="65.2686" x2="287.3965" y2="106.4546">
<stop offset="0" style="stop-color:#E27817"/>
<stop offset="0.3906" style="stop-color:#E47519"/>
<stop offset="0.7116" style="stop-color:#E96B1F"/>
<stop offset="1" style="stop-color:#F15A29"/>
</linearGradient>
<polygon fill="url(#SVGID_1_)" points="285.068,66.556 272.054,95.664 302.739,95.664 302.739,66.556 "/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="216.8877" y1="65.2686" x2="216.8877" y2="106.4546">
<stop offset="0" style="stop-color:#E27817"/>
<stop offset="0.3906" style="stop-color:#E47519"/>
<stop offset="0.7116" style="stop-color:#E96B1F"/>
<stop offset="1" style="stop-color:#F15A29"/>
</linearGradient>
<polygon fill="url(#SVGID_2_)" points="180.483,95.664 193.893,95.664 240.172,95.664 253.292,66.556 180.483,66.556 "/>
<g>
<polygon fill="#019733" points="256.464,59.293 253.603,65.696 253.593,65.696 253.197,66.592 240.172,95.7 215.738,150.321
199.788,185.978 231.676,185.978 231.676,185.969 272.071,95.7 275.634,87.737 285.089,66.592 288.355,59.293 "/>
</g>
<g>
<polygon fill="#019733" points="215.738,150.321 194.605,95.7 180.483,95.7 180.483,135.118 199.788,185.969 199.788,185.978
"/>
</g>
<path fill="#019733" d="M151.355,59.294v100.005h-28.989h-11.292v-7.972c3.644-4.232,6.749-9.936,6.749-16.218
c0-2.846-0.456-5.578-1.294-8.104h0.011l-4.274-12.151c-0.238-1.16-0.633-2.257-1.15-3.281v-0.032l-5.878-11.59
c-1.201-2.808-3.975-4.897-7.34-5.362c0.281-4.969,2.837-8.87,5.932-8.87l-3.137-1.004l3.137-3.033
c-5.01,0-9.098,5.775-9.388,13.021c-3.116,0.609-5.672,2.598-6.79,5.258l-5.723,11.271c-0.052,0.104-0.104,0.197-0.155,0.3v0.01
c-0.528,1.057-0.932,2.174-1.169,3.344l-4.232,12.079c-0.012,0.02-0.012,0.03-0.021,0.042c-0.828,2.525-1.294,5.258-1.294,8.104
c0,6.282,3.25,11.985,6.904,16.218v35.616h29.112h11.294h58.105V59.294H151.355z M86.554,117.834
c-0.673,2.019-2.442,3.252-3.954,2.744c-1.51-0.508-2.194-2.547-1.521-4.565c0.673-2.017,2.443-3.25,3.953-2.742
C86.544,113.777,87.228,115.817,86.554,117.834z M110.163,120.578c-1.51,0.508-3.27-0.726-3.954-2.744
c-0.672-2.017,0.011-4.057,1.521-4.563c1.512-0.508,3.282,0.726,3.955,2.742C112.357,118.031,111.674,120.07,110.163,120.578z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="134.6348" y1="65.2686" x2="134.6348" y2="106.4546">
<stop offset="0" style="stop-color:#E27817"/>
<stop offset="0.3906" style="stop-color:#E47519"/>
<stop offset="0.7116" style="stop-color:#E96B1F"/>
<stop offset="1" style="stop-color:#F15A29"/>
</linearGradient>
<polygon fill="url(#SVGID_3_)" points="151.292,66.556 117.914,66.556 117.914,95.664 145.981,95.664 151.292,95.664
151.355,95.664 151.355,66.592 151.292,66.592 "/>
<g opacity="0.5">
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="244.0713" y1="198.6924" x2="244.0713" y2="111.1674">
<stop offset="0" style="stop-color:#019733"/>
<stop offset="0.1363" style="stop-color:#0B732D;stop-opacity:0.8637"/>
<stop offset="0.2826" style="stop-color:#145529;stop-opacity:0.7174"/>
<stop offset="0.4366" style="stop-color:#1A3D25;stop-opacity:0.5634"/>
<stop offset="0.5997" style="stop-color:#1F2C22;stop-opacity:0.4003"/>
<stop offset="0.778" style="stop-color:#222221;stop-opacity:0.222"/>
<stop offset="1" style="stop-color:#231F20;stop-opacity:0"/>
</linearGradient>
<polygon fill="url(#SVGID_4_)" points="256.464,59.293 253.603,65.696 253.593,65.696 253.197,66.592 240.172,95.7
215.738,150.321 199.788,185.978 231.676,185.978 231.676,185.969 272.071,95.7 275.634,87.737 285.089,66.592 288.355,59.293
"/>
</g>
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="165.9131" y1="41.1123" x2="165.9131" y2="128.6277">
<stop offset="0" style="stop-color:#019733"/>
<stop offset="0.1363" style="stop-color:#0B732D;stop-opacity:0.8637"/>
<stop offset="0.2826" style="stop-color:#145529;stop-opacity:0.7174"/>
<stop offset="0.4366" style="stop-color:#1A3D25;stop-opacity:0.5634"/>
<stop offset="0.5997" style="stop-color:#1F2C22;stop-opacity:0.4003"/>
<stop offset="0.778" style="stop-color:#222221;stop-opacity:0.222"/>
<stop offset="1" style="stop-color:#231F20;stop-opacity:0"/>
</linearGradient>
<rect x="151.355" y="59.294" opacity="0.5" fill="url(#SVGID_5_)" width="29.116" height="127.649"/>
<g opacity="0.58">
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="198.1104" y1="83.4141" x2="198.1104" y2="154.2879">
<stop offset="0" style="stop-color:#019733"/>
<stop offset="0.0409" style="stop-color:#038E32;stop-opacity:0.9591"/>
<stop offset="0.2465" style="stop-color:#0F662B;stop-opacity:0.7535"/>
<stop offset="0.4491" style="stop-color:#184726;stop-opacity:0.5509"/>
<stop offset="0.6453" style="stop-color:#1E3123;stop-opacity:0.3547"/>
<stop offset="0.8322" style="stop-color:#222421;stop-opacity:0.1678"/>
<stop offset="1" style="stop-color:#231F20;stop-opacity:0"/>
</linearGradient>
<polygon fill="url(#SVGID_6_)" points="215.738,150.321 194.605,95.7 180.483,95.7 180.483,135.118 199.788,185.969
199.788,185.978 "/>
</g>
<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="127.7627" y1="192.1367" x2="127.7627" y2="137.5901">
<stop offset="0" style="stop-color:#019733"/>
<stop offset="0.0409" style="stop-color:#038E32;stop-opacity:0.9591"/>
<stop offset="0.2465" style="stop-color:#0F662B;stop-opacity:0.7535"/>
<stop offset="0.4491" style="stop-color:#184726;stop-opacity:0.5509"/>
<stop offset="0.6453" style="stop-color:#1E3123;stop-opacity:0.3547"/>
<stop offset="0.8322" style="stop-color:#222421;stop-opacity:0.1678"/>
<stop offset="1" style="stop-color:#231F20;stop-opacity:0"/>
</linearGradient>
<path opacity="0.6" fill="url(#SVGID_7_)" d="M151.355,59.294v100.005h-28.989h-11.292v-7.972
c3.644-4.232,6.749-9.936,6.749-16.218c0-2.846-0.456-5.578-1.294-8.104h0.011l-4.274-12.151c-0.238-1.16-0.633-2.257-1.15-3.281
v-0.032l-5.878-11.59c-1.201-2.808-3.975-4.897-7.34-5.362c0.281-4.969,2.837-8.87,5.932-8.87l-3.137-1.004l3.137-3.033
c-5.01,0-9.098,5.775-9.388,13.021c-3.116,0.609-5.672,2.598-6.79,5.258l-5.723,11.271c-0.052,0.104-0.104,0.197-0.155,0.3v0.01
c-0.528,1.057-0.932,2.174-1.169,3.344l-4.232,12.079c-0.012,0.02-0.012,0.03-0.021,0.042c-0.828,2.525-1.294,5.258-1.294,8.104
c0,6.282,3.25,11.985,6.904,16.218v35.616h29.112h11.294h58.105V59.294H151.355z M86.554,117.834
c-0.673,2.019-2.442,3.252-3.954,2.744c-1.51-0.508-2.194-2.547-1.521-4.565c0.673-2.017,2.443-3.25,3.953-2.742
C86.544,113.777,87.228,115.817,86.554,117.834z M110.163,120.578c-1.51,0.508-3.27-0.726-3.954-2.744
c-0.672-2.017,0.011-4.057,1.521-4.563c1.512-0.508,3.282,0.726,3.955,2.742C112.357,118.031,111.674,120.07,110.163,120.578z"/>
<g opacity="0.5">
<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="244.0713" y1="53.3584" x2="244.0713" y2="78.0277">
<stop offset="0" style="stop-color:#019733"/>
<stop offset="0.1363" style="stop-color:#0B732D;stop-opacity:0.8637"/>
<stop offset="0.2826" style="stop-color:#145529;stop-opacity:0.7174"/>
<stop offset="0.4366" style="stop-color:#1A3D25;stop-opacity:0.5634"/>
<stop offset="0.5997" style="stop-color:#1F2C22;stop-opacity:0.4003"/>
<stop offset="0.778" style="stop-color:#222221;stop-opacity:0.222"/>
<stop offset="1" style="stop-color:#231F20;stop-opacity:0"/>
</linearGradient>
<polygon fill="url(#SVGID_8_)" points="256.464,59.293 253.603,65.696 253.593,65.696 253.197,66.592 240.172,95.7
215.738,150.321 199.788,185.978 231.676,185.978 231.676,185.969 272.071,95.7 275.634,87.737 285.089,66.592 288.355,59.293
"/>
</g>
<polygon fill="#019733" points="180.483,59.198 183.329,66.556 180.471,66.556 "/>
<polygon fill="#019733" points="180.483,59.198 183.329,66.556 180.471,66.556 "/>
<g>
<polygon fill="#019733" points="290.713,66.592 285.054,66.592 288.32,59.293 "/>
<polygon fill="#019733" points="308.417,120.554 283.562,95.7 300.261,95.7 "/>
<polygon opacity="0.6" fill="#019733" points="308.417,120.554 283.562,95.7 300.261,95.7 "/>
<polygon fill="#019733" points="290.713,66.592 285.054,66.592 288.32,59.293 "/>
</g>
</g>
<g>
<path fill="#666666" d="M358.849,130.077v23.827h28.81V77.887h16.547v91.732h-62.987v-39.542H358.849z"/>
<path fill="#666666" d="M434.61,93.602v22.677h45.356v14.949H434.61v22.677h45.356v15.715h-62.987V77.887h62.987v15.715H434.61z"
/>
<path fill="#666666" d="M492.744,169.619V77.887h56.342l6.643,8.05v75.634l-6.579,8.049H492.744z M539.184,93.602h-28.811v60.303
h28.811V93.602z"/>
<path fill="#666666" d="M586.136,169.619h-17.632V77.887h17.632V169.619z"/>
<path fill="#666666" d="M598.913,116.278h33.281v14.949h-33.281V116.278z"/>
<path fill="#666666" d="M691.412,77.887h16.544l-19.995,91.732h-21.462l-21.527-91.732h17.63l13.798,70.588L691.412,77.887z"/>
<path fill="#666666" d="M738.364,169.619h-17.631V77.887h17.631V169.619z"/>
<path fill="#666666" d="M768.77,169.619h-17.632V77.887h17.632l17.886,50.273l18.59-50.273h16.545v91.732h-16.545v-38.392
l-12.84,38.392h-10.35l-13.286-38.392V169.619z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@@ -16,6 +16,9 @@ if g:jedi#auto_initialization
if len(g:jedi#goto_definitions_command)
execute 'nnoremap <buffer> '.g:jedi#goto_definitions_command.' :call jedi#goto_definitions()<CR>'
endif
if len(g:jedi#goto_stubs_command)
execute 'nnoremap <buffer> '.g:jedi#goto_stubs_command.' :call jedi#goto_stubs()<CR>'
endif
if len(g:jedi#usages_command)
execute 'nnoremap <buffer> '.g:jedi#usages_command.' :call jedi#usages()<CR>'
endif
@@ -24,12 +27,16 @@ if g:jedi#auto_initialization
execute 'nnoremap <buffer> '.g:jedi#rename_command.' :call jedi#rename()<CR>'
execute 'vnoremap <buffer> '.g:jedi#rename_command.' :call jedi#rename_visual()<CR>'
endif
if len(g:jedi#rename_command_keep_name)
execute 'nnoremap <buffer> '.g:jedi#rename_command_keep_name.' :call jedi#rename_keep_name()<CR>'
execute 'vnoremap <buffer> '.g:jedi#rename_command_keep_name.' :call jedi#rename_visual_keep_name()<CR>'
endif
" documentation/pydoc
if len(g:jedi#documentation_command)
execute 'nnoremap <silent> <buffer>'.g:jedi#documentation_command.' :call jedi#show_documentation()<CR>'
endif
if g:jedi#show_call_signatures > 0 && has('conceal')
if g:jedi#show_call_signatures > 0
call jedi#configure_call_signatures()
endif
@@ -41,10 +48,15 @@ if g:jedi#auto_initialization
inoremap <silent> <buffer> <space> <C-R>=jedi#smart_auto_mappings()<CR>
end
if g:jedi#auto_close_doc
if g:jedi#auto_close_doc && (&g:completeopt =~# '\<preview\>' && &g:completeopt !~# '\<popup\>')
" close preview if its still open after insert
augroup jedi_preview
autocmd! InsertLeave <buffer> if pumvisible() == 0|pclose|endif
if v:version > 704
autocmd CompleteDone <buffer> pclose
else
autocmd InsertLeave <buffer> if pumvisible() == 0|pclose|endif
autocmd CursorMovedI <buffer> if pumvisible() == 0|pclose|endif
endif
augroup END
endif
endif

View File

@@ -15,6 +15,11 @@ if get(g:, 'jedi#auto_vim_configuration', 1)
" jedi-vim really needs, otherwise jedi-vim cannot start.
filetype plugin on
augroup jedi_pyi
au!
autocmd BufNewFile,BufRead *.pyi set filetype=python
augroup END
" Change completeopt, but only if it was not set already.
" This gets done on VimEnter, since otherwise Vim fails to restore the
" screen. Neovim is not affected, this is likely caused by using
@@ -28,7 +33,12 @@ if get(g:, 'jedi#auto_vim_configuration', 1)
redir END
endif
if len(split(completeopt, '\n')) == 1
set completeopt=menuone,longest,preview
set completeopt=menuone,longest
if v:version > 801 || (v:version == 801 && has('patch-8.1.1882'))
set completeopt+=popup
else
set completeopt+=preview
endif
endif
endfunction
if has('nvim')
@@ -48,7 +58,25 @@ endif
" Pyimport command
command! -nargs=1 -complete=custom,jedi#py_import_completions Pyimport :call jedi#py_import(<q-args>)
command! -nargs=0 -bar JediDebugInfo call jedi#debug_info()
command! -nargs=? -complete=file JediChooseEnvironment :call jedi#choose_environment(<q-args>)
command! -nargs=? -complete=file JediLoadProject :call jedi#load_project(<q-args>)
function! s:jedi_debug_info()
" Ensure the autoload file has been loaded (and ignore any errors, which
" will be displayed with the debug info).
let unset = {}
let saved_squelch_py_warning = get(g:, 'jedi#squelch_py_warning', unset)
let g:jedi#squelch_py_warning = 1
call jedi#init_python()
if saved_squelch_py_warning is unset
unlet g:jedi#squelch_py_warning
else
let g:jedi#squelch_py_warning = saved_squelch_py_warning
endif
call jedi#debug_info()
endfunction
command! -nargs=0 -bar JediDebugInfo call s:jedi_debug_info()
command! -nargs=0 -bang JediClearCache call jedi#clear_cache(<bang>0)
" vim: set et ts=4:

View File

@@ -1,3 +0,0 @@
[pytest]
# Ignore all files
norecursedirs = *

View File

@@ -4,12 +4,14 @@ The Python parts of the Jedi library for VIM. It is mostly about communicating
with VIM.
"""
from typing import Optional
import traceback # for exception output
import re
import os
import sys
from shlex import split as shsplit
from contextlib import contextmanager
from pathlib import Path
try:
from itertools import zip_longest
except ImportError:
@@ -25,6 +27,16 @@ else:
ELLIPSIS = u""
try:
# Somehow sys.prefix is set in combination with VIM and virtualenvs.
# However the sys path is not affected. Just reset it to the normal value.
sys.prefix = sys.base_prefix
sys.exec_prefix = sys.base_exec_prefix
except AttributeError:
# If we're not in a virtualenv we don't care. Everything is fine.
pass
class PythonToVimStr(unicode):
""" Vim has a different string implementation of single quotes """
__slots__ = []
@@ -57,7 +69,9 @@ class VimError(Exception):
self.executing = executing
def __str__(self):
return self.message + '; created by: ' + repr(self.executing)
return "{}; created by {!r} (in {})".format(
self.message, self.executing, self.throwpoint
)
def _catch_exception(string, is_eval):
@@ -73,11 +87,11 @@ def _catch_exception(string, is_eval):
def vim_command(string):
_catch_exception(string, False)
_catch_exception(string, is_eval=False)
def vim_eval(string):
return _catch_exception(string, True)
return _catch_exception(string, is_eval=True)
def no_jedi_warning(error=None):
@@ -100,10 +114,9 @@ sys.path.insert(0, parso_path)
try:
import jedi
except ImportError as e:
no_jedi_warning(str(e))
except ImportError:
jedi = None
jedi_import_error = str(e)
jedi_import_error = sys.exc_info()
else:
try:
version = jedi.__version__
@@ -125,6 +138,58 @@ finally:
sys.path.remove(parso_path)
class VimCompat:
_eval_cache = {}
_func_cache = {}
@classmethod
def has(cls, what):
try:
return cls._eval_cache[what]
except KeyError:
ret = cls._eval_cache[what] = cls.call('has', what)
return ret
@classmethod
def call(cls, func, *args):
try:
f = cls._func_cache[func]
except KeyError:
if IS_NVIM:
f = cls._func_cache[func] = getattr(vim.funcs, func)
else:
f = cls._func_cache[func] = vim.Function(func)
return f(*args)
@classmethod
def setqflist(cls, items, title, context):
if cls.has('patch-7.4.2200'): # can set qf title.
what = {'title': title}
if cls.has('patch-8.0.0590'): # can set qf context
what['context'] = {'jedi_usages': context}
if cls.has('patch-8.0.0657'): # can set items via "what".
what['items'] = items
cls.call('setqflist', [], ' ', what)
else:
# Can set title (and maybe context), but needs two calls.
cls.call('setqflist', items)
cls.call('setqflist', items, 'a', what)
else:
cls.call('setqflist', items)
@classmethod
def setqflist_title(cls, title):
if cls.has('patch-7.4.2200'):
cls.call('setqflist', [], 'a', {'title': title})
@classmethod
def can_update_current_qflist_for_context(cls, context):
if cls.has('patch-8.0.0590'): # can set qf context
return cls.call('getqflist', {'context': 1})['context'] == {
'jedi_usages': context,
}
def catch_and_print_exceptions(func):
def wrapper(*args, **kwargs):
try:
@@ -148,23 +213,124 @@ def _check_jedi_availability(show_error=False):
return func_receiver
# Tuple of cache key / project
_current_project_cache = None, None
def get_project():
vim_environment_path = vim_eval(
"get(b:, 'jedi_environment_path', g:jedi#environment_path)"
)
vim_project_path = vim_eval("g:jedi#project_path")
vim_added_sys_path = vim_eval("get(g:, 'jedi#added_sys_path', [])")
vim_added_sys_path += vim_eval("get(b:, 'jedi_added_sys_path', [])")
global _current_project_cache
cache_key = dict(project_path=vim_project_path,
environment_path=vim_environment_path,
added_sys_path=vim_added_sys_path)
if cache_key == _current_project_cache[0]:
return _current_project_cache[1]
if vim_environment_path in ("auto", "", None):
environment_path = None
else:
environment_path = vim_environment_path
if vim_project_path in ("auto", "", None):
project_path = jedi.get_default_project().path
else:
project_path = vim_project_path
project = jedi.Project(project_path,
environment_path=environment_path,
added_sys_path=vim_added_sys_path)
_current_project_cache = cache_key, project
return project
@catch_and_print_exceptions
def get_script(source=None, column=None):
jedi.settings.additional_dynamic_modules = \
[b.name for b in vim.buffers if b.name is not None and b.name.endswith('.py')]
def choose_environment():
args = shsplit(vim.eval('a:args'))
envs = list(jedi.find_system_environments())
envs.extend(jedi.find_virtualenvs(paths=args or None))
env_paths = [env.executable for env in envs]
vim_command('belowright new')
vim.current.buffer[:] = env_paths
vim.current.buffer.name = "Hit Enter to Choose an Environment"
vim_command(
'setlocal buftype=nofile bufhidden=wipe noswapfile nobuflisted readonly nomodifiable')
vim_command('noremap <buffer> <ESC> :bw<CR>')
vim_command('noremap <buffer> <CR> :python3 jedi_vim.choose_environment_hit_enter()<CR>')
@catch_and_print_exceptions
def choose_environment_hit_enter():
vim.vars['jedi#environment_path'] = vim.current.line
vim_command('bd')
@catch_and_print_exceptions
def load_project():
path = vim.eval('a:args')
vim.vars['jedi#project_path'] = path
env_path = vim_eval("g:jedi#environment_path")
if env_path == 'auto':
env_path = None
if path:
try:
project = jedi.Project.load(path)
except FileNotFoundError:
project = jedi.Project(path, environment_path=env_path)
project.save()
else:
project = jedi.get_default_project()
path = project.path
project.save()
global _current_project_cache
cache_key = dict(project_path=path,
environment_path=env_path,
added_sys_path=[])
_current_project_cache = cache_key, project
@catch_and_print_exceptions
def get_script(source=None):
jedi.settings.additional_dynamic_modules = [
b.name for b in vim.buffers if (
b.name is not None and
b.name.endswith('.py') and
b.options['buflisted'])]
if source is None:
source = '\n'.join(vim.current.buffer)
buf_path = vim.current.buffer.name
if not buf_path:
# If a buffer has no name its name is an empty string.
buf_path = None
return jedi.Script(source, path=buf_path, project=get_project())
def get_pos(column=None):
row = vim.current.window.cursor[0]
if column is None:
column = vim.current.window.cursor[1]
buf_path = vim.current.buffer.name
encoding = vim_eval('&encoding') or 'latin1'
return jedi.Script(source, row, column, buf_path, encoding)
return row, column
@_check_jedi_availability(show_error=False)
@catch_and_print_exceptions
def completions():
jedi.settings.case_insensitive_completion = \
bool(int(vim_eval("get(b:, 'jedi_case_insensitive_completion', "
"g:jedi#case_insensitive_completion)")))
row, column = vim.current.window.cursor
# Clear call signatures in the buffer so they aren't seen by the completer.
# Call signatures in the command line can stay.
@@ -173,7 +339,7 @@ def completions():
if vim.eval('a:findstart') == '1':
count = 0
for char in reversed(vim.current.line[:column]):
if not re.match('[\w\d]', char):
if not re.match(r'[\w\d]', char):
break
count += 1
vim.command('return %i' % (column - count))
@@ -190,20 +356,28 @@ def completions():
# here again hacks, because jedi has a different interface than vim
column += len(base)
try:
script = get_script(source=source, column=column)
completions = script.completions()
signatures = script.call_signatures()
script = get_script(source=source)
completions = script.complete(*get_pos(column))
signatures = script.get_signatures(*get_pos(column))
add_info = \
any(option in vim.eval("&completeopt").split(",")
for option in ("preview", "popup"))
out = []
for c in completions:
d = dict(word=PythonToVimStr(c.name[:len(base)] + c.complete),
abbr=PythonToVimStr(c.name_with_symbols),
# stuff directly behind the completion
menu=PythonToVimStr(c.description),
info=PythonToVimStr(c.docstring()), # docstr
icase=1, # case insensitive
dup=1 # allow duplicates (maybe later remove this)
)
if add_info:
try:
d["info"] = PythonToVimStr(c.docstring())
except Exception:
print("jedi-vim: error with docstring for %r: %s" % (
c, traceback.format_exc()))
out.append(d)
strout = str(out)
@@ -229,82 +403,373 @@ def tempfile(content):
finally:
os.unlink(f.name)
@_check_jedi_availability(show_error=True)
@catch_and_print_exceptions
def goto(mode="goto", no_output=False):
def goto(mode="goto"):
"""
:param str mode: "related_name", "definition", "assignment", "auto"
:return: list of definitions/assignments
:rtype: list
:param str mode: "definition", "assignment", "goto"
:rtype: list of jedi.api.classes.Name
"""
script = get_script()
pos = get_pos()
if mode == "goto":
definitions = [x for x in script.goto_definitions()
if not x.in_builtin_module()]
if not definitions:
definitions = script.goto_assignments()
elif mode == "related_name":
definitions = script.usages()
names = script.goto(*pos, follow_imports=True)
elif mode == "definition":
definitions = script.goto_definitions()
names = script.infer(*pos)
elif mode == "assignment":
definitions = script.goto_assignments()
names = script.goto(*pos)
elif mode == "stubs":
names = script.goto(*pos, follow_imports=True, only_stubs=True)
if no_output:
return definitions
if not definitions:
if not names:
echo_highlight("Couldn't find any definitions for this.")
elif len(definitions) == 1 and mode != "related_name":
d = list(definitions)[0]
if d.in_builtin_module():
if d.is_keyword:
echo_highlight("Cannot get the definition of Python keywords.")
else:
echo_highlight("Builtin modules cannot be displayed (%s)."
% d.desc_with_module)
else:
using_tagstack = int(vim_eval('g:jedi#use_tag_stack')) == 1
if (d.module_path or '') != vim.current.buffer.name:
result = new_buffer(d.module_path,
using_tagstack=using_tagstack)
if not result:
return []
if d.module_path and os.path.exists(d.module_path) and using_tagstack:
tagname = d.name
with tempfile('{0}\t{1}\t{2}'.format(tagname, d.module_path,
'call cursor({0}, {1})'.format(d.line, d.column + 1))) as f:
old_tags = vim.eval('&tags')
old_wildignore = vim.eval('&wildignore')
try:
# Clear wildignore to ensure tag file isn't ignored
vim.command('set wildignore=')
vim.command('let &tags = %s' %
repr(PythonToVimStr(f.name)))
vim.command('tjump %s' % tagname)
finally:
vim.command('let &tags = %s' %
repr(PythonToVimStr(old_tags)))
vim.command('let &wildignore = %s' %
repr(PythonToVimStr(old_wildignore)))
vim.current.window.cursor = d.line, d.column
elif len(names) == 1 and mode != "related_name":
n = list(names)[0]
_goto_specific_name(n)
else:
# multiple solutions
lst = []
for d in definitions:
if d.in_builtin_module():
lst.append(dict(text=PythonToVimStr('Builtin ' + d.description)))
elif d.module_path is None:
# Typically a namespace, in the future maybe other things as
# well.
lst.append(dict(text=PythonToVimStr(d.description)))
show_goto_multi_results(names, mode)
return names
def _goto_specific_name(n, options=''):
if n.column is None:
if n.is_keyword:
echo_highlight("Cannot get the definition of Python keywords.")
else:
name = 'Namespaces' if n.type == 'namespace' else 'Builtin modules'
echo_highlight(
"%s cannot be displayed (%s)."
% (name, n.full_name or n.name)
)
else:
using_tagstack = int(vim_eval('g:jedi#use_tag_stack')) == 1
result = set_buffer(n.module_path, options=options,
using_tagstack=using_tagstack)
if not result:
return []
if (using_tagstack and n.module_path and
n.module_path.exists()):
tagname = n.name
with tempfile('{0}\t{1}\t{2}'.format(
tagname, n.module_path, 'call cursor({0}, {1})'.format(
n.line, n.column + 1))) as f:
old_tags = vim.eval('&tags')
old_wildignore = vim.eval('&wildignore')
try:
# Clear wildignore to ensure tag file isn't ignored
vim.command('set wildignore=')
vim.command('let &tags = %s' %
repr(PythonToVimStr(f.name)))
vim.command('tjump %s' % tagname)
finally:
vim.command('let &tags = %s' %
repr(PythonToVimStr(old_tags)))
vim.command('let &wildignore = %s' %
repr(PythonToVimStr(old_wildignore)))
vim.current.window.cursor = n.line, n.column
def relpath(path):
"""Make path relative to cwd if it is below."""
abspath = os.path.abspath(path)
if abspath.startswith(os.getcwd()):
return os.path.relpath(path)
return path
def annotate_description(n):
code = n.get_line_code().strip()
if n.type == 'statement':
return code
if n.type == 'function':
if code.startswith('def'):
return code
typ = 'def'
else:
typ = n.type
return '[%s] %s' % (typ, code)
def show_goto_multi_results(names, mode):
"""Create (or reuse) a quickfix list for multiple names."""
global _current_names
lst = []
(row, col) = vim.current.window.cursor
current_idx = None
current_def = None
for n in names:
if n.column is None:
# Typically a namespace, in the future maybe other things as
# well.
lst.append(dict(text=PythonToVimStr(n.description)))
else:
text = annotate_description(n)
lst.append(dict(filename=PythonToVimStr(relpath(str(n.module_path))),
lnum=n.line, col=n.column + 1,
text=PythonToVimStr(text)))
# Select current/nearest entry via :cc later.
if n.line == row and n.column <= col:
if (current_idx is None
or (abs(lst[current_idx]["col"] - col)
> abs(n.column - col))):
current_idx = len(lst)
current_def = n
# Build qflist title.
qf_title = mode
if current_def is not None:
if current_def.full_name:
qf_title += ": " + current_def.full_name
else:
qf_title += ": " + str(current_def)
select_entry = current_idx
else:
select_entry = 0
qf_context = id(names)
if (_current_names
and VimCompat.can_update_current_qflist_for_context(qf_context)):
# Same list, only adjust title/selected entry.
VimCompat.setqflist_title(qf_title)
vim_command('%dcc' % select_entry)
else:
VimCompat.setqflist(lst, title=qf_title, context=qf_context)
for_usages = mode == "usages"
vim_eval('jedi#add_goto_window(%d, %d)' % (for_usages, len(lst)))
vim_command('%d' % select_entry)
def _same_names(a, b):
"""Compare without _inference_state.
Ref: https://github.com/davidhalter/jedi-vim/issues/952)
"""
return all(
x._name.start_pos == y._name.start_pos
and x.module_path == y.module_path
and x.name == y.name
for x, y in zip(a, b)
)
@catch_and_print_exceptions
def usages(visuals=True):
script = get_script()
names = script.get_references(*get_pos())
if not names:
echo_highlight("No usages found here.")
return names
if visuals:
global _current_names
if _current_names:
if _same_names(_current_names, names):
names = _current_names
else:
lst.append(dict(filename=PythonToVimStr(d.module_path),
lnum=d.line, col=d.column + 1,
text=PythonToVimStr(d.description)))
vim_eval('setqflist(%s)' % repr(lst))
vim_eval('jedi#add_goto_window(' + str(len(lst)) + ')')
return definitions
clear_usages()
assert not _current_names
show_goto_multi_results(names, "usages")
if not _current_names:
_current_names = names
highlight_usages()
else:
assert names is _current_names # updated above
return names
_current_names = None
"""Current definitions to use for highlighting."""
_pending_names = {}
"""Pending definitions for unloaded buffers."""
_placed_names_in_buffers = set()
"""Set of buffers for faster cleanup."""
IS_NVIM = hasattr(vim, 'from_nvim')
if IS_NVIM:
vim_prop_add = None
else:
vim_prop_type_added = False
try:
vim_prop_add = vim.Function("prop_add")
except ValueError:
vim_prop_add = None
else:
vim_prop_remove = vim.Function("prop_remove")
def clear_usages():
"""Clear existing highlights."""
global _current_names
if _current_names is None:
return
_current_names = None
if IS_NVIM:
for buf in _placed_names_in_buffers:
src_ids = buf.vars.get('_jedi_usages_src_ids')
if src_ids is not None:
for src_id in src_ids:
buf.clear_highlight(src_id)
elif vim_prop_add:
for buf in _placed_names_in_buffers:
vim_prop_remove({
'type': 'jediUsage',
'all': 1,
'bufnr': buf.number,
})
else:
# Unset current window only.
assert _current_names is None
highlight_usages_for_vim_win()
_placed_names_in_buffers.clear()
def highlight_usages():
"""Set usage names to be highlighted.
With Neovim it will use the nvim_buf_add_highlight API to highlight all
buffers already.
With Vim without support for text-properties only the current window is
highlighted via matchaddpos, and autocommands are setup to highlight other
windows on demand. Otherwise Vim's text-properties are used.
"""
global _current_names, _pending_names
names = _current_names
_pending_names = {}
if IS_NVIM or vim_prop_add:
bufs = {x.name: x for x in vim.buffers}
defs_per_buf = {}
for name in names:
try:
buf = bufs[str(name.module_path)]
except KeyError:
continue
defs_per_buf.setdefault(buf, []).append(name)
if IS_NVIM:
# We need to remember highlight ids with Neovim's API.
buf_src_ids = {}
for buf, names in defs_per_buf.items():
buf_src_ids[buf] = []
for name in names:
src_id = _add_highlighted_name(buf, name)
buf_src_ids[buf].append(src_id)
for buf, src_ids in buf_src_ids.items():
buf.vars['_jedi_usages_src_ids'] = src_ids
else:
for buf, names in defs_per_buf.items():
try:
for name in names:
_add_highlighted_name(buf, name)
except vim.error as exc:
if exc.args[0].startswith('Vim:E275:'):
# "Cannot add text property to unloaded buffer"
_pending_names.setdefault(buf.name, []).extend(
names)
else:
highlight_usages_for_vim_win()
def _handle_pending_usages_for_buf():
"""Add (pending) highlights for the current buffer (Vim with textprops)."""
buf = vim.current.buffer
bufname = buf.name
try:
buf_names = _pending_names[bufname]
except KeyError:
return
for name in buf_names:
_add_highlighted_name(buf, name)
del _pending_names[bufname]
def _add_highlighted_name(buf, name):
lnum = name.line
start_col = name.column
# Skip highlighting of module definitions that point to the start
# of the file.
if name.type == 'module' and lnum == 1 and start_col == 0:
return
_placed_names_in_buffers.add(buf)
# TODO: validate that name.name is at this position?
# Would skip the module definitions from above already.
length = len(name.name)
if vim_prop_add:
# XXX: needs jediUsage highlight (via after/syntax/python.vim).
global vim_prop_type_added
if not vim_prop_type_added:
vim.eval("prop_type_add('jediUsage', {'highlight': 'jediUsage'})")
vim_prop_type_added = True
vim_prop_add(lnum, start_col+1, {
'type': 'jediUsage',
'bufnr': buf.number,
'length': length,
})
return
assert IS_NVIM
end_col = name.column + length
src_id = buf.add_highlight('jediUsage', lnum-1, start_col, end_col,
src_id=0)
return src_id
def highlight_usages_for_vim_win():
"""Highlight usages in the current window.
It stores the matchids in a window-local variable.
(matchaddpos() only works for the current window.)
"""
win = vim.current.window
cur_matchids = win.vars.get('_jedi_usages_vim_matchids')
if cur_matchids:
if cur_matchids[0] == vim.current.buffer.number:
return
# Need to clear non-matching highlights.
for matchid in cur_matchids[1:]:
expr = 'matchdelete(%d)' % int(matchid)
vim.eval(expr)
matchids = []
if _current_names:
buffer_path = vim.current.buffer.name
for name in _current_names:
if (str(name.module_path) or '') == buffer_path:
positions = [
[name.line,
name.column + 1,
len(name.name)]
]
expr = "matchaddpos('jediUsage', %s)" % repr(positions)
matchids.append(int(vim_eval(expr)))
if matchids:
vim.current.window.vars['_jedi_usages_vim_matchids'] = [
vim.current.buffer.number] + matchids
elif cur_matchids is not None:
# Always set it (uses an empty list for "unset", which is not possible
# using del).
vim.current.window.vars['_jedi_usages_vim_matchids'] = []
# Remember if clearing is needed for later buffer autocommands.
vim.current.buffer.vars['_jedi_usages_needs_clear'] = bool(matchids)
@_check_jedi_availability(show_error=True)
@@ -312,21 +777,27 @@ def goto(mode="goto", no_output=False):
def show_documentation():
script = get_script()
try:
definitions = script.goto_definitions()
except jedi.NotFoundError:
definitions = []
names = script.help(*get_pos())
except Exception:
# print to stdout, will be in :messages
definitions = []
names = []
print("Exception, this shouldn't happen.")
print(traceback.format_exc())
if not definitions:
if not names:
echo_highlight('No documentation found for that.')
vim.command('return')
else:
docs = ['Docstring for %s\n%s\n%s' % (d.desc_with_module, '=' * 40, d.docstring())
if d.docstring() else '|No Docstring for %s|' % d for d in definitions]
return
docs = []
for n in names:
doc = n.docstring()
if doc:
title = 'Docstring for %s %s' % (n.type, n.full_name or n.name)
underline = '=' * len(title)
docs.append('%s\n%s\n%s' % (title, underline, doc))
else:
docs.append('|No Docstring for %s|' % n)
text = ('\n' + '-' * 79 + '\n').join(docs)
vim.command('let l:doc = %s' % repr(PythonToVimStr(text)))
vim.command('let l:doc_lines = %s' % len(text.split('\n')))
@@ -365,9 +836,12 @@ def show_call_signatures(signatures=()):
if int(vim_eval("has('conceal') && g:jedi#show_call_signatures")) == 0:
return
if signatures == ():
signatures = get_script().call_signatures()
# We need to clear the signatures before we calculate them again. The
# reason for this is that call signatures are unfortunately written to the
# buffer.
clear_call_signatures()
if signatures == ():
signatures = get_script().get_signatures(*get_pos())
if not signatures:
return
@@ -375,6 +849,7 @@ def show_call_signatures(signatures=()):
if int(vim_eval("g:jedi#show_call_signatures")) == 2:
return cmdline_call_signatures(signatures)
seen_sigs = []
for i, signature in enumerate(signatures):
line, column = signature.bracket_start
# signatures are listed above each other
@@ -389,13 +864,19 @@ def show_call_signatures(signatures=()):
line = vim_eval("getline(%s)" % line_to_replace)
# Descriptions are usually looking like `param name`, remove the param.
params = [p.description.replace('\n', '').replace('param ', '', 1) for p in signature.params]
params = [p.description.replace('\n', '').replace('param ', '', 1)
for p in signature.params]
try:
# *_*PLACEHOLDER*_* makes something fat. See after/syntax file.
params[signature.index] = '*_*%s*_*' % params[signature.index]
except (IndexError, TypeError):
pass
# Skip duplicates.
if params in seen_sigs:
continue
seen_sigs.append(params)
# This stuff is reaaaaally a hack! I cannot stress enough, that
# this is a stupid solution. But there is really no other yet.
# There is no possibility in VIM to draw on the screen, but there
@@ -517,7 +998,7 @@ def cmdline_call_signatures(signatures):
@_check_jedi_availability(show_error=True)
@catch_and_print_exceptions
def rename():
def rename(delete_word=True):
if not int(vim.eval('a:0')):
# Need to save the cursor position before insert mode
cursor = vim.current.window.cursor
@@ -528,8 +1009,19 @@ def rename():
vim_command('augroup END')
vim_command("let s:jedi_replace_orig = expand('<cword>')")
vim_command('normal! diw')
vim_command('startinsert')
line = vim_eval('getline(".")')
if delete_word:
vim_command('normal! diw')
else:
vim_command('normal! yiwel')
if re.match(r'\w+$', line[cursor[1]:]):
# In case the deleted word is at the end of the line we need to
# move the cursor to the end.
vim_command('startinsert!')
else:
vim_command('startinsert')
else:
# Remove autocommand.
@@ -555,9 +1047,17 @@ def rename():
return do_rename(replace)
def rename_visual():
replace = vim.eval('input("Rename to: ")')
orig = vim.eval('getline(".")[(getpos("\'<")[2]-1):getpos("\'>")[2]]')
def rename_visual(use_selected_text_as_prompt_answer=False):
orig = vim.eval('getline(".")[(getpos("\'<")[2]-1):getpos("\'>")[2]'
'-((&selection ==# "exclusive") ? 2 : 1)]')
input_text = ""
if use_selected_text_as_prompt_answer:
input_text = orig
replace = vim.eval(
'input("Rename to:", "{}")'.format(PythonToVimStr(input_text))
)
do_rename(replace, orig)
@@ -569,38 +1069,35 @@ def do_rename(replace, orig=None):
if orig is None:
orig = vim_eval('s:jedi_replace_orig')
if orig == replace:
echo_highlight('Jedi did 0 renames.')
return
# Save original window / tab.
saved_tab = int(vim_eval('tabpagenr()'))
saved_win = int(vim_eval('winnr()'))
temp_rename = goto(mode="related_name", no_output=True)
temp_rename = usages(visuals=False)
# Sort the whole thing reverse (positions at the end of the line
# must be first, because they move the stuff before the position).
temp_rename = sorted(temp_rename, reverse=True,
key=lambda x: (x.module_path, x.line, x.column))
key=lambda x: (str(x.module_path), x.line, x.column))
buffers = set()
for r in temp_rename:
if r.in_builtin_module():
continue
if os.path.abspath(vim.current.buffer.name) != r.module_path:
assert r.module_path is not None
result = new_buffer(r.module_path)
if not result:
echo_highlight("Jedi-vim: failed to create buffer window for {0}!".format(r.module_path))
continue
result = set_buffer(r.module_path)
if not result:
echo_highlight('Failed to create buffer window for %s!' % (r.module_path))
continue
buffers.add(vim.current.buffer.name)
# Save view.
saved_view = vim_eval('string(winsaveview())')
# Replace original word.
vim.current.window.cursor = (r.line, r.column)
vim_command('normal! c{0:d}l{1}'.format(len(orig), replace))
# Restore view.
vim_command('call winrestview(%s)' % saved_view)
r_line = vim.current.buffer[r.line - 1]
vim.current.buffer[r.line - 1] = (r_line[:r.column] + replace +
r_line[r.column + len(orig):])
# Restore previous tab and window.
vim_command('tabnext {0:d}'.format(saved_tab))
@@ -616,40 +1113,40 @@ def do_rename(replace, orig=None):
@_check_jedi_availability(show_error=True)
@catch_and_print_exceptions
def py_import():
# args are the same as for the :edit command
args = shsplit(vim.eval('a:args'))
import_path = args.pop()
text = 'import %s' % import_path
scr = jedi.Script(text, 1, len(text), '')
try:
completion = scr.goto_assignments()[0]
except IndexError:
echo_highlight('Cannot find %s in sys.path!' % import_path)
name = next(get_project().search(import_path), None)
if name is None:
echo_highlight('Cannot find %s in your project or on sys.path!' % import_path)
else:
if completion.in_builtin_module():
echo_highlight('%s is a builtin module.' % import_path)
else:
cmd_args = ' '.join([a.replace(' ', '\\ ') for a in args])
new_buffer(completion.module_path, cmd_args)
cmd_args = ' '.join([a.replace(' ', '\\ ') for a in args])
_goto_specific_name(name, options=cmd_args)
@catch_and_print_exceptions
def py_import_completions():
argl = vim.eval('a:argl')
try:
import jedi
except ImportError:
if jedi is None:
print('Pyimport completion requires jedi module: https://github.com/davidhalter/jedi')
comps = []
else:
text = 'import %s' % argl
script = jedi.Script(text, 1, len(text), '')
comps = ['%s%s' % (argl, c.complete) for c in script.completions()]
names = get_project().complete_search(argl)
comps = [argl + n for n in sorted(set(c.complete for c in names))]
vim.command("return '%s'" % '\n'.join(comps))
@catch_and_print_exceptions
def new_buffer(path, options='', using_tagstack=False):
def set_buffer(path: Optional[Path], options='', using_tagstack=False):
"""
Opens a new buffer if we have to or does nothing. Returns True in case of
success.
"""
path = str(path or '')
# Check both, because it might be an empty string
if path in (vim.current.buffer.name, os.path.abspath(vim.current.buffer.name)):
return True
path = relpath(path)
# options are what you can to edit the edit options
if int(vim_eval('g:jedi#use_tabs_not_buffers')) == 1:
_tabnew(path, options)
@@ -697,7 +1194,6 @@ def _tabnew(path, options=''):
:param options: `:tabnew` options, read vim help.
"""
path = os.path.abspath(path)
if int(vim_eval('has("gui")')) == 1:
vim_command('tab drop %s %s' % (options, escape_file_path(path)))
return
@@ -712,7 +1208,7 @@ def _tabnew(path, options=''):
# don't know why this happens :-)
pass
else:
if buf_path == path:
if os.path.abspath(buf_path) == os.path.abspath(path):
# tab exists, just switch to that tab
vim_command('tabfirst | tabnext %i' % (tab_nr + 1))
# Goto the buffer's window.

View File

@@ -1,44 +1,96 @@
"""Used in jedi-vim's jedi#debug_info()"""
import sys
import vim
from jedi_vim import PythonToVimStr, jedi
def echo(msg):
vim.command('echo %r' % PythonToVimStr(msg))
def echo_error(msg):
vim.command('echohl ErrorMsg')
echo(msg)
vim.command('echohl None')
def format_exc_info(exc_info=None, tb_indent=2):
import traceback
if exc_info is None:
exc_info = sys.exc_info()
exc_msg = traceback.format_exception_only(exc_info[0], exc_info[1])
lines = ''.join(exc_msg).rstrip('\n').split('\n')
lines.append('Traceback (most recent call last):')
tb = traceback.format_tb(exc_info[2])
lines.extend(''.join(tb).rstrip('\n').split('\n'))
indent = ' ' * tb_indent
return '{0}'.format(('\n' + indent).join(lines))
def get_known_environments():
"""Get known Jedi environments."""
envs = list(jedi.find_virtualenvs())
envs.extend(jedi.find_system_environments())
return envs
def display_debug_info():
import vim
def echo(msg):
vim.command('echo {0}'.format(msg))
echo("printf(' - sys.version: `%s`', {0!r})".format(
echo(' - global sys.executable: `{0}`'.format(sys.executable))
echo(' - global sys.version: `{0}`'.format(
', '.join([x.strip()
for x in __import__('sys').version.split('\n')])))
echo("printf(' - site module: `%s`', {0!r})".format(
__import__('site').__file__))
for x in sys.version.split('\n')])))
echo(' - global site module: `{0}`'.format(__import__('site').__file__))
try:
import jedi_vim
except Exception as e:
echo("printf('ERROR: jedi_vim is not available: %s: %s', "
"{0!r}, {1!r})".format(e.__class__.__name__, str(e)))
except Exception:
echo_error('ERROR: could not import jedi_vim: {0}'.format(
format_exc_info()))
return
try:
if jedi_vim.jedi is None:
echo("'ERROR: could not import the \"jedi\" Python module.'")
echo("printf(' The error was: %s', {0!r})".format(
getattr(jedi_vim, "jedi_import_error", "UNKNOWN")))
if jedi_vim.jedi is None:
if hasattr(jedi_vim, 'jedi_import_error'):
error_msg = format_exc_info(jedi_vim.jedi_import_error)
else:
echo("printf('Jedi path: `%s`', {0!r})".format(
jedi_vim.jedi.__file__))
echo("printf(' - version: %s', {0!r})".format(
jedi_vim.jedi.__version__))
echo("' - sys_path:'")
error_msg = 'unknown error'
echo_error('ERROR: could not import the "jedi" Python module: {0}'.format(
error_msg))
else:
echo('\n##### Jedi\n\n - path: `{0}`'.format(jedi_vim.jedi.__file__))
echo(' - version: {0}'.format(jedi_vim.jedi.__version__))
try:
project = jedi_vim.get_project()
environment = project.get_environment()
except AttributeError:
script_evaluator = jedi_vim.jedi.Script('')._evaluator
try:
sys_path = script_evaluator.project.sys_path
except AttributeError:
sys_path = script_evaluator.sys_path
for p in sys_path:
echo("printf(' - `%s`', {0!r})".format(p))
except Exception as e:
echo("printf('There was an error accessing jedi_vim.jedi: %s', "
"{0!r})".format(e))
else:
echo('\n##### Jedi environment: {0}\n\n'.format(environment))
echo(' - executable: {0}'.format(environment.executable))
try:
sys_path = environment.get_sys_path()
except Exception:
echo_error('ERROR: failed to get sys path from environment: {0}'.format(
format_exc_info()))
return
echo(' - sys_path:')
for p in sys_path:
echo(' - `{0}`'.format(p))
if environment:
echo('\n##### Known environments\n\n')
for environment in get_known_environments():
echo(' - {0} ({1})\n'.format(
environment,
environment.executable,
))

5
setup.cfg Normal file
View File

@@ -0,0 +1,5 @@
[tool:pytest]
testpaths = test
[flake8]
max-line-length = 100

View File

@@ -1,71 +0,0 @@
let g:jedi#completions_command = 'X'
source plugin/jedi.vim
describe 'completions'
before
new
set filetype=python
end
after
" default
let g:jedi#popup_select_first = 1
bd!
end
it 'smart import'
exec "normal ifrom os "
Expect getline('.') == 'from os import '
end
it 'no smart import after space'
exec "normal! ifrom os "
exec "normal a "
Expect getline('.') == 'from os '
end
it 'import'
" X is the completion command
normal oimporX
Expect getline('.') == 'import'
normal a subproX
Expect getline('.') == 'import subprocess'
end
it 'exception'
normal oIndentationErrX
Expect getline('.') == 'IndentationError'
normal a().filenaX
Expect getline('.') == 'IndentationError().filename'
end
it 'multi complete'
normal oImpXErrX()
Expect getline('.') == 'ImportError()'
end
it 'cycling through entries popup_select_first=0'
let g:jedi#popup_select_first = 0
execute "normal oraise impX\<C-n>"
" It looks like this is currently not working properly.
"Expect getline('.') == 'raise ImportError'
end
it 'cycling through entries popup_select_first=1'
execute "normal oraise impX\<C-n>"
Expect getline('.') == 'raise ImportWarning'
end
it 'longest'
" -longest completes the first one
set completeopt -=longest
execute "normal oraise baseX"
Expect getline('.') == 'raise BaseException'
set completeopt +=longest
end
it 'dot_open'
end
end
" vim: et:ts=4:sw=4

65
test/test_integration.py Normal file
View File

@@ -0,0 +1,65 @@
"""Runs tests from ./vspec in vim-vspec."""
import os
import subprocess
try:
from urllib.request import urlretrieve
except ImportError:
from urllib import urlretrieve
import zipfile
import pytest
vspec_version = '1.9.0'
VSPEC_URL = 'https://github.com/kana/vim-vspec/archive/%s.zip' % vspec_version
root = os.path.dirname(os.path.dirname(__file__))
CACHE_FOLDER = os.path.join(root, 'build')
VSPEC_FOLDER = os.path.join(CACHE_FOLDER, 'vim-vspec-%s' % vspec_version)
VSPEC_RUNNER = os.path.join(VSPEC_FOLDER, 'bin/vspec')
TEST_DIR = os.path.join(root, 'test', 'vspec')
@pytest.fixture(scope='session')
def install_vspec():
if not os.path.isdir(CACHE_FOLDER):
os.mkdir(CACHE_FOLDER)
if not os.path.exists(VSPEC_FOLDER):
name, hdrs = urlretrieve(VSPEC_URL)
z = zipfile.ZipFile(name)
for n in z.namelist():
dest = os.path.join(CACHE_FOLDER, n)
destdir = os.path.dirname(dest)
if not os.path.isdir(destdir):
os.makedirs(destdir)
data = z.read(n)
if not os.path.isdir(dest):
with open(dest, 'wb') as f:
f.write(data)
z.close()
os.chmod(VSPEC_RUNNER, 0o777)
def get_vspec_tests():
for f in os.listdir(TEST_DIR):
yield os.path.relpath(os.path.join(TEST_DIR, f))
@pytest.mark.parametrize('path', get_vspec_tests())
def test_integration(install_vspec, path):
output = subprocess.check_output(
[VSPEC_RUNNER, '.', VSPEC_FOLDER, os.path.relpath(path, root)],
cwd=root,
)
had_ok = False
for line in output.splitlines():
if (line.startswith(b'not ok') or
line.startswith(b'Error') or
line.startswith(b'Bail out!')):
pytest.fail(u"{0} failed:\n{1}".format(
path, output.decode('utf-8')), pytrace=False)
if not had_ok and line.startswith(b'ok'):
had_ok = True
if not had_ok:
pytest.fail(u"{0} failed: no 'ok' found:\n{1}".format(
path, output.decode('utf-8')), pytrace=False)

8
test/vimrc Normal file
View File

@@ -0,0 +1,8 @@
" Minimal vimrc to use jedi-vim.
"
" Not used anywhere yet, but allows for easy testing.
let script_dir = fnamemodify(expand('<sfile>'), ':h:h')
let &runtimepath = script_dir.','.&runtimepath.','.script_dir.'/after'
syntax on
filetype plugin indent on

View File

@@ -0,0 +1,29 @@
source plugin/jedi.vim
source test/_utils.vim
describe 'simple:'
before
new
normal! ifoo
end
after
bd!
end
it 'choose'
Expect g:jedi#environment_path == 'auto'
Expect bufname('%') == ''
JediChooseEnvironment
" A Python executable needs to be a few letters
Expect len(getline('.')) > 5
Expect bufname('%') == 'Hit Enter to Choose an Environment'
execute "normal \<CR>"
Expect g:jedi#environment_path != 'auto'
bd " TODO why is this necessary? There seems to be a random buffer.
Expect bufname('%') == ''
Expect getline('.') == 'foo'
end
end

131
test/vspec/completions.vim Normal file
View File

@@ -0,0 +1,131 @@
let g:jedi#completions_command = 'X'
source plugin/jedi.vim
describe 'completions'
before
new
set filetype=python
end
after
" default
let g:jedi#popup_select_first = 1
bd!
end
it 'longest in completeopt'
" This gets set up with Vim only on VimEnter.
if has('nvim')
Expect stridx(&completeopt, 'longest') > -1
else
Expect stridx(&completeopt, 'longest') == -1
doautocmd VimEnter
Expect stridx(&completeopt, 'longest') > -1
endif
" Do not use it for following tests.
set completeopt-=longest
end
it 'no smart import by default'
exec "normal ifrom os "
Expect getline('.') == 'from os '
end
it 'import'
" X is the completion command
normal oimporX
Expect getline('.') == 'import'
normal a subproX
Expect getline('.') == 'import subprocess'
end
it 'exception'
normal oIndentationErrX
Expect getline('.') == 'IndentationError'
" Do not remap keys (".") here, otherwise this triggers completion in
" Neovim already.
normal! a().filena
normal aX
Expect getline('.') == 'IndentationError().filename'
end
it 'multi complete'
" NOTE: nvim results in "importErr()" here with completeopt+=longest,
" but Vim is fine.
" This is due to `pumvisible()` in jedi#complete_opened being true
" with nvim still, but it is 0 with Vim, i.e. Vim appears to close
" the pum already (with the tests).
"
" This might be a misunderstanding though, since the test might not
" expect the "import" keyword to be offered for completion?!
normal oImpXErrX()
Expect getline('.') == 'ImportError()'
end
it 'cycling through entries popup_select_first=0'
set completeopt+=longest
let g:jedi#popup_select_first = 0
execute "normal oraise impX\<C-n>"
Expect getline('.') == 'raise ImportError'
set completeopt-=longest
end
it 'cycling through entries popup_select_first=1'
execute "normal oraise impX\<C-n>"
Expect getline('.') == 'raise ImportWarning'
end
it 'cycling through entries popup_select_first=1 and longest'
set completeopt+=longest
execute "normal oraise impX"
Expect getline('.') == 'raise Import'
" With Neovim pumvisible() is 1 in jedi#complete_opened, which then
" triggers the <Down>. This is not the case with Vim.
if has('nvim')
execute "normal oraise impX\<C-n>"
Expect getline('.') == 'raise ImportWarning'
execute "normal oraise impX\<C-n>\<C-n>"
Expect getline('.') == 'raise imp'
else
execute "normal oraise impX\<C-n>"
Expect getline('.') == 'raise ImportError'
execute "normal oraise impX\<C-n>\<C-n>"
Expect getline('.') == 'raise ImportWarning'
endif
set completeopt-=longest
end
end
describe 'smart completions'
before
new
let g:jedi#smart_auto_mappings = 1
set filetype=python
end
after
" default
let g:jedi#smart_auto_mappings = 0
bd!
end
it 'smart import'
exec "normal ifrom os "
Expect getline('.') == 'from os import '
end
it 'no smart import after space'
exec "normal! ifrom os "
exec "normal a "
Expect getline('.') == 'from os '
end
end
" vim: et:ts=4:sw=4

View File

@@ -4,12 +4,11 @@ source plugin/jedi.vim
describe 'completions_disabled'
before
new
set filetype=python
end
after
bd!
try | %bwipeout! | catch | endtry
end
it 'typing'

View File

@@ -6,16 +6,19 @@ describe 'documentation docstrings'
end
after
bd!
bd!
try | %bwipeout! | catch | endtry
end
it 'simple'
Expect maparg('K') == ':call jedi#show_documentation()<CR>'
put = 'ImportError'
normal GK
Expect bufname('%') == "__doc__"
Expect &filetype == 'rst'
let content = join(getline(1,'$'), "\n")
let header = getline(1, 2)
Expect header[0] == "Docstring for class builtins.ImportError"
Expect header[1] == "========================================"
let content = join(getline(3, '$'), "\n")
Expect stridx(content, "Import can't find module") > 0
normal K
Expect bufname('%') == ''

View File

@@ -1,10 +1,10 @@
let mapleader = '\'
source plugin/jedi.vim
source test/utils.vim
source test/_utils.vim
describe 'goto simple'
describe 'goto simple:'
before
new " open a new split
new
set filetype=python
put =[
\ 'def a(): pass',
@@ -22,77 +22,57 @@ describe 'goto simple'
it 'goto definitions'
normal \d
Expect line('.') == 1
Expect col('.') == 5
Expect line('.') == 2
Expect col('.') == 1
end
it 'goto assignments'
silent normal \g
normal \g
Expect line('.') == 2
Expect col('.') == 1
" cursor before `=` means that it stays there.
silent normal \g
normal \g
Expect line('.') == 2
Expect col('.') == 1
" going to the last line changes it.
normal! $
silent normal \g
normal \g
Expect line('.') == 1
Expect col('.') == 5
end
end
describe 'goto with tabs'
describe 'goto with tabs:'
before
set filetype=python
let g:jedi#use_tabs_not_buffers = 1
end
after
bd!
bd!
try | %bwipeout! | catch | endtry
end
it 'follow import'
put = ['import subprocess', 'subprocess']
silent normal G\g
normal G\g
Expect getline('.') == 'import subprocess'
Expect line('.') == 2
Expect col('.') == 8
silent normal G\d
normal G\d
Expect CurrentBufferIsModule('subprocess') == 1
Expect line('.') == 1
Expect col('.') == 1
Expect tabpagenr('$') == 2
Expect winnr('$') == 1
tabprevious
bwipe
Expect tabpagenr('$') == 1
Expect bufname('%') == ''
end
it 'multi definitions'
" This used to behave differently. Now we don't have any real multi
" definitions.
" put = ['import tokenize']
" silent normal G$\d
" Expect CurrentBufferIsModule('tokenize') == 1
" Expect CurrentBufferIsModule('token') == 0
" execute "normal \<CR>"
" Expect tabpagenr('$') == 2
" Expect winnr('$') == 1
" Expect CurrentBufferIsModule('token') == 1
" bd
" silent normal G$\d
" execute "normal j\<CR>"
" Expect tabpagenr('$') == 2
" Expect winnr('$') == 1
" Expect CurrentBufferIsModule('tokenize') == 1
end
end
@@ -103,8 +83,7 @@ describe 'goto with buffers'
end
after
bd!
bd!
try | %bwipeout! | catch | endtry
set nohidden
end
@@ -112,7 +91,7 @@ describe 'goto with buffers'
put = ['import os']
normal G$
call jedi#goto_assignments()
PythonJedi jedi_vim.goto()
python3 jedi_vim.goto()
Expect CurrentBufferIsModule('os') == 0
" Without hidden, it's not possible to open a new buffer, when the old
" one is not saved.
@@ -124,48 +103,29 @@ describe 'goto with buffers'
Expect line('.') == 1
Expect col('.') == 1
end
it 'multi definitions'
" set hidden
" put = ['import tokenize']
" silent normal G$\d
" Expect CurrentBufferIsModule('tokenize') == 0
" Expect CurrentBufferIsModule('token') == 0
" execute "normal \<CR>"
" Expect tabpagenr('$') == 1
" Expect winnr('$') == 1
" Expect CurrentBufferIsModule('token') == 1
" bd
" silent normal G$\d
" execute "normal j\<CR>"
" Expect tabpagenr('$') == 1
" Expect winnr('$') == 1
" Expect CurrentBufferIsModule('tokenize') == 1
end
end
describe 'goto with splits'
before
enew!
set filetype=python
let g:jedi#use_splits_not_buffers = 'left'
end
after
bd!
bd!
try | %bwipeout! | catch | endtry
end
it 'follow import'
put = ['import subprocess', 'subprocess']
silent normal G\g
normal G\g
Expect getline('.') == 'import subprocess'
Expect line('.') == 2
Expect col('.') == 8
silent normal G\d
normal G\d
Expect CurrentBufferIsModule('subprocess') == 1
Expect line('.') == 1
Expect col('.') == 1
@@ -179,6 +139,7 @@ end
describe 'goto wildignore'
before
enew!
set filetype=python
set wildignore=*,with\ spaces,*.pyc
set hidden
@@ -189,12 +150,11 @@ describe 'goto wildignore'
put = ['from subprocess import Popen', 'Popen']
Expect CurrentBufferIsModule('subprocess') == 0
silent normal G
normal G
end
after
bd!
bd!
try | %bwipeout! | catch | endtry
set wildignore&vim
end

View File

@@ -0,0 +1,13 @@
source plugin/jedi.vim
describe 'JediDebugInfo'
it 'works'
redir @a | JediDebugInfo | redir END
let output = split(@a, '\n')
Expect output[0] == 'You should run this in a buffer with filetype "python".'
Expect output[1] == '#### Jedi-vim debug information'
Expect output[-1] == '</details>'
end
end
" vim: et:ts=4:sw=4

View File

@@ -1,14 +1,15 @@
source plugin/jedi.vim
source test/utils.vim
source test/_utils.vim
describe 'pyimport'
before
let g:jedi#use_tabs_not_buffers = 1
let g:jedi#project_path = 'autoload'
end
after
bd!
bd!
try | %bwipeout! | catch | endtry
unlet g:jedi#project_path
end
it 'open_tab'
@@ -27,10 +28,7 @@ describe 'pyimport'
Expect jedi#py_import_completions('subproc', 0, 0) == 'subprocess'
Expect jedi#py_import_completions('subprocess', 0, 0) == 'subprocess'
let g:comp = jedi#py_import_completions('zip', 0, 0)
" Sometimes zipapp is in there sometimes not, depends on Python
" version.
let g:comp = substitute(g:comp, '^zipapp\n', '', '')
Expect g:comp == "zipfile\nzipimport"
let g:comp = jedi#py_import_completions('sre_', 0, 0)
Expect g:comp == "sre_compile\nsre_constants\nsre_parse"
end
end

View File

@@ -2,22 +2,19 @@ source plugin/jedi.vim
describe 'signatures'
before
enew
set filetype=python
end
after
bd!
bd!
try | %bwipeout! | catch | endtry
end
it 'simple'
normal odef xyz(number): return
normal o
normal oxyz(
normal G$
" equals doautocmd CursorMovedI
Python jedi_vim.show_call_signatures()
normal oxyz()
doautocmd CursorHoldI
Expect getline(3) == '?!?jedi=0, ?!? (*_*number*_*) ?!?jedi?!?'
doautocmd InsertLeave
@@ -37,28 +34,41 @@ describe 'signatures'
autocmd jedi_call_signatures * <buffer>
redir END
Expect autocmds =~# 'jedi_call_signatures'
bd!
end
it 'simple after CursorHoldI with only parenthesis'
noautocmd normal o
doautocmd CursorHoldI
noautocmd normal istr(
noautocmd normal istaticmethod()
doautocmd CursorHoldI
Expect getline(1) == '?!?jedi=0, ?!? (*_*object*_*) ?!?jedi?!?'
Expect getline(1) == '?!?jedi=0, ?!? (*_*f: Callable[..., Any]*_*) ?!?jedi?!?'
end
it 'highlights correct argument'
noautocmd normal o
doautocmd CursorHoldI
noautocmd normal iformat(42, "x")
" Move to x - highlights "x".
noautocmd normal 2h
doautocmd CursorHoldI
Expect getline(1) == '?!?jedi=0, ?!? (value: object, *_*format_spec: str=...*_*) ?!?jedi?!?'
" Move left to 42 - hightlights first argument ("value").
noautocmd normal 4h
doautocmd CursorHoldI
Expect getline(1) == '?!?jedi=0, ?!? (*_*value: object*_*, format_spec: str=...) ?!?jedi?!?'
end
it 'no signature'
normal ostr
Python jedi_vim.show_call_signatures()
exe 'normal ostr '
python3 jedi_vim.show_call_signatures()
Expect getline(1, '$') == ['', 'str ']
end
it 'signatures disabled'
let g:jedi#show_call_signatures = 0
normal ostr(
Python jedi_vim.show_call_signatures()
exe 'normal ostr( '
python3 jedi_vim.show_call_signatures()
Expect getline(1, '$') == ['', 'str( ']
let g:jedi#show_call_signatures = 1
@@ -68,21 +78,21 @@ describe 'signatures'
let g:jedi#show_call_signatures = 2
call jedi#configure_call_signatures()
normal ostr(
exe 'normal ostaticmethod( '
redir => msg
Python jedi_vim.show_call_signatures()
python3 jedi_vim.show_call_signatures()
redir END
Expect msg == "\nstr(object)"
Expect msg == "\nstaticmethod(f: Callable[..., Any])"
redir => msg
doautocmd InsertLeave
doautocmd InsertLeave
redir END
Expect msg == "\n"
normal Sdef foo(a, b): pass
normal ofoo(a, b, c,
exe 'normal ofoo(a, b, c, '
redir => msg
Python jedi_vim.show_call_signatures()
python3 jedi_vim.show_call_signatures()
redir END
Expect msg == "\nfoo(a, b)"
end
@@ -93,30 +103,30 @@ describe 'signatures'
function! Signature()
redir => msg
Python jedi_vim.show_call_signatures()
python3 jedi_vim.show_call_signatures()
redir END
return msg
endfunction
let funcname = repeat('a', &columns - 30)
let funcname = repeat('a', &columns - (30 + (&ruler ? 18 : 0)))
put = 'def '.funcname.'(arg1, arg2, arg3, a, b, c):'
put = ' pass'
execute "normal o".funcname."( "
execute "normal o\<BS>".funcname."( "
Expect Signature() == "\n".funcname."(arg1, …)"
normal sarg1,
exe 'normal sarg1, '
Expect Signature() == "\n".funcname."(…, arg2, …)"
normal sarg2, arg3,
exe 'normal sarg2, arg3, '
Expect Signature() == "\n".funcname."(…, a, b, c)"
normal sa, b,
exe 'normal sa, b, '
Expect Signature() == "\n".funcname."(…, c)"
g/^/d
put = 'def '.funcname.'('.repeat('b', 20).', arg2):'
put = ' pass'
execute "normal o".funcname."( "
execute "normal o\<BS>".funcname."( "
Expect Signature() == "\n".funcname."(…)"
end
@@ -124,9 +134,9 @@ describe 'signatures'
let g:jedi#show_call_signatures = 2
call jedi#configure_call_signatures()
normal ostr
exe 'normal ostr '
redir => msg
Python jedi_vim.show_call_signatures()
python3 jedi_vim.show_call_signatures()
redir END
Expect msg == "\n"
end

View File

@@ -1,2 +0,0 @@
def test_integration(case, monkeypatch, pytestconfig):
case.run()