sourcecode 0.18.0__tar.gz → 0.19.0__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 (109) hide show
  1. {sourcecode-0.18.0 → sourcecode-0.19.0}/PKG-INFO +1 -1
  2. {sourcecode-0.18.0 → sourcecode-0.19.0}/docs/schema.md +2 -2
  3. {sourcecode-0.18.0 → sourcecode-0.19.0}/pyproject.toml +1 -1
  4. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/__init__.py +1 -1
  5. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/dependency_analyzer.py +4 -0
  6. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/schema.py +1 -0
  7. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/serializer.py +1 -0
  8. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_dependency_analyzer_node_python.py +1 -1
  9. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_dependency_analyzer_polyglot.py +76 -0
  10. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration_dependencies.py +1 -1
  11. {sourcecode-0.18.0 → sourcecode-0.19.0}/.gitignore +0 -0
  12. {sourcecode-0.18.0 → sourcecode-0.19.0}/.ruff.toml +0 -0
  13. {sourcecode-0.18.0 → sourcecode-0.19.0}/README.md +0 -0
  14. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/architecture_analyzer.py +0 -0
  15. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/architecture_summary.py +0 -0
  16. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/classifier.py +0 -0
  17. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/cli.py +0 -0
  18. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  19. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/coverage_parser.py +0 -0
  20. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/__init__.py +0 -0
  21. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/base.py +0 -0
  22. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/dart.py +0 -0
  23. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/dotnet.py +0 -0
  24. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/elixir.py +0 -0
  25. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/go.py +0 -0
  26. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/heuristic.py +0 -0
  27. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/java.py +0 -0
  28. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  29. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/nodejs.py +0 -0
  30. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/parsers.py +0 -0
  31. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/php.py +0 -0
  32. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/project.py +0 -0
  33. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/python.py +0 -0
  34. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/ruby.py +0 -0
  35. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/rust.py +0 -0
  36. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/systems.py +0 -0
  37. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/terraform.py +0 -0
  38. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/detectors/tooling.py +0 -0
  39. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/doc_analyzer.py +0 -0
  40. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/env_analyzer.py +0 -0
  41. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/git_analyzer.py +0 -0
  42. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/graph_analyzer.py +0 -0
  43. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/metrics_analyzer.py +0 -0
  44. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/prepare_context.py +0 -0
  45. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/redactor.py +0 -0
  46. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/scanner.py +0 -0
  47. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/semantic_analyzer.py +0 -0
  48. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/summarizer.py +0 -0
  49. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/tree_utils.py +0 -0
  50. {sourcecode-0.18.0 → sourcecode-0.19.0}/src/sourcecode/workspace.py +0 -0
  51. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/__init__.py +0 -0
  52. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/conftest.py +0 -0
  53. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/coverage.xml +0 -0
  54. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  55. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
  56. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  57. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/go_service/go.mod +0 -0
  58. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/jacoco.xml +0 -0
  59. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/lcov.info +0 -0
  60. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  61. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/nextjs_app/package.json +0 -0
  62. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  63. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  64. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  65. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  66. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  67. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  68. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_architecture_analyzer.py +0 -0
  69. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_architecture_summary.py +0 -0
  70. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_classifier.py +0 -0
  71. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_cli.py +0 -0
  72. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_code_notes_analyzer.py +0 -0
  73. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_coverage_parser.py +0 -0
  74. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_cross_consistency.py +0 -0
  75. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_dependency_schema.py +0 -0
  76. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_detector_go_rust_java.py +0 -0
  77. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_detector_nodejs.py +0 -0
  78. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_detector_php_ruby_dart.py +0 -0
  79. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_detector_python.py +0 -0
  80. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_detector_universal_managed.py +0 -0
  81. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_detector_universal_systems.py +0 -0
  82. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_detectors_base.py +0 -0
  83. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_doc_analyzer_jsdom.py +0 -0
  84. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_doc_analyzer_python.py +0 -0
  85. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_graph_analyzer_polyglot.py +0 -0
  86. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_graph_analyzer_python_node.py +0 -0
  87. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_graph_schema.py +0 -0
  88. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration.py +0 -0
  89. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration_detection.py +0 -0
  90. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration_docs.py +0 -0
  91. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration_graph_modules.py +0 -0
  92. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration_lqn.py +0 -0
  93. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration_metrics.py +0 -0
  94. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration_multistack.py +0 -0
  95. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration_semantics.py +0 -0
  96. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_integration_universal.py +0 -0
  97. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_metrics_analyzer.py +0 -0
  98. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_packaging.py +0 -0
  99. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_real_projects.py +0 -0
  100. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_redactor.py +0 -0
  101. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_scanner.py +0 -0
  102. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_schema.py +0 -0
  103. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_schema_normalization.py +0 -0
  104. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_semantic_analyzer_node.py +0 -0
  105. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_semantic_analyzer_python.py +0 -0
  106. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_semantic_import_resolution.py +0 -0
  107. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_semantic_schema.py +0 -0
  108. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_summarizer.py +0 -0
  109. {sourcecode-0.18.0 → sourcecode-0.19.0}/tests/test_workspace_analyzer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 0.18.0
