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.
- {sourcecode-1.31.2 → sourcecode-1.31.3}/PKG-INFO +3 -3
- {sourcecode-1.31.2 → sourcecode-1.31.3}/README.md +2 -2
- {sourcecode-1.31.2 → sourcecode-1.31.3}/pyproject.toml +1 -1
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/cli.py +34 -6
- sourcecode-1.31.3/tests/test_bug_fixes_v1312.py +239 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/.continue-here.md +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/.gitignore +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/.ruff.toml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/CHANGELOG.md +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/CONTRIBUTING.md +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/LICENSE +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/SECURITY.md +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/docs/privacy.md +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/docs/schema.md +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/raw +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/run_cli.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/flow_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/serializer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/__init__.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/conftest.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/latin1_sample.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/latin1_sample_iso.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_bug_fixes_v1302.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_bug_fixes_v2.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_classifier.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_cli.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_python.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_encoding_regression.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_mcp_runner.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_mcp_serve.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_mcp_tools.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_output_ux.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_packaging.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_real_projects.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_redactor.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_repository_ir.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_scanner.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_schema.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_scoring_calibration.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_summarizer.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_task_differentiation.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_telemetry.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_v131_improvements.py +0 -0
- {sourcecode-1.31.2 → sourcecode-1.31.3}/tests/test_v1_10_regressions.py +0 -0
- {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.
|
|
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
|
-

|
|
229
229
|

|
|
230
230
|
|
|
231
231
|
---
|
|
@@ -261,7 +261,7 @@ pipx install sourcecode
|
|
|
261
261
|
|
|
262
262
|
```bash
|
|
263
263
|
sourcecode version
|
|
264
|
-
# sourcecode 1.31.
|
|
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
|
-

|
|
6
6
|

|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -38,7 +38,7 @@ pipx install sourcecode
|
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
sourcecode version
|
|
41
|
-
# sourcecode 1.31.
|
|
41
|
+
# sourcecode 1.31.3
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
---
|
|
@@ -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
|
|
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
|
-
|
|
2510
|
-
|
|
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
|
-
#
|
|
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
|
|
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"
|
{sourcecode-1.31.2 → sourcecode-1.31.3}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.31.2 → sourcecode-1.31.3}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.31.2 → sourcecode-1.31.3}/.agents/skills/source-command-gsd-workstreams/SKILL.md
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|