crackerjack 0.11.1__tar.gz → 0.11.2__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.
- {crackerjack-0.11.1 → crackerjack-0.11.2}/PKG-INFO +2 -1
- crackerjack-0.11.2/crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/crackerjack.py +5 -4
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/pyproject.toml +3 -1
- {crackerjack-0.11.1 → crackerjack-0.11.2}/pyproject.toml +3 -1
- crackerjack-0.11.2/tests/test_crackerjack.py +174 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/tests/test_main.py +1 -4
- crackerjack-0.11.1/crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
- crackerjack-0.11.1/tests/test_crackerjack.py +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/LICENSE +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/README.md +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.gitignore +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.libcst.codemod.yaml +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.pdm.toml +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.pre-commit-config.yaml +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/.gitignore +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/CACHEDIR.TAG +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/__init__.py +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/__main__.py +0 -0
- {crackerjack-0.11.1 → crackerjack-0.11.2}/tests/__init__.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: crackerjack
|
3
|
-
Version: 0.11.
|
3
|
+
Version: 0.11.2
|
4
4
|
Summary: Default template for PDM package
|
5
5
|
Keywords: black,ruff,mypy,creosote,refurb
|
6
6
|
Author-Email: lesleslie <les@wedgwoodwebworks.com>
|
@@ -33,6 +33,7 @@ Requires-Dist: uv>=0.5.13
|
|
33
33
|
Requires-Dist: pytest-cov>=6.0.0
|
34
34
|
Requires-Dist: pytest-mock>=3.14.0
|
35
35
|
Requires-Dist: tomli-w>=1.2.0
|
36
|
+
Requires-Dist: pytest-asyncio>=0.25.3
|
36
37
|
Description-Content-Type: text/markdown
|
37
38
|
|
38
39
|
# Crackerjack Python
|
Binary file
|
@@ -28,6 +28,8 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
|
|
28
28
|
return
|
29
29
|
our_toml_config: t.Any = loads(self.our_toml_path.read_text())
|
30
30
|
pkg_toml_config: t.Any = loads(self.pkg_toml_path.read_text())
|
31
|
+
pkg_toml_config.setdefault("tool", {})
|
32
|
+
pkg_toml_config.setdefault("project", {})
|
31
33
|
for tool, settings in our_toml_config["tool"].items():
|
32
34
|
for setting, value in settings.items():
|
33
35
|
if isinstance(value, str | list) and "crackerjack" in value:
|
@@ -44,14 +46,13 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
|
|
44
46
|
"skips",
|
45
47
|
"ignore",
|
46
48
|
) and isinstance(value, list):
|
47
|
-
|
48
|
-
|
49
|
-
)
|
49
|
+
conf = pkg_toml_config["tool"].get(tool, {}).get(setting, [])
|
50
|
+
settings[setting] = list(set(conf + value))
|
50
51
|
pkg_toml_config["tool"][tool] = settings
|
51
52
|
python_version_pattern = r"\s*W*(\d\.\d*)"
|
52
53
|
requires_python = our_toml_config["project"]["requires-python"]
|
53
54
|
classifiers = []
|
54
|
-
for classifier in pkg_toml_config["project"]
|
55
|
+
for classifier in pkg_toml_config["project"].get("classifiers", []):
|
55
56
|
classifier = re.sub(
|
56
57
|
python_version_pattern, f" {self.python_version}", classifier
|
57
58
|
)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
[tool.pytest.ini_options]
|
2
2
|
addopts = "--cov=crackerjack"
|
3
|
+
asyncio_default_fixture_loop_scope = "function"
|
3
4
|
|
4
5
|
[tool.codespell]
|
5
6
|
skip = "*/data/*"
|
@@ -114,7 +115,7 @@ pythonPlatform = "Darwin"
|
|
114
115
|
|
115
116
|
[project]
|
116
117
|
name = "crackerjack"
|
117
|
-
version = "0.11.
|
118
|
+
version = "0.11.1"
|
118
119
|
description = "Default template for PDM package"
|
119
120
|
requires-python = ">=3.13"
|
120
121
|
readme = "README.md"
|
@@ -151,6 +152,7 @@ dependencies = [
|
|
151
152
|
"pytest-cov>=6.0.0",
|
152
153
|
"pytest-mock>=3.14.0",
|
153
154
|
"tomli-w>=1.2.0",
|
155
|
+
"pytest-asyncio>=0.25.3",
|
154
156
|
]
|
155
157
|
authors = [
|
156
158
|
{ name = "lesleslie", email = "les@wedgwoodwebworks.com" },
|
@@ -1,5 +1,6 @@
|
|
1
1
|
[tool.pytest.ini_options]
|
2
2
|
addopts = "--cov=crackerjack"
|
3
|
+
asyncio_default_fixture_loop_scope = "function"
|
3
4
|
|
4
5
|
[tool.codespell]
|
5
6
|
skip = "*/data/*"
|
@@ -116,7 +117,7 @@ pythonPlatform = "Darwin"
|
|
116
117
|
|
117
118
|
[project]
|
118
119
|
name = "crackerjack"
|
119
|
-
version = "0.11.
|
120
|
+
version = "0.11.2"
|
120
121
|
description = "Default template for PDM package"
|
121
122
|
requires-python = ">=3.13"
|
122
123
|
readme = "README.md"
|
@@ -153,6 +154,7 @@ dependencies = [
|
|
153
154
|
"pytest-cov>=6.0.0",
|
154
155
|
"pytest-mock>=3.14.0",
|
155
156
|
"tomli-w>=1.2.0",
|
157
|
+
"pytest-asyncio>=0.25.3",
|
156
158
|
]
|
157
159
|
authors = [
|
158
160
|
{ name = "lesleslie", email = "les@wedgwoodwebworks.com" },
|
@@ -0,0 +1,174 @@
|
|
1
|
+
import typing as t
|
2
|
+
from pathlib import Path
|
3
|
+
from unittest.mock import MagicMock, call, patch
|
4
|
+
|
5
|
+
import pytest
|
6
|
+
from crackerjack.__main__ import options
|
7
|
+
from crackerjack.crackerjack import Crackerjack
|
8
|
+
|
9
|
+
|
10
|
+
@pytest.fixture
|
11
|
+
def mock_execute() -> t.Generator[t.Any, t.Any, t.Any]:
|
12
|
+
with patch("crackerjack.crackerjack.execute") as mock:
|
13
|
+
yield mock
|
14
|
+
|
15
|
+
|
16
|
+
@pytest.fixture
|
17
|
+
def mock_subprocess_run() -> t.Generator[t.Any, t.Any, t.Any]:
|
18
|
+
with patch("subprocess.run") as mock:
|
19
|
+
yield mock
|
20
|
+
|
21
|
+
|
22
|
+
@pytest.fixture
|
23
|
+
def mock_print() -> t.Generator[t.Any, t.Any, t.Any]:
|
24
|
+
with patch("builtins.print") as mock:
|
25
|
+
yield mock
|
26
|
+
|
27
|
+
|
28
|
+
@pytest.fixture
|
29
|
+
def mock_input() -> t.Generator[t.Any, t.Any, t.Any]:
|
30
|
+
with patch("builtins.input") as mock:
|
31
|
+
yield mock
|
32
|
+
|
33
|
+
|
34
|
+
@pytest.fixture(autouse=True)
|
35
|
+
def reset_options() -> None:
|
36
|
+
"""Resets the options before each test."""
|
37
|
+
options.commit = False
|
38
|
+
options.interactive = False
|
39
|
+
options.doc = False
|
40
|
+
options.update_precommit = False
|
41
|
+
options.do_not_update_configs = False
|
42
|
+
options.publish = False
|
43
|
+
options.bump = False
|
44
|
+
options.verbose = False
|
45
|
+
|
46
|
+
|
47
|
+
@pytest.fixture
|
48
|
+
def tmp_path_package(tmp_path: Path) -> Path:
|
49
|
+
return tmp_path / "my-package"
|
50
|
+
|
51
|
+
|
52
|
+
@pytest.fixture
|
53
|
+
def create_package_dir(tmp_path_package: Path) -> None:
|
54
|
+
(tmp_path_package / "my_package").mkdir(parents=True)
|
55
|
+
(tmp_path_package / "pyproject.toml").touch()
|
56
|
+
(tmp_path_package / ".gitignore").touch()
|
57
|
+
(tmp_path_package / ".pre-commit-config.yaml").touch()
|
58
|
+
(tmp_path_package / ".libcst.codemod.yaml").touch()
|
59
|
+
|
60
|
+
|
61
|
+
class TestCrackerjackProcess:
|
62
|
+
def test_process_all_options(
|
63
|
+
self,
|
64
|
+
mock_execute: MagicMock,
|
65
|
+
mock_print: MagicMock,
|
66
|
+
mock_input: MagicMock,
|
67
|
+
mock_subprocess_run: MagicMock,
|
68
|
+
tmp_path: Path,
|
69
|
+
tmp_path_package: Path,
|
70
|
+
create_package_dir: None,
|
71
|
+
) -> None:
|
72
|
+
mock_input.return_value = "Test Commit"
|
73
|
+
mock_execute.return_value.returncode = 0
|
74
|
+
mock_execute.return_value.stdout = "Mock Build Output"
|
75
|
+
mock_subprocess_run.return_value.returncode = 0
|
76
|
+
mock_execute.return_value.stderr = ""
|
77
|
+
mock_subprocess_run.return_value.stdout = ""
|
78
|
+
mock_subprocess_run.return_value.stderr = ""
|
79
|
+
crackerjack_instance = Crackerjack(pkg_path=tmp_path_package)
|
80
|
+
options_mock = MagicMock()
|
81
|
+
options_mock.do_not_update_configs = False
|
82
|
+
options_mock.update_precommit = True
|
83
|
+
options_mock.interactive = True
|
84
|
+
options_mock.commit = False
|
85
|
+
options_mock.publish = None
|
86
|
+
options_mock.bump = None
|
87
|
+
crackerjack_instance.process(options_mock)
|
88
|
+
|
89
|
+
assert crackerjack_instance.pkg_name == "my_package"
|
90
|
+
(tmp_path_package / "my_package").exists()
|
91
|
+
mock_execute.assert_has_calls(
|
92
|
+
[
|
93
|
+
call(["pdm", "self", "add", "keyring"]),
|
94
|
+
call(["pdm", "config", "python.use_uv", "true"]),
|
95
|
+
call(["git", "init"]),
|
96
|
+
call(["git", "branch", "-m", "main"]),
|
97
|
+
call(["git", "add", "pyproject.toml"]),
|
98
|
+
call(["git", "add", "pdm.lock"]),
|
99
|
+
call(["pre-commit", "install"]),
|
100
|
+
call(["git", "config", "advice.addIgnoredFile", "false"]),
|
101
|
+
call(["pdm", "install"]),
|
102
|
+
call(["pre-commit", "run", "refurb", "--all-files"]),
|
103
|
+
call(["pre-commit", "run", "bandit", "--all-files"]),
|
104
|
+
call(["pre-commit", "run", "pyright", "--all-files"]),
|
105
|
+
call(["pre-commit", "run", "--all-files"]),
|
106
|
+
call(["git", "add", ".gitignore"]),
|
107
|
+
call(["git", "add", ".pre-commit-config.yaml"]),
|
108
|
+
call(["git", "add", ".libcst.codemod.yaml"]),
|
109
|
+
],
|
110
|
+
any_order=True,
|
111
|
+
)
|
112
|
+
|
113
|
+
def test_process_no_options(
|
114
|
+
self,
|
115
|
+
mock_execute: MagicMock,
|
116
|
+
mock_print: MagicMock,
|
117
|
+
mock_subprocess_run: MagicMock,
|
118
|
+
tmp_path_package: Path,
|
119
|
+
create_package_dir: None,
|
120
|
+
) -> None:
|
121
|
+
mock_execute.return_value.returncode = 0
|
122
|
+
mock_subprocess_run.return_value.returncode = 0
|
123
|
+
crackerjack_instance = Crackerjack(pkg_path=tmp_path_package)
|
124
|
+
options_mock = MagicMock()
|
125
|
+
options_mock.do_not_update_configs = True
|
126
|
+
options_mock.update_precommit = False
|
127
|
+
options_mock.interactive = False
|
128
|
+
options_mock.publish = None
|
129
|
+
options_mock.bump = None
|
130
|
+
options_mock.commit = False
|
131
|
+
|
132
|
+
crackerjack_instance.process(options_mock)
|
133
|
+
|
134
|
+
assert crackerjack_instance.pkg_name == "my_package"
|
135
|
+
(tmp_path_package / "my_package").exists()
|
136
|
+
mock_execute.assert_has_calls(
|
137
|
+
[
|
138
|
+
call(["pre-commit", "run", "--all-files"]),
|
139
|
+
]
|
140
|
+
)
|
141
|
+
|
142
|
+
def test_process_interactive_hooks(
|
143
|
+
self,
|
144
|
+
mock_execute: MagicMock,
|
145
|
+
mock_print: MagicMock,
|
146
|
+
mock_subprocess_run: MagicMock,
|
147
|
+
tmp_path_package: Path,
|
148
|
+
create_package_dir: None,
|
149
|
+
) -> None:
|
150
|
+
mock_execute.return_value.returncode = 0
|
151
|
+
mock_subprocess_run.return_value.returncode = 0
|
152
|
+
|
153
|
+
crackerjack_instance = Crackerjack(pkg_path=tmp_path_package)
|
154
|
+
options_mock = MagicMock()
|
155
|
+
options_mock.do_not_update_configs = False
|
156
|
+
options_mock.update_precommit = False
|
157
|
+
options_mock.interactive = True
|
158
|
+
options_mock.publish = None
|
159
|
+
options_mock.bump = None
|
160
|
+
options_mock.commit = False
|
161
|
+
|
162
|
+
crackerjack_instance.process(options_mock)
|
163
|
+
|
164
|
+
assert crackerjack_instance.pkg_name == "my_package"
|
165
|
+
(tmp_path_package / "my_package").exists()
|
166
|
+
|
167
|
+
mock_execute.assert_has_calls(
|
168
|
+
[
|
169
|
+
call(["pre-commit", "run", "refurb", "--all-files"]),
|
170
|
+
call(["pre-commit", "run", "bandit", "--all-files"]),
|
171
|
+
call(["pre-commit", "run", "pyright", "--all-files"]),
|
172
|
+
call(["pre-commit", "run", "--all-files"]),
|
173
|
+
]
|
174
|
+
)
|
@@ -2,15 +2,13 @@ import typing as t
|
|
2
2
|
|
3
3
|
import pytest
|
4
4
|
from click.testing import CliRunner
|
5
|
-
from crackerjack.__main__ import crackerjack, options
|
5
|
+
from crackerjack.__main__ import crackerjack, options
|
6
6
|
from crackerjack.crackerjack import Crackerjack
|
7
7
|
|
8
8
|
|
9
|
-
# Mock crackerjack_it before test suite
|
10
9
|
@pytest.fixture(autouse=True)
|
11
10
|
def mock_crackerjack_it(monkeypatch: pytest.MonkeyPatch) -> None:
|
12
11
|
def mock_process(self: Crackerjack, options: t.Any) -> None:
|
13
|
-
"""Mock implementation for crackerjack_it process function."""
|
14
12
|
pass
|
15
13
|
|
16
14
|
monkeypatch.setattr(Crackerjack, "process", mock_process)
|
@@ -23,7 +21,6 @@ def runner() -> CliRunner:
|
|
23
21
|
|
24
22
|
@pytest.fixture(autouse=True)
|
25
23
|
def reset_options() -> None:
|
26
|
-
"""Resets the options before each test."""
|
27
24
|
options.commit = False
|
28
25
|
options.interactive = False
|
29
26
|
options.doc = False
|
Binary file
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.11/3256171999636029978
RENAMED
File without changes
|
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.4/10355199064880463147
RENAMED
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.6/15140459877605758699
RENAMED
File without changes
|
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.1.9/17041001205004563469
RENAMED
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.2.0/10047773857155985907
RENAMED
File without changes
|
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.2.2/18053836298936336950
RENAMED
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.3.0/12548816621480535786
RENAMED
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.3.3/11081883392474770722
RENAMED
File without changes
|
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.3.5/16311176246009842383
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.6.0/11982804814124138945
RENAMED
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.6.0/12055761203849489982
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.7.3/16061516852537040135
RENAMED
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.8.4/16354268377385700367
RENAMED
File without changes
|
{crackerjack-0.11.1 → crackerjack-0.11.2}/crackerjack/.ruff_cache/0.9.3/13948373885254993391
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|