crackerjack 0.21.1__tar.gz → 0.21.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.
Files changed (89) hide show
  1. {crackerjack-0.21.1 → crackerjack-0.21.2}/PKG-INFO +1 -1
  2. crackerjack-0.21.2/crackerjack/.pre-commit-config-ai.yaml +135 -0
  3. crackerjack-0.21.2/crackerjack/.ruff_cache/0.12.1/5056746222905752453 +0 -0
  4. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/crackerjack.py +21 -5
  5. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/pyproject.toml +1 -1
  6. {crackerjack-0.21.1 → crackerjack-0.21.2}/pyproject.toml +1 -1
  7. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_crackerjack.py +69 -0
  8. crackerjack-0.21.1/crackerjack/.ruff_cache/0.12.1/5056746222905752453 +0 -0
  9. {crackerjack-0.21.1 → crackerjack-0.21.2}/LICENSE +0 -0
  10. {crackerjack-0.21.1 → crackerjack-0.21.2}/README.md +0 -0
  11. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.gitignore +0 -0
  12. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.libcst.codemod.yaml +0 -0
  13. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.pdm.toml +0 -0
  14. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.pre-commit-config.yaml +0 -0
  15. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.pytest_cache/.gitignore +0 -0
  16. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.pytest_cache/CACHEDIR.TAG +0 -0
  17. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.pytest_cache/README.md +0 -0
  18. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.pytest_cache/v/cache/nodeids +0 -0
  19. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.pytest_cache/v/cache/stepwise +0 -0
  20. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/.gitignore +0 -0
  21. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
  22. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
  23. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
  24. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
  25. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
  26. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
  27. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.11/18187162184424859798 +0 -0
  28. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.12/16869036553936192448 +0 -0
  29. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.12/1867267426380906393 +0 -0
  30. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.12/4240757255861806333 +0 -0
  31. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.12/4441409093023629623 +0 -0
  32. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.13/1867267426380906393 +0 -0
  33. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.13/4240757255861806333 +0 -0
  34. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
  35. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
  36. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
  37. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
  38. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
  39. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
  40. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
  41. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.12.0/5056746222905752453 +0 -0
  42. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
  43. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
  44. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
  45. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
  46. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
  47. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
  48. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
  49. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
  50. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
  51. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
  52. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
  53. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
  54. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
  55. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
  56. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
  57. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
  58. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
  59. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
  60. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
  61. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
  62. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
  63. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
  64. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
  65. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
  66. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
  67. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
  68. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/.ruff_cache/CACHEDIR.TAG +0 -0
  69. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/__init__.py +0 -0
  70. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/__main__.py +0 -0
  71. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/errors.py +0 -0
  72. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/interactive.py +0 -0
  73. {crackerjack-0.21.1 → crackerjack-0.21.2}/crackerjack/py313.py +0 -0
  74. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/TESTING.md +0 -0
  75. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/__init__.py +0 -0
  76. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/conftest.py +0 -0
  77. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/data/comments_sample.txt +0 -0
  78. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/data/docstrings_sample.txt +0 -0
  79. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/data/expected_comments_sample.txt +0 -0
  80. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/data/init.py +0 -0
  81. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_crackerjack_runner.py +0 -0
  82. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_errors.py +0 -0
  83. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_interactive.py +0 -0
  84. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_interactive_run.py +0 -0
  85. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_main.py +0 -0
  86. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_py313_advanced.py +0 -0
  87. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_py313_features.py +0 -0
  88. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_pytest_features.py +0 -0
  89. {crackerjack-0.21.1 → crackerjack-0.21.2}/tests/test_structured_errors.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: crackerjack
3
- Version: 0.21.1
3
+ Version: 0.21.2
4
4
  Summary: Crackerjack: code quality toolkit
5
5
  Keywords: bandit,black,creosote,mypy,pyright,pytest,refurb,ruff
6
6
  Author-Email: lesleslie <les@wedgwoodwebworks.com>
