diff --git a/CHANGELOG.md b/CHANGELOG.md index c5aa37b52..80d6f6ee6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - #533 Refactoring to Remove usage of unicode type - #559 Improve handling of whitespace in import and from-import statements - #581 Remove functions in rope.base.ast that has functionally identical implementation in stdlib's ast +- #589 Fix issue with `sample_project()` creating directories where it shouldn't when running tests # Release 1.5.1 diff --git a/rope/base/project.py b/rope/base/project.py index 527ffcf33..d1a7d7fe6 100644 --- a/rope/base/project.py +++ b/rope/base/project.py @@ -212,6 +212,7 @@ def __init__( """ if projectroot != "/": projectroot = _realpath(projectroot).rstrip("/\\") + assert isinstance(projectroot, str) self._address = projectroot self._ropefolder_name = ropefolder if not os.path.exists(self._address): diff --git a/ropetest/projecttest.py b/ropetest/projecttest.py index ff71f0171..aa42c4e7d 100644 --- a/ropetest/projecttest.py +++ b/ropetest/projecttest.py @@ -1,7 +1,7 @@ import os.path -import shutil -from textwrap import dedent +import tempfile import unittest +from textwrap import dedent from rope.base.exceptions import RopeError, ResourceNotFoundError from rope.base.fscommands import FileSystemCommands @@ -222,17 +222,15 @@ def test_nonempty_get_children2(self): ) def test_does_not_fail_for_permission_denied(self): - bad_dir = os.path.join(self.sample_folder, "bad_dir") - os.makedirs(bad_dir) - self.addCleanup(shutil.rmtree, bad_dir) - os.chmod(bad_dir, 0o000) - try: - parent = self.project.get_resource(self.sample_folder) + with tempfile.TemporaryDirectory(suffix="bad_dir") as bad_dir: + os.chmod(bad_dir, 0o000) + try: + parent = self.project.get_resource(self.sample_folder) - parent.get_children() + parent.get_children() - finally: - os.chmod(bad_dir, 0o755) + finally: + os.chmod(bad_dir, 0o755) def test_getting_files(self): files = self.project.root.get_files() @@ -1005,7 +1003,7 @@ def test_none_project_rope_folder(self): self.assertTrue(self.project.ropefolder is None) def test_getting_project_rope_folder(self): - self.project = testutils.sample_project(ropefolder=".ropeproject") + self.project = testutils.sample_project() self.assertTrue(self.project.ropefolder.exists()) self.assertEqual(".ropeproject", self.project.ropefolder.path) @@ -1083,7 +1081,7 @@ def test_ignored_resources_and_prefixes(self): self.assertFalse(self.project.is_ignored(myfile)) def test_loading_config_dot_py(self): - self.project = testutils.sample_project(ropefolder=".ropeproject") + self.project = testutils.sample_project() config = self.project.get_file(".ropeproject/config.py") if not config.exists(): config.create() @@ -1094,13 +1092,13 @@ def project_opened(project): project.root.create_file("loaded") """)) self.project.close() - self.project = Project(self.project.address, ropefolder=".ropeproject") + self.project = Project(self.project.address) self.assertTrue(self.project.get_file("loaded").exists()) myfile = self.project.get_file("myfile.txt") self.assertTrue(self.project.is_ignored(myfile)) def test_loading_pyproject(self): - self.project = testutils.sample_project(ropefolder=".ropeproject") + self.project = testutils.sample_project() config = self.project.get_file("pyproject.toml") if not config.exists(): config.create() @@ -1109,23 +1107,23 @@ def test_loading_pyproject(self): ignored_resources=["pyproject.py"] """)) self.project.close() - self.project = Project(self.project.address, ropefolder=".ropeproject") + self.project = Project(self.project.address) myfile = self.project.get_file("pyproject.py") self.assertTrue(self.project.is_ignored(myfile)) def test_loading_pyproject_empty_file(self): - self.project = testutils.sample_project(ropefolder=".ropeproject") + self.project = testutils.sample_project() config = self.project.get_file("pyproject.toml") if not config.exists(): config.create() config.write("") self.project.close() - self.project = Project(self.project.address, ropefolder=".ropeproject") + self.project = Project(self.project.address) myfile = self.project.get_file("pyproject.py") self.assertFalse(self.project.is_ignored(myfile)) def test_loading_pyproject_no_tool_section(self): - self.project = testutils.sample_project(ropefolder=".ropeproject") + self.project = testutils.sample_project() config = self.project.get_file("pyproject.toml") if not config.exists(): config.create() @@ -1134,12 +1132,12 @@ def test_loading_pyproject_no_tool_section(self): name = 'testproject' """)) self.project.close() - self.project = Project(self.project.address, ropefolder=".ropeproject") + self.project = Project(self.project.address) myfile = self.project.get_file("pyproject.py") self.assertFalse(self.project.is_ignored(myfile)) def test_loading_pyproject_no_tool_rope_section(self): - self.project = testutils.sample_project(ropefolder=".ropeproject") + self.project = testutils.sample_project() config = self.project.get_file("pyproject.toml") if not config.exists(): config.create() @@ -1148,7 +1146,7 @@ def test_loading_pyproject_no_tool_rope_section(self): name = 'testproject' """)) self.project.close() - self.project = Project(self.project.address, ropefolder=".ropeproject") + self.project = Project(self.project.address) myfile = self.project.get_file("pyproject.py") self.assertFalse(self.project.is_ignored(myfile)) diff --git a/ropetest/testutils.py b/ropetest/testutils.py index 91ed4d437..5badca5f9 100644 --- a/ropetest/testutils.py +++ b/ropetest/testutils.py @@ -1,26 +1,23 @@ +import logging import os.path import shutil import sys -import logging - -logging.basicConfig(format="%(levelname)s:%(funcName)s:%(message)s", level=logging.INFO) +import tempfile import unittest +from pathlib import Path import rope.base.project from rope.contrib import generate -def sample_project(root=None, foldername=None, **kwds): - if root is None: - root = "sample_project" - if foldername: - root = foldername - # HACK: Using ``/dev/shm/`` for faster tests - if os.name == "posix": - if os.path.isdir("/dev/shm") and os.access("/dev/shm", os.W_OK): - root = "/dev/shm/" + root - elif os.path.isdir("/tmp") and os.access("/tmp", os.W_OK): - root = "/tmp/" + root +logging.basicConfig(format="%(levelname)s:%(funcName)s:%(message)s", level=logging.INFO) + +RUN_TMP_DIR = tempfile.mkdtemp(prefix="ropetest-run-") + + +def sample_project(foldername=None, **kwds): + root = Path(tempfile.mkdtemp(prefix="project-", dir=RUN_TMP_DIR)) + root /= foldername if foldername else "sample_project" logging.debug("Using %s as root of the project.", root) # Using these prefs for faster tests prefs = { @@ -32,7 +29,6 @@ def sample_project(root=None, foldername=None, **kwds): "import_dynload_stdmods": False, } prefs.update(kwds) - remove_recursively(root) project = rope.base.project.Project(root, **prefs) return project