diff --git a/.gitignore b/.gitignore index 15b8071ce..ce320e7ea 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ __pycache__/ .Python build/ develop-eggs/ -dist/ +/dist/ downloads/ eggs/ .eggs/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 09ccfc280..4b262f24a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # **Upcoming release** - #730 Match on module aliases for autoimport suggestions +- #755 Remove dependency on `build` package being installed while running tests # Release 1.12.0 diff --git a/MANIFEST.in b/MANIFEST.in index 86e75b337..c6e77775f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include README.rst COPYING setup.py MANIFEST.in CHANGELOG.md +include README.rst COPYING setup.py MANIFEST.in CHANGELOG.md ropetest-package-fixtures/external_fixturepkg/dist/external_fixturepkg-1.0.0-py3-none-any.whl ropetest-package-fixtures/external_fixturepkg/dist/external_fixturepkg-1.0.0.tar.gz recursive-include rope *.py recursive-include docs *.rst recursive-include ropetest *.py diff --git a/pyproject.toml b/pyproject.toml index 0df77c259..276938f34 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,6 +87,7 @@ profile = "black" [tool.pytest.ini_options] +testpaths = "ropetest" python_files = [ "*test.py", "__init__.py", diff --git a/rope/contrib/autoimport/utils.py b/rope/contrib/autoimport/utils.py index d61bac6c2..a16efba05 100644 --- a/rope/contrib/autoimport/utils.py +++ b/rope/contrib/autoimport/utils.py @@ -54,7 +54,7 @@ def get_package_source( if "site-packages" in package.parts: return Source.SITE_PACKAGE if sys.version_info < (3, 10, 0): - if str(package).startswith(sys.prefix): + if str(package).startswith(sys.base_prefix): return Source.STANDARD else: if name in sys.stdlib_module_names: diff --git a/ropetest-package-fixtures/external_fixturepkg/README.md b/ropetest-package-fixtures/external_fixturepkg/README.md new file mode 100644 index 000000000..d6f5f60d2 --- /dev/null +++ b/ropetest-package-fixtures/external_fixturepkg/README.md @@ -0,0 +1,12 @@ +# example_project + +Just an example project for testing rope. + + +To build this package, run: + +```bash +$ python -m build +``` + +This generates packages in `dist` folder. diff --git a/ropetest-package-fixtures/external_fixturepkg/dist/external_fixturepkg-1.0.0-py3-none-any.whl b/ropetest-package-fixtures/external_fixturepkg/dist/external_fixturepkg-1.0.0-py3-none-any.whl new file mode 100644 index 000000000..ba7951d5f Binary files /dev/null and b/ropetest-package-fixtures/external_fixturepkg/dist/external_fixturepkg-1.0.0-py3-none-any.whl differ diff --git a/ropetest-package-fixtures/external_fixturepkg/dist/external_fixturepkg-1.0.0.tar.gz b/ropetest-package-fixtures/external_fixturepkg/dist/external_fixturepkg-1.0.0.tar.gz new file mode 100644 index 000000000..3ea5e8759 Binary files /dev/null and b/ropetest-package-fixtures/external_fixturepkg/dist/external_fixturepkg-1.0.0.tar.gz differ diff --git a/ropetest-package-fixtures/external_fixturepkg/pyproject.toml b/ropetest-package-fixtures/external_fixturepkg/pyproject.toml new file mode 100644 index 000000000..6dcae495c --- /dev/null +++ b/ropetest-package-fixtures/external_fixturepkg/pyproject.toml @@ -0,0 +1,18 @@ +[build-system] +requires = ["flit-core >= 3.8"] +build-backend = "flit_core.buildapi" + +[project] +name = "external_fixturepkg" +version = "1.0.0" +description = "Just an example project built with build/flit for testing purpose" +readme = "README.md" +requires-python = ">= 3.7" + +dependencies = [ ] + +[project.scripts] +pyproject-build = "build.__main__:entrypoint" + +[tool.flit.sdist] +exclude = ["**/__pycache__", "**/*.egg-info"] diff --git a/ropetest-package-fixtures/external_fixturepkg/src/external_fixturepkg/__init__.py b/ropetest-package-fixtures/external_fixturepkg/src/external_fixturepkg/__init__.py new file mode 100644 index 000000000..8cf1e00f3 --- /dev/null +++ b/ropetest-package-fixtures/external_fixturepkg/src/external_fixturepkg/__init__.py @@ -0,0 +1,2 @@ +def sample_function(): + pass diff --git a/ropetest-package-fixtures/external_fixturepkg/src/external_fixturepkg/__main__.py b/ropetest-package-fixtures/external_fixturepkg/src/external_fixturepkg/__main__.py new file mode 100644 index 000000000..e6d098dee --- /dev/null +++ b/ropetest-package-fixtures/external_fixturepkg/src/external_fixturepkg/__main__.py @@ -0,0 +1,6 @@ +def main() -> None: + pass + + +if __name__ == '__main__': + main() diff --git a/ropetest-package-fixtures/external_fixturepkg/src/external_fixturepkg/mod1.py b/ropetest-package-fixtures/external_fixturepkg/src/external_fixturepkg/mod1.py new file mode 100644 index 000000000..3c74911b3 --- /dev/null +++ b/ropetest-package-fixtures/external_fixturepkg/src/external_fixturepkg/mod1.py @@ -0,0 +1 @@ +foo = None diff --git a/ropetest/conftest.py b/ropetest/conftest.py index ce8a1eab5..47515d31e 100644 --- a/ropetest/conftest.py +++ b/ropetest/conftest.py @@ -1,4 +1,6 @@ import pathlib +import sys +from subprocess import check_call import pytest @@ -13,13 +15,6 @@ def project(): testutils.remove_project(project) -@pytest.fixture -def project2(): - project = testutils.sample_project("another_project") - yield project - testutils.remove_project(project) - - @pytest.fixture def project_path(project): yield pathlib.Path(project.address) @@ -52,3 +47,17 @@ def pkg1(project) -> resources.Folder: @pytest.fixture def mod2(project, pkg1) -> resources.Folder: return testutils.create_module(project, "mod2", pkg1) + + +@pytest.fixture(scope="session") +def external_fixturepkg(): + check_call([ + sys.executable, + "-m", + "pip", + "install", + "--force-reinstall", + "ropetest-package-fixtures/external_fixturepkg/dist/external_fixturepkg-1.0.0-py3-none-any.whl", + ]) + yield + check_call([sys.executable, "-m", "pip", "uninstall", "--yes", "external-fixturepkg"]) diff --git a/ropetest/contrib/autoimport/conftest.py b/ropetest/contrib/autoimport/conftest.py index a32913046..29bcba4c0 100644 --- a/ropetest/contrib/autoimport/conftest.py +++ b/ropetest/contrib/autoimport/conftest.py @@ -24,19 +24,18 @@ def typing_path(): @pytest.fixture -def build_env_path(): - from build import env - - yield pathlib.Path(env.__file__) +def example_external_package_module_path(external_fixturepkg): + from external_fixturepkg import mod1 + yield pathlib.Path(mod1.__file__) @pytest.fixture -def build_path(): - import build +def example_external_package_path(external_fixturepkg): + import external_fixturepkg # Uses __init__.py so we need the parent - yield pathlib.Path(build.__file__).parent + yield pathlib.Path(external_fixturepkg.__file__).parent @pytest.fixture diff --git a/ropetest/contrib/autoimport/utilstest.py b/ropetest/contrib/autoimport/utilstest.py index acf2fb9e5..511e1a541 100644 --- a/ropetest/contrib/autoimport/utilstest.py +++ b/ropetest/contrib/autoimport/utilstest.py @@ -14,31 +14,35 @@ def test_get_package_source_not_project(mod1_path): assert utils.get_package_source(mod1_path, None, "") == Source.UNKNOWN -def test_get_package_source_pytest(build_path): +def test_get_package_source_pytest(example_external_package_path): # pytest is not installed as part of the standard library # but should be installed into site_packages, # so it should return Source.SITE_PACKAGE - assert utils.get_package_source(build_path, None, "build") == Source.SITE_PACKAGE + source = utils.get_package_source(example_external_package_path, None, "mod1") + assert source == Source.SITE_PACKAGE def test_get_package_source_typing(typing_path): - assert utils.get_package_source(typing_path, None, "typing") == Source.STANDARD def test_get_modname_project_no_add(mod1_path, project_path): - assert utils.get_modname_from_path(mod1_path, project_path, False) == "mod1" def test_get_modname_single_file(typing_path): - assert utils.get_modname_from_path(typing_path, typing_path) == "typing" -def test_get_modname_folder(build_path, build_env_path): - - assert utils.get_modname_from_path(build_env_path, build_path) == "build.env" +def test_get_modname_folder( + example_external_package_path, + example_external_package_module_path, +): + modname = utils.get_modname_from_path( + example_external_package_module_path, + example_external_package_path, + ) + assert modname == "external_fixturepkg.mod1" def test_get_package_tuple_sample(project_path): diff --git a/ropetest/contrib/autoimporttest.py b/ropetest/contrib/autoimporttest.py index d2f481daa..d74135fff 100644 --- a/ropetest/contrib/autoimporttest.py +++ b/ropetest/contrib/autoimporttest.py @@ -111,13 +111,6 @@ def test_handling_builtin_modules(self): self.importer.update_module("sys") self.assertIn("sys", self.importer.get_modules("exit")) - def test_search_submodule(self): - self.importer.update_module("build") - import_statement = ("from build import env", "env") - self.assertIn(import_statement, self.importer.search("env", exact_match=True)) - self.assertIn(import_statement, self.importer.search("en")) - self.assertIn(import_statement, self.importer.search("env")) - def test_search_module(self): self.importer.update_module("os") import_statement = ("import os", "os") @@ -184,6 +177,16 @@ def test_skipping_directories_not_accessible_because_of_permission_error(self): self.assertGreater(len(self.importer._dump_all()), 0) +def test_search_submodule(external_fixturepkg): + project = testutils.sample_project(extension_modules=["sys"]) + importer = autoimport.AutoImport(project, observe=False) + importer.update_module("external_fixturepkg") + import_statement = ("from external_fixturepkg import mod1", "mod1") + assert import_statement in importer.search("mod1", exact_match=True) + assert import_statement in importer.search("mo") + assert import_statement in importer.search("mod1") + + class AutoImportObservingTest(unittest.TestCase): def setUp(self): super().setUp()