@@ -0,0 +1,135 @@
1
+ repos:
2
+ # File structure and format validators - check structure first
3
+ - repo: https://github.com/pre-commit/pre-commit-hooks
4
+ rev: v5.0.0
5
+ hooks:
6
+ - id: trailing-whitespace
7
+ name: trailing-whitespace
8
+ verbose: true
9
+ - id: end-of-file-fixer
10
+ name: end-of-file-fixer
11
+ verbose: true
12
+ - id: check-yaml
13
+ name: check-yaml
14
+ verbose: true
15
+ - id: check-toml
16
+ name: check-toml
17
+ verbose: true
18
+ - id: check-added-large-files
19
+ name: check-added-large-files
20
+ verbose: true
21
+
22
+ - repo: https://github.com/abravalheri/validate-pyproject
23
+ rev: v0.24.1
24
+ hooks:
25
+ - id: validate-pyproject
26
+ verbose: true
27
+
28
+ - repo: https://github.com/tox-dev/pyproject-fmt
29
+ rev: "v2.6.0"
30
+ hooks:
31
+ - id: pyproject-fmt
32
+ verbose: true
33
+
34
+ # Package management - once structure is valid
35
+ - repo: https://github.com/pdm-project/pdm
36
+ rev: 2.25.3
37
+ hooks:
38
+ - id: pdm-lock-check
39
+ verbose: true
40
+ - id: pdm-sync
41
+ verbose: true
42
+ additional_dependencies:
43
+ - keyring
44
+
45
+ - repo: https://github.com/astral-sh/uv-pre-commit
46
+ rev: 0.7.15
47
+ hooks:
48
+ - id: uv-lock
49
+ files: ^pyproject\.toml$
50
+ verbose: true
51
+
52
+ # Security check - early to prevent credential leaks
53
+ - repo: https://github.com/Yelp/detect-secrets
54
+ rev: v1.5.0
55
+ hooks:
56
+ - id: detect-secrets
57
+ exclude: 'pdm\.lock|uv\.lock|pyproject\.toml|tests/.*|docs/.*|.*\.md'
58
+ verbose: true
59
+
60
+ # Code quality tier 1 - quick fixes
61
+ - repo: https://github.com/codespell-project/codespell
62
+ rev: v2.4.1
63
+ hooks:
64
+ - id: codespell
65
+ verbose: true
66
+ additional_dependencies:
67
+ - tomli
68
+
69
+ - repo: https://github.com/astral-sh/ruff-pre-commit
70
+ rev: v0.12.1
71
+ hooks:
72
+ - id: ruff-check
73
+ verbose: true
74
+ args: [--output-format=json]
75
+ - id: ruff-format
76
+ verbose: true
77
+
78
+ # Code quality tier 2 - analysis
79
+ - repo: https://github.com/jendrikseipp/vulture
80
+ rev: 'v2.14'
81
+ hooks:
82
+ - id: vulture
83
+ verbose: true
84
+
85
+ - repo: https://github.com/fredrikaverpil/creosote
86
+ rev: v4.0.3
87
+ hooks:
88
+ - id: creosote
89
+ verbose: true
90
+
91
+ - repo: https://github.com/rohaquinlop/complexipy-pre-commit
92
+ rev: v3.0.0
93
+ hooks:
94
+ - id: complexipy
95
+ args: ["-d", "low", "-j"]
96
+ verbose: true
97
+
98
+ - repo: https://github.com/dosisod/refurb
99
+ rev: v2.1.0
100
+ hooks:
101
+ - id: refurb
102
+ verbose: true
103
+
104
+ # Code quality tier 3 - thorough checks
105
+ - repo: local
106
+ hooks:
107
+ - id: autotyping
108
+ name: autotyping
109
+ entry: python -m autotyping
110
+ args:
111
+ - --aggressive
112
+ - --only-without-imports
113
+ - --guess-common-names
114
+ - crackerjack
115
+ types_or: [ python, pyi ]
116
+ language: python
117
+ files: \.py$
118
+ verbose: true
119
+ additional_dependencies:
120
+ - autotyping>=24.3.0
121
+ - libcst>=1.1.0
122
+
123
+ - repo: https://github.com/PyCQA/bandit
124
+ rev: '1.8.5'
125
+ hooks:
126
+ - id: bandit
127
+ args: ["-c", "pyproject.toml", "--format", "json"]
128
+ verbose: true
129
+
130
+ - repo: https://github.com/RobertCraigie/pyright-python
131
+ rev: v1.1.402
132
+ hooks:
133
+ - id: pyright
134
+ verbose: true
135
+ args: ["--outputjson"]
@@ -12,7 +12,12 @@ from rich.console import Console
12
12
  from tomli_w import dumps
13
13
  from crackerjack.errors import ErrorCode, ExecutionError
14
14
 
15
- config_files = (".gitignore", ".pre-commit-config.yaml", ".libcst.codemod.yaml")
15
+ config_files = (
16
+ ".gitignore",
17
+ ".pre-commit-config.yaml",
18
+ ".pre-commit-config-ai.yaml",
19
+ ".libcst.codemod.yaml",
20
+ )
16
21
  default_python_version = "3.13"
17
22
 
18
23
 
@@ -534,6 +539,7 @@ class ProjectManager(BaseModel, arbitrary_types_allowed=True):
534
539
  code_cleaner: CodeCleaner
535
540
  config_manager: ConfigManager
536
541
  dry_run: bool = False
542
+ options: t.Any = None
537
543
 
538
544
  def update_pkg_configs(self) -> None:
539
545
  self.config_manager.copy_configs()
@@ -548,15 +554,21 @@ class ProjectManager(BaseModel, arbitrary_types_allowed=True):
548
554
  self.execute_command(["git", "branch", "-m", "main"])
549
555
  self.execute_command(["git", "add", "pyproject.toml"])
550
556
  self.execute_command(["git", "add", "pdm.lock"])
551
- self.execute_command(["pre-commit", "install"])
557
+ install_cmd = ["pre-commit", "install"]
558
+ if hasattr(self, "options") and getattr(self.options, "ai_agent", False):
559
+ install_cmd.extend(["-c", ".pre-commit-config-ai.yaml"])
560
+ self.execute_command(install_cmd)
552
561
  self.execute_command(["git", "config", "advice.addIgnoredFile", "false"])
553
562
  self.config_manager.update_pyproject_configs()
554
563
 
555
564
  def run_pre_commit(self) -> None:
556
565
  self.console.print("\nRunning pre-commit hooks...\n")
557
- check_all = self.execute_command(["pre-commit", "run", "--all-files"])
566
+ cmd = ["pre-commit", "run", "--all-files"]
567
+ if hasattr(self, "options") and getattr(self.options, "ai_agent", False):
568
+ cmd.extend(["-c", ".pre-commit-config-ai.yaml"])
569
+ check_all = self.execute_command(cmd)
558
570
  if check_all.returncode > 0:
559
- check_all = self.execute_command(["pre-commit", "run", "--all-files"])
571
+ check_all = self.execute_command(cmd)
560
572
  if check_all.returncode > 0:
561
573
  self.console.print("\n\nPre-commit failed. Please fix errors.\n")
562
574
  raise SystemExit(1)
@@ -630,7 +642,10 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
630
642
 
631
643
  def _update_precommit(self, options: t.Any) -> None:
632
644
  if self.pkg_path.stem == "crackerjack" and options.update_precommit:
633
- self.execute_command(["pre-commit", "autoupdate"])
645
+ update_cmd = ["pre-commit", "autoupdate"]
646
+ if options.ai_agent:
647
+ update_cmd.extend(["-c", ".pre-commit-config-ai.yaml"])
648
+ self.execute_command(update_cmd)
634
649
 
635
650
  def _clean_project(self, options: t.Any) -> None:
636
651
  if options.clean:
@@ -774,6 +789,7 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
774
789
  self._update_project(options)
775
790
  self._update_precommit(options)
776
791
  self._clean_project(options)
792
+ self.project_manager.options = options
777
793
  if not options.skip_hooks:
