crackerjack 0.26.0__py3-none-any.whl → 0.27.1__py3-none-any.whl

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.

Potentially problematic release.


This version of crackerjack might be problematic. Click here for more details.

crackerjack/.gitignore CHANGED
@@ -18,3 +18,14 @@
18
18
  /coverage.json
19
19
  /test-results.xml
20
20
  /.coverage
21
+
22
+ # AI agent output files
23
+ /hooks-analysis.json
24
+ /quality-metrics.json
25
+ /project-structure.json
26
+ /error-context.json
27
+ /ai-agent-summary.json
28
+ /bandit-report.json
29
+
30
+ # Autotyping cache
31
+ .autotyping-cache/
@@ -1,105 +1,112 @@
1
+ # AI-optimized pre-commit hooks for comprehensive analysis and structured output
2
+ # Designed for AI agent workflows with enhanced reporting and metrics
3
+
1
4
  repos:
2
- # File structure and format validators - check structure first
5
+ # Group 1: File Structure & Format Validation (parallel-safe, fast)
3
6
  - repo: https://github.com/pre-commit/pre-commit-hooks
4
7
  rev: v5.0.0
5
8
  hooks:
6
9
  - id: trailing-whitespace
7
10
  name: trailing-whitespace
8
- verbose: true
11
+ stages: [pre-commit]
9
12
  - id: end-of-file-fixer
10
13
  name: end-of-file-fixer
11
- verbose: true
14
+ stages: [pre-commit]
12
15
  - id: check-yaml
13
16
  name: check-yaml
14
- verbose: true
17
+ stages: [pre-commit]
15
18
  - id: check-toml
16
19
  name: check-toml
17
- verbose: true
20
+ stages: [pre-commit]
18
21
  - id: check-added-large-files
19
22
  name: check-added-large-files
20
- verbose: true
23
+ stages: [pre-commit]
21
24
 
25
+ # Group 2: Project Configuration Management
22
26
  - repo: https://github.com/abravalheri/validate-pyproject
23
27
  rev: v0.24.1
24
28
  hooks:
25
29
  - id: validate-pyproject
26
- verbose: true
30
+ stages: [pre-commit]
27
31
 
28
32
  - repo: https://github.com/tox-dev/pyproject-fmt
29
33
  rev: "v2.6.0"
30
34
  hooks:
31
35
  - id: pyproject-fmt
32
36
  args: ["-n"]
33
- verbose: true
37
+ stages: [pre-commit]
34
38
 
35
- # Package management - once structure is valid
36
39
  - repo: https://github.com/astral-sh/uv-pre-commit
37
- rev: 0.7.15
40
+ rev: 0.7.21
38
41
  hooks:
39
42
  - id: uv-lock
40
43
  files: ^pyproject\.toml$
41
- verbose: true
44
+ stages: [pre-commit]
42
45
 
43
- # Security check - early to prevent credential leaks
46
+ # Group 3: Security (early detection, critical)
44
47
  - repo: https://github.com/Yelp/detect-secrets
45
48
  rev: v1.5.0
46
49
  hooks:
47
50
  - id: detect-secrets
48
51
  exclude: 'uv\.lock|pyproject\.toml|tests/.*|docs/.*|.*\.md'
49
- verbose: true
52
+ stages: [pre-commit]
50
53
 
51
- # Code quality tier 1 - quick fixes
54
+ # Group 4: Code Quality & Style (fast formatting)
52
55
  - repo: https://github.com/codespell-project/codespell
53
56
  rev: v2.4.1
54
57
  hooks:
55
58
  - id: codespell
56
- verbose: true
57
59
  additional_dependencies:
58
60
  - tomli
61
+ stages: [pre-commit]
59
62
 
60
63
  - repo: https://github.com/astral-sh/ruff-pre-commit
61
- rev: v0.12.1
64
+ rev: v0.12.3
62
65
  hooks:
63
66
  - id: ruff-check
64
- verbose: true
65
- args: [--output-format=json]
67
+ args: ["--output-format=json", "--fix"]
68
+ stages: [pre-commit]
66
69
  - id: ruff-format
67
- verbose: true
70
+ stages: [pre-commit]
68
71
 
69
72
  - repo: https://github.com/executablebooks/mdformat
70
- rev: 0.7.18
73
+ rev: 0.7.22
71
74
  hooks:
72
75
  - id: mdformat
73
76
  additional_dependencies:
74
77
  - mdformat-ruff
78
+ stages: [pre-commit]
75
79
 
76
- # Code quality tier 2 - analysis
80
+ # Group 5: Static Analysis (comprehensive, slower)
77
81
  - repo: https://github.com/jendrikseipp/vulture
78
82
  rev: 'v2.14'
79
83
  hooks:
80
84
  - id: vulture
81
- verbose: true
85
+ args: ["--verbose"]
86
+ stages: [pre-commit]
82
87
 
83
88
  - repo: https://github.com/fredrikaverpil/creosote
84
89
  rev: v4.0.3
85
90
  hooks:
86
91
  - id: creosote
87
- verbose: true
92
+ args: ["--verbose"]
93
+ stages: [pre-commit]
88
94
 
89
95
  - repo: https://github.com/rohaquinlop/complexipy-pre-commit
90
96
  rev: v3.0.0
91
97
  hooks:
92
98
  - id: complexipy
93
- args: ["-d", "low", "-j"]
94
- verbose: true
99
+ args: ["-d", "low", "--output", "complexipy.json"]
100
+ stages: [pre-commit]
95
101
 
96
102
  - repo: https://github.com/dosisod/refurb
97
103
  rev: v2.1.0
98
104
  hooks:
99
105
  - id: refurb
100
- verbose: true
106
+ args: ["--quiet"]
107
+ stages: [pre-commit]
101
108
 
102
- # Code quality tier 3 - thorough checks
109
+ # Group 6: Type Checking & Enhancement (most expensive)
103
110
  - repo: local
104
111
  hooks:
105
112
  - id: autotyping
@@ -109,25 +116,38 @@ repos:
109
116
  - --aggressive
110
117
  - --only-without-imports
111
118
  - --guess-common-names
119
+ - --cache-dir=.autotyping-cache
120
+ - --workers=4
121
+ - --max-line-length=88
122
+ - --exclude-name=test_*,conftest
112
123
  - crackerjack
113
124
  types_or: [ python, pyi ]
114
125
  language: python
115
- files: \.py$
116
- verbose: true
126
+ files: ^crackerjack/.*\.py$
127
+ stages: [pre-commit]
117
128
  additional_dependencies:
118
129
  - autotyping>=24.3.0
119
130
  - libcst>=1.1.0
120
131
 
121
132
  - repo: https://github.com/PyCQA/bandit
122
- rev: '1.8.5'
133
+ rev: '1.8.6'
123
134
  hooks:
124
135
  - id: bandit
125
- args: ["-c", "pyproject.toml", "--format", "json"]
126
- verbose: true
136
+ args: ["-c", "pyproject.toml", "-f", "json", "-o", "bandit-report.json", "-r", "-ll"]
137
+ stages: [pre-commit]
127
138
 
128
139
  - repo: https://github.com/RobertCraigie/pyright-python
129
- rev: v1.1.402
140
+ rev: v1.1.403
130
141
  hooks:
131
142
  - id: pyright
132
- verbose: true
133
143
  args: ["--outputjson"]
144
+ stages: [pre-commit]
145
+
146
+ # Group 7: Documentation & Security Enhancement (AI-specific)
147
+ # pydocstyle temporarily disabled - conflicts with code cleaning functionality
148
+ # - repo: https://github.com/PyCQA/pydocstyle
149
+ # rev: 6.3.0
150
+ # hooks:
151
+ # - id: pydocstyle
152
+ # args: ["--config=pyproject.toml"]
153
+ # stages: [pre-commit]
@@ -55,29 +55,33 @@ repos:
55
55
  additional_dependencies:
56
56
  - mdformat-ruff
57
57
 
58
- # Code quality tier 2 - analysis
58
+ # Code quality tier 2 - analysis (moved to pre-push for performance)
59
59
  - repo: https://github.com/jendrikseipp/vulture
60
60
  rev: 'v2.14'
61
61
  hooks:
62
62
  - id: vulture
63
+ stages: [pre-push, manual]
63
64
 
64
65
  - repo: https://github.com/fredrikaverpil/creosote
65
66
  rev: v4.0.3
66
67
  hooks:
67
68
  - id: creosote
69
+ stages: [pre-push, manual]
68
70
 
69
71
  - repo: https://github.com/rohaquinlop/complexipy-pre-commit
70
72
  rev: v3.0.0
71
73
  hooks:
72
74
  - id: complexipy
73
75
  args: ["-d", "low"]
