copier-python 0.22.2__tar.gz → 0.23.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. {copier_python-0.22.2 → copier_python-0.23.1}/PKG-INFO +1 -1
  2. {copier_python-0.22.2 → copier_python-0.23.1}/copier_python/update.py +18 -7
  3. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_agents.py +8 -4
  4. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_compose.py +13 -5
  5. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_contributing.py +8 -4
  6. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_dockerfile.py +8 -4
  7. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_docs.py +11 -5
  8. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_license.py +9 -5
  9. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_mise_toml.py +13 -5
  10. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_pyproject.py +11 -5
  11. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_readme.py +12 -6
  12. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_workflows.py +8 -4
  13. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_zensical.py +13 -5
  14. {copier_python-0.22.2 → copier_python-0.23.1}/tests/test_update.py +3 -3
  15. {copier_python-0.22.2 → copier_python-0.23.1}/.gitignore +0 -0
  16. {copier_python-0.22.2 → copier_python-0.23.1}/AGENTS.md +0 -0
  17. {copier_python-0.22.2 → copier_python-0.23.1}/CONTRIBUTING.md +0 -0
  18. {copier_python-0.22.2 → copier_python-0.23.1}/LICENSE +0 -0
  19. {copier_python-0.22.2 → copier_python-0.23.1}/README.md +0 -0
  20. {copier_python-0.22.2 → copier_python-0.23.1}/copier_python/__init__.py +0 -0
  21. {copier_python-0.22.2 → copier_python-0.23.1}/copier_python/__main__.py +0 -0
  22. {copier_python-0.22.2 → copier_python-0.23.1}/copier_python/py.typed +0 -0
  23. {copier_python-0.22.2 → copier_python-0.23.1}/copier_python/repo.py +0 -0
  24. {copier_python-0.22.2 → copier_python-0.23.1}/docs/contributing.md +0 -0
  25. {copier_python-0.22.2 → copier_python-0.23.1}/docs/development/requirements.md +0 -0
  26. {copier_python-0.22.2 → copier_python-0.23.1}/docs/development/updates.md +0 -0
  27. {copier_python-0.22.2 → copier_python-0.23.1}/docs/development/workflow.md +0 -0
  28. {copier_python-0.22.2 → copier_python-0.23.1}/docs/index.md +0 -0
  29. {copier_python-0.22.2 → copier_python-0.23.1}/docs/license.md +0 -0
  30. {copier_python-0.22.2 → copier_python-0.23.1}/docs/project-creation.md +0 -0
  31. {copier_python-0.22.2 → copier_python-0.23.1}/docs/project-development.md +0 -0
  32. {copier_python-0.22.2 → copier_python-0.23.1}/docs/project-release.md +0 -0
  33. {copier_python-0.22.2 → copier_python-0.23.1}/docs/project-setup.md +0 -0
  34. {copier_python-0.22.2 → copier_python-0.23.1}/docs/project-updates.md +0 -0
  35. {copier_python-0.22.2 → copier_python-0.23.1}/docs/releasing.md +0 -0
  36. {copier_python-0.22.2 → copier_python-0.23.1}/docs/requirements.md +0 -0
  37. {copier_python-0.22.2 → copier_python-0.23.1}/docs/setup.md +0 -0
  38. {copier_python-0.22.2 → copier_python-0.23.1}/pyproject.toml +0 -0
  39. {copier_python-0.22.2 → copier_python-0.23.1}/tests/__init__.py +0 -0
  40. {copier_python-0.22.2 → copier_python-0.23.1}/tests/conftest.py +0 -0
  41. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__init__.py +0 -0
  42. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_agents.ambr +0 -0
  43. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_compose.ambr +0 -0
  44. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_contributing.ambr +0 -0
  45. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_dockerfile.ambr +0 -0
  46. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_docs.ambr +0 -0
  47. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_license.ambr +0 -0
  48. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_mise_toml.ambr +0 -0
  49. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_pre_commit.ambr +0 -0
  50. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_pyproject.ambr +0 -0
  51. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_readme.ambr +0 -0
  52. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_workflows.ambr +0 -0
  53. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/__snapshots__/test_zensical.ambr +0 -0
  54. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_commit_check.py +0 -0
  55. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_pre_commit.py +0 -0
  56. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_structure.py +0 -0
  57. {copier_python-0.22.2 → copier_python-0.23.1}/tests/template/test_template.py +0 -0
  58. {copier_python-0.22.2 → copier_python-0.23.1}/tests/test_version.py +0 -0
  59. {copier_python-0.22.2 → copier_python-0.23.1}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: copier-python
3
- Version: 0.22.2
3
+ Version: 0.23.1
4
4
  Summary: Copier template for Python projects with modern tooling
5
5
  Project-URL: Homepage, https://smkent.github.io/copier-python
6
6
  Project-URL: Repository, https://github.com/smkent/copier-python
@@ -3,12 +3,15 @@ from __future__ import annotations
3
3
  import json
4
4
  import os
5
5
  import subprocess
6
+ from contextlib import contextmanager
6
7
  from dataclasses import dataclass, field
7
8
  from typing import TYPE_CHECKING
8
9
 
9
10
  from .repo import RepoWorktree
10
11
 
11
12
  if TYPE_CHECKING:
13
+ from collections.abc import Generator
14
+
12
15
  from .repo import RepoTarget
13
16
 
14
17
  TEMPLATE_REPO_URL = "https://github.com/smkent/copier-python"
@@ -25,6 +28,18 @@ class UpdateAction:
25
28
  with RepoWorktree.clone(self.repo, branch=self.branch) as worktree:
26
29
  return self._run(worktree)
27
30
 
31
+ @contextmanager
32
+ def _success_or_shell(
33
+ self, repo: RepoWorktree, name: str
34
+ ) -> Generator[None]:
35
+ try:
36
+ yield
37
+ except subprocess.CalledProcessError:
38
+ print( # noqa: T201
39
+ f"{name} failed. Fix errors and exit the shell to continue."
40
+ )
41
+ repo.shell()
42
+
28
43
  def _run(self, repo: RepoWorktree) -> str | None:
29
44
  """Run copier update in the repo worktree."""
30
45
  copier_status = json.loads(
@@ -38,7 +53,6 @@ class UpdateAction:
38
53
  if not copier_status.get("update_available", False):
39
54
  return None
40
55
  repo.run(["copier", "update", "--skip-answered", "--vcs-ref", end_ref])
41
- repo.run(["mise", "install"])
42
56
 
43
57
  status = repo.git_status()
44
58
  if not status:
@@ -54,13 +68,10 @@ class UpdateAction:
54
68
  if repo.has_conflicts(status):
55
69
  raise RuntimeError("Conflicts remain, aborting")
56
70
 
57
- try:
71
+ with self._success_or_shell(repo, "`mise install`"):
72
+ repo.run(["mise", "install"])
73
+ with self._success_or_shell(repo, "Lint/test"):
58
74
  repo.run_task("lt")
59
- except subprocess.CalledProcessError:
60
- print( # noqa: T201
61
- "Lint/test failed. Fix errors and exit the shell to continue."
62
- )
63
- repo.shell()
64
75
 
65
76
  title = "Apply template updates"
66
77
  body = ""
@@ -1,13 +1,17 @@
1
- """Snapshot tests for AGENTS.md template."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
9
7
  from tests.utils import template
10
8
 
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+
13
+ from syrupy.assertion import SnapshotAssertion
14
+
11
15
 
12
16
  @pytest.mark.parametrize(
13
17
  "llm_contribution_policy", template.choices.llm_contribution_policy
@@ -1,13 +1,21 @@
1
- """Snapshot tests for compose.yaml template."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
7
+ from tests.utils import template
9
8
 
10
- @pytest.mark.parametrize("project_visibility", ["public", "private"])
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+
13
+ from syrupy.assertion import SnapshotAssertion
14
+
15
+
16
+ @pytest.mark.parametrize(
17
+ "project_visibility", template.choices.project_visibility
18
+ )
11
19
  def test_compose_features(
12
20
  render_template: Callable[..., Path],
13
21
  snapshot: SnapshotAssertion,
@@ -1,13 +1,17 @@
1
- """Snapshot tests for CONTRIBUTING.md template."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
9
7
  from tests.utils import template
10
8
 
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+
13
+ from syrupy.assertion import SnapshotAssertion
14
+
11
15
 
12
16
  @pytest.mark.parametrize(
13
17
  "enable_docs",
@@ -1,13 +1,17 @@
1
- """Snapshot tests for Dockerfile templates."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
9
7
  from tests.utils import template
10
8
 
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+
13
+ from syrupy.assertion import SnapshotAssertion
14
+
11
15
 
12
16
  @pytest.mark.parametrize(
13
17
  "python_version_minimum", template.python_versions.min_param
@@ -1,13 +1,17 @@
1
- """Snapshot tests for zensical.toml template."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
9
7
  from tests.utils import template
10
8
 
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+
13
+ from syrupy.assertion import SnapshotAssertion
14
+
11
15
 
12
16
  @pytest.mark.parametrize(
13
17
  "enable_pypi",
@@ -37,7 +41,9 @@ def test_docs_features(
37
41
  assert (rendered / "docs" / doc_file).read_text() == snapshot
38
42
 
39
43
 
40
- @pytest.mark.parametrize("project_visibility", ["public", "private"])
44
+ @pytest.mark.parametrize(
45
+ "project_visibility", template.choices.project_visibility
46
+ )
41
47
  @pytest.mark.parametrize(
42
48
  "enable_pypi",
43
49
  [pytest.param(True, id="pypi"), pytest.param(False, id="no_pypi")],
@@ -1,14 +1,18 @@
1
- """Snapshot tests for LICENSE template."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
6
  import yaml
8
- from syrupy.assertion import SnapshotAssertion
9
7
 
10
8
  from tests.utils import template
11
9
 
10
+ if TYPE_CHECKING:
11
+ from collections.abc import Callable
12
+ from pathlib import Path
13
+
14
+ from syrupy.assertion import SnapshotAssertion
15
+
12
16
 
13
17
  @pytest.mark.parametrize(
14
18
  "copyright_license", template.choices.copyright_license
@@ -24,7 +28,7 @@ def test_license(
24
28
  assert (rendered / name).read_text() == snapshot
25
29
 
26
30
 
27
- @pytest.mark.parametrize("project_type", ["application", "library"])
31
+ @pytest.mark.parametrize("project_type", template.choices.project_type)
28
32
  def test_license_default(
29
33
  render_template: Callable[..., Path], project_type: str
30
34
  ) -> None:
@@ -1,13 +1,21 @@
1
- """Snapshot tests for mise.toml template."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
7
+ from tests.utils import template
9
8
 
10
- @pytest.mark.parametrize("project_visibility", ["public", "private"])
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+
13
+ from syrupy.assertion import SnapshotAssertion
14
+
15
+
16
+ @pytest.mark.parametrize(
17
+ "project_visibility", template.choices.project_visibility
18
+ )
11
19
  @pytest.mark.parametrize(
12
20
  "enable_docs",
13
21
  [pytest.param(True, id="docs"), pytest.param(False, id="no_docs")],
@@ -1,15 +1,21 @@
1
- """Snapshot tests for pyproject.toml template."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
9
7
  from tests.utils import template
10
8
 
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
11
12
 
12
- @pytest.mark.parametrize("project_visibility", ["public", "private"])
13
+ from syrupy.assertion import SnapshotAssertion
14
+
15
+
16
+ @pytest.mark.parametrize(
17
+ "project_visibility", template.choices.project_visibility
18
+ )
13
19
  @pytest.mark.parametrize(
14
20
  "python_version_minimum", template.python_versions.min_param_full_range
15
21
  )
@@ -1,13 +1,17 @@
1
- """Snapshot tests for README.md template."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
9
7
  from tests.utils import template
10
8
 
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+
13
+ from syrupy.assertion import SnapshotAssertion
14
+
11
15
 
12
16
  @pytest.mark.parametrize(
13
17
  "enable_coverage",
@@ -40,7 +44,9 @@ def test_readme_features(
40
44
  assert (rendered / "README.md").read_text() == snapshot
41
45
 
42
46
 
43
- @pytest.mark.parametrize("project_visibility", ["public", "private"])
47
+ @pytest.mark.parametrize(
48
+ "project_visibility", template.choices.project_visibility
49
+ )
44
50
  @pytest.mark.parametrize(
45
51
  "copyright_license", template.choices.copyright_license
46
52
  )
@@ -57,7 +63,7 @@ def test_readme_project_visibility(
57
63
  assert (rendered / "README.md").read_text() == snapshot
58
64
 
59
65
 
60
- @pytest.mark.parametrize("project_type", ["application", "library"])
66
+ @pytest.mark.parametrize("project_type", template.choices.project_type)
61
67
  def test_readme_project_type(
62
68
  render_template: Callable[..., Path],
63
69
  snapshot: SnapshotAssertion,
@@ -1,13 +1,17 @@
1
- """Snapshot tests for GitHub workflow templates."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
9
7
  from tests.utils import template
10
8
 
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+
13
+ from syrupy.assertion import SnapshotAssertion
14
+
11
15
 
12
16
  @pytest.mark.parametrize(
13
17
  "enable_coverage",
@@ -1,13 +1,21 @@
1
- """Snapshot tests for zensical.toml template."""
1
+ from __future__ import annotations
2
2
 
3
- from collections.abc import Callable
4
- from pathlib import Path
3
+ from typing import TYPE_CHECKING
5
4
 
6
5
  import pytest
7
- from syrupy.assertion import SnapshotAssertion
8
6
 
7
+ from tests.utils import template
9
8
 
10
- @pytest.mark.parametrize("project_visibility", ["public", "private"])
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+
13
+ from syrupy.assertion import SnapshotAssertion
14
+
15
+
16
+ @pytest.mark.parametrize(
17
+ "project_visibility", template.choices.project_visibility
18
+ )
11
19
  @pytest.mark.parametrize(
12
20
  "enable_pypi",
13
21
  [pytest.param(True, id="pypi"), pytest.param(False, id="no_pypi")],
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
26
26
 
27
27
 
28
28
  DEFAULT_BRANCH_NAME = "fhqwhgads"
29
- DEFAULT_END_REF = "v0.20.0"
29
+ DEFAULT_END_REF = "v0.22.2"
30
30
 
31
31
 
32
32
  @pytest.fixture(params=["v0.16.0"])
@@ -316,7 +316,6 @@ def test_main_update_error(
316
316
  ["copier", "update", "--skip-answered", "--vcs-ref", end_ref],
317
317
  cwd=worktree,
318
318
  )
319
- expect_run.expect(["mise", "install"], cwd=worktree)
320
319
  expect_run.expect(
321
320
  ["git", "status", "--porcelain"], cwd=worktree, capture_output=True
322
321
  )
@@ -324,6 +323,7 @@ def test_main_update_error(
324
323
  expect_run.expect(
325
324
  ["git", "status", "--porcelain"], cwd=worktree, capture_output=True
326
325
  )
326
+ expect_run.expect(["mise", "install"], cwd=worktree)
327
327
  expect_run.expect(["mise", "run", "lt"], cwd=worktree)
328
328
  expect_run.expect([str(mock_shell)], cwd=worktree)
329
329
  for cmd in [
@@ -407,10 +407,10 @@ def test_main_update_with_project(
407
407
  ["copier", "update", "--skip-answered", "--vcs-ref", end_ref],
408
408
  cwd=worktree,
409
409
  )
410
- expect_run.expect(["mise", "install"], cwd=worktree)
411
410
  expect_run.expect(
412
411
  ["git", "status", "--porcelain"], cwd=worktree, capture_output=True
413
412
  )
413
+ expect_run.expect(["mise", "install"], cwd=worktree)
414
414
  for cmd in [
415
415
  [*["mise", "run", "lt"]],
416
416
  [*["git", "add", "-A"]],
File without changes
File without changes
File without changes