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,212 @@
1
+ """Core pattern validation classes and utilities.
2
+
3
+ This module contains the base classes and utilities for safely handling
4
+ regex patterns with validation, caching, and performance monitoring.
5
+ """
6
+
7
+ import re
8
+ import signal
9
+ import threading
10
+ import time
11
+ import typing as t
12
+ from dataclasses import dataclass, field
13
+ from re import Pattern
14
+
15
+ MAX_INPUT_SIZE = 10 * 1024 * 1024
16
+ MAX_ITERATIONS = 10
17
+ PATTERN_CACHE_SIZE = 100
18
+
19
+
20
+ class CompiledPatternCache:
21
+ _lock = threading.RLock()
22
+ _cache: dict[str, Pattern[str]] = {}
23
+ _max_size = PATTERN_CACHE_SIZE
24
+
25
+ @classmethod
26
+ def get_compiled_pattern(cls, pattern: str) -> Pattern[str]:
27
+ return cls.get_compiled_pattern_with_flags(pattern, pattern, 0)
28
+
29
+ @classmethod
30
+ def get_compiled_pattern_with_flags(
31
+ cls, cache_key: str, pattern: str, flags: int
32
+ ) -> Pattern[str]:
33
+ with cls._lock:
34
+ if cache_key in cls._cache:
35
+ return cls._cache[cache_key]
36
+
37
+ try:
38
+ compiled = re.compile(pattern, flags)
39
+ except re.error as e:
40
+ raise ValueError(f"Invalid regex pattern '{pattern}': {e}")
41
+
42
+ if len(cls._cache) >= cls._max_size:
43
+ oldest_key = next(iter(cls._cache))
44
+ del cls._cache[oldest_key]
45
+
46
+ cls._cache[cache_key] = compiled
47
+ return compiled
48
+
49
+ @classmethod
50
+ def clear_cache(cls) -> None:
51
+ with cls._lock:
52
+ cls._cache.clear()
53
+
54
+ @classmethod
55
+ def get_cache_stats(cls) -> dict[str, int | list[str]]:
56
+ with cls._lock:
57
+ return {
58
+ "size": len(cls._cache),
59
+ "max_size": cls._max_size,
60
+ "patterns": list[t.Any](cls._cache.keys()),
61
+ }
62
+
63
+
64
+ def validate_pattern_safety(pattern: str) -> list[str]:
65
+ warnings = []
66
+
67
+ if ".*.*" in pattern:
68
+ warnings.append("Multiple .* constructs may cause performance issues")
69
+
70
+ if ".+.+" in pattern:
71
+ warnings.append("Multiple .+ constructs may cause performance issues")
72
+
73
+ nested_quantifiers = re.findall(r"[+*?]\??[+*?]", pattern)
74
+ if nested_quantifiers:
75
+ warnings.append(f"Nested quantifiers detected: {nested_quantifiers}")
76
+
77
+ if "|" in pattern and pattern.count("|") > 10:
78
+ warnings.append("Many alternations may cause performance issues")
79
+
80
+ return warnings
81
+
82
+
83
+ @dataclass
84
+ class ValidatedPattern:
85
+ name: str
86
+ pattern: str
87
+ replacement: str
88
+ test_cases: list[tuple[str, str]]
89
+ description: str = ""
90
+ global_replace: bool = False
91
+ flags: int = 0
92
+ _compiled_pattern: Pattern[str] | None = field(default=None, init=False)
93
+
94
+ def __post_init__(self) -> None:
95
+ self._validate()
96
+
97
+ def _validate(self) -> None:
98
+ try:
99
+ self._get_compiled_pattern()
100
+ except ValueError as e:
101
+ if "Invalid regex pattern" in str(e):
102
+ error_msg = str(e).replace(f"'{self.pattern}'", f"'{self.name}'")
103
+ raise ValueError(error_msg) from e
104
+ raise
105
+
106
+ if r"\g < " in self.replacement or r" >" in self.replacement:
107
+ raise ValueError(
108
+ f"Bad replacement syntax in '{self.name}': {self.replacement}. "
109
+ "Use \\g<1> not \\g<1>" # REGEX OK: educational example
110
+ )
111
+
112
+ warnings = validate_pattern_safety(self.pattern)
113
+ if warnings:
114
+ pass
115
+
116
+ for input_text, expected in self.test_cases:
117
+ try:
118
+ count = 0 if self.global_replace else 1
119
+ result = self._apply_internal(input_text, count)
120
+ if result != expected:
121
+ raise ValueError(
122
+ f"Pattern '{self.name}' failed test case: "
123
+ f"'{input_text}' -> '{result}' != expected '{expected}'"
124
+ )
125
+ except re.error as e:
126
+ raise ValueError(f"Pattern '{self.name}' failed on '{input_text}': {e}")
127
+
128
+ def _get_compiled_pattern(self) -> Pattern[str]:
129
+ cache_key = f"{self.pattern}|flags: {self.flags}"
130
+ return CompiledPatternCache.get_compiled_pattern_with_flags(
131
+ cache_key, self.pattern, self.flags
132
+ )
133
+
134
+ def _apply_internal(self, text: str, count: int = 1) -> str:
135
+ if len(text) > MAX_INPUT_SIZE:
136
+ raise ValueError(
137
+ f"Input text too large: {len(text)} bytes > {MAX_INPUT_SIZE}"
138
+ )
139
+
140
+ return self._get_compiled_pattern().sub(self.replacement, text, count=count)
141
+
142
+ def apply(self, text: str) -> str:
143
+ count = 0 if self.global_replace else 1
144
+ return self._apply_internal(text, count)
145
+
146
+ def apply_iteratively(self, text: str, max_iterations: int = MAX_ITERATIONS) -> str:
147
+ if max_iterations <= 0:
148
+ raise ValueError("max_iterations must be positive")
149
+
150
+ result = text
151
+ for _ in range(max_iterations):
152
+ new_result = self.apply(result)
153
+ if new_result == result:
154
+ break
155
+ result = new_result
156
+ else:
157
+ pass
158
+
159
+ return result
160
+
161
+ def apply_with_timeout(self, text: str, timeout_seconds: float = 1.0) -> str:
162
+ def timeout_handler(signum: int, frame: t.Any) -> None:
163
+ raise TimeoutError(
164
+ f"Pattern '{self.name}' timed out after {timeout_seconds}s"
165
+ )
166
+
167
+ old_handler = signal.signal(signal.SIGALRM, timeout_handler)
168
+ signal.alarm(int(timeout_seconds))
169
+
170
+ try:
171
+ result = self.apply(text)
172
+ finally:
173
+ signal.alarm(0)
174
+ signal.signal(signal.SIGALRM, old_handler)
175
+
176
+ return result
177
+
178
+ def test(self, text: str) -> bool:
179
+ compiled = self._get_compiled_pattern()
180
+ return bool(compiled.search(text))
181
+
182
+ def search(self, text: str) -> re.Match[str] | None:
183
+ if len(text) > MAX_INPUT_SIZE:
184
+ raise ValueError(
185
+ f"Input text too large: {len(text)} bytes > {MAX_INPUT_SIZE}"
186
+ )
187
+ return self._get_compiled_pattern().search(text)
188
+
189
+ def findall(self, text: str) -> list[str]:
190
+ if len(text) > MAX_INPUT_SIZE:
191
+ raise ValueError(
192
+ f"Input text too large: {len(text)} bytes > {MAX_INPUT_SIZE}"
193
+ )
194
+ return self._get_compiled_pattern().findall(text)
195
+
196
+ def get_performance_stats(
197
+ self, text: str, iterations: int = 100
198
+ ) -> dict[str, float]:
199
+ times = []
200
+
201
+ for _ in range(iterations):
202
+ start = time.perf_counter()
203
+ self.apply(text)
204
+ end = time.perf_counter()
205
+ times.append(end - start)
206
+
207
+ return {
208
+ "mean_time": sum(times) / len(times),
209
+ "min_time": min(times),
210
+ "max_time": max(times),
211
+ "total_time": sum(times),
212
+ }
@@ -0,0 +1,14 @@
1
+ """Documentation-related regex patterns.
2
+
3
+ This package provides patterns for working with documentation elements including
4
+ docstrings, markdown badges, links, comments, and code blocks.
5
+ """
6
+
7
+ from .badges_markdown import PATTERNS as BADGES_MARKDOWN_PATTERNS
8
+ from .comments_blocks import PATTERNS as COMMENTS_BLOCKS_PATTERNS
9
+ from .docstrings import PATTERNS as DOCSTRINGS_PATTERNS
10
+
11
+ # Merge all documentation patterns into a single registry
12
+ PATTERNS = DOCSTRINGS_PATTERNS | BADGES_MARKDOWN_PATTERNS | COMMENTS_BLOCKS_PATTERNS
13
+
14
+ __all__ = ["PATTERNS"]
@@ -0,0 +1,96 @@
1
+ """Badge and markdown link parsing patterns.
2
+
3
+ This module provides regex patterns for working with markdown syntax,
4
+ particularly coverage badges and links in README files.
5
+ """
6
+
7
+ import re
8
+
9
+ from ..core import ValidatedPattern
10
+
11
+ PATTERNS = {
12
+ "detect_coverage_badge": ValidatedPattern(
13
+ name="detect_coverage_badge",
14
+ pattern=r"!\[Coverage.*?\]\(.*?coverage.*?\)|!\[.*coverage.*?\]\(.*?shields\.io.*?coverage.*?\)|https://img\.shields\.io/badge/coverage-[\d\.]+%25-\w+",
15
+ replacement="",
16
+ description="Detect existing coverage badges in README content",
17
+ flags=re.IGNORECASE,
18
+ test_cases=[
19
+ ("![Coverage](https://example.com/coverage.svg)", ""),
20
+ (
21
+ "![Coverage Badge](https://shields.io/coverage-100%25-green)",
22
+ "",
23
+ ),
24
+ (
25
+ "https://img.shields.io/badge/coverage-95.5%25-brightgreen",
26
+ "",
27
+ ),
28
+ (
29
+ "![test coverage](https://img.shields.io/coverage/repo)",
30
+ "",
31
+ ),
32
+ ("Some text without badge", "Some text without badge"),
33
+ ],
34
+ ),
35
+ "extract_markdown_links": ValidatedPattern(
36
+ name="extract_markdown_links",
37
+ pattern=r"\[([^\]]+)\]\(([^)]+)\)",
38
+ replacement=r"\1 -> \2",
39
+ description="Extract markdown link text and URLs from [text](url) patterns",
40
+ test_cases=[
41
+ ("[Click here](http://example.com)", "Click here -> http://example.com"),
42
+ ("[GitHub](https://github.com)", "GitHub -> https://github.com"),
43
+ (
44
+ "[Documentation](./docs/README.md)",
45
+ "Documentation -> ./docs/README.md",
46
+ ),
47
+ ("No links here", "No links here"),
48
+ ],
49
+ ),
50
+ "update_coverage_badge_any": ValidatedPattern(
51
+ name="update_coverage_badge_any",
52
+ pattern=r"(!\[.*coverage.*?\]\()([^)]+)(\))",
53
+ replacement=r"\1NEW_BADGE_URL\3",
54
+ description="Update any coverage-related badge URL",
55
+ flags=re.IGNORECASE,
56
+ test_cases=[
57
+ ("![Coverage](old_url)", "![Coverage](NEW_BADGE_URL)"),
58
+ ("![coverage badge](old_url)", "![coverage badge](NEW_BADGE_URL)"),
59
+ ("![test coverage](url)", "![test coverage](NEW_BADGE_URL)"),
60
+ ("![Other Badge](url)", "![Other Badge](url)"),
61
+ ],
62
+ ),
63
+ "update_coverage_badge_url": ValidatedPattern(
64
+ name="update_coverage_badge_url",
65
+ pattern=r"(!\[Coverage.*?\]\()([^)]+)(\))",
66
+ replacement=r"\1NEW_BADGE_URL\3",
67
+ description="Update coverage badge URL in markdown links",
68
+ test_cases=[
69
+ ("![Coverage](old_url)", "![Coverage](NEW_BADGE_URL)"),
70
+ ("![Coverage Badge](old_badge_url)", "![Coverage Badge](NEW_BADGE_URL)"),
71
+ ("text ![Coverage](url) more", "text ![Coverage](NEW_BADGE_URL) more"),
72
+ ("no badge here", "no badge here"),
73
+ ],
74
+ ),
75
+ "update_shields_coverage_url": ValidatedPattern(
76
+ name="update_shields_coverage_url",
77
+ pattern=r"(https://img\.shields\.io/badge/coverage-[\d\.]+%25-\w+)",
78
+ replacement="NEW_BADGE_URL",
79
+ description="Update shields.io coverage badge URLs directly",
80
+ test_cases=[
81
+ (
82
+ "https://img.shields.io/badge/coverage-95.5%25-brightgreen",
83
+ "NEW_BADGE_URL",
84
+ ),
85
+ (
86
+ "https://img.shields.io/badge/coverage-100%25-success",
87
+ "NEW_BADGE_URL",
88
+ ),
89
+ (
90
+ "https://img.shields.io/badge/coverage-75.0%25-yellow",
91
+ "NEW_BADGE_URL",
92
+ ),
93
+ ("https://example.com/other-badge", "https://example.com/other-badge"),
94
+ ],
95
+ ),
96
+ }
@@ -0,0 +1,83 @@
1
+ """Comment and code block parsing patterns.
2
+
3
+ This module provides regex patterns for working with code comments,
4
+ TODO markers, and bash/command code blocks in documentation.
5
+ """
6
+
7
+ import re
8
+
9
+ from ..core import ValidatedPattern
10
+
11
+ PATTERNS = {
12
+ "enhance_command_blocks": ValidatedPattern(
13
+ name="enhance_command_blocks",
14
+ pattern=r"```(?:bash|shell|sh)?\n([^`]+)\n```",
15
+ replacement=r"```bash\n\1\n```",
16
+ description="Enhance command blocks with proper bash syntax highlighting",
17
+ test_cases=[
18
+ ("```\npython -m test\n```", "```bash\npython -m test\n```"),
19
+ ("```bash\necho hello\n```", "```bash\necho hello\n```"),
20
+ ("```sh\nls -la\n```", "```bash\nls -la\n```"),
21
+ ("```shell\ncd /tmp\n```", "```bash\ncd /tmp\n```"),
22
+ ],
23
+ ),
24
+ "extract_bash_command_blocks": ValidatedPattern(
25
+ name="extract_bash_command_blocks",
26
+ pattern=r"```bash\n([^`]+)\n```",
27
+ replacement=r"\1",
28
+ description="Extract content from bash command blocks",
29
+ test_cases=[
30
+ ("```bash\necho hello\n```", "echo hello"),
31
+ ("```bash\npython -m test\n```", "python -m test"),
32
+ ("text\n```bash\nls -la\n```\nmore", "text\nls -la\nmore"),
33
+ ("```bash\nmulti\nline\ncommand\n```", "multi\nline\ncommand"),
34
+ ],
35
+ ),
36
+ "extract_step_numbers": ValidatedPattern(
37
+ name="extract_step_numbers",
38
+ pattern=r"^(\s*)(\d+)\.\s*(.+)$",
39
+ replacement=r"\1**Step \2**: \3",
40
+ description="Extract and enhance numbered steps in documentation",
41
+ flags=re.MULTILINE,
42
+ test_cases=[
43
+ ("1. First step", "**Step 1**: First step"),
44
+ (" 2. Indented step", " **Step 2**: Indented step"),
45
+ ("10. Double digit step", "**Step 10**: Double digit step"),
46
+ ("normal text", "normal text"),
47
+ ],
48
+ ),
49
+ "preserved_comments": ValidatedPattern(
50
+ name="preserved_comments",
51
+ pattern=r"(#.*?(?: coding: | encoding: | type: | noqa | pragma).*)",
52
+ replacement=r"\1",
53
+ description="Match preserved code comments (encoding, type hints, etc.)",
54
+ test_cases=[
55
+ ("# coding: utf-8", "# coding: utf-8"),
56
+ ("# encoding: utf-8", "# encoding: utf-8"),
57
+ ("# type: ignore", "# type: ignore"),
58
+ ("# noqa: F401", "# noqa: F401"),
59
+ (
60
+ "x = 1 # type: int",
61
+ "x = 1 # type: int",
62
+ ),
63
+ (
64
+ "# pragma: no cover",
65
+ "# pragma: no cover",
66
+ ),
67
+ ("# regular comment", "# regular comment"),
68
+ ],
69
+ ),
70
+ "todo_pattern": ValidatedPattern(
71
+ name="todo_pattern",
72
+ pattern=r"(#.*?TODO.*)",
73
+ replacement=r"\1",
74
+ flags=re.IGNORECASE,
75
+ description="Match TODO comments for validation",
76
+ test_cases=[
77
+ ("# TODO: Fix this", "# TODO: Fix this"),
78
+ ("# todo: implement feature", "# todo: implement feature"),
79
+ ("# Todo: Update docs", "# Todo: Update docs"),
80
+ ("# FIXME: not a TODO", "# FIXME: not a TODO"),
81
+ ],
82
+ ),
83
+ }
@@ -0,0 +1,89 @@
1
+ """Docstring parsing and manipulation patterns.
2
+
3
+ This module provides regex patterns for working with docstrings in various formats
4
+ including triple-quoted strings, Google-style, and Sphinx-style documentation.
5
+ """
6
+
7
+ import re
8
+
9
+ from ..core import ValidatedPattern
10
+
11
+ PATTERNS = {
12
+ "docstring_triple_double": ValidatedPattern(
13
+ name="docstring_triple_double",
14
+ pattern=r'^\s*""".*?"""\s*$',
15
+ replacement=r"",
16
+ flags=re.MULTILINE | re.DOTALL,
17
+ description="Remove triple-quoted docstrings with double quotes",
18
+ test_cases=[
19
+ (' """This is a docstring""" ', ""),
20
+ ('"""Module docstring"""', ""),
21
+ (' """\n Multi-line\n docstring\n """', ""),
22
+ (
23
+ 'regular_code = "not a docstring"',
24
+ 'regular_code = "not a docstring"',
25
+ ),
26
+ ],
27
+ ),
28
+ "docstring_triple_single": ValidatedPattern(
29
+ name="docstring_triple_single",
30
+ pattern=r"^\s*'''.*?'''\s*$",
31
+ replacement=r"",
32
+ flags=re.MULTILINE | re.DOTALL,
33
+ description="Remove triple-quoted docstrings with single quotes",
34
+ test_cases=[
35
+ (" '''This is a docstring''' ", ""),
36
+ ("'''Module docstring'''", ""),
37
+ (" '''\n Multi-line\n docstring\n '''", ""),
38
+ (
39
+ "regular_code = 'not a docstring'",
40
+ "regular_code = 'not a docstring'",
41
+ ),
42
+ ],
43
+ ),
44
+ "extract_docstring_returns": ValidatedPattern(
45
+ name="extract_docstring_returns",
46
+ pattern=r"(?:Returns?|Return):\s*(.+?)(?=\n\n|\n\w+:|\Z)",
47
+ replacement=r"\1",
48
+ description="Extract return descriptions from docstrings",
49
+ flags=re.MULTILINE | re.DOTALL,
50
+ test_cases=[
51
+ ("Returns: Simple value", "Simple value"),
52
+ ("Return: Another form", "Another form"),
53
+ ("Returns: Multi-line\n description", "Multi-line\n description"),
54
+ ("Returns: Simple value\n\nArgs:", "Simple value\n\nArgs:"),
55
+ ],
56
+ ),
57
+ "extract_google_docstring_params": ValidatedPattern(
58
+ name="extract_google_docstring_params",
59
+ pattern=r"^\s*(\w+)(?:\s*\([^)]+\))?\s*:\s*(.+)$",
60
+ replacement=r"\1: \2",
61
+ description="Extract parameter names and descriptions from Google-style docstrings",
62
+ flags=re.MULTILINE,
63
+ test_cases=[
64
+ ("name (str): Description here", "name: Description here"),
65
+ ("count (int): Number of items", "count: Number of items"),
66
+ (
67
+ "complex_param (Optional[Dict[str, Any]]): Complex type",
68
+ "complex_param: Complex type",
69
+ ),
70
+ ("simple: Simple desc", "simple: Simple desc"),
71
+ ],
72
+ ),
73
+ "extract_sphinx_docstring_params": ValidatedPattern(
74
+ name="extract_sphinx_docstring_params",
75
+ pattern=r":param\s+(\w+)\s*:\s*(.+)$",
76
+ replacement=r"\1: \2",
77
+ description="Extract parameter names and descriptions from Sphinx-style docstrings",
78
+ flags=re.MULTILINE,
79
+ test_cases=[
80
+ (":param name: Description here", "name: Description here"),
81
+ (":param count: Number of items", "count: Number of items"),
82
+ (":param my_var: Simple description", "my_var: Simple description"),
83
+ (
84
+ ":param complex_var: Multi-word description here",
85
+ "complex_var: Multi-word description here",
86
+ ),
87
+ ],
88
+ ),
89
+ }