sourcecode 0.19.0__py3-none-any.whl → 0.20.0__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.
sourcecode/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Genera mapas de contexto estructurado para agentes IA."""
2
2
 
3
- __version__ = "0.19.0"
3
+ __version__ = "0.20.0"
sourcecode/cli.py CHANGED
@@ -75,6 +75,11 @@ def main(
75
75
  "--graph-edges",
76
76
  help="Tipos de arista para `--graph-modules` separados por comas: imports,calls,contains,extends",
77
77
  ),
78
+ no_tree: bool = typer.Option(
79
+ False,
80
+ "--no-tree",
81
+ help="Suprimir file_tree y file_paths del output (ideal con --dependencies en proyectos grandes)",
82
+ ),
78
83
  no_redact: bool = typer.Option(
79
84
  False,
80
85
  "--no-redact",
@@ -151,6 +156,11 @@ def main(
151
156
  "--code-notes",
152
157
  help="Extraer anotaciones TODO/FIXME/HACK/NOTE/DEPRECATED/WARNING/BUG/XXX/OPTIMIZE con ubicacion y simbolo envolvente, y detectar ADRs en docs/decisions/, docs/adr/ y similares",
153
158
  ),
159
+ agent: bool = typer.Option(
160
+ False,
161
+ "--agent",
162
+ help="Modo agente: selecciona automaticamente --compact --dependencies --env-map --code-notes y activa --no-tree en proyectos Java/Gradle o grandes",
163
+ ),
154
164
  ) -> None:
155
165
  """Genera un mapa de contexto estructurado del proyecto en formato JSON o YAML."""
156
166
  # Validar formato
@@ -221,6 +231,16 @@ def main(
221
231
  _java_min_depth = 8
222
232
  effective_depth = max(depth, _java_min_depth) if _is_java and depth < _java_min_depth else depth
223
233
 
234
+ # --agent: auto-select flags based on project characteristics
235
+ if agent:
236
+ compact = True
237
+ if _is_java:
238
+ no_tree = True
239
+ _agent_flags = ["--compact", "--dependencies", "--env-map", "--code-notes"]
240
+ if no_tree:
241
+ _agent_flags.append("--no-tree")
242
+ typer.echo(f"[agent] {' '.join(_agent_flags)}", err=True)
243
+
224
244
  scanner = FileScanner(target, max_depth=effective_depth)
225
245
  raw_tree = scanner.scan_tree()
226
246
 
@@ -594,7 +614,7 @@ def main(
594
614
 
595
615
  # 4. Serializar (con o sin modo compact)
596
616
  if compact:
597
- data = compact_view(sm)
617
+ data = compact_view(sm, no_tree=no_tree)
598
618
  # Aplicar redaccion sobre el dict del compact view
599
619
  if not no_redact:
600
620
  data = redact_dict(data)
@@ -602,6 +622,9 @@ def main(
602
622
  else:
603
623
  # Redactar sobre el dict serializado (SEC-01, SEC-03)
604
624
  raw_dict = asdict(sm)
625
+ if no_tree:
626
+ raw_dict.pop("file_tree", None)
627
+ raw_dict.pop("file_paths", None)
605
628
  if not no_redact:
606
629
  raw_dict = redact_dict(raw_dict)
607
630
 
@@ -34,6 +34,7 @@ class DependencyAnalyzer:
34
34
  self._analyze_go,
35
35
  self._analyze_dotnet,
36
36
  self._analyze_java,
37
+ self._analyze_gradle,
37
38
  ):
38
39
  handler_records, handler_limitations = handler(root)
39
40
  records.extend(replace(record, workspace=workspace) for record in handler_records)
@@ -925,6 +926,47 @@ class DependencyAnalyzer:
925
926
  result.append(resolved)
926
927
  return self._dedupe(result)
927
928
 
929
+ def _parse_maven_properties(self, root_elem: ET.Element, ns: str) -> dict[str, str]:
930
+ properties: dict[str, str] = {}
931
+ props_elem = root_elem.find(f"{ns}properties")
932
+ if props_elem is not None:
933
+ for prop in props_elem:
934
+ tag = prop.tag.replace(ns, "") if ns else prop.tag
935
+ if prop.text:
936
+ properties[tag] = prop.text.strip()
937
+ return properties
938
+
939
+ def _resolve_maven_version(self, version_raw: Optional[str], properties: dict[str, str]) -> Optional[str]:
940
+ if not version_raw:
941
+ return None
942
+ if not version_raw.startswith("${"):
943
+ return version_raw
944
+ prop_name = version_raw[2:-1] if version_raw.endswith("}") else None
945
+ if prop_name and prop_name in properties:
946
+ return properties[prop_name]
947
+ return None
948
+
949
+ def _parse_dependency_management(
950
+ self, root_elem: ET.Element, ns: str, properties: dict[str, str]
951
+ ) -> dict[str, str]:
952
+ dm_versions: dict[str, str] = {}
953
+ dm_elem = root_elem.find(f"{ns}dependencyManagement")
954
+ if dm_elem is None:
955
+ return dm_versions
956
+ deps_elem = dm_elem.find(f"{ns}dependencies")
957
+ if deps_elem is None:
958
+ return dm_versions
959
+ for dep in deps_elem.findall(f"{ns}dependency"):
960
+ group_id = (dep.findtext(f"{ns}groupId") or "").strip()
961
+ artifact_id = (dep.findtext(f"{ns}artifactId") or "").strip()
962
+ if not group_id or not artifact_id:
963
+ continue
964
+ version_raw = (dep.findtext(f"{ns}version") or "").strip() or None
965
+ resolved = self._resolve_maven_version(version_raw, properties)
966
+ if resolved:
967
+ dm_versions[f"{group_id}:{artifact_id}"] = resolved
968
+ return dm_versions
969
+
928
970
  def _analyze_java(self, root: Path) -> tuple[list[DependencyRecord], list[str]]:
929
971
  pom = root / "pom.xml"
930
972
  if not pom.exists():
@@ -938,6 +980,9 @@ class DependencyAnalyzer:
938
980
  ns_match = re.match(r"\{[^}]+\}", root_elem.tag)
939
981
  ns = ns_match.group(0) if ns_match else ""
940
982
 
983
+ properties = self._parse_maven_properties(root_elem, ns)
984
+ dm_versions = self._parse_dependency_management(root_elem, ns, properties)
985
+
941
986
  records: list[DependencyRecord] = []
942
987
  deps_elem = root_elem.find(f"{ns}dependencies")
943
988
  if deps_elem is None:
@@ -949,8 +994,9 @@ class DependencyAnalyzer:
949
994
  if not group_id or not artifact_id:
950
995
  continue
951
996
  version_raw = (dep.findtext(f"{ns}version") or "").strip() or None
952
- # Versiones interpoladas con propiedades Maven (${...}) no son resolvibles estáticamente
953
- declared = version_raw if version_raw and not version_raw.startswith("${") else None
997
+ declared = self._resolve_maven_version(version_raw, properties)
998
+ if declared is None:
999
+ declared = dm_versions.get(f"{group_id}:{artifact_id}")
954
1000
  scope_text = (dep.findtext(f"{ns}scope") or "compile").strip().lower()
955
1001
  scope = "dev" if scope_text == "test" else "direct"
956
1002
  records.append(
@@ -969,6 +1015,115 @@ class DependencyAnalyzer:
969
1015
  limitations.append("java: pom.xml sin dependencias parseables (puede usar BOM o propiedades)")
970
1016
  return records, limitations
971
1017
 
1018
+ def _analyze_gradle(self, root: Path) -> tuple[list[DependencyRecord], list[str]]:
1019
+ for filename in ("build.gradle", "build.gradle.kts"):
1020
+ gradle_file = root / filename
1021
+ if gradle_file.exists():
1022
+ try:
1023
+ content = gradle_file.read_text(encoding="utf-8", errors="replace")
1024
+ except OSError:
1025
+ return [], [f"gradle: error al leer {filename}"]
1026
+ props = self._parse_gradle_properties(root, content)
1027
+ records = self._parse_gradle_dependencies(content, props, filename)
1028
+ return records, ["gradle: sin lockfile compatible; dependencias transitivas no disponibles"]
1029
+ return [], []
1030
+
1031
+ def _parse_gradle_properties(self, root: Path, content: str) -> dict[str, str]:
1032
+ props: dict[str, str] = {}
1033
+ # gradle.properties file (key=value format)
1034
+ gp = root / "gradle.properties"
1035
+ if gp.exists():
1036
+ try:
1037
+ for line in gp.read_text(encoding="utf-8", errors="replace").splitlines():
1038
+ stripped = line.strip()
1039
+ if stripped and not stripped.startswith("#") and "=" in stripped:
1040
+ k, _, v = stripped.partition("=")
1041
+ props[k.strip()] = v.strip()
1042
+ except OSError:
1043
+ pass
1044
+ # Variables declared in the build file itself.
1045
+ # Match: val/var/def x = "v", or bare x = "v" anywhere (ext blocks, top-level).
1046
+ # Negative lookbehind (?<![.\w]) prevents matching mid-expression (e.g. obj.field = "v").
1047
+ for m in re.finditer(r"""(?:(?:val|var|def)\s+)?(?<![.\w])(\w+)\s*=\s*["']([^"']+)["']""", content):
1048
+ props.setdefault(m.group(1), m.group(2))
1049
+ return props
1050
+
1051
+ def _resolve_gradle_version(self, version_raw: Optional[str], props: dict[str, str]) -> Optional[str]:
1052
+ if not version_raw:
1053
+ return None
1054
+ # ${varName} — Groovy string interpolation
1055
+ m = re.fullmatch(r"\$\{(\w+)\}", version_raw)
1056
+ if m:
1057
+ return props.get(m.group(1))
1058
+ # $varName — Kotlin string interpolation
1059
+ m = re.fullmatch(r"\$(\w+)", version_raw)
1060
+ if m:
1061
+ return props.get(m.group(1))
1062
+ return version_raw
1063
+
1064
+ def _parse_gradle_dependencies(
1065
+ self, content: str, props: dict[str, str], manifest_path: str
1066
+ ) -> list[DependencyRecord]:
1067
+ _DIRECT = frozenset({
1068
+ "implementation", "api", "compileOnly", "runtimeOnly", "compile", "provided",
1069
+ "compileClasspath", "runtimeClasspath",
1070
+ })
1071
+ _DEV = frozenset({
1072
+ "testImplementation", "testRuntimeOnly", "testCompileOnly", "testApi",
1073
+ "testCompile", "androidTestImplementation", "annotationProcessor", "kapt",
1074
+ "debugImplementation", "releaseImplementation",
1075
+ })
1076
+ all_scopes = _DIRECT | _DEV
1077
+ records: list[DependencyRecord] = []
1078
+
1079
+ # String notation: scope("group:artifact") or scope("group:artifact:version")
1080
+ str_pat = re.compile(
1081
+ r"""(\w+)\s*\(?\s*["']([A-Za-z][\w.\-]*:[A-Za-z][\w.\-]*)(?::([^"'\s)]+))?["']"""
1082
+ )
1083
+ for m in str_pat.finditer(content):
1084
+ scope_kw = m.group(1)
1085
+ if scope_kw not in all_scopes:
1086
+ continue
1087
+ parts = m.group(2).split(":")
1088
+ if len(parts) < 2:
1089
+ continue
1090
+ group_id, artifact_id = parts[0].strip(), parts[1].strip()
1091
+ if not group_id or not artifact_id:
1092
+ continue
1093
+ version = self._resolve_gradle_version(m.group(3), props)
1094
+ records.append(DependencyRecord(
1095
+ name=f"{group_id}:{artifact_id}",
1096
+ ecosystem="java",
1097
+ scope="dev" if scope_kw in _DEV else "direct",
1098
+ declared_version=version,
1099
+ source="manifest",
1100
+ manifest_path=manifest_path,
1101
+ ))
1102
+
1103
+ # Map notation: scope(group: "g", name: "a", version: "v") — Groovy uses ':', Kotlin uses '='
1104
+ map_pat = re.compile(
1105
+ r"""(\w+)\s*\(?\s*group\s*[=:]\s*["']([^"']+)["']\s*,\s*name\s*[=:]\s*["']([^"']+)["']"""
1106
+ r"""(?:\s*,\s*version\s*[=:]\s*["']([^"']+)["'])?"""
1107
+ )
1108
+ for m in map_pat.finditer(content):
1109
+ scope_kw = m.group(1)
1110
+ if scope_kw not in all_scopes:
1111
+ continue
1112
+ group_id, artifact_id = m.group(2).strip(), m.group(3).strip()
1113
+ if not group_id or not artifact_id:
1114
+ continue
1115
+ version = self._resolve_gradle_version(m.group(4), props)
1116
+ records.append(DependencyRecord(
1117
+ name=f"{group_id}:{artifact_id}",
1118
+ ecosystem="java",
1119
+ scope="dev" if scope_kw in _DEV else "direct",
1120
+ declared_version=version,
1121
+ source="manifest",
1122
+ manifest_path=manifest_path,
1123
+ ))
1124
+
1125
+ return self._dedupe(records)
1126
+
972
1127
  def _load_yaml_file(self, path: Path) -> Optional[dict[str, Any]]:
973
1128
  if not path.exists():
974
1129
  return None
sourcecode/serializer.py CHANGED
@@ -54,27 +54,31 @@ def to_yaml(sm: SourceMap) -> str:
54
54
  return stream.getvalue()
55
55
 
56
56
 
57
- def compact_view(sm: SourceMap) -> dict[str, Any]:
57
+ def compact_view(sm: SourceMap, *, no_tree: bool = False) -> dict[str, Any]:
58
58
  """Proyeccion compacta del SourceMap (~500-700 tokens).
59
59
 
60
60
  Incluye: schema_version, project_type, stacks, entry_points,
61
61
  project_summary (siempre), architecture_summary (siempre),
62
- dependency_summary (cuando requested=True),
63
- file_tree_depth1 (backward compat).
62
+ dependency_summary + key_dependencies (cuando requested=True),
63
+ file_tree_depth1 (omitido si no_tree=True).
64
64
 
65
65
  Excluye: dependencies (lista larga), docs, module_graph.
66
66
  """
67
- depth1: dict[str, Any] = {}
68
- for name, value in sm.file_tree.items():
69
- if isinstance(value, dict):
70
- depth1[name] = {}
71
- else:
72
- depth1[name] = None
67
+ depth1: dict[str, Any] | None = None
68
+ if not no_tree:
69
+ depth1 = {}
70
+ for name, value in sm.file_tree.items():
71
+ if isinstance(value, dict):
72
+ depth1[name] = {}
73
+ else:
74
+ depth1[name] = None
73
75
 
74
76
  dep_summary_dict: Any = None
77
+ key_deps: Any = None
75
78
  if sm.dependency_summary is not None and sm.dependency_summary.requested:
76
79
  dep_summary_dict = asdict(sm.dependency_summary)
77
80
  dep_summary_dict.pop("dependencies", None)
81
+ key_deps = [asdict(d) for d in sm.key_dependencies]
78
82
 
79
83
  env_summary_dict: Any = None
80
84
  if sm.env_summary is not None and sm.env_summary.requested:
@@ -84,18 +88,21 @@ def compact_view(sm: SourceMap) -> dict[str, Any]:
84
88
  if sm.code_notes_summary is not None and sm.code_notes_summary.requested:
85
89
  code_notes_summary_dict = asdict(sm.code_notes_summary)
86
90
 
87
- return {
91
+ result: dict[str, Any] = {
88
92
  "schema_version": sm.metadata.schema_version,
89
93
  "project_type": sm.project_type,
90
94
  "project_summary": sm.project_summary,
91
95
  "architecture_summary": sm.architecture_summary,
92
96
  "stacks": [asdict(stack) for stack in sm.stacks],
93
97
  "entry_points": [asdict(entry_point) for entry_point in sm.entry_points],
94
- "file_tree_depth1": depth1,
95
98
  "dependency_summary": dep_summary_dict,
99
+ "key_dependencies": key_deps,
96
100
  "env_summary": env_summary_dict,
97
101
  "code_notes_summary": code_notes_summary_dict,
98
102
  }
103
+ if not no_tree:
104
+ result["file_tree_depth1"] = depth1
105
+ return result
99
106
 
100
107
 
101
108
  def normalize_source_map(sm: SourceMap) -> SourceMap:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 0.19.0
3
+ Version: 0.20.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 @@ sourcecode --version
81
81
 
82
82
  ## What It Detects
83
83
 
84
- - Stacks: Node.js, Python, Go, Rust, Java, PHP, Ruby, and Dart.
84
+ - Stacks: Node.js, Python, Go, Rust, Java (Maven `pom.xml` and Gradle `build.gradle`/`build.gradle.kts`), PHP, Ruby, and Dart.
85
85
  - Frameworks associated with each stack when enough signals are present.
86
86
  - `project_type`: `webapp`, `api`, `library`, `cli`, `fullstack`, `monorepo`, or `unknown`.
87
87
  - Relevant `entry_points`, such as `main.py`, `cmd/api/main.go`, or `app/page.tsx`.
@@ -111,6 +111,8 @@ sourcecode --version
111
111
  | `--env-map` | off | Map all environment variables referenced in source code: key name, required/optional status, inferred type (`string`, `int`, `bool`, `url`, `path`, `enum`), functional category (`database`, `auth`, `cache`, `storage`, `service`, `observability`, `feature_flag`, `server`, `general`), default value when present, and source file locations. Supplements with descriptions from `.env.example`, `.env.sample`, and similar reference files. |
112
112
  | `--code-notes` | off | Extract inline code annotations — `TODO`, `FIXME`, `HACK`, `NOTE`, `DEPRECATED`, `WARNING`, `XXX`, `BUG`, `OPTIMIZE` — with file path, line number, annotation text, and the nearest enclosing function or class. Also detects Architecture Decision Records (ADRs) in `docs/decisions/`, `docs/adr/`, `adr/`, and similar directories, extracting title, status, and summary. |
113
113
  | `--depth INTEGER` | `4` | Maximum file tree depth. Range: 1–20. |
114
+ | `--no-tree` | off | Suppress `file_tree`, `file_paths` (and `file_tree_depth1` in `--compact`) from the output. Ideal with `--dependencies` on large projects to get dependency data without a multi-thousand-line file tree. |
115
+ | `--agent` | off | Agent mode: auto-selects `--compact --dependencies --env-map --code-notes` and adds `--no-tree` automatically for Java/Gradle projects or large repositories. Prints selected flags to stderr. Can be combined with other flags (e.g. `--agent --git-context`). |
114
116
  | `--no-redact` | off | Disable secret redaction (enabled by default). |
115
117
  | `--version` | — | Show version and exit. |
116
118
 
@@ -123,8 +125,8 @@ The full schema (`SourceMap`) includes the following fields:
123
125
  | Field | Type | Description |
124
126
  |-------|------|-------------|
125
127
  | `metadata` | object | Schema version, timestamp, `sourcecode` version, and analyzed path. |
126
- | `file_tree` | object | Repository tree where `null` represents a file and `{}` represents a directory. |
127
- | `file_paths` | array | Flat list of all project paths derived from `file_tree`, with forward-slash separators. Always present; respects `--depth`. |
128
+ | `file_tree` | object | Repository tree where `null` represents a file and `{}` represents a directory. Suppressed when `--no-tree` is active. |
129
+ | `file_paths` | array | Flat list of all project paths derived from `file_tree`, with forward-slash separators. Respects `--depth`. Suppressed when `--no-tree` is active. |
128
130
  | `project_summary` | string\|null | Deterministic natural-language description of the project. Includes: manifest/README description when available, detected architecture pattern (`layered`, `mvc`, `hexagonal`, `fullstack`), business domain names inferred from directory structure, entry points (when no domains are detected), and dependency count. Present when stacks are detected. |
129
131
  | `architecture_summary` | string\|null | Static summary of the main execution flow, orchestrated modules, and output produced by the project. Present when enough structural evidence is available. |
130
132
  | `stacks` | array | Stack detections with confidence, frameworks, manifests, `primary`, `root`, `workspace`, and `signals`. |
@@ -223,7 +225,7 @@ ADR detection looks for Markdown files in `docs/decisions/`, `docs/adr/`, `adr/`
223
225
 
224
226
  ## Compact Mode
225
227
 
226
- `--compact` returns a reduced JSON view optimized for LLM prompts (~500-700 tokens). It excludes the full `dependencies` list, `docs`, and `module_graph`, while retaining the fields most useful for project orientation. When optional flags are also active, their summaries are included: `dependency_summary` (with `--dependencies`), `env_summary` (with `--env-map`), and `code_notes_summary` (with `--code-notes`).
228
+ `--compact` returns a reduced JSON view optimized for LLM prompts. It excludes the full `dependencies` list, `docs`, and `module_graph`, while retaining the fields most useful for project orientation. When optional flags are also active, their summaries are included: `dependency_summary` + `key_dependencies` (with `--dependencies`), `env_summary` (with `--env-map`), and `code_notes_summary` (with `--code-notes`). Adding `--no-tree` further removes `file_tree_depth1`, bringing the output to ~500-800 tokens depending on how many flags are active.
227
229
 
228
230
  Real output from a Python FastAPI project:
229
231
 
@@ -266,7 +268,7 @@ Real output from a Python FastAPI project:
266
268
  }
267
269
  ```
268
270
 
269
- When `--compact --dependencies` is used, `dependency_summary` is populated instead of `null`.
271
+ When `--compact --dependencies` is used, `dependency_summary` is populated and `key_dependencies` lists the top-15 direct dependencies with resolved versions. Add `--no-tree` to drop `file_tree_depth1` for the smallest possible context footprint.
270
272
 
271
273
  ## Docs Mode
272
274
 
@@ -444,15 +446,27 @@ In a monorepo, each stack includes its own `root` and `workspace`, and one of th
444
446
 
445
447
  Different modes optimize for different tradeoffs between context size and depth of information.
446
448
 
447
- **`--compact` — minimal context (~500-700 tokens)**
449
+ **`--agent` — zero-config mode for AI pipelines**
450
+
451
+ Best for: running `sourcecode` from inside an agent without knowing the project in advance. Auto-selects the right flag combination based on detected stack and project size.
452
+
453
+ ```bash
454
+ sourcecode --agent .
455
+ sourcecode --agent --git-context . # add git context on top of auto-selected flags
456
+ ```
457
+
458
+ On a Java/Gradle project the output is: `--compact --dependencies --env-map --code-notes --no-tree` (~800 tokens). On a Node/Python project: same without `--no-tree` (~900 tokens including depth-1 tree). Selected flags are always printed to stderr so the agent can log them.
459
+
460
+ **`--compact` — minimal context**
448
461
 
449
462
  Best for: initial orientation, deciding what to explore next, fast handoffs between agents.
450
463
 
451
- Includes: `project_summary` (instant project description), `architecture_summary` (execution-oriented static summary), `stacks`, `entry_points`, `file_tree_depth1`, and `dependency_summary` when `--dependencies` was also requested.
464
+ Includes: `project_summary`, `architecture_summary`, `stacks`, `entry_points`, `file_tree_depth1`, and — when the respective flags are active — `dependency_summary` + `key_dependencies`, `env_summary`, `code_notes_summary`.
452
465
 
453
466
  ```bash
454
467
  sourcecode --compact .
455
- sourcecode --compact --dependencies .
468
+ sourcecode --compact --dependencies . # + key dependencies with versions
469
+ sourcecode --compact --dependencies --no-tree . # smallest footprint: no file tree
456
470
  ```
457
471
 
458
472
  **Full output — deep analysis**
@@ -1,11 +1,11 @@
1
- sourcecode/__init__.py,sha256=K3oF2tC36Se4IiYU6MvNhrg4EoK_jaLeik_nUWPID4Y,100
1
+ sourcecode/__init__.py,sha256=dzKShGXdjPL26nODQDz1WcEo-41T1Cel-cSD0xF9gPg,100
2
2
  sourcecode/architecture_analyzer.py,sha256=zxgqeqn2FhIUDn06X-whjGKiXbrHFkRlzZcr2zKd0Gw,16874
3
3
  sourcecode/architecture_summary.py,sha256=r9IciS9z-7h8xpiME7DKBLhLV36xzXtSzbZ1cRDWklo,11709
4
4
  sourcecode/classifier.py,sha256=fcp2wIq198wq3Rsh_bDmZIK_W5UI6FEL5oqm1RrQfpA,6846
5
- sourcecode/cli.py,sha256=pB0NmyaH-gCrHCFlNxYSMfuArM6nitv6PyrMLkYKKRs,25429
5
+ sourcecode/cli.py,sha256=_FKnSNHqtLH6wJ2IA_7NR7-TUICCitildIMpSZt4IP8,26360
6
6
  sourcecode/code_notes_analyzer.py,sha256=rRd8bFYV0krjlxxQV0wenwE9K7pVpUQSR7KvSvUQKw4,9226
7
7
  sourcecode/coverage_parser.py,sha256=q0LeZJaX1bnntLu-ImksdBsMlpsVmk_iUfSaB4eaJGo,19702
8
- sourcecode/dependency_analyzer.py,sha256=KITti0XLHK3RvZGqAUseWnlFLXGFyv5FqvSK5R6PB1g,41147
8
+ sourcecode/dependency_analyzer.py,sha256=2TYBIpenhfWf_TVBZZfq3T0SHFv8xCKFIyn1XnFHG6s,48146
9
9
  sourcecode/doc_analyzer.py,sha256=Ec3orx6vBKsh5cNM3-F4y2Got2KuKx8w3dErwtdtM-A,19891
10
10
  sourcecode/env_analyzer.py,sha256=JZxBOuIxnM0xw0IaJFL6LiPJBErL848L3XoTOHGBqZI,13554
11
11
  sourcecode/git_analyzer.py,sha256=S9PGt8RDasBQYQUsZh9-H_KWVlPvzwR4jgM7TKN9ZCk,7643
@@ -16,7 +16,7 @@ sourcecode/redactor.py,sha256=xuGcadGEHaPw4qZXlMDvzMCsr4VOkdp3oBQptHyJk8c,2884
16
16
  sourcecode/scanner.py,sha256=Ga4jDRAOhkcwlRmlE2ko6cE39qKy0aI4iE1lGBWmAlk,6410
17
17
  sourcecode/schema.py,sha256=dnNdnQxJtBv0PRVWi6-xnpr16dj6IsUGbso9PeeEolA,15743
18
18
  sourcecode/semantic_analyzer.py,sha256=SRQSGJzEi4ZsGvb7U3qvnRiKHabz4hvIzCqiG92x9K8,79349
19
- sourcecode/serializer.py,sha256=edOfD25lUKkZ0gIjFcjqWmY4yHSnOKvudzNisvW_RYg,13456
19
+ sourcecode/serializer.py,sha256=ck0gK3PV-rY5UrAvykKh8x56Lb1135J23xzbcEsvUW8,13772
20
20
  sourcecode/summarizer.py,sha256=2Yz5xJ1bhtJLlrUpKcd74wijypRRo9GJmGT8u971EW0,11572
21
21
  sourcecode/tree_utils.py,sha256=xla45Whq24j6U9kEgTztJXkMpmOEDieAulKxP3nl89s,935
22
22
  sourcecode/workspace.py,sha256=fQlVoNx8S-fSHpKoJ0JBvEHCFkxszH0KZVJed1i3TRk,6845
@@ -39,7 +39,7 @@ sourcecode/detectors/rust.py,sha256=V23NO6Y8NsrhrUlGC2feUEcNK63hf3gc1y3jI4tes1Q,
39
39
  sourcecode/detectors/systems.py,sha256=nYaKbGDFu0EOXFcd_1doWFT3tTUdkbxc2DjHUF5TcqQ,1627
40
40
  sourcecode/detectors/terraform.py,sha256=cxORPR_zVLOJpHlh4e9JnFpkQsn_UnqMMom5yG65hZ4,1693
41
41
  sourcecode/detectors/tooling.py,sha256=hIvop80No22pqyGVJ32NKliSdjkHRePQkIRroqG01bY,1875
42
- sourcecode-0.19.0.dist-info/METADATA,sha256=cv1q6sPPTkTruEdpHr8JioUXmXuSec5dPAhAw9NXoW8,25900
43
- sourcecode-0.19.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
44
- sourcecode-0.19.0.dist-info/entry_points.txt,sha256=voDtdlGU2-jR3wCZpQoOls_0eUKaDVCKIfajGHFDATs,50
45
- sourcecode-0.19.0.dist-info/RECORD,,
42
+ sourcecode-0.20.0.dist-info/METADATA,sha256=KzFy_Iwj3H4eEWomjdYtE_XMb94isl55ekXSIHKOQ58,27548
43
+ sourcecode-0.20.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
44
+ sourcecode-0.20.0.dist-info/entry_points.txt,sha256=voDtdlGU2-jR3wCZpQoOls_0eUKaDVCKIfajGHFDATs,50
45
+ sourcecode-0.20.0.dist-info/RECORD,,