From 3fc0b8d58919e3d7475c17e5d462c11248645cea Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 14 Dec 2022 14:14:36 +1100 Subject: [PATCH 1/7] Remove redundant testutils.sample_project(ropefolder) arguments These were specifying default .ropeproject folder anyway, so it functionally doesn't make a difference. --- ropetest/projecttest.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/ropetest/projecttest.py b/ropetest/projecttest.py index ff71f0171..4b6704811 100644 --- a/ropetest/projecttest.py +++ b/ropetest/projecttest.py @@ -1005,7 +1005,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 +1083,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 +1094,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 +1109,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 +1134,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 +1148,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)) From 0056b3ed42f8a6089c672053dec96c85129f4cdb Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 14 Dec 2022 14:31:30 +1100 Subject: [PATCH 2/7] Simplify implementation of sample_project() Also, should fix issue #589 --- ropetest/testutils.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/ropetest/testutils.py b/ropetest/testutils.py index 91ed4d437..6ce60e4c7 100644 --- a/ropetest/testutils.py +++ b/ropetest/testutils.py @@ -1,26 +1,21 @@ +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 import rope.base.project from rope.contrib import generate +logging.basicConfig(format="%(levelname)s:%(funcName)s:%(message)s", level=logging.INFO) + + 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 + root = tempfile.mkdtemp(prefix="ropetest-") + root = os.path.join(root, foldername if foldername else "sample_project") logging.debug("Using %s as root of the project.", root) # Using these prefs for faster tests prefs = { From f7e1d27c3e96496d045aad5fdaa81881e41a7efb Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 14 Dec 2022 14:51:56 +1100 Subject: [PATCH 3/7] Remove root argument This is barely used anywhere and the only place where it does, we can use foldername instead. --- ropetest/testutils.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ropetest/testutils.py b/ropetest/testutils.py index 6ce60e4c7..157b320e7 100644 --- a/ropetest/testutils.py +++ b/ropetest/testutils.py @@ -11,11 +11,12 @@ logging.basicConfig(format="%(levelname)s:%(funcName)s:%(message)s", level=logging.INFO) +RUN_TMP_DIR = tempfile.mkdtemp(prefix="ropetest-run-") -def sample_project(root=None, foldername=None, **kwds): - if root is None: - root = tempfile.mkdtemp(prefix="ropetest-") - root = os.path.join(root, foldername if foldername else "sample_project") + +def sample_project(foldername=None, **kwds): + root = tempfile.mkdtemp(prefix="project-", dir=RUN_TMP_DIR) + root = os.path.join(root, foldername if foldername else "sample_project") logging.debug("Using %s as root of the project.", root) # Using these prefs for faster tests prefs = { From 408e025fd79c63bfe5294ab901a8b35a2772bbed Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 14 Dec 2022 15:13:18 +1100 Subject: [PATCH 4/7] Change testutils.py to use pathlib --- rope/base/project.py | 1 + ropetest/testutils.py | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) 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/testutils.py b/ropetest/testutils.py index 157b320e7..d6e463526 100644 --- a/ropetest/testutils.py +++ b/ropetest/testutils.py @@ -4,6 +4,7 @@ import sys import tempfile import unittest +from pathlib import Path import rope.base.project from rope.contrib import generate @@ -15,8 +16,8 @@ def sample_project(foldername=None, **kwds): - root = tempfile.mkdtemp(prefix="project-", dir=RUN_TMP_DIR) - root = os.path.join(root, foldername if foldername else "sample_project") + 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 = { From 083ce67209bea3b081c1947b8a24d30d9f0e1c4a Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 14 Dec 2022 15:27:40 +1100 Subject: [PATCH 5/7] Rewrite test that creates errant sample_folder directory --- ropetest/projecttest.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/ropetest/projecttest.py b/ropetest/projecttest.py index 4b6704811..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() From ad71deb028d624f5e8a462ccae19a37539df02ea Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 14 Dec 2022 15:30:42 +1100 Subject: [PATCH 6/7] Remove unnecessary remove_recursively() when creatings sample_project() Now that we always create new temp directory, there is no need to pre-emptively try to clean the directory from previous runs. --- ropetest/testutils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ropetest/testutils.py b/ropetest/testutils.py index d6e463526..5badca5f9 100644 --- a/ropetest/testutils.py +++ b/ropetest/testutils.py @@ -29,7 +29,6 @@ def sample_project(foldername=None, **kwds): "import_dynload_stdmods": False, } prefs.update(kwds) - remove_recursively(root) project = rope.base.project.Project(root, **prefs) return project From a046db6a9e9ccd9bd50db7df8749e288b440fc62 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 14 Dec 2022 15:36:49 +1100 Subject: [PATCH 7/7] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) 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