76
+ stages: [pre-push, manual]
74
77
 
75
78
  - repo: https://github.com/dosisod/refurb
76
79
  rev: v2.1.0
77
80
  hooks:
78
81
  - id: refurb
82
+ stages: [pre-push, manual]
79
83
 
80
- # Code quality tier 3 - thorough checks
84
+ # Code quality tier 3 - thorough checks (moved to pre-push for performance)
81
85
  - repo: local
82
86
  hooks:
83
87
  - id: autotyping
@@ -90,7 +94,8 @@ repos:
90
94
  - crackerjack
91
95
  types_or: [ python, pyi ]
92
96
  language: python
93
- files: \.py$
97
+ files: ^crackerjack/.*\.py$
98
+ stages: [pre-push, manual]
94
99
  additional_dependencies:
95
100
  - autotyping>=24.3.0
96
101
  - libcst>=1.1.0
@@ -99,9 +104,11 @@ repos:
99
104
  rev: '1.8.6'
100
105
  hooks:
101
106
  - id: bandit
102
- args: ["-c", "pyproject.toml"]
107
+ args: ["-c", "pyproject.toml", "-r", "-ll"]
108
+ stages: [pre-push, manual]
103
109
 
104
110
  - repo: https://github.com/RobertCraigie/pyright-python
105
111
  rev: v1.1.403
106
112
  hooks:
107
113
  - id: pyright
114
+ stages: [pre-push, manual]
crackerjack/__main__.py CHANGED
@@ -1,9 +1,11 @@
1
+ import asyncio
1
2
  from enum import Enum
2
3
 
3
4
  import typer
4
5
  from pydantic import BaseModel, field_validator
5
6
  from rich.console import Console
6
- from crackerjack import create_crackerjack_runner
7
+
8
+ from .crackerjack import create_crackerjack_runner
7
9
 
8
10
  console = Console(force_terminal=True)
9
11
  app = typer.Typer(
@@ -39,6 +41,8 @@ class Options(BaseModel):
39
41
  ai_agent: bool = False
40
42
  create_pr: bool = False
41
43
  skip_hooks: bool = False
44
+ comprehensive: bool = False
45
+ async_mode: bool = False
42
46
 
43
47
  @classmethod
44
48
  @field_validator("publish", "bump", mode="before")
@@ -137,6 +141,17 @@ cli_options = {
137
141
  help="Enable AI agent mode with structured output.",
138
142
  hidden=True,
139
143
  ),
144
+ "comprehensive": typer.Option(
145
+ False,
146
+ "--comprehensive",
147
+ help="Use comprehensive pre-commit hooks (slower but thorough).",
148
+ ),
149
+ "async_mode": typer.Option(
150
+ False,
151
+ "--async",
152
+ help="Enable async mode for faster file operations (experimental).",
153
+ hidden=True,
154
+ ),
140
155
  }
141
156
 
142
157
 
@@ -162,6 +177,8 @@ def main(
162
177
  skip_hooks: bool = cli_options["skip_hooks"],
163
178
  create_pr: bool = cli_options["create_pr"],
164
179
  ai_agent: bool = cli_options["ai_agent"],
180
+ comprehensive: bool = cli_options["comprehensive"],
181
+ async_mode: bool = cli_options["async_mode"],
165
182
  ) -> None:
166
183
  options = Options(
167
184
  commit=commit,
@@ -181,14 +198,16 @@ def main(
181
198
  skip_hooks=skip_hooks,
182
199
  all=all,
183
200
  ai_agent=ai_agent,
201
+ comprehensive=comprehensive,
184
202
  create_pr=create_pr,
203
+ async_mode=async_mode,
185
204
  )
186
205
  if ai_agent:
187
206
  import os
188
207
 
189
208
  os.environ["AI_AGENT"] = "1"
190
209
  if interactive:
191
- from crackerjack.interactive import launch_interactive_cli
210
+ from .interactive import launch_interactive_cli
192
211
 
193
212
  try:
194
213
  from importlib.metadata import version
@@ -199,7 +218,10 @@ def main(
199
218
  launch_interactive_cli(pkg_version)
200
219
  else:
201
220
  runner = create_crackerjack_runner(console=console)
202
- runner.process(options)
221
+ if async_mode:
222
+ asyncio.run(runner.process_async(options))
223
+ else:
224
+ runner.process(options)
203
225
 
204
226
 
205
227
  if __name__ == "__main__":