diff --git a/jedi/inference/compiled/access.py b/jedi/inference/compiled/access.py index 09ed1b64..fcad4887 100644 --- a/jedi/inference/compiled/access.py +++ b/jedi/inference/compiled/access.py @@ -183,10 +183,12 @@ class DirectObjectAccess: def py__file__(self) -> Optional[Path]: try: - return Path(self._obj.__file__) + __file__attribute = self._obj.__file__ except AttributeError: return None + return Path(__file__attribute) if __file__attribute is not None else None + def py__doc__(self): return inspect.getdoc(self._obj) or '' diff --git a/test/examples/implicit_namespace_package_with_subpackages/ns1/pkg_implicit_namespace_package_test/pkgA/__init__.py b/test/examples/implicit_namespace_package_with_subpackages/ns1/pkg_implicit_namespace_package_test/pkgA/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/examples/implicit_namespace_package_with_subpackages/ns2/pkg_implicit_namespace_package_test/pkgB/__init__.py b/test/examples/implicit_namespace_package_with_subpackages/ns2/pkg_implicit_namespace_package_test/pkgB/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/test_api/test_interpreter.py b/test/test_api/test_interpreter.py index 1aa027bf..8acbec1d 100644 --- a/test/test_api/test_interpreter.py +++ b/test/test_api/test_interpreter.py @@ -9,8 +9,10 @@ import pytest import jedi import jedi.settings +from jedi import Project from jedi.inference.compiled import mixed from importlib import import_module +from test.helpers import get_example_dir class _GlobalNameSpace: @@ -591,6 +593,40 @@ def test_dict_completion(code, column, expected): assert [c.complete for c in comps] == expected +def test_implicit_namespace_package_with_subpackages_v1(monkeypatch): + sys_path_dir1 = get_example_dir('implicit_namespace_package_with_subpackages', 'ns1') + sys_path_dir2 = get_example_dir('implicit_namespace_package_with_subpackages', 'ns2') + monkeypatch.syspath_prepend(sys_path_dir1) + monkeypatch.syspath_prepend(sys_path_dir2) + + import pkg_implicit_namespace_package_test + interpreter = jedi.Interpreter( + "pkg_implicit_namespace_package_test.", + namespaces=[locals()], + project=Project('.') + ) + comps = interpreter.complete() + expected = ["pkgA", "pkgB"] + assert [c.complete for c in comps] == expected + + +def test_implicit_namespace_package_with_subpackages_v2(monkeypatch): + sys_path_dir1 = get_example_dir('implicit_namespace_package_with_subpackages', 'ns1') + sys_path_dir2 = get_example_dir('implicit_namespace_package_with_subpackages', 'ns2') + monkeypatch.syspath_prepend(sys_path_dir1) + monkeypatch.syspath_prepend(sys_path_dir2) + + # import pkg_implicit_namespace_package_test + interpreter = jedi.Interpreter( + "import pkg_implicit_namespace_package_test.", + namespaces=[locals()], + project=Project('.') + ) + comps = interpreter.complete() + expected = ["pkgA", "pkgB"] + assert [c.complete for c in comps] == expected + + @pytest.mark.parametrize( 'code, types', [ ('dct[1]', ['int']),