778
794
  self.project_manager.run_pre_commit()
779
795
  else:
@@ -4,7 +4,7 @@ requires = [ "pdm-backend" ]
4
4
 
5
5
  [project]
6
6
  name = "crackerjack"
7
- version = "0.21.0"
7
+ version = "0.21.1"
8
8
  description = "Crackerjack: code quality toolkit"
9
9
  readme = "README.md"
10
10
  keywords = [
@@ -6,7 +6,7 @@ requires = [
6
6
 
7
7
  [project]
8
8
  name = "crackerjack"
9
- version = "0.21.1"
9
+ version = "0.21.2"
10
10
  description = "Crackerjack: code quality toolkit"
11
11
  readme = "README.md"
12
12
  keywords = [
@@ -852,6 +852,75 @@ class TestCrackerjackProcess:
852
852
  cj.process(options)
853
853
  mock_cj_execute.assert_any_call(["pre-commit", "autoupdate"])
854
854
 
855
+ def test_update_precommit_ai_agent(
856
+ self,
857
+ mock_console_print: MagicMock,
858
+ tmp_path: Path,
859
+ options_factory: t.Callable[..., OptionsForTesting],
860
+ ) -> None:
861
+ crackerjack_path = tmp_path / "crackerjack"
862
+ crackerjack_path.mkdir(exist_ok=True)
863
+ options = options_factory(update_precommit=True, ai_agent=True)
864
+ with patch.object(Crackerjack, "execute_command") as mock_cj_execute:
865
+ mock_cj_execute.return_value = MagicMock(returncode=0, stdout="Success")
866
+ cj = Crackerjack(pkg_path=crackerjack_path, dry_run=True)
867
+ with patch.object(cj, "_setup_package"):
868
+ with patch.object(cj, "_update_project"):
869
+ cj.process(options)
870
+ mock_cj_execute.assert_any_call(
871
+ ["pre-commit", "autoupdate", "-c", ".pre-commit-config-ai.yaml"]
872
+ )
873
+
874
+ def test_run_pre_commit_ai_agent(
875
+ self,
876
+ mock_console_print: MagicMock,
877
+ tmp_path: Path,
878
+ options_factory: t.Callable[..., OptionsForTesting],
879
+ ) -> None:
880
+ mock_project = MagicMock()
881
+
882
+ options = options_factory(ai_agent=True)
883
+ mock_project.options = options
884
+
885
+ mock_project.console = MagicMock()
886
+
887
+ mock_project.execute_command.return_value = MagicMock(returncode=0)
888
+
889
+ ProjectManager.run_pre_commit(mock_project)
890
+
891
+ mock_project.execute_command.assert_called_with(
892
+ ["pre-commit", "run", "--all-files", "-c", ".pre-commit-config-ai.yaml"]
893
+ )
894
+
895
+ def test_pre_commit_install_ai_agent(
896
+ self,
897
+ mock_console_print: MagicMock,
898
+ tmp_path: Path,
899
+ options_factory: t.Callable[..., OptionsForTesting],
900
+ ) -> None:
901
+ mock_project = MagicMock(spec=ProjectManager)
902
+
903
+ options = options_factory(ai_agent=True)
904
+ mock_project.options = options
905
+
906
+ mock_project.console = MagicMock()
907
+
908
+ mock_project.config_manager = MagicMock()
909
+
910
+ with patch.object(mock_project, "execute_command") as mock_execute:
911
+ mock_execute.return_value = MagicMock(
912
+ returncode=0,
913
+ stdout="package1\npackage2\n",
914
+ )
915
+
916
+ original_method = ProjectManager.update_pkg_configs
917
+
918
+ original_method(mock_project)
919
+
920
+ mock_execute.assert_any_call(
921
+ ["pre-commit", "install", "-c", ".pre-commit-config-ai.yaml"]
922
+ )
923
+
855
924
  def test_process_with_precommit_failure(
856
925
  self,
857
926
  mock_execute: MagicMock,
File without changes
File without changes