GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Upgrade Jedi to latest stable (0.13.1) (#3113) · orecore/vscode-python@84a5c15

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
  • news/1 Enhancements
    • 2667.md
  • pythonFiles
    • completion.py
    • jedi
      • __init__.py
      • _compatibility.py
      • api
        • __init__.py
        • classes.py
        • completion.py
        • environment.py
        • helpers.py
        • project.py
        • replstartup.py
      • cache.py
      • common
        • utils.py
      • debug.py
      • evaluate
        • __init__.py
        • arguments.py
        • base_context.py
        • compiled
          • __init__.py
          • access.py
          • context.py
          • mixed.py
          • subprocess
            • __init__.py
            • __main__.py
            • functions.py
        • context
          • function.py
          • instance.py
          • iterable.py
          • klass.py
          • module.py
          • namespace.py
        • docstrings.py
        • dynamic.py
        • filters.py
        • flow_analysis.py
        • helpers.py
        • imports.py
        • jedi_typing.py
        • lazy_context.py
        • param.py
        • pep0484.py
        • recursion.py
        • stdlib.py
        • syntax_tree.py
        • sys_path.py
        • utils.py
      • parser_utils.py
      • settings.py
      • utils.py
    • parso
      • __init__.py
      • grammar.py
      • parser.py
      • pgen2
        • __init__.py
        • generator.py
        • grammar.py
        • grammar_parser.py
        • parse.py
        • pgen.py
      • python
        • diff.py
        • errors.py
        • parser.py
        • token.py
        • tokenize.py
        • tree.py
      • tree.py
  • src/test/autocomplete
    • base.test.ts

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎news/1 Enhancements/2667.md‎

Copy file name to clipboard
+1Lines changed: 1 addition & 0 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Update Jedi to 0.13.1 and parso 0.3.1.
Collapse file

‎pythonFiles/completion.py‎

Copy file name to clipboardExpand all lines: pythonFiles/completion.py
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class JediCompletion(object):
3333

3434
def __init__(self):
3535
self.default_sys_path = sys.path
36-
self.environment = jedi.api.environment.Environment(sys.prefix, sys.executable)
36+
self.environment = jedi.api.environment.create_environment(sys.executable)
3737
self._input = io.open(sys.stdin.fileno(), encoding='utf-8')
3838
if (os.path.sep == '/') and (platform.uname()[2].find('Microsoft') > -1):
3939
# WSL; does not support UNC paths
Collapse file

‎pythonFiles/jedi/__init__.py‎

Copy file name to clipboardExpand all lines: pythonFiles/jedi/__init__.py
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
... datetime.da'''
2424
>>> script = jedi.Script(source, 3, len('datetime.da'), 'example.py')
2525
>>> script
26-
<Script: 'example.py'>
26+
<Script: 'example.py' ...>
2727
>>> completions = script.completions()
2828
>>> completions #doctest: +ELLIPSIS
2929
[<Completion: date>, <Completion: datetime>, ...]
@@ -36,7 +36,7 @@
3636
good text editor, while still having very good IDE features for Python.
3737
"""
3838

39-
__version__ = '0.12.0'
39+
__version__ = '0.13.1'
4040

4141
from jedi.api import Script, Interpreter, set_debug_function, \
4242
preload_module, names
Collapse file

‎pythonFiles/jedi/_compatibility.py‎

Copy file name to clipboardExpand all lines: pythonFiles/jedi/_compatibility.py
+138-64Lines changed: 138 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
To ensure compatibility from Python ``2.7`` - ``3.x``, a module has been
33
created. Clearly there is huge need to use conforming syntax.
44
"""
5-
import binascii
65
import errno
76
import sys
87
import os
@@ -17,8 +16,6 @@
1716
pass
1817

1918
is_py3 = sys.version_info[0] >= 3
20-
is_py33 = is_py3 and sys.version_info[1] >= 3
21-
is_py34 = is_py3 and sys.version_info[1] >= 4
2219
is_py35 = is_py3 and sys.version_info[1] >= 5
2320
py_version = int(str(sys.version_info[0]) + str(sys.version_info[1]))
2421

@@ -35,24 +32,36 @@ def close(self):
3532
del self.loader
3633

3734

38-
def find_module_py34(string, path=None, full_name=None):
35+
def find_module_py34(string, path=None, full_name=None, is_global_search=True):
3936
spec = None
4037
loader = None
4138

42-
spec = importlib.machinery.PathFinder.find_spec(string, path)
43-
if spec is not None:
44-
# We try to disambiguate implicit namespace pkgs with non implicit namespace pkgs
45-
if not spec.has_location:
46-
full_name = string if not path else full_name
47-
implicit_ns_info = ImplicitNSInfo(full_name, spec.submodule_search_locations._path)
48-
return None, implicit_ns_info, False
39+
for finder in sys.meta_path:
40+
if is_global_search and finder != importlib.machinery.PathFinder:
41+
p = None
42+
else:
43+
p = path
44+
try:
45+
find_spec = finder.find_spec
46+
except AttributeError:
47+
# These are old-school clases that still have a different API, just
48+
# ignore those.
49+
continue
50+
51+
spec = find_spec(string, p)
52+
if spec is not None:
53+
loader = spec.loader
54+
if loader is None and not spec.has_location:
55+
# This is a namespace package.
56+
full_name = string if not path else full_name
57+
implicit_ns_info = ImplicitNSInfo(full_name, spec.submodule_search_locations._path)
58+
return None, implicit_ns_info, False
59+
break
4960

50-
# we have found the tail end of the dotted path
51-
loader = spec.loader
5261
return find_module_py33(string, path, loader)
5362

5463

55-
def find_module_py33(string, path=None, loader=None, full_name=None):
64+
def find_module_py33(string, path=None, loader=None, full_name=None, is_global_search=True):
5665
loader = loader or importlib.machinery.PathFinder.find_module(string, path)
5766

5867
if loader is None and path is None: # Fallback to find builtins
@@ -105,7 +114,7 @@ def find_module_py33(string, path=None, loader=None, full_name=None):
105114
return module_file, module_path, is_package
106115

107116

108-
def find_module_pre_py33(string, path=None, full_name=None):
117+
def find_module_pre_py34(string, path=None, full_name=None, is_global_search=True):
109118
# This import is here, because in other places it will raise a
110119
# DeprecationWarning.
111120
import imp
@@ -140,8 +149,7 @@ def find_module_pre_py33(string, path=None, full_name=None):
140149
raise ImportError("No module named {}".format(string))
141150

142151

143-
find_module = find_module_py33 if is_py33 else find_module_pre_py33
144-
find_module = find_module_py34 if is_py34 else find_module
152+
find_module = find_module_py34 if is_py3 else find_module_pre_py34
145153
find_module.__doc__ = """
146154
Provides information about a module.
147155
@@ -208,6 +216,7 @@ def _iter_modules(paths, prefix=''):
208216
yield importer, prefix + modname, ispkg
209217
# END COPY
210218

219+
211220
iter_modules = _iter_modules if py_version >= 34 else pkgutil.iter_modules
212221

213222

@@ -253,6 +262,7 @@ def reraise(exception, traceback):
253262
254263
"""
255264

265+
256266
class Python3Method(object):
257267
def __init__(self, func):
258268
self.func = func
@@ -313,10 +323,10 @@ def force_unicode(obj):
313323
try:
314324
import builtins # module name in python 3
315325
except ImportError:
316-
import __builtin__ as builtins
326+
import __builtin__ as builtins # noqa: F401
317327

318328

319-
import ast
329+
import ast # noqa: F401
320330

321331

322332
def literal_eval(string):
@@ -326,7 +336,7 @@ def literal_eval(string):
326336
try:
327337
from itertools import zip_longest
328338
except ImportError:
329-
from itertools import izip_longest as zip_longest # Python 2
339+
from itertools import izip_longest as zip_longest # Python 2 # noqa: F401
330340

331341
try:
332342
FileNotFoundError = FileNotFoundError
@@ -356,6 +366,7 @@ def print_to_stderr(*args):
356366
eval("print(*args, file=sys.stderr)")
357367
else:
358368
print >> sys.stderr, args
369+
sys.stderr.flush()
359370

360371

361372
def utf8_repr(func):
@@ -379,10 +390,14 @@ def wrapper(self):
379390
if is_py3:
380391
import queue
381392
else:
382-
import Queue as queue
383-
393+
import Queue as queue # noqa: F401
384394

385-
import pickle
395+
try:
396+
# Attempt to load the C implementation of pickle on Python 2 as it is way
397+
# faster.
398+
import cPickle as pickle
399+
except ImportError:
400+
import pickle
386401
if sys.version_info[:2] == (3, 3):
387402
"""
388403
Monkeypatch the unpickler in Python 3.3. This is needed, because the
@@ -443,53 +458,45 @@ def loads(s, fix_imports=True, encoding="ASCII", errors="strict"):
443458
pickle.loads = loads
444459

445460

446-
_PICKLE_PROTOCOL = 2
447-
is_windows = sys.platform == 'win32'
448-
449-
# The Windows shell on Python 2 consumes all control characters (below 32) and expand on
450-
# all Python versions \n to \r\n.
451-
# pickle starting from protocol version 1 uses binary data, which could not be escaped by
452-
# any normal unicode encoder. Therefore, the only bytes encoder which doesn't produce
453-
# control characters is binascii.hexlify.
454-
455-
456461
def pickle_load(file):
457-
if is_windows:
458-
try:
459-
data = file.readline()
460-
data = binascii.unhexlify(data.strip())
461-
if is_py3:
462-
return pickle.loads(data, encoding='bytes')
463-
else:
464-
return pickle.loads(data)
465-
# Python on Windows don't throw EOF errors for pipes. So reraise them with
466-
# the correct type, which is cought upwards.
467-
except OSError:
468-
raise EOFError()
469-
else:
462+
try:
470463
if is_py3:
471464
return pickle.load(file, encoding='bytes')
472-
else:
473-
return pickle.load(file)
465+
return pickle.load(file)
466+
# Python on Windows don't throw EOF errors for pipes. So reraise them with
467+
# the correct type, which is caught upwards.
468+
except OSError:
469+
if sys.platform == 'win32':
470+
raise EOFError()
471+
raise
474472

475473

476-
def pickle_dump(data, file):
477-
if is_windows:
478-
try:
479-
data = pickle.dumps(data, protocol=_PICKLE_PROTOCOL)
480-
data = binascii.hexlify(data)
481-
file.write(data)
482-
file.write(b'\n')
483-
# On Python 3.3 flush throws sometimes an error even if the two file writes
484-
# should done it already before. This could be also computer / speed depending.
485-
file.flush()
486-
# Python on Windows don't throw EPIPE errors for pipes. So reraise them with
487-
# the correct type and error number.
488-
except OSError:
489-
raise IOError(errno.EPIPE, "Broken pipe")
490-
else:
491-
pickle.dump(data, file, protocol=_PICKLE_PROTOCOL)
474+
def pickle_dump(data, file, protocol):
475+
try:
476+
pickle.dump(data, file, protocol)
477+
# On Python 3.3 flush throws sometimes an error even though the writing
478+
# operation should be completed.
492479
file.flush()
480+
# Python on Windows don't throw EPIPE errors for pipes. So reraise them with
481+
# the correct type and error number.
482+
except OSError:
483+
if sys.platform == 'win32':
484+
raise IOError(errno.EPIPE, "Broken pipe")
485+
raise
486+
487+
488+
# Determine the highest protocol version compatible for a given list of Python
489+
# versions.
490+
def highest_pickle_protocol(python_versions):
491+
protocol = 4
492+
for version in python_versions:
493+
if version[0] == 2:
494+
# The minimum protocol version for the versions of Python that we
495+
# support (2.7 and 3.3+) is 2.
496+
return 2
497+
if version[1] < 4:
498+
protocol = 3
499+
return protocol
493500

494501

495502
try:
@@ -512,4 +519,71 @@ def __init__(self, *args, **kwargs):
512519
except AttributeError:
513520
CREATE_NO_WINDOW = 0x08000000
514521
kwargs['creationflags'] = CREATE_NO_WINDOW
522+
# The child process doesn't need file descriptors except 0, 1, 2.
523+
# This is unix only.
524+
kwargs['close_fds'] = 'posix' in sys.builtin_module_names
515525
super(GeneralizedPopen, self).__init__(*args, **kwargs)
526+
527+
528+
# shutil.which is not available on Python 2.7.
529+
def which(cmd, mode=os.F_OK | os.X_OK, path=None):
530+
"""Given a command, mode, and a PATH string, return the path which
531+
conforms to the given mode on the PATH, or None if there is no such
532+
file.
533+
534+
`mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
535+
of os.environ.get("PATH"), or can be overridden with a custom search
536+
path.
537+
538+
"""
539+
# Check that a given file can be accessed with the correct mode.
540+
# Additionally check that `file` is not a directory, as on Windows
541+
# directories pass the os.access check.
542+
def _access_check(fn, mode):
543+
return (os.path.exists(fn) and os.access(fn, mode)
544+
and not os.path.isdir(fn))
545+
546+
# If we're given a path with a directory part, look it up directly rather
547+
# than referring to PATH directories. This includes checking relative to the
548+
# current directory, e.g. ./script
549+
if os.path.dirname(cmd):
550+
if _access_check(cmd, mode):
551+
return cmd
552+
return None
553+
554+
if path is None:
555+
path = os.environ.get("PATH", os.defpath)
556+
if not path:
557+
return None
558+
path = path.split(os.pathsep)
559+
560+
if sys.platform == "win32":
561+
# The current directory takes precedence on Windows.
562+
if os.curdir not in path:
563+
path.insert(0, os.curdir)
564+
565+
# PATHEXT is necessary to check on Windows.
566+
pathext = os.environ.get("PATHEXT", "").split(os.pathsep)
567+
# See if the given file matches any of the expected path extensions.
568+
# This will allow us to short circuit when given "python.exe".
569+
# If it does match, only test that one, otherwise we have to try
570+
# others.
571+
if any(cmd.lower().endswith(ext.lower()) for ext in pathext):
572+
files = [cmd]
573+
else:
574+
files = [cmd + ext for ext in pathext]
575+
else:
576+
# On other platforms you don't have things like PATHEXT to tell you
577+
# what file suffixes are executable, so just pass on cmd as-is.
578+
files = [cmd]
579+
580+
seen = set()
581+
for dir in path:
582+
normdir = os.path.normcase(dir)
583+
if normdir not in seen:
584+
seen.add(normdir)
585+
for thefile in files:
586+
name = os.path.join(dir, thefile)
587+
if _access_check(name, mode):
588+
return name
589+
return None

0 commit comments

Comments
0 (0)
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.