crackerjack 0.18.2__py3-none-any.whl → 0.45.2__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.
Files changed (533) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +96 -2
  3. crackerjack/__main__.py +637 -138
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +39 -0
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/lsp/_base.py +194 -0
  27. crackerjack/adapters/lsp/_client.py +358 -0
  28. crackerjack/adapters/lsp/_manager.py +193 -0
  29. crackerjack/adapters/lsp/skylos.py +283 -0
  30. crackerjack/adapters/lsp/zuban.py +557 -0
  31. crackerjack/adapters/refactor/README.md +59 -0
  32. crackerjack/adapters/refactor/__init__.py +12 -0
  33. crackerjack/adapters/refactor/creosote.py +318 -0
  34. crackerjack/adapters/refactor/refurb.py +406 -0
  35. crackerjack/adapters/refactor/skylos.py +494 -0
  36. crackerjack/adapters/sast/README.md +132 -0
  37. crackerjack/adapters/sast/__init__.py +32 -0
  38. crackerjack/adapters/sast/_base.py +201 -0
  39. crackerjack/adapters/sast/bandit.py +423 -0
  40. crackerjack/adapters/sast/pyscn.py +405 -0
  41. crackerjack/adapters/sast/semgrep.py +241 -0
  42. crackerjack/adapters/security/README.md +111 -0
  43. crackerjack/adapters/security/__init__.py +17 -0
  44. crackerjack/adapters/security/gitleaks.py +339 -0
  45. crackerjack/adapters/type/README.md +52 -0
  46. crackerjack/adapters/type/__init__.py +12 -0
  47. crackerjack/adapters/type/pyrefly.py +402 -0
  48. crackerjack/adapters/type/ty.py +402 -0
  49. crackerjack/adapters/type/zuban.py +522 -0
  50. crackerjack/adapters/utility/README.md +51 -0
  51. crackerjack/adapters/utility/__init__.py +10 -0
  52. crackerjack/adapters/utility/checks.py +884 -0
  53. crackerjack/agents/README.md +264 -0
  54. crackerjack/agents/__init__.py +66 -0
  55. crackerjack/agents/architect_agent.py +238 -0
  56. crackerjack/agents/base.py +167 -0
  57. crackerjack/agents/claude_code_bridge.py +641 -0
  58. crackerjack/agents/coordinator.py +600 -0
  59. crackerjack/agents/documentation_agent.py +520 -0
  60. crackerjack/agents/dry_agent.py +585 -0
  61. crackerjack/agents/enhanced_coordinator.py +279 -0
  62. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  63. crackerjack/agents/error_middleware.py +53 -0
  64. crackerjack/agents/formatting_agent.py +230 -0
  65. crackerjack/agents/helpers/__init__.py +9 -0
  66. crackerjack/agents/helpers/performance/__init__.py +22 -0
  67. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  68. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  69. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  70. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  71. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  72. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  73. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  74. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  75. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  76. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  77. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  78. crackerjack/agents/import_optimization_agent.py +1181 -0
  79. crackerjack/agents/performance_agent.py +325 -0
  80. crackerjack/agents/performance_helpers.py +205 -0
  81. crackerjack/agents/proactive_agent.py +55 -0
  82. crackerjack/agents/refactoring_agent.py +511 -0
  83. crackerjack/agents/refactoring_helpers.py +247 -0
  84. crackerjack/agents/security_agent.py +793 -0
  85. crackerjack/agents/semantic_agent.py +479 -0
  86. crackerjack/agents/semantic_helpers.py +356 -0
  87. crackerjack/agents/test_creation_agent.py +570 -0
  88. crackerjack/agents/test_specialist_agent.py +526 -0
  89. crackerjack/agents/tracker.py +110 -0
  90. crackerjack/api.py +647 -0
  91. crackerjack/cli/README.md +394 -0
  92. crackerjack/cli/__init__.py +24 -0
  93. crackerjack/cli/cache_handlers.py +209 -0
  94. crackerjack/cli/cache_handlers_enhanced.py +680 -0
  95. crackerjack/cli/facade.py +162 -0
  96. crackerjack/cli/formatting.py +13 -0
  97. crackerjack/cli/handlers/__init__.py +85 -0
  98. crackerjack/cli/handlers/advanced.py +103 -0
  99. crackerjack/cli/handlers/ai_features.py +62 -0
  100. crackerjack/cli/handlers/analytics.py +479 -0
  101. crackerjack/cli/handlers/changelog.py +271 -0
  102. crackerjack/cli/handlers/config_handlers.py +16 -0
  103. crackerjack/cli/handlers/coverage.py +84 -0
  104. crackerjack/cli/handlers/documentation.py +280 -0
  105. crackerjack/cli/handlers/main_handlers.py +497 -0
  106. crackerjack/cli/handlers/monitoring.py +371 -0
  107. crackerjack/cli/handlers.py +700 -0
  108. crackerjack/cli/interactive.py +488 -0
  109. crackerjack/cli/options.py +1216 -0
  110. crackerjack/cli/semantic_handlers.py +292 -0
  111. crackerjack/cli/utils.py +19 -0
  112. crackerjack/cli/version.py +19 -0
  113. crackerjack/code_cleaner.py +1307 -0
  114. crackerjack/config/README.md +472 -0
  115. crackerjack/config/__init__.py +275 -0
  116. crackerjack/config/global_lock_config.py +207 -0
  117. crackerjack/config/hooks.py +390 -0
  118. crackerjack/config/loader.py +239 -0
  119. crackerjack/config/settings.py +141 -0
  120. crackerjack/config/tool_commands.py +331 -0
  121. crackerjack/core/README.md +393 -0
  122. crackerjack/core/__init__.py +0 -0
  123. crackerjack/core/async_workflow_orchestrator.py +738 -0
  124. crackerjack/core/autofix_coordinator.py +282 -0
  125. crackerjack/core/container.py +105 -0
  126. crackerjack/core/enhanced_container.py +583 -0
  127. crackerjack/core/file_lifecycle.py +472 -0
  128. crackerjack/core/performance.py +244 -0
  129. crackerjack/core/performance_monitor.py +357 -0
  130. crackerjack/core/phase_coordinator.py +1227 -0
  131. crackerjack/core/proactive_workflow.py +267 -0
  132. crackerjack/core/resource_manager.py +425 -0
  133. crackerjack/core/retry.py +275 -0
  134. crackerjack/core/service_watchdog.py +601 -0
  135. crackerjack/core/session_coordinator.py +239 -0
  136. crackerjack/core/timeout_manager.py +563 -0
  137. crackerjack/core/websocket_lifecycle.py +410 -0
  138. crackerjack/core/workflow/__init__.py +21 -0
  139. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  140. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  141. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  142. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  143. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  144. crackerjack/core/workflow_orchestrator.py +2243 -0
  145. crackerjack/data/README.md +11 -0
  146. crackerjack/data/__init__.py +8 -0
  147. crackerjack/data/models.py +79 -0
  148. crackerjack/data/repository.py +210 -0
  149. crackerjack/decorators/README.md +180 -0
  150. crackerjack/decorators/__init__.py +35 -0
  151. crackerjack/decorators/error_handling.py +649 -0
  152. crackerjack/decorators/error_handling_decorators.py +334 -0
  153. crackerjack/decorators/helpers.py +58 -0
  154. crackerjack/decorators/patterns.py +281 -0
  155. crackerjack/decorators/utils.py +58 -0
  156. crackerjack/docs/INDEX.md +11 -0
  157. crackerjack/docs/README.md +11 -0
  158. crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
  159. crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
  160. crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
  161. crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
  162. crackerjack/docs/generated/api/SERVICES.md +1252 -0
  163. crackerjack/documentation/README.md +11 -0
  164. crackerjack/documentation/__init__.py +31 -0
  165. crackerjack/documentation/ai_templates.py +756 -0
  166. crackerjack/documentation/dual_output_generator.py +767 -0
  167. crackerjack/documentation/mkdocs_integration.py +518 -0
  168. crackerjack/documentation/reference_generator.py +1065 -0
  169. crackerjack/dynamic_config.py +678 -0
  170. crackerjack/errors.py +378 -0
  171. crackerjack/events/README.md +11 -0
  172. crackerjack/events/__init__.py +16 -0
  173. crackerjack/events/telemetry.py +175 -0
  174. crackerjack/events/workflow_bus.py +346 -0
  175. crackerjack/exceptions/README.md +301 -0
  176. crackerjack/exceptions/__init__.py +5 -0
  177. crackerjack/exceptions/config.py +4 -0
  178. crackerjack/exceptions/tool_execution_error.py +245 -0
  179. crackerjack/executors/README.md +591 -0
  180. crackerjack/executors/__init__.py +13 -0
  181. crackerjack/executors/async_hook_executor.py +938 -0
  182. crackerjack/executors/cached_hook_executor.py +316 -0
  183. crackerjack/executors/hook_executor.py +1295 -0
  184. crackerjack/executors/hook_lock_manager.py +708 -0
  185. crackerjack/executors/individual_hook_executor.py +739 -0
  186. crackerjack/executors/lsp_aware_hook_executor.py +349 -0
  187. crackerjack/executors/progress_hook_executor.py +282 -0
  188. crackerjack/executors/tool_proxy.py +433 -0
  189. crackerjack/hooks/README.md +485 -0
  190. crackerjack/hooks/lsp_hook.py +93 -0
  191. crackerjack/intelligence/README.md +557 -0
  192. crackerjack/intelligence/__init__.py +37 -0
  193. crackerjack/intelligence/adaptive_learning.py +693 -0
  194. crackerjack/intelligence/agent_orchestrator.py +485 -0
  195. crackerjack/intelligence/agent_registry.py +377 -0
  196. crackerjack/intelligence/agent_selector.py +439 -0
  197. crackerjack/intelligence/integration.py +250 -0
  198. crackerjack/interactive.py +719 -0
  199. crackerjack/managers/README.md +369 -0
  200. crackerjack/managers/__init__.py +11 -0
  201. crackerjack/managers/async_hook_manager.py +135 -0
  202. crackerjack/managers/hook_manager.py +585 -0
  203. crackerjack/managers/publish_manager.py +631 -0
  204. crackerjack/managers/test_command_builder.py +391 -0
  205. crackerjack/managers/test_executor.py +474 -0
  206. crackerjack/managers/test_manager.py +1357 -0
  207. crackerjack/managers/test_progress.py +187 -0
  208. crackerjack/mcp/README.md +374 -0
  209. crackerjack/mcp/__init__.py +0 -0
  210. crackerjack/mcp/cache.py +352 -0
  211. crackerjack/mcp/client_runner.py +121 -0
  212. crackerjack/mcp/context.py +802 -0
  213. crackerjack/mcp/dashboard.py +657 -0
  214. crackerjack/mcp/enhanced_progress_monitor.py +493 -0
  215. crackerjack/mcp/file_monitor.py +394 -0
  216. crackerjack/mcp/progress_components.py +607 -0
  217. crackerjack/mcp/progress_monitor.py +1016 -0
  218. crackerjack/mcp/rate_limiter.py +336 -0
  219. crackerjack/mcp/server.py +24 -0
  220. crackerjack/mcp/server_core.py +526 -0
  221. crackerjack/mcp/service_watchdog.py +505 -0
  222. crackerjack/mcp/state.py +407 -0
  223. crackerjack/mcp/task_manager.py +259 -0
  224. crackerjack/mcp/tools/README.md +27 -0
  225. crackerjack/mcp/tools/__init__.py +19 -0
  226. crackerjack/mcp/tools/core_tools.py +469 -0
  227. crackerjack/mcp/tools/error_analyzer.py +283 -0
  228. crackerjack/mcp/tools/execution_tools.py +384 -0
  229. crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
  230. crackerjack/mcp/tools/intelligence_tools.py +264 -0
  231. crackerjack/mcp/tools/monitoring_tools.py +628 -0
  232. crackerjack/mcp/tools/proactive_tools.py +367 -0
  233. crackerjack/mcp/tools/progress_tools.py +222 -0
  234. crackerjack/mcp/tools/semantic_tools.py +584 -0
  235. crackerjack/mcp/tools/utility_tools.py +358 -0
  236. crackerjack/mcp/tools/workflow_executor.py +699 -0
  237. crackerjack/mcp/websocket/README.md +31 -0
  238. crackerjack/mcp/websocket/__init__.py +14 -0
  239. crackerjack/mcp/websocket/app.py +54 -0
  240. crackerjack/mcp/websocket/endpoints.py +492 -0
  241. crackerjack/mcp/websocket/event_bridge.py +188 -0
  242. crackerjack/mcp/websocket/jobs.py +406 -0
  243. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  244. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  245. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  246. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  247. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  248. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  249. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  250. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  251. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  252. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  253. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  254. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  255. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  256. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  257. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  258. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  259. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  260. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  261. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  262. crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
  263. crackerjack/mcp/websocket/server.py +174 -0
  264. crackerjack/mcp/websocket/websocket_handler.py +276 -0
  265. crackerjack/mcp/websocket_server.py +10 -0
  266. crackerjack/models/README.md +308 -0
  267. crackerjack/models/__init__.py +40 -0
  268. crackerjack/models/config.py +730 -0
  269. crackerjack/models/config_adapter.py +265 -0
  270. crackerjack/models/protocols.py +1535 -0
  271. crackerjack/models/pydantic_models.py +320 -0
  272. crackerjack/models/qa_config.py +145 -0
  273. crackerjack/models/qa_results.py +134 -0
  274. crackerjack/models/resource_protocols.py +299 -0
  275. crackerjack/models/results.py +35 -0
  276. crackerjack/models/semantic_models.py +258 -0
  277. crackerjack/models/task.py +173 -0
  278. crackerjack/models/test_models.py +60 -0
  279. crackerjack/monitoring/README.md +11 -0
  280. crackerjack/monitoring/__init__.py +0 -0
  281. crackerjack/monitoring/ai_agent_watchdog.py +405 -0
  282. crackerjack/monitoring/metrics_collector.py +427 -0
  283. crackerjack/monitoring/regression_prevention.py +580 -0
  284. crackerjack/monitoring/websocket_server.py +406 -0
  285. crackerjack/orchestration/README.md +340 -0
  286. crackerjack/orchestration/__init__.py +43 -0
  287. crackerjack/orchestration/advanced_orchestrator.py +894 -0
  288. crackerjack/orchestration/cache/README.md +312 -0
  289. crackerjack/orchestration/cache/__init__.py +37 -0
  290. crackerjack/orchestration/cache/memory_cache.py +338 -0
  291. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  292. crackerjack/orchestration/config.py +297 -0
  293. crackerjack/orchestration/coverage_improvement.py +180 -0
  294. crackerjack/orchestration/execution_strategies.py +361 -0
  295. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  296. crackerjack/orchestration/strategies/README.md +401 -0
  297. crackerjack/orchestration/strategies/__init__.py +39 -0
  298. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  299. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  300. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  301. crackerjack/orchestration/test_progress_streamer.py +647 -0
  302. crackerjack/plugins/README.md +11 -0
  303. crackerjack/plugins/__init__.py +15 -0
  304. crackerjack/plugins/base.py +200 -0
  305. crackerjack/plugins/hooks.py +254 -0
  306. crackerjack/plugins/loader.py +335 -0
  307. crackerjack/plugins/managers.py +264 -0
  308. crackerjack/py313.py +191 -0
  309. crackerjack/security/README.md +11 -0
  310. crackerjack/security/__init__.py +0 -0
  311. crackerjack/security/audit.py +197 -0
  312. crackerjack/services/README.md +374 -0
  313. crackerjack/services/__init__.py +9 -0
  314. crackerjack/services/ai/README.md +295 -0
  315. crackerjack/services/ai/__init__.py +7 -0
  316. crackerjack/services/ai/advanced_optimizer.py +878 -0
  317. crackerjack/services/ai/contextual_ai_assistant.py +542 -0
  318. crackerjack/services/ai/embeddings.py +444 -0
  319. crackerjack/services/ai/intelligent_commit.py +328 -0
  320. crackerjack/services/ai/predictive_analytics.py +510 -0
  321. crackerjack/services/anomaly_detector.py +392 -0
  322. crackerjack/services/api_extractor.py +617 -0
  323. crackerjack/services/backup_service.py +467 -0
  324. crackerjack/services/bounded_status_operations.py +530 -0
  325. crackerjack/services/cache.py +369 -0
  326. crackerjack/services/changelog_automation.py +399 -0
  327. crackerjack/services/command_execution_service.py +305 -0
  328. crackerjack/services/config_integrity.py +132 -0
  329. crackerjack/services/config_merge.py +546 -0
  330. crackerjack/services/config_service.py +198 -0
  331. crackerjack/services/config_template.py +493 -0
  332. crackerjack/services/coverage_badge_service.py +173 -0
  333. crackerjack/services/coverage_ratchet.py +381 -0
  334. crackerjack/services/debug.py +733 -0
  335. crackerjack/services/dependency_analyzer.py +460 -0
  336. crackerjack/services/dependency_monitor.py +622 -0
  337. crackerjack/services/documentation_generator.py +493 -0
  338. crackerjack/services/documentation_service.py +704 -0
  339. crackerjack/services/enhanced_filesystem.py +497 -0
  340. crackerjack/services/enterprise_optimizer.py +865 -0
  341. crackerjack/services/error_pattern_analyzer.py +676 -0
  342. crackerjack/services/file_filter.py +221 -0
  343. crackerjack/services/file_hasher.py +149 -0
  344. crackerjack/services/file_io_service.py +361 -0
  345. crackerjack/services/file_modifier.py +615 -0
  346. crackerjack/services/filesystem.py +381 -0
  347. crackerjack/services/git.py +422 -0
  348. crackerjack/services/health_metrics.py +615 -0
  349. crackerjack/services/heatmap_generator.py +744 -0
  350. crackerjack/services/incremental_executor.py +380 -0
  351. crackerjack/services/initialization.py +823 -0
  352. crackerjack/services/input_validator.py +668 -0
  353. crackerjack/services/intelligent_commit.py +327 -0
  354. crackerjack/services/log_manager.py +289 -0
  355. crackerjack/services/logging.py +228 -0
  356. crackerjack/services/lsp_client.py +628 -0
  357. crackerjack/services/memory_optimizer.py +414 -0
  358. crackerjack/services/metrics.py +587 -0
  359. crackerjack/services/monitoring/README.md +30 -0
  360. crackerjack/services/monitoring/__init__.py +9 -0
  361. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  362. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  363. crackerjack/services/monitoring/health_metrics.py +716 -0
  364. crackerjack/services/monitoring/metrics.py +587 -0
  365. crackerjack/services/monitoring/performance_benchmarks.py +410 -0
  366. crackerjack/services/monitoring/performance_cache.py +388 -0
  367. crackerjack/services/monitoring/performance_monitor.py +569 -0
  368. crackerjack/services/parallel_executor.py +527 -0
  369. crackerjack/services/pattern_cache.py +333 -0
  370. crackerjack/services/pattern_detector.py +478 -0
  371. crackerjack/services/patterns/__init__.py +142 -0
  372. crackerjack/services/patterns/agents.py +107 -0
  373. crackerjack/services/patterns/code/__init__.py +15 -0
  374. crackerjack/services/patterns/code/detection.py +118 -0
  375. crackerjack/services/patterns/code/imports.py +107 -0
  376. crackerjack/services/patterns/code/paths.py +159 -0
  377. crackerjack/services/patterns/code/performance.py +119 -0
  378. crackerjack/services/patterns/code/replacement.py +36 -0
  379. crackerjack/services/patterns/core.py +212 -0
  380. crackerjack/services/patterns/documentation/__init__.py +14 -0
  381. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  382. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  383. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  384. crackerjack/services/patterns/formatting.py +226 -0
  385. crackerjack/services/patterns/operations.py +339 -0
  386. crackerjack/services/patterns/security/__init__.py +23 -0
  387. crackerjack/services/patterns/security/code_injection.py +122 -0
  388. crackerjack/services/patterns/security/credentials.py +190 -0
  389. crackerjack/services/patterns/security/path_traversal.py +221 -0
  390. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  391. crackerjack/services/patterns/templates.py +62 -0
  392. crackerjack/services/patterns/testing/__init__.py +18 -0
  393. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  394. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  395. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  396. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  397. crackerjack/services/patterns/tool_output/other.py +97 -0
  398. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  399. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  400. crackerjack/services/patterns/url_sanitization.py +114 -0
  401. crackerjack/services/patterns/utilities.py +42 -0
  402. crackerjack/services/patterns/utils.py +339 -0
  403. crackerjack/services/patterns/validation.py +46 -0
  404. crackerjack/services/patterns/versioning.py +62 -0
  405. crackerjack/services/predictive_analytics.py +523 -0
  406. crackerjack/services/profiler.py +280 -0
  407. crackerjack/services/quality/README.md +415 -0
  408. crackerjack/services/quality/__init__.py +11 -0
  409. crackerjack/services/quality/anomaly_detector.py +392 -0
  410. crackerjack/services/quality/pattern_cache.py +333 -0
  411. crackerjack/services/quality/pattern_detector.py +479 -0
  412. crackerjack/services/quality/qa_orchestrator.py +491 -0
  413. crackerjack/services/quality/quality_baseline.py +395 -0
  414. crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
  415. crackerjack/services/quality/quality_intelligence.py +949 -0
  416. crackerjack/services/regex_patterns.py +58 -0
  417. crackerjack/services/regex_utils.py +483 -0
  418. crackerjack/services/secure_path_utils.py +524 -0
  419. crackerjack/services/secure_status_formatter.py +450 -0
  420. crackerjack/services/secure_subprocess.py +635 -0
  421. crackerjack/services/security.py +239 -0
  422. crackerjack/services/security_logger.py +495 -0
  423. crackerjack/services/server_manager.py +411 -0
  424. crackerjack/services/smart_scheduling.py +167 -0
  425. crackerjack/services/status_authentication.py +460 -0
  426. crackerjack/services/status_security_manager.py +315 -0
  427. crackerjack/services/terminal_utils.py +0 -0
  428. crackerjack/services/thread_safe_status_collector.py +441 -0
  429. crackerjack/services/tool_filter.py +368 -0
  430. crackerjack/services/tool_version_service.py +43 -0
  431. crackerjack/services/unified_config.py +115 -0
  432. crackerjack/services/validation_rate_limiter.py +220 -0
  433. crackerjack/services/vector_store.py +689 -0
  434. crackerjack/services/version_analyzer.py +461 -0
  435. crackerjack/services/version_checker.py +223 -0
  436. crackerjack/services/websocket_resource_limiter.py +438 -0
  437. crackerjack/services/zuban_lsp_service.py +391 -0
  438. crackerjack/slash_commands/README.md +11 -0
  439. crackerjack/slash_commands/__init__.py +59 -0
  440. crackerjack/slash_commands/init.md +112 -0
  441. crackerjack/slash_commands/run.md +197 -0
  442. crackerjack/slash_commands/status.md +127 -0
  443. crackerjack/tools/README.md +11 -0
  444. crackerjack/tools/__init__.py +30 -0
  445. crackerjack/tools/_git_utils.py +105 -0
  446. crackerjack/tools/check_added_large_files.py +139 -0
  447. crackerjack/tools/check_ast.py +105 -0
  448. crackerjack/tools/check_json.py +103 -0
  449. crackerjack/tools/check_jsonschema.py +297 -0
  450. crackerjack/tools/check_toml.py +103 -0
  451. crackerjack/tools/check_yaml.py +110 -0
  452. crackerjack/tools/codespell_wrapper.py +72 -0
  453. crackerjack/tools/end_of_file_fixer.py +202 -0
  454. crackerjack/tools/format_json.py +128 -0
  455. crackerjack/tools/mdformat_wrapper.py +114 -0
  456. crackerjack/tools/trailing_whitespace.py +198 -0
  457. crackerjack/tools/validate_input_validator_patterns.py +236 -0
  458. crackerjack/tools/validate_regex_patterns.py +188 -0
  459. crackerjack/ui/README.md +11 -0
  460. crackerjack/ui/__init__.py +1 -0
  461. crackerjack/ui/dashboard_renderer.py +28 -0
  462. crackerjack/ui/templates/README.md +11 -0
  463. crackerjack/utils/console_utils.py +13 -0
  464. crackerjack/utils/dependency_guard.py +230 -0
  465. crackerjack/utils/retry_utils.py +275 -0
  466. crackerjack/workflows/README.md +590 -0
  467. crackerjack/workflows/__init__.py +46 -0
  468. crackerjack/workflows/actions.py +811 -0
  469. crackerjack/workflows/auto_fix.py +444 -0
  470. crackerjack/workflows/container_builder.py +499 -0
  471. crackerjack/workflows/definitions.py +443 -0
  472. crackerjack/workflows/engine.py +177 -0
  473. crackerjack/workflows/event_bridge.py +242 -0
  474. crackerjack-0.45.2.dist-info/METADATA +1678 -0
  475. crackerjack-0.45.2.dist-info/RECORD +478 -0
  476. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  477. crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
  478. crackerjack/.gitignore +0 -14
  479. crackerjack/.libcst.codemod.yaml +0 -18
  480. crackerjack/.pdm.toml +0 -1
  481. crackerjack/.pre-commit-config.yaml +0 -91
  482. crackerjack/.pytest_cache/.gitignore +0 -2
  483. crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
  484. crackerjack/.pytest_cache/README.md +0 -8
  485. crackerjack/.pytest_cache/v/cache/nodeids +0 -1
  486. crackerjack/.pytest_cache/v/cache/stepwise +0 -1
  487. crackerjack/.ruff_cache/.gitignore +0 -1
  488. crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
  489. crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
  490. crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
  491. crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
  492. crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
  493. crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
  494. crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
  495. crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
  496. crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
  497. crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
  498. crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
  499. crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
  500. crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
  501. crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
  502. crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
  503. crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
  504. crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
  505. crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
  506. crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
  507. crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
  508. crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
  509. crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
  510. crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
  511. crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
  512. crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
  513. crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
  514. crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
  515. crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
  516. crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
  517. crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
  518. crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
  519. crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
  520. crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
  521. crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
  522. crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
  523. crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
  524. crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
  525. crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
  526. crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
  527. crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
  528. crackerjack/crackerjack.py +0 -855
  529. crackerjack/pyproject.toml +0 -214
  530. crackerjack-0.18.2.dist-info/METADATA +0 -420
  531. crackerjack-0.18.2.dist-info/RECORD +0 -59
  532. crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
  533. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,339 @@
1
+ """Utility functions for regex pattern operations."""
2
+
3
+ import re
4
+
5
+ # Import for type checking - circular import avoided
6
+ from typing import TYPE_CHECKING
7
+
8
+ from .core import MAX_ITERATIONS, CompiledPatternCache, ValidatedPattern
9
+
10
+ if TYPE_CHECKING:
11
+ pass # SAFE_PATTERNS imported at runtime to avoid circular imports
12
+
13
+
14
+ def validate_all_patterns() -> dict[str, bool]:
15
+ """Validate all patterns in the registry."""
16
+ from . import SAFE_PATTERNS
17
+
18
+ results: dict[str, bool] = {}
19
+ for name, pattern in SAFE_PATTERNS.items():
20
+ try:
21
+ pattern._validate()
22
+ results[name] = True
23
+ except ValueError as e:
24
+ results[name] = False
25
+ print(f"Pattern '{name}' failed validation: {e}")
26
+ return results
27
+
28
+
29
+ def find_pattern_for_text(text: str) -> list[str]:
30
+ """Find all patterns that match the given text."""
31
+ from . import SAFE_PATTERNS
32
+
33
+ return [name for name, pattern in SAFE_PATTERNS.items() if pattern.test(text)]
34
+
35
+
36
+ def apply_safe_replacement(text: str, pattern_name: str) -> str:
37
+ """Apply a named pattern to text."""
38
+ from . import SAFE_PATTERNS
39
+
40
+ if pattern_name not in SAFE_PATTERNS:
41
+ raise ValueError(f"Unknown pattern: {pattern_name}")
42
+
43
+ return SAFE_PATTERNS[pattern_name].apply(text)
44
+
45
+
46
+ def get_pattern_description(pattern_name: str) -> str:
47
+ """Get description for a named pattern."""
48
+ from . import SAFE_PATTERNS
49
+
50
+ if pattern_name not in SAFE_PATTERNS:
51
+ return "Unknown pattern"
52
+
53
+ return SAFE_PATTERNS[pattern_name].description
54
+
55
+
56
+ def fix_multi_word_hyphenation(text: str) -> str:
57
+ """Fix multi-word hyphenation iteratively."""
58
+ from . import SAFE_PATTERNS
59
+
60
+ return SAFE_PATTERNS["fix_spaced_hyphens"].apply_iteratively(text)
61
+
62
+
63
+ def update_pyproject_version(content: str, new_version: str) -> str:
64
+ """Update version in pyproject.toml content."""
65
+ from . import SAFE_PATTERNS
66
+
67
+ pattern_obj = SAFE_PATTERNS["update_pyproject_version"]
68
+
69
+ temp_pattern = ValidatedPattern(
70
+ name="temp_version_update",
71
+ pattern=pattern_obj.pattern,
72
+ replacement=f"\\g<1>{new_version}\\g<3>",
73
+ description=f"Update version to {new_version}",
74
+ test_cases=[
75
+ ('version = "1.2.3"', f'version = "{new_version}"'),
76
+ ],
77
+ )
78
+
79
+ return re.compile(pattern_obj.pattern, re.MULTILINE).sub(
80
+ temp_pattern.replacement, content
81
+ )
82
+
83
+
84
+ def apply_formatting_fixes(content: str) -> str:
85
+ """Apply common formatting fixes to content."""
86
+ from . import SAFE_PATTERNS
87
+
88
+ pattern = SAFE_PATTERNS["remove_trailing_whitespace"]
89
+ content = re.compile(pattern.pattern, re.MULTILINE).sub(
90
+ pattern.replacement, content
91
+ )
92
+
93
+ content = SAFE_PATTERNS["normalize_multiple_newlines"].apply(content)
94
+
95
+ return content
96
+
97
+
98
+ def apply_security_fixes(content: str) -> str:
99
+ """Apply common security fixes to content."""
100
+ from . import SAFE_PATTERNS
101
+
102
+ content = SAFE_PATTERNS["fix_subprocess_run_shell"].apply(content)
103
+ content = SAFE_PATTERNS["fix_subprocess_call_shell"].apply(content)
104
+ content = SAFE_PATTERNS["fix_subprocess_popen_shell"].apply(content)
105
+
106
+ content = SAFE_PATTERNS["fix_unsafe_yaml_load"].apply(content)
107
+ content = SAFE_PATTERNS["fix_weak_md5_hash"].apply(content)
108
+ content = SAFE_PATTERNS["fix_weak_sha1_hash"].apply(content)
109
+ content = SAFE_PATTERNS["fix_insecure_random_choice"].apply(content)
110
+
111
+ content = SAFE_PATTERNS["remove_debug_prints_with_secrets"].apply(content)
112
+
113
+ return content
114
+
115
+
116
+ def apply_test_fixes(content: str) -> str:
117
+ """Apply common test-related fixes to content."""
118
+ from . import SAFE_PATTERNS
119
+
120
+ return SAFE_PATTERNS["normalize_assert_statements"].apply(content)
121
+
122
+
123
+ def is_valid_job_id(job_id: str) -> bool:
124
+ """Check if a job ID is valid."""
125
+ from . import SAFE_PATTERNS
126
+
127
+ return SAFE_PATTERNS["validate_job_id_alphanumeric"].test(job_id)
128
+
129
+
130
+ def remove_coverage_fail_under(addopts: str) -> str:
131
+ """Remove --cov-fail-under from pytest addopts."""
132
+ from . import SAFE_PATTERNS
133
+
134
+ return SAFE_PATTERNS["remove_coverage_fail_under"].apply(addopts)
135
+
136
+
137
+ def update_coverage_requirement(content: str, new_coverage: float) -> str:
138
+ """Update coverage requirement to a new value."""
139
+ from . import SAFE_PATTERNS
140
+
141
+ pattern_obj = SAFE_PATTERNS["update_coverage_requirement"]
142
+
143
+ temp_pattern = ValidatedPattern(
144
+ name="temp_coverage_update",
145
+ pattern=pattern_obj.pattern,
146
+ replacement=f"\\1{new_coverage: .0f}",
147
+ description=f"Update coverage to {new_coverage}",
148
+ test_cases=[
149
+ ("--cov-fail-under=85", f"--cov-fail-under={new_coverage: .0f}"),
150
+ ],
151
+ )
152
+
153
+ return re.compile(pattern_obj.pattern).sub(temp_pattern.replacement, content)
154
+
155
+
156
+ def update_repo_revision(content: str, repo_url: str, new_revision: str) -> str:
157
+ """Update repository revision in content."""
158
+ escaped_url = re.escape(repo_url)
159
+ pattern = rf'("repo": "{escaped_url}".*?"rev": )"([^"]+)"'
160
+ replacement = rf'\1"{new_revision}"'
161
+
162
+ return re.compile(pattern, re.DOTALL).sub(replacement, content)
163
+
164
+
165
+ def sanitize_internal_urls(text: str) -> str:
166
+ """Sanitize all internal URLs in text."""
167
+ from . import SAFE_PATTERNS
168
+
169
+ url_patterns = [
170
+ "sanitize_localhost_urls",
171
+ "sanitize_127_urls",
172
+ "sanitize_any_localhost_urls",
173
+ "sanitize_ws_localhost_urls",
174
+ "sanitize_ws_127_urls",
175
+ "sanitize_simple_localhost_urls",
176
+ "sanitize_simple_ws_localhost_urls",
177
+ ]
178
+
179
+ result = text
180
+ for pattern_name in url_patterns:
181
+ result = SAFE_PATTERNS[pattern_name].apply(result)
182
+
183
+ return result
184
+
185
+
186
+ def apply_pattern_iteratively(
187
+ text: str, pattern_name: str, max_iterations: int = MAX_ITERATIONS
188
+ ) -> str:
189
+ """Apply a pattern iteratively until no more changes."""
190
+ from . import SAFE_PATTERNS
191
+
192
+ if pattern_name not in SAFE_PATTERNS:
193
+ raise ValueError(f"Unknown pattern: {pattern_name}")
194
+
195
+ return SAFE_PATTERNS[pattern_name].apply_iteratively(text, max_iterations)
196
+
197
+
198
+ def get_all_pattern_stats() -> dict[str, dict[str, float] | dict[str, str]]:
199
+ """Get performance statistics for all patterns."""
200
+ from . import SAFE_PATTERNS
201
+
202
+ test_text = "python - m crackerjack - t with pytest - hypothesis - specialist"
203
+ stats: dict[str, dict[str, float] | dict[str, str]] = {}
204
+
205
+ for name, pattern in SAFE_PATTERNS.items():
206
+ try:
207
+ pattern_stats = pattern.get_performance_stats(test_text, iterations=10)
208
+ stats[name] = pattern_stats
209
+ except Exception as e:
210
+ stats[name] = {"error": str(e)}
211
+
212
+ return stats
213
+
214
+
215
+ def clear_all_caches() -> None:
216
+ """Clear all pattern caches."""
217
+ CompiledPatternCache.clear_cache()
218
+
219
+
220
+ def get_cache_info() -> dict[str, int | list[str]]:
221
+ """Get cache statistics."""
222
+ return CompiledPatternCache.get_cache_stats()
223
+
224
+
225
+ def detect_path_traversal_patterns(path_str: str) -> list[str]:
226
+ """Detect path traversal patterns in a path string."""
227
+ from . import SAFE_PATTERNS
228
+
229
+ detected = []
230
+ traversal_patterns = [
231
+ "detect_directory_traversal_basic",
232
+ "detect_directory_traversal_backslash",
233
+ "detect_url_encoded_traversal",
234
+ "detect_double_url_encoded_traversal",
235
+ ]
236
+
237
+ for pattern_name in traversal_patterns:
238
+ pattern = SAFE_PATTERNS[pattern_name]
239
+ if pattern.test(path_str):
240
+ detected.append(pattern_name)
241
+
242
+ return detected
243
+
244
+
245
+ def detect_null_byte_patterns(path_str: str) -> list[str]:
246
+ """Detect null byte patterns in a path string."""
247
+ from . import SAFE_PATTERNS
248
+
249
+ detected = []
250
+ null_patterns = [
251
+ "detect_null_bytes_url",
252
+ "detect_null_bytes_literal",
253
+ "detect_utf8_overlong_null",
254
+ ]
255
+
256
+ for pattern_name in null_patterns:
257
+ pattern = SAFE_PATTERNS[pattern_name]
258
+ if pattern.test(path_str):
259
+ detected.append(pattern_name)
260
+
261
+ return detected
262
+
263
+
264
+ def detect_dangerous_directory_patterns(path_str: str) -> list[str]:
265
+ """Detect dangerous directory access patterns in a path string."""
266
+ from . import SAFE_PATTERNS
267
+
268
+ detected = []
269
+ dangerous_patterns = [
270
+ "detect_sys_directory_pattern",
271
+ "detect_proc_directory_pattern",
272
+ "detect_etc_directory_pattern",
273
+ "detect_boot_directory_pattern",
274
+ "detect_dev_directory_pattern",
275
+ "detect_root_directory_pattern",
276
+ "detect_var_log_directory_pattern",
277
+ "detect_bin_directory_pattern",
278
+ "detect_sbin_directory_pattern",
279
+ ]
280
+
281
+ for pattern_name in dangerous_patterns:
282
+ pattern = SAFE_PATTERNS[pattern_name]
283
+ if pattern.test(path_str):
284
+ detected.append(pattern_name)
285
+
286
+ return detected
287
+
288
+
289
+ def detect_suspicious_path_patterns(path_str: str) -> list[str]:
290
+ """Detect suspicious path patterns in a path string."""
291
+ from . import SAFE_PATTERNS
292
+
293
+ detected = []
294
+ suspicious_patterns = [
295
+ "detect_parent_directory_in_path",
296
+ "detect_suspicious_temp_traversal",
297
+ "detect_suspicious_var_traversal",
298
+ ]
299
+
300
+ for pattern_name in suspicious_patterns:
301
+ pattern = SAFE_PATTERNS[pattern_name]
302
+ if pattern.test(path_str):
303
+ detected.append(pattern_name)
304
+
305
+ return detected
306
+
307
+
308
+ def validate_path_security(path_str: str) -> dict[str, list[str]]:
309
+ """Validate path security by checking for various attack patterns."""
310
+ return {
311
+ "traversal_patterns": detect_path_traversal_patterns(path_str),
312
+ "null_bytes": detect_null_byte_patterns(path_str),
313
+ "dangerous_directories": detect_dangerous_directory_patterns(path_str),
314
+ "suspicious_patterns": detect_suspicious_path_patterns(path_str),
315
+ }
316
+
317
+
318
+ class RegexPatternsService:
319
+ """Service class that implements RegexPatternsProtocol.
320
+
321
+ Wraps module-level regex pattern functions to provide a protocol-compliant interface.
322
+ """
323
+
324
+ def update_pyproject_version(self, content: str, new_version: str) -> str:
325
+ """Update version in pyproject.toml content."""
326
+ return update_pyproject_version(content, new_version)
327
+
328
+ def remove_coverage_fail_under(self, content: str) -> str:
329
+ """Remove --cov-fail-under from pytest addopts."""
330
+ return remove_coverage_fail_under(content)
331
+
332
+ def update_version_in_changelog(self, content: str, new_version: str) -> str:
333
+ """Update version in changelog content."""
334
+ # Placeholder implementation - can be enhanced later
335
+ return content
336
+
337
+ def mask_tokens_in_text(self, text: str) -> str:
338
+ """Mask sensitive tokens in text."""
339
+ return sanitize_internal_urls(text)
@@ -0,0 +1,46 @@
1
+ """Input validation patterns."""
2
+
3
+ from .core import ValidatedPattern
4
+
5
+ PATTERNS: dict[str, ValidatedPattern] = {
6
+ "validate_env_var_name_format": ValidatedPattern(
7
+ name="validate_env_var_name_format",
8
+ pattern=r"^[A-Z_][A-Z0-9_]*$",
9
+ replacement="VALID_ENV_VAR_NAME",
10
+ description="Validate environment variable name format - uppercase letters, "
11
+ " numbers, underscores only, must start with letter or underscore",
12
+ test_cases=[
13
+ ("VALID_VAR", "VALID_ENV_VAR_NAME"),
14
+ ("_VALID_VAR", "VALID_ENV_VAR_NAME"),
15
+ ("API_KEY_123", "VALID_ENV_VAR_NAME"),
16
+ ("DATABASE_URL", "VALID_ENV_VAR_NAME"),
17
+ ("_PRIVATE_VAR", "VALID_ENV_VAR_NAME"),
18
+ ],
19
+ ),
20
+ "validate_job_id_alphanumeric": ValidatedPattern(
21
+ name="validate_job_id_alphanumeric",
22
+ pattern=r"^[a-zA-Z0-9_-]+$",
23
+ replacement="VALID",
24
+ description="Validate job ID contains only alphanumeric characters, "
25
+ "underscores, and hyphens",
26
+ test_cases=[
27
+ ("valid_job-123", "VALID"),
28
+ ("another_valid-job_456", "VALID"),
29
+ ("job_123", "VALID"),
30
+ ],
31
+ ),
32
+ "validate_job_id_format": ValidatedPattern(
33
+ name="validate_job_id_format",
34
+ pattern=r"^[a-zA-Z0-9\-_]+$",
35
+ replacement="VALID_JOB_ID",
36
+ description="Validate job ID format - alphanumeric with hyphens and"
37
+ " underscores only",
38
+ test_cases=[
39
+ ("valid_job-123", "VALID_JOB_ID"),
40
+ ("another-valid_job_456", "VALID_JOB_ID"),
41
+ ("job_123", "VALID_JOB_ID"),
42
+ ("UPPERCASE_JOB-ID", "VALID_JOB_ID"),
43
+ ("hyphen-underscore_combo", "VALID_JOB_ID"),
44
+ ],
45
+ ),
46
+ }
@@ -0,0 +1,62 @@
1
+ """Version number extraction and update patterns."""
2
+
3
+ import re
4
+
5
+ from .core import ValidatedPattern
6
+
7
+ PATTERNS: dict[str, ValidatedPattern] = {
8
+ "extract_version_numbers": ValidatedPattern(
9
+ name="extract_version_numbers",
10
+ pattern=r"version\s+(\d+\.\d+\.\d+)",
11
+ replacement=r"\1",
12
+ description="Extract semantic version numbers from 'version X.Y.Z' patterns",
13
+ flags=re.IGNORECASE,
14
+ test_cases=[
15
+ ("version 1.2.3", "1.2.3"),
16
+ ("Version 10.0.1", "10.0.1"),
17
+ ("current version 0.5.0", "current 0.5.0"),
18
+ ("VERSION 2.11.4", "2.11.4"),
19
+ ],
20
+ ),
21
+ "update_pyproject_version": ValidatedPattern(
22
+ name="update_pyproject_version",
23
+ pattern=r'^(version\s*=\s*["\'])([^"\']+)(["\'])$',
24
+ replacement=r"\g<1>NEW_VERSION\g<3>",
25
+ description="Update version in pyproject.toml files (NEW_VERSION placeholder"
26
+ " replaced dynamically)",
27
+ test_cases=[
28
+ ('version = "1.2.3"', 'version = "NEW_VERSION"'),
29
+ ("version='0.1.0'", "version='NEW_VERSION'"),
30
+ ('version="1.0.0-beta"', 'version="NEW_VERSION"'),
31
+ ("version = '2.1.0'", "version = 'NEW_VERSION'"),
32
+ ("version='10.20.30'", "version='NEW_VERSION'"),
33
+ ('name = "my-package"', 'name = "my-package"'),
34
+ ],
35
+ ),
36
+ "update_repo_revision": ValidatedPattern(
37
+ name="update_repo_revision",
38
+ pattern=r'("repo": "[^"]+?".*?"rev": )"([^"]+)"',
39
+ replacement=r'\1"NEW_REVISION"',
40
+ description="Update repository revision in config files (NEW_REVISION"
41
+ " placeholder replaced dynamically)",
42
+ flags=re.DOTALL,
43
+ test_cases=[
44
+ (
45
+ '"repo": "https: //github.com/user/repo".*"rev": "old_rev"',
46
+ '"repo": "https: //github.com/user/repo".*"rev": "NEW_REVISION"',
47
+ ),
48
+ (
49
+ '"repo": "git@github.com: user/repo.git", "branch": "main", "rev": '
50
+ '"abc123"',
51
+ '"repo": "git@github.com: user/repo.git", "branch": "main", "rev": '
52
+ '"NEW_REVISION"',
53
+ ),
54
+ (
55
+ '{"repo": "https: //example.com/repo", "description": "test", "rev": '
56
+ '"456def"}',
57
+ '{"repo": "https: //example.com/repo", "description": "test", "rev": '
58
+ '"NEW_REVISION"}',
59
+ ),
60
+ ],
61
+ ),
62
+ }