summaryrefslogtreecommitdiff
path: root/tests/testdata/python3
diff options
context:
space:
mode:
authornoah-weingarden <33741795+noah-weingarden@users.noreply.github.com>2023-02-26 12:29:01 -0500
committerGitHub <noreply@github.com>2023-02-26 12:29:01 -0500
commitfe5776279506e9fad59f0a4b850b6fa3e1a4220f (patch)
tree762a1fb8ff84d96e37762e7de19a9fe54b976473 /tests/testdata/python3
parent27352c2bf9c1b3795e599ae63b1ead32a0522bc8 (diff)
downloadastroid-git-fe5776279506e9fad59f0a4b850b6fa3e1a4220f.tar.gz
Update submodule_path after finding an editable install (#2033)
Diffstat (limited to 'tests/testdata/python3')
-rw-r--r--tests/testdata/python3/data/import_setuptools_pep660/__editable___example_0_1_0_finder.py72
-rw-r--r--tests/testdata/python3/data/import_setuptools_pep660/example/__init__.py1
-rw-r--r--tests/testdata/python3/data/import_setuptools_pep660/example/subpackage/__init__.py1
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