diff options
| author | noah-weingarden <33741795+noah-weingarden@users.noreply.github.com> | 2023-02-26 12:29:01 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-26 12:29:01 -0500 |
| commit | fe5776279506e9fad59f0a4b850b6fa3e1a4220f (patch) | |
| tree | 762a1fb8ff84d96e37762e7de19a9fe54b976473 /tests/testdata/python3 | |
| parent | 27352c2bf9c1b3795e599ae63b1ead32a0522bc8 (diff) | |
| download | astroid-git-fe5776279506e9fad59f0a4b850b6fa3e1a4220f.tar.gz | |
Update submodule_path after finding an editable install (#2033)
Diffstat (limited to 'tests/testdata/python3')
3 files changed, 74 insertions, 0 deletions
diff --git a/tests/testdata/python3/data/import_setuptools_pep660/__editable___example_0_1_0_finder.py b/tests/testdata/python3/data/import_setuptools_pep660/__editable___example_0_1_0_finder.py new file mode 100644 index 00000000..7e324f41 --- /dev/null +++ b/tests/testdata/python3/data/import_setuptools_pep660/__editable___example_0_1_0_finder.py @@ -0,0 +1,72 @@ +"""This file contains Finders automatically generated by setuptools for a package installed +in editable mode via custom import hooks. It's generated here: +https://github.com/pypa/setuptools/blob/c34b82735c1a9c8707bea00705ae2f621bf4c24d/setuptools/command/editable_wheel.py#L732-L801 +""" +import sys +from importlib.machinery import ModuleSpec +from importlib.machinery import all_suffixes as module_suffixes +from importlib.util import spec_from_file_location +from itertools import chain +from pathlib import Path + +MAPPING = {"example": Path(__file__).parent.resolve() / "example"} +NAMESPACES = {} +PATH_PLACEHOLDER = "__editable__.example-0.1.0.finder" + ".__path_hook__" + + +class _EditableFinder: # MetaPathFinder + @classmethod + def find_spec(cls, fullname, path=None, target=None): + for pkg, pkg_path in reversed(list(MAPPING.items())): + if fullname == pkg or fullname.startswith(f"{pkg}."): + rest = fullname.replace(pkg, "", 1).strip(".").split(".") + return cls._find_spec(fullname, Path(pkg_path, *rest)) + + return None + + @classmethod + def _find_spec(cls, fullname, candidate_path): + init = candidate_path / "__init__.py" + candidates = (candidate_path.with_suffix(x) for x in module_suffixes()) + for candidate in chain([init], candidates): + if candidate.exists(): + return spec_from_file_location(fullname, candidate) + + +class _EditableNamespaceFinder: # PathEntryFinder + @classmethod + def _path_hook(cls, path): + if path == PATH_PLACEHOLDER: + return cls + raise ImportError + + @classmethod + def _paths(cls, fullname): + # Ensure __path__ is not empty for the spec to be considered a namespace. + return NAMESPACES[fullname] or MAPPING.get(fullname) or [PATH_PLACEHOLDER] + + @classmethod + def find_spec(cls, fullname, target=None): + if fullname in NAMESPACES: + spec = ModuleSpec(fullname, None, is_package=True) + spec.submodule_search_locations = cls._paths(fullname) + return spec + return None + + @classmethod + def find_module(cls, fullname): + return None + + +def install(): + if not any(finder == _EditableFinder for finder in sys.meta_path): + sys.meta_path.append(_EditableFinder) + + if not NAMESPACES: + return + + if not any(hook == _EditableNamespaceFinder._path_hook for hook in sys.path_hooks): + # PathEntryFinder is needed to create NamespaceSpec without private APIS + sys.path_hooks.append(_EditableNamespaceFinder._path_hook) + if PATH_PLACEHOLDER not in sys.path: + sys.path.append(PATH_PLACEHOLDER) # Used just to trigger the path hook diff --git a/tests/testdata/python3/data/import_setuptools_pep660/example/__init__.py b/tests/testdata/python3/data/import_setuptools_pep660/example/__init__.py new file mode 100644 index 00000000..643085bc --- /dev/null +++ b/tests/testdata/python3/data/import_setuptools_pep660/example/__init__.py @@ -0,0 +1 @@ +from subpackage import hello diff --git a/tests/testdata/python3/data/import_setuptools_pep660/example/subpackage/__init__.py b/tests/testdata/python3/data/import_setuptools_pep660/example/subpackage/__init__.py new file mode 100644 index 00000000..d7501694 --- /dev/null +++ b/tests/testdata/python3/data/import_setuptools_pep660/example/subpackage/__init__.py @@ -0,0 +1 @@ +hello = 1 |
