diff options
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 |