3
+ Version: 0.19.0
4
4
  Summary: Genera un mapa de contexto estructurado de proyectos de software para agentes IA
5
5
  License: MIT
6
6
  Requires-Python: >=3.9
@@ -81,7 +81,7 @@ Campos:
81
81
  {
82
82
  "schema_version": "1.0",
83
83
  "generated_at": "2026-04-07T19:41:05.686277+00:00",
84
- "sourcecode_version": "0.18.0",
84
+ "sourcecode_version": "0.19.0",
85
85
  "analyzed_path": "/abs/path/to/project"
86
86
  }
87
87
  ```
@@ -645,7 +645,7 @@ Ejemplo de salida para un monorepo con web Node.js y API Python con `--dependenc
645
645
  "metadata": {
646
646
  "schema_version": "1.0",
647
647
  "generated_at": "2026-04-07T19:41:05.686277+00:00",
648
- "sourcecode_version": "0.18.0",
648
+ "sourcecode_version": "0.19.0",
649
649
  "analyzed_path": "/abs/path/to/project"
650
650
  },
651
651
  "file_tree": {
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "0.18.0"
7
+ version = "0.19.0"
8
8
  description = "Genera un mapa de contexto estructurado de proyectos de software para agentes IA"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Genera mapas de contexto estructurado para agentes IA."""
2
2
 
3
- __version__ = "0.18.0"
3
+ __version__ = "0.19.0"
@@ -47,6 +47,7 @@ class DependencyAnalyzer:
47
47
  ecosystems: set[str] = set()
48
48
  sources: set[str] = set()
49
49
  limitations: list[str] = []
50
+ all_dependencies: list[DependencyRecord] = []
50
51
  for summary in summaries:
51
52
  result.total_count += summary.total_count
52
53
  result.direct_count += summary.direct_count
@@ -56,9 +57,11 @@ class DependencyAnalyzer:
56
57
  for limitation in summary.limitations:
57
58
  if limitation not in limitations:
58
59
  limitations.append(limitation)
60
+ all_dependencies.extend(summary.dependencies)
59
61
  result.ecosystems = sorted(ecosystems)
60
62
  result.sources = sorted(sources)
61
63
  result.limitations = limitations
64
+ result.dependencies = all_dependencies
62
65
  return result
63
66
 
64
67
  def _build_summary(
@@ -80,6 +83,7 @@ class DependencyAnalyzer:
80
83
  ecosystems=ecosystems,
81
84
  sources=sources,
82
85
  limitations=unique_limitations,
86
+ dependencies=list(records),
83
87
  )
84
88
 
85
89
  def _dedupe(self, records: Iterable[DependencyRecord]) -> list[DependencyRecord]:
@@ -96,6 +96,7 @@ class DependencySummary:
96
96
  ecosystems: list[str] = field(default_factory=list)
97
97
  sources: list[str] = field(default_factory=list)
98
98
  limitations: list[str] = field(default_factory=list)
99
+ dependencies: list["DependencyRecord"] = field(default_factory=list)
99
100
 
100
101
 
101
102
  @dataclass
@@ -74,6 +74,7 @@ def compact_view(sm: SourceMap) -> dict[str, Any]:
74
74
  dep_summary_dict: Any = None
75
75
  if sm.dependency_summary is not None and sm.dependency_summary.requested:
76
76
  dep_summary_dict = asdict(sm.dependency_summary)
77
+ dep_summary_dict.pop("dependencies", None)
77
78
 
78
79
  env_summary_dict: Any = None
79
80
  if sm.env_summary is not None and sm.env_summary.requested:
@@ -106,6 +106,6 @@ def test_python_requirements_without_lockfile_keeps_declared_versions(tmp_path:
106
106
  assert summary.direct_count == 2
107
107
  typer_dep = next(record for record in records if record.name == "typer")
108
108
  rich_dep = next(record for record in records if record.name == "rich")
109
- assert typer_dep.declared_version == "==0.18.0"
109
+ assert typer_dep.declared_version == "==0.19.0"
110
110
  assert typer_dep.resolved_version is None
111
111
  assert rich_dep.declared_version == ">=13.0"
@@ -139,3 +139,79 @@ require github.com/gin-gonic/gin v1.10.0
139
139
  assert json_dep.resolved_version == "13.0.3"
140
140
  assert transitive_dotnet.scope == "transitive"
141
141
  assert "dotnet" in dotnet_summary.ecosystems
142
+
143
+
144
+ def test_java_pom_dependencies_listed_in_summary(tmp_path: Path) -> None:
145
+ (tmp_path / "pom.xml").write_text(
146
+ """<?xml version="1.0" encoding="UTF-8"?>
147
+ <project xmlns="http://maven.apache.org/POM/4.0.0">
148
+ <modelVersion>4.0.0</modelVersion>
149
+ <groupId>com.example</groupId>
150
+ <artifactId>demo</artifactId>
151
+ <version>1.0.0</version>
152
+ <dependencies>
153
+ <dependency>
154
+ <groupId>org.springframework.boot</groupId>
155
+ <artifactId>spring-boot-starter-web</artifactId>
156
+ <version>3.2.0</version>
157
+ </dependency>
158
+ <dependency>
159
+ <groupId>org.springframework.boot</groupId>
160
+ <artifactId>spring-boot-starter-test</artifactId>
161
+ <version>3.2.0</version>
162
+ <scope>test</scope>
163
+ </dependency>
164
+ <dependency>
165
+ <groupId>com.fasterxml.jackson.core</groupId>
166
+ <artifactId>jackson-databind</artifactId>
167
+ <version>2.15.0</version>
168
+ </dependency>
169
+ </dependencies>
170
+ </project>"""
171
+ )
172
+
173
+ records, summary = DependencyAnalyzer().analyze(tmp_path)
174
+
175
+ assert summary.total_count == 3
176
+ assert len(summary.dependencies) == 3
177
+ assert summary.dependencies == records
178
+
179
+ names = {r.name for r in summary.dependencies}
180
+ assert "org.springframework.boot:spring-boot-starter-web" in names
181
+ assert "org.springframework.boot:spring-boot-starter-test" in names
182
+ assert "com.fasterxml.jackson.core:jackson-databind" in names
183
+
184
+ web = next(r for r in summary.dependencies if "starter-web" in r.name)
185
+ assert web.declared_version == "3.2.0"
186
+ assert web.scope == "direct"
187
+ assert web.ecosystem == "java"
188
+
189
+ test_dep = next(r for r in summary.dependencies if "starter-test" in r.name)
190
+ assert test_dep.scope == "dev"
191
+
192
+
193
+ def test_java_dependency_summary_excluded_from_compact_view(tmp_path: Path) -> None:
194
+ import json
195
+ from typer.testing import CliRunner
196
+ from sourcecode.cli import app
197
+
198
+ (tmp_path / "pom.xml").write_text(
199
+ """<?xml version="1.0" encoding="UTF-8"?>
200
+ <project xmlns="http://maven.apache.org/POM/4.0.0">
201
+ <modelVersion>4.0.0</modelVersion>
202
+ <groupId>com.example</groupId><artifactId>demo</artifactId><version>1.0.0</version>
203
+ <dependencies>
204
+ <dependency>
205
+ <groupId>org.springframework.boot</groupId>
206
+ <artifactId>spring-boot-starter-web</artifactId>
207
+ <version>3.2.0</version>
208
+ </dependency>
209
+ </dependencies>
210
+ </project>"""
211
+ )
212
+
213
+ runner = CliRunner()
214
+ result = runner.invoke(app, ["--compact", str(tmp_path)])
215
+ assert result.exit_code == 0, result.output
216
+ data = json.loads(result.output)
217
+ assert "dependencies" not in data["dependency_summary"]
@@ -34,7 +34,7 @@ def test_cli_dependencies_flag_enables_dependency_block(tmp_path: Path) -> None:
34
34
 
35
35
 
36
36
  def test_cli_without_dependencies_flag_keeps_block_disabled(tmp_path: Path) -> None:
37
- (tmp_path / "requirements.txt").write_text("typer==0.18.0\n")
37
+ (tmp_path / "requirements.txt").write_text("typer==0.19.0\n")
38
38
 
39
39
  result = runner.invoke(app, [str(tmp_path)])
40
40
 
File without changes
File without changes
File without changes