sourcecode 1.31.2__tar.gz → 1.31.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. {sourcecode-1.31.2 → sourcecode-1.31.3}/PKG-INFO +3 -3
  2. {sourcecode-1.31.2 → sourcecode-1.31.3}/README.md +2 -2
  3. {sourcecode-1.31.2 → sourcecode-1.31.3}/pyproject.toml +1 -1
  4. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/__init__.py +1 -1
  5. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/cli.py +34 -6
  6. sourcecode-1.31.3/tests/test_bug_fixes_v1312.py +239 -0
  7. {sourcecode-1.31.2 → sourcecode-1.31.3}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  8. {sourcecode-1.31.2 → sourcecode-1.31.3}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  9. {sourcecode-1.31.2 → sourcecode-1.31.3}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  10. {sourcecode-1.31.2 → sourcecode-1.31.3}/.continue-here.md +0 -0
  11. {sourcecode-1.31.2 → sourcecode-1.31.3}/.github/workflows/build-windows.yml +0 -0
  12. {sourcecode-1.31.2 → sourcecode-1.31.3}/.gitignore +0 -0
  13. {sourcecode-1.31.2 → sourcecode-1.31.3}/.ruff.toml +0 -0
  14. {sourcecode-1.31.2 → sourcecode-1.31.3}/CHANGELOG.md +0 -0
  15. {sourcecode-1.31.2 → sourcecode-1.31.3}/CONTRIBUTING.md +0 -0
  16. {sourcecode-1.31.2 → sourcecode-1.31.3}/LICENSE +0 -0
  17. {sourcecode-1.31.2 → sourcecode-1.31.3}/SECURITY.md +0 -0
  18. {sourcecode-1.31.2 → sourcecode-1.31.3}/docs/privacy.md +0 -0
  19. {sourcecode-1.31.2 → sourcecode-1.31.3}/docs/schema.md +0 -0
  20. {sourcecode-1.31.2 → sourcecode-1.31.3}/raw +0 -0
  21. {sourcecode-1.31.2 → sourcecode-1.31.3}/run_cli.py +0 -0
  22. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/adaptive_scanner.py +0 -0
  23. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/architecture_analyzer.py +0 -0
  24. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/architecture_summary.py +0 -0
  25. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/ast_extractor.py +0 -0
  26. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/classifier.py +0 -0
  27. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/code_notes_analyzer.py +0 -0
  28. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/confidence_analyzer.py +0 -0
  29. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/context_scorer.py +0 -0
  30. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/context_summarizer.py +0 -0
  31. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/contract_model.py +0 -0
  32. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/contract_pipeline.py +0 -0
  33. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/coverage_parser.py +0 -0
  34. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/dependency_analyzer.py +0 -0
  35. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/__init__.py +0 -0
  36. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/base.py +0 -0
  37. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/csproj_parser.py +0 -0
  38. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/dart.py +0 -0
  39. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/dotnet.py +0 -0
  40. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/elixir.py +0 -0
  41. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/go.py +0 -0
  42. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/heuristic.py +0 -0
  43. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/hybrid.py +0 -0
  44. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/java.py +0 -0
  45. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/jvm_ext.py +0 -0
  46. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/nodejs.py +0 -0
  47. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/parsers.py +0 -0
  48. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/php.py +0 -0
  49. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/project.py +0 -0
  50. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/python.py +0 -0
  51. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/ruby.py +0 -0
  52. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/rust.py +0 -0
  53. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/systems.py +0 -0
  54. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/terraform.py +0 -0
  55. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/tooling.py +0 -0
  56. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/doc_analyzer.py +0 -0
  57. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/entrypoint_classifier.py +0 -0
  58. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/env_analyzer.py +0 -0
  59. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/file_classifier.py +0 -0
  60. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/flow_analyzer.py +0 -0
  61. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/git_analyzer.py +0 -0
  62. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/graph_analyzer.py +0 -0
  63. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/__init__.py +0 -0
  64. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  65. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  66. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  67. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  68. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  69. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/runner.py +0 -0
  70. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/server.py +0 -0
  71. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/metrics_analyzer.py +0 -0
  72. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/pr_comment_renderer.py +0 -0
  73. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/prepare_context.py +0 -0
  74. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/progress.py +0 -0
  75. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/ranking_engine.py +0 -0
  76. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/redactor.py +0 -0
  77. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/relevance_scorer.py +0 -0
  78. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/repo_classifier.py +0 -0
  79. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/repository_ir.py +0 -0
  80. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/runtime_classifier.py +0 -0
  81. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/scanner.py +0 -0
  82. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/schema.py +0 -0
  83. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/semantic_analyzer.py +0 -0
  84. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/serializer.py +0 -0
  85. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/summarizer.py +0 -0
  86. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/__init__.py +0 -0
  87. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/config.py +0 -0
  88. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/consent.py +0 -0
  89. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/events.py +0 -0
  90. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/filters.py +0 -0
  91. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/transport.py +0 -0
  92. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/tree_utils.py +0 -0
  93. {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/workspace.py +0 -0
  94. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/__init__.py +0 -0
  95. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/conftest.py +0 -0
  96. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/coverage.xml +0 -0
  97. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  98. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/fastapi_app/src/main.py +0 -0
  99. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  100. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/go_service/go.mod +0 -0
  101. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/jacoco.xml +0 -0
  102. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/latin1_sample.java +0 -0
  103. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/latin1_sample_iso.java +0 -0
  104. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/lcov.info +0 -0
  105. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  106. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/nextjs_app/package.json +0 -0
  107. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  108. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  109. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  110. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  111. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  112. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  113. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
  114. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
  115. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
  116. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
  117. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
  118. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
  119. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
  120. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
  121. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
  122. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
  123. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
  124. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
  125. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
  126. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
  127. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
  128. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
  129. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
  130. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
  131. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
  132. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
  133. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
  134. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
  135. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
  136. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
  137. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
  138. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
  139. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
  140. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_architecture_analyzer.py +0 -0
  141. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_architecture_summary.py +0 -0
  142. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_ast_extractor.py +0 -0
  143. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_block1_reliability.py +0 -0
  144. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_block2_coverage.py +0 -0
  145. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_block5_quality.py +0 -0
  146. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_bug_fixes_v1302.py +0 -0
  147. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_bug_fixes_v16.py +0 -0
  148. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_bug_fixes_v2.py +0 -0
  149. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_classifier.py +0 -0
  150. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_cli.py +0 -0
  151. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_code_notes_analyzer.py +0 -0
  152. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_context_scorer.py +0 -0
  153. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_contract_pipeline.py +0 -0
  154. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_coverage_parser.py +0 -0
  155. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_cross_consistency.py +0 -0
  156. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_dependency_analyzer_node_python.py +0 -0
  157. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_dependency_analyzer_polyglot.py +0 -0
  158. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_dependency_schema.py +0 -0
  159. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_dotnet.py +0 -0
  160. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_go_rust_java.py +0 -0
  161. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_nodejs.py +0 -0
  162. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_php_ruby_dart.py +0 -0
  163. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_python.py +0 -0
  164. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_universal_managed.py +0 -0
  165. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_universal_systems.py +0 -0
  166. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detectors_base.py +0 -0
  167. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_doc_analyzer_jsdom.py +0 -0
  168. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_doc_analyzer_python.py +0 -0
  169. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_encoding_regression.py +0 -0
  170. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_graph_analyzer_polyglot.py +0 -0
  171. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_graph_analyzer_python_node.py +0 -0
  172. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_graph_schema.py +0 -0
  173. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_hybrid_inference.py +0 -0
  174. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration.py +0 -0
  175. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_dependencies.py +0 -0
  176. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_detection.py +0 -0
  177. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_docs.py +0 -0
  178. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_graph_modules.py +0 -0
  179. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_lqn.py +0 -0
  180. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_metrics.py +0 -0
  181. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_multistack.py +0 -0
  182. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_semantics.py +0 -0
  183. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_universal.py +0 -0
  184. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_java_spring_integration.py +0 -0
  185. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_mcp_runner.py +0 -0
  186. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_mcp_serve.py +0 -0
  187. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_mcp_tools.py +0 -0
  188. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_metrics_analyzer.py +0 -0
  189. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_output_ux.py +0 -0
  190. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_packaging.py +0 -0
  191. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_phase1_improvements.py +0 -0
  192. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_pipeline_integrity.py +0 -0
  193. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_real_projects.py +0 -0
  194. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_redactor.py +0 -0
  195. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_repository_ir.py +0 -0
  196. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_scanner.py +0 -0
  197. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_schema.py +0 -0
  198. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_schema_normalization.py +0 -0
  199. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_scoring_calibration.py +0 -0
  200. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_semantic_analyzer_node.py +0 -0
  201. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_semantic_analyzer_python.py +0 -0
  202. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_semantic_import_resolution.py +0 -0
  203. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_semantic_schema.py +0 -0
  204. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_signal_hierarchy.py +0 -0
  205. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_summarizer.py +0 -0
  206. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_surface_honesty.py +0 -0
  207. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_task_differentiation.py +0 -0
  208. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_telemetry.py +0 -0
  209. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_v131_improvements.py +0 -0
  210. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_v1_10_regressions.py +0 -0
  211. {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_workspace_analyzer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.31.2
3
+ Version: 1.31.3
4
4
  Summary: Deterministic codebase context for AI coding agents
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -225,7 +225,7 @@ Description-Content-Type: text/markdown
225
225
 
226
226
  **Deterministic, behavior-aware codebase context for AI agents and PR review.**
227
227
 
228
- ![Version](https://img.shields.io/badge/version-1.31.2-blue)
228
+ ![Version](https://img.shields.io/badge/version-1.31.3-blue)
229
229
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
230
230
 
231
231
  ---
@@ -261,7 +261,7 @@ pipx install sourcecode
261
261
 
262
262
  ```bash
263
263
  sourcecode version
264
- # sourcecode 1.31.2
264
+ # sourcecode 1.31.3
265
265
  ```
266
266
 
267
267
  ---
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Deterministic, behavior-aware codebase context for AI agents and PR review.**
4
4
 
5
- ![Version](https://img.shields.io/badge/version-1.31.2-blue)
5
+ ![Version](https://img.shields.io/badge/version-1.31.3-blue)
6
6
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
7
7
 
8
8
  ---
@@ -38,7 +38,7 @@ pipx install sourcecode
38
38
 
39
39
  ```bash
40
40
  sourcecode version
41
- # sourcecode 1.31.2
41
+ # sourcecode 1.31.3
42
42
  ```
43
43
 
44
44
  ---
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.31.2"
7
+ version = "1.31.3"
8
8
  description = "Deterministic codebase context for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Deterministic codebase context maps for AI coding agents."""
2
2
 
3
- __version__ = "1.31.2"
3
+ __version__ = "1.31.3"
@@ -2467,6 +2467,8 @@ def _extract_java_endpoints(root: "Path") -> "dict[str, Any]":
2467
2467
  _CLASS_PATH_RE = _re.compile(
2468
2468
  r'@RequestMapping\s*\(\s*(?:value\s*=\s*)?["\']([^"\']+)["\']',
2469
2469
  )
2470
+ _REQUEST_METHOD_VERB_RE = _re.compile(r'method\s*=\s*RequestMethod\.([A-Z]+)')
2471
+ _VALUE_PATH_RE = _re.compile(r'value\s*=\s*"([^"]+)"')
2470
2472
 
2471
2473
  _HTTP_METHOD_MAP = {
2472
2474
  "Get": "GET", "Post": "POST", "Put": "PUT",
@@ -2502,12 +2504,24 @@ def _extract_java_endpoints(root: "Path") -> "dict[str, Any]":
2502
2504
  cls_m = _CLASS_RE.search(content)
2503
2505
  class_name = cls_m.group(1) if cls_m else java_file.stem
2504
2506
 
2505
- # Extract class-level base path from @RequestMapping on the class
2507
+ # Extract class-level base path and locate class body start
2506
2508
  class_base = ""
2507
2509
  lines = content.splitlines()
2510
+
2511
+ # First pass: find class/interface declaration line index
2512
+ class_body_start = 0
2508
2513
  for i, line in enumerate(lines):
2509
- if "@RequestMapping" in line and i < len(lines) - 1:
2510
- # Check if next non-blank line is class declaration or it's on same block
2514
+ stripped_l = line.strip()
2515
+ if (not stripped_l.startswith("//") and not stripped_l.startswith("*")
2516
+ and ("class " in stripped_l or "interface " in stripped_l)
2517
+ and _CLASS_RE.search(stripped_l)):
2518
+ class_body_start = i + 1
2519
+ break
2520
+
2521
+ # Second pass: extract class-level @RequestMapping path (only before class body)
2522
+ search_end = class_body_start if class_body_start else len(lines)
2523
+ for i in range(search_end):
2524
+ if "@RequestMapping" in lines[i]:
2511
2525
  block = "\n".join(lines[max(0, i - 1): i + 5])
2512
2526
  if "class " in block or "interface " in block:
2513
2527
  path_m = _CLASS_PATH_RE.search(block)
@@ -2515,12 +2529,13 @@ def _extract_java_endpoints(root: "Path") -> "dict[str, Any]":
2515
2529
  class_base = path_m.group(1).rstrip("/")
2516
2530
  break
2517
2531
 
2518
- # Extract method-level endpoints
2519
- # Parse line-by-line to associate annotations with methods
2532
+ # Extract method-level endpoints starting from inside class body
2533
+ # (skipping class-level annotations that appear before the class declaration)
2520
2534
  pending_annotations: list[tuple[str, str]] = [] # (http_verb, path_suffix)
2521
2535
  pending_filtro: Optional[str] = None
2522
2536
 
2523
- for i, line in enumerate(lines):
2537
+ for i in range(class_body_start, len(lines)):
2538
+ line = lines[i]
2524
2539
  stripped = line.strip()
2525
2540
 
2526
2541
  # Check for @M3FiltroSeguridad
@@ -2535,6 +2550,19 @@ def _extract_java_endpoints(root: "Path") -> "dict[str, Any]":
2535
2550
  verb_key = hm.group(1)
2536
2551
  http_verb = _HTTP_METHOD_MAP.get(verb_key, "GET")
2537
2552
  path_suffix = (hm.group(2) or "").strip()
2553
+
2554
+ # For @RequestMapping: resolve HTTP method from method= attribute
2555
+ if verb_key == "Request":
2556
+ annotation_block = "\n".join(lines[i:min(i + 5, len(lines))])
2557
+ vm = _REQUEST_METHOD_VERB_RE.search(annotation_block)
2558
+ if vm:
2559
+ http_verb = vm.group(1)
2560
+ # If path not captured (method= precedes value=), try value= extraction
2561
+ if not path_suffix:
2562
+ vp = _VALUE_PATH_RE.search(annotation_block)
2563
+ if vp:
2564
+ path_suffix = vp.group(1)
2565
+
2538
2566
  pending_annotations.append((http_verb, path_suffix))
2539
2567
  continue
2540
2568
 
@@ -0,0 +1,239 @@
1
+ """Tests for v1.31.2 bug fixes.
2
+
3
+ BUG #1 endpoints: class-level @RequestMapping leaked into method loop
4
+ → all methods showed class path only (or double prefix)
5
+ BUG #2 endpoints: @RequestMapping(method=RequestMethod.DELETE) resolved as GET
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ import textwrap
11
+ from pathlib import Path
12
+
13
+ import pytest
14
+ from typer.testing import CliRunner
15
+
16
+ from sourcecode.cli import app, _extract_java_endpoints
17
+
18
+ runner = CliRunner()
19
+
20
+
21
+ # ── helpers ───────────────────────────────────────────────────────────────────
22
+
23
+ def _write_java(tmp_path: Path, filename: str, source: str) -> Path:
24
+ f = tmp_path / filename
25
+ f.write_text(textwrap.dedent(source), encoding="utf-8")
26
+ return tmp_path
27
+
28
+
29
+ # ── BUG #1: path concatenation ─────────────────────────────────────────────
30
+
31
+
32
+ def test_acceso_rol_paths_correct(tmp_path):
33
+ """AccesoRolRestController: each method gets class_base + method_path."""
34
+ _write_java(tmp_path, "AccesoRolRestController.java", """\
35
+ @RestController
36
+ @RequestMapping("/v1/accesoRol")
37
+ public class AccesoRolRestController {
38
+
39
+ @M3FiltroSeguridad("accesoRol")
40
+ @GetMapping("/list")
41
+ public ResponseEntity<?> list() { return null; }
42
+
43
+ @PostMapping("/create")
44
+ public ResponseEntity<?> create() { return null; }
45
+
46
+ @DeleteMapping("/{id}")
47
+ public ResponseEntity<?> delete() { return null; }
48
+ }
49
+ """)
50
+ result = _extract_java_endpoints(tmp_path)
51
+ paths = {e["path"] for e in result["endpoints"]}
52
+ assert "/v1/accesoRol/list" in paths, f"expected /v1/accesoRol/list, got {paths}"
53
+ assert "/v1/accesoRol/create" in paths
54
+ assert "/v1/accesoRol/{id}" in paths
55
+ # class path alone must NOT appear as a standalone endpoint
56
+ assert "/v1/accesoRol" not in paths
57
+ # no double-prefix
58
+ assert not any("/v1/accesoRol/v1/accesoRol" in p for p in paths)
59
+
60
+
61
+ def test_no_double_prefix(tmp_path):
62
+ """Class path must not be concatenated with itself."""
63
+ _write_java(tmp_path, "PortalController.java", """\
64
+ @RestController
65
+ @RequestMapping("/v1/portal/acreditaciones")
66
+ public class PortalController {
67
+
68
+ @GetMapping("/all")
69
+ public List<?> getAll() { return null; }
70
+ }
71
+ """)
72
+ result = _extract_java_endpoints(tmp_path)
73
+ paths = {e["path"] for e in result["endpoints"]}
74
+ assert "/v1/portal/acreditaciones/all" in paths
75
+ assert not any("acreditaciones/v1" in p for p in paths)
76
+
77
+
78
+ def test_method_count_one_per_handler(tmp_path):
79
+ """Each handler must produce exactly one endpoint, not two."""
80
+ _write_java(tmp_path, "FooController.java", """\
81
+ @RestController
82
+ @RequestMapping("/api")
83
+ public class FooController {
84
+
85
+ @GetMapping("/items")
86
+ public List<?> items() { return null; }
87
+
88
+ @PostMapping("/items")
89
+ public void save() { }
90
+ }
91
+ """)
92
+ result = _extract_java_endpoints(tmp_path)
93
+ assert result["total"] == 2
94
+ handlers = [e["handler"] for e in result["endpoints"]]
95
+ assert len(handlers) == len(set(handlers)), "duplicate handlers found"
96
+
97
+
98
+ def test_no_class_level_path_in_method_loop(tmp_path):
99
+ """Class-level @RequestMapping must not pollute method loop."""
100
+ _write_java(tmp_path, "SimpleController.java", """\
101
+ @RestController
102
+ @RequestMapping(value = "/base")
103
+ public class SimpleController {
104
+
105
+ @GetMapping
106
+ public String root() { return "ok"; }
107
+ }
108
+ """)
109
+ result = _extract_java_endpoints(tmp_path)
110
+ # root() with @GetMapping (no path) → /base
111
+ assert result["total"] == 1
112
+ assert result["endpoints"][0]["path"] == "/base"
113
+ assert result["endpoints"][0]["handler"] == "root"
114
+
115
+
116
+ # ── BUG #2: HTTP method resolution ────────────────────────────────────────────
117
+
118
+
119
+ def test_request_mapping_delete_method(tmp_path):
120
+ """@RequestMapping(method=RequestMethod.DELETE) must resolve to DELETE."""
121
+ _write_java(tmp_path, "RolController.java", """\
122
+ @RestController
123
+ @RequestMapping("/v1/rol")
124
+ public class RolController {
125
+
126
+ @RequestMapping(value = "/borrarMultiple", method = RequestMethod.DELETE)
127
+ public ResponseEntity<?> borrarMultiple() { return null; }
128
+ }
129
+ """)
130
+ result = _extract_java_endpoints(tmp_path)
131
+ assert result["total"] == 1
132
+ ep = result["endpoints"][0]
133
+ assert ep["method"] == "DELETE", f"expected DELETE, got {ep['method']}"
134
+ assert ep["handler"] == "borrarMultiple"
135
+ assert ep["path"] == "/v1/rol/borrarMultiple"
136
+
137
+
138
+ def test_request_mapping_post_method(tmp_path):
139
+ """@RequestMapping(method=RequestMethod.POST) must resolve to POST."""
140
+ _write_java(tmp_path, "ItemController.java", """\
141
+ @RestController
142
+ @RequestMapping("/items")
143
+ public class ItemController {
144
+
145
+ @RequestMapping(value = "/create", method = RequestMethod.POST)
146
+ public ResponseEntity<?> create() { return null; }
147
+ }
148
+ """)
149
+ result = _extract_java_endpoints(tmp_path)
150
+ ep = result["endpoints"][0]
151
+ assert ep["method"] == "POST"
152
+
153
+
154
+ def test_request_mapping_no_method_defaults_get(tmp_path):
155
+ """@RequestMapping without method= defaults to GET."""
156
+ _write_java(tmp_path, "InfoController.java", """\
157
+ @RestController
158
+ public class InfoController {
159
+
160
+ @RequestMapping("/health")
161
+ public String health() { return "ok"; }
162
+ }
163
+ """)
164
+ result = _extract_java_endpoints(tmp_path)
165
+ assert result["endpoints"][0]["method"] == "GET"
166
+
167
+
168
+ def test_request_mapping_method_before_value(tmp_path):
169
+ """@RequestMapping(method=DELETE, value="/path") — method= before value=."""
170
+ _write_java(tmp_path, "OrderController.java", """\
171
+ @RestController
172
+ @RequestMapping("/orders")
173
+ public class OrderController {
174
+
175
+ @RequestMapping(method = RequestMethod.DELETE, value = "/cancel")
176
+ public void cancel() { }
177
+ }
178
+ """)
179
+ result = _extract_java_endpoints(tmp_path)
180
+ ep = result["endpoints"][0]
181
+ assert ep["method"] == "DELETE"
182
+ assert ep["path"] == "/orders/cancel"
183
+
184
+
185
+ def test_delete_mapping_annotation(tmp_path):
186
+ """@DeleteMapping must still resolve to DELETE (regression guard)."""
187
+ _write_java(tmp_path, "TaskController.java", """\
188
+ @RestController
189
+ @RequestMapping("/tasks")
190
+ public class TaskController {
191
+
192
+ @DeleteMapping("/{id}")
193
+ public void remove() { }
194
+ }
195
+ """)
196
+ result = _extract_java_endpoints(tmp_path)
197
+ assert result["endpoints"][0]["method"] == "DELETE"
198
+
199
+
200
+ # ── combined: paths + methods ─────────────────────────────────────────────────
201
+
202
+
203
+ def test_mixed_controller(tmp_path):
204
+ """Full CRUD controller: correct paths and methods for all verbs."""
205
+ _write_java(tmp_path, "CrudController.java", """\
206
+ @RestController
207
+ @RequestMapping("/v1/items")
208
+ public class CrudController {
209
+
210
+ @GetMapping
211
+ public List<?> getAll() { return null; }
212
+
213
+ @GetMapping("/{id}")
214
+ public Object getById() { return null; }
215
+
216
+ @PostMapping
217
+ public Object create() { return null; }
218
+
219
+ @PutMapping("/{id}")
220
+ public Object update() { return null; }
221
+
222
+ @DeleteMapping("/{id}")
223
+ public void delete() { }
224
+
225
+ @RequestMapping(value = "/bulk", method = RequestMethod.DELETE)
226
+ public void deleteBulk() { }
227
+ }
228
+ """)
229
+ result = _extract_java_endpoints(tmp_path)
230
+ by_handler = {e["handler"]: e for e in result["endpoints"]}
231
+
232
+ assert by_handler["getAll"]["method"] == "GET"
233
+ assert by_handler["getAll"]["path"] == "/v1/items"
234
+ assert by_handler["getById"]["path"] == "/v1/items/{id}"
235
+ assert by_handler["create"]["method"] == "POST"
236
+ assert by_handler["update"]["method"] == "PUT"
237
+ assert by_handler["delete"]["method"] == "DELETE"
238
+ assert by_handler["deleteBulk"]["method"] == "DELETE"
239
+ assert by_handler["deleteBulk"]["path"] == "/v1/items/bulk"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes