Skip to content

Commit b5d051d

Browse files
Create a method to remove managed files for tools (#326)
1 parent fcece11 commit b5d051d

3 files changed

Lines changed: 65 additions & 6 deletions

File tree

src/usethis/_core/tool.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
uninstall_pre_commit_hooks,
1818
)
1919
from usethis._integrations.pre_commit.hooks import add_placeholder_hook, get_hook_names
20-
from usethis._integrations.pyproject.remove import remove_pyproject_toml
2120
from usethis._integrations.pyproject.valid import ensure_pyproject_validity
2221
from usethis._integrations.pytest.core import add_pytest_dir, remove_pytest_dir
2322
from usethis._integrations.ruff.rules import (
@@ -67,6 +66,7 @@ def use_codespell(*, remove: bool = False) -> None:
6766
tool.remove_pyproject_configs()
6867
tool.remove_pre_commit_repo_configs()
6968
remove_deps_from_group(tool.dev_deps, "dev")
69+
tool.remove_managed_files()
7070

7171

7272
def use_coverage(*, remove: bool = False) -> None:
@@ -85,6 +85,7 @@ def use_coverage(*, remove: bool = False) -> None:
8585
else:
8686
tool.remove_pyproject_configs()
8787
remove_deps_from_group([*tool.dev_deps, Dependency(name="pytest-cov")], "test")
88+
tool.remove_managed_files()
8889

8990

9091
def use_deptry(*, remove: bool = False) -> None:
@@ -105,6 +106,7 @@ def use_deptry(*, remove: bool = False) -> None:
105106
tool.remove_pyproject_configs()
106107
remove_bitbucket_steps_from_default(tool.get_bitbucket_steps())
107108
remove_deps_from_group(tool.dev_deps, "dev")
109+
tool.remove_managed_files()
108110

109111

110112
def use_pre_commit(*, remove: bool = False) -> None:
@@ -164,6 +166,7 @@ def use_pre_commit(*, remove: bool = False) -> None:
164166
# they're not going to do it via pre-commit anymore.
165167
if RequirementsTxtTool().is_used():
166168
RequirementsTxtTool().print_how_to_use()
169+
tool.remove_managed_files()
167170

168171

169172
def _add_all_tools_pre_commit_configs():
@@ -210,6 +213,7 @@ def use_pyproject_fmt(*, remove: bool = False) -> None:
210213
tool.remove_pyproject_configs()
211214
tool.remove_pre_commit_repo_configs()
212215
remove_deps_from_group(tool.dev_deps, "dev")
216+
tool.remove_managed_files()
213217

214218

215219
def use_pyproject_toml(*, remove: bool = False) -> None:
@@ -222,7 +226,7 @@ def use_pyproject_toml(*, remove: bool = False) -> None:
222226
ensure_pyproject_validity()
223227
tool.print_how_to_use()
224228
else:
225-
remove_pyproject_toml()
229+
tool.remove_managed_files()
226230

227231

228232
def use_pytest(*, remove: bool = False) -> None:
@@ -264,6 +268,7 @@ def use_pytest(*, remove: bool = False) -> None:
264268

265269
if CoverageTool().is_used():
266270
CoverageTool().print_how_to_use()
271+
tool.remove_managed_files()
267272

268273

269274
def use_requirements_txt(*, remove: bool = False) -> None:
@@ -301,10 +306,7 @@ def use_requirements_txt(*, remove: bool = False) -> None:
301306

302307
else:
303308
tool.remove_pre_commit_repo_configs()
304-
305-
if path.exists() and path.is_file():
306-
tick_print("Removing 'requirements.txt'.")
307-
path.unlink()
309+
tool.remove_managed_files()
308310

309311

310312
def use_ruff(*, remove: bool = False) -> None:
@@ -352,3 +354,4 @@ def use_ruff(*, remove: bool = False) -> None:
352354
remove_bitbucket_steps_from_default(tool.get_bitbucket_steps())
353355
tool.remove_pyproject_configs()
354356
remove_deps_from_group(tool.dev_deps, "dev")
357+
tool.remove_managed_files()

src/usethis/_tool.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
remove_config_value,
3131
set_config_value,
3232
)
33+
from usethis._integrations.pyproject.remove import remove_pyproject_toml
3334
from usethis._integrations.uv.deps import Dependency, is_dep_in_any_group
3435

3536

@@ -199,6 +200,17 @@ def remove_pyproject_configs(self) -> None:
199200
tick_print(f"Removing {self.name} config from 'pyproject.toml'.")
200201
first_removal = False
201202

203+
def remove_managed_files(self) -> None:
204+
"""Remove all files managed by this tool.
205+
206+
This includes any tool-specific files in the project.
207+
If no files exist, this method has no effect.
208+
"""
209+
for file in self.get_managed_files():
210+
if (Path.cwd() / file).exists() and (Path.cwd() / file).is_file():
211+
tick_print(f"Removing '{file}'.")
212+
file.unlink()
213+
202214

203215
class CodespellTool(Tool):
204216
@property
@@ -459,6 +471,10 @@ def get_managed_files(self) -> list[Path]:
459471
Path("pyproject.toml"),
460472
]
461473

474+
def remove_managed_files(self) -> None:
475+
remove_pyproject_toml()
476+
return super().remove_managed_files()
477+
462478

463479
class PytestTool(Tool):
464480
@property

tests/usethis/test_usethis_tool.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,46 @@ def get_pyproject_configs(self) -> list[PyProjectConfig]:
714714
assert not err
715715
assert out == "✔ Adding mytool config to 'pyproject.toml'.\n"
716716

717+
class TestRemoveManagedFiles:
718+
def test_no_files(self, tmp_path: Path):
719+
# Arrange
720+
tool = DefaultTool()
721+
722+
# Act
723+
with change_cwd(tmp_path):
724+
tool.remove_managed_files()
725+
726+
# Assert
727+
assert not (tmp_path / "mytool-config.yaml").exists()
728+
729+
def test_file(self, tmp_path: Path, capfd: pytest.CaptureFixture[str]):
730+
# Arrange
731+
tool = MyTool()
732+
(tmp_path / "mytool-config.yaml").write_text("")
733+
734+
# Act
735+
with change_cwd(tmp_path):
736+
tool.remove_managed_files()
737+
738+
# Assert
739+
assert not (tmp_path / "mytool-config.yaml").exists()
740+
741+
out, err = capfd.readouterr()
742+
assert not err
743+
assert out == "✔ Removing 'mytool-config.yaml'.\n"
744+
745+
def test_dir_not_removed(self, tmp_path: Path):
746+
# Arrange
747+
tool = MyTool()
748+
(tmp_path / "mytool-config.yaml").mkdir()
749+
750+
# Act
751+
with change_cwd(tmp_path):
752+
tool.remove_managed_files()
753+
754+
# Assert
755+
assert (tmp_path / "mytool-config.yaml").exists()
756+
717757

718758
class TestDeptryTool:
719759
"""Tests for DeptryTool."""

0 commit comments

Comments
 (0)