code-atlas-forge 1.1.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.
Files changed (181) hide show
  1. code_atlas/__init__.py +6 -0
  2. code_atlas/__main__.py +6 -0
  3. code_atlas/api/__init__.py +5 -0
  4. code_atlas/api/handlers.py +1514 -0
  5. code_atlas/api/server.py +394 -0
  6. code_atlas/cli.py +2084 -0
  7. code_atlas/config.py +149 -0
  8. code_atlas/context/__init__.py +66 -0
  9. code_atlas/context/contracts.py +277 -0
  10. code_atlas/context/domain.py +760 -0
  11. code_atlas/context/engine.py +442 -0
  12. code_atlas/context/expand.py +133 -0
  13. code_atlas/context/renderers.py +71 -0
  14. code_atlas/context/tokenizer.py +37 -0
  15. code_atlas/contracts/__init__.py +38 -0
  16. code_atlas/contracts/enums.py +67 -0
  17. code_atlas/contracts/models.py +175 -0
  18. code_atlas/contracts/ports.py +70 -0
  19. code_atlas/discovery/__init__.py +25 -0
  20. code_atlas/discovery/gitignore.py +119 -0
  21. code_atlas/discovery/identity.py +52 -0
  22. code_atlas/discovery/models.py +204 -0
  23. code_atlas/discovery/scanner.py +495 -0
  24. code_atlas/domains/__init__.py +107 -0
  25. code_atlas/domains/api/__init__.py +28 -0
  26. code_atlas/domains/api/adapter.py +405 -0
  27. code_atlas/domains/api/common.py +308 -0
  28. code_atlas/domains/api/consumers.py +224 -0
  29. code_atlas/domains/api/emit.py +231 -0
  30. code_atlas/domains/api/openapi.py +398 -0
  31. code_atlas/domains/api/routes.py +582 -0
  32. code_atlas/domains/api/yaml_subset.py +683 -0
  33. code_atlas/domains/aws/__init__.py +28 -0
  34. code_atlas/domains/aws/adapter.py +382 -0
  35. code_atlas/domains/aws/common.py +261 -0
  36. code_atlas/domains/aws/configs.py +1164 -0
  37. code_atlas/domains/aws/emit.py +411 -0
  38. code_atlas/domains/aws/pyfiles.py +2220 -0
  39. code_atlas/domains/aws/sqlbridge.py +448 -0
  40. code_atlas/domains/cicd/__init__.py +50 -0
  41. code_atlas/domains/cicd/adapter.py +762 -0
  42. code_atlas/domains/cicd/classify.py +136 -0
  43. code_atlas/domains/cicd/workflow.py +504 -0
  44. code_atlas/domains/cicd/yamlmini.py +946 -0
  45. code_atlas/domains/cli_surface.py +739 -0
  46. code_atlas/domains/contracts.py +274 -0
  47. code_atlas/domains/crossresolve.py +1208 -0
  48. code_atlas/domains/evidence.py +57 -0
  49. code_atlas/domains/identity.py +149 -0
  50. code_atlas/domains/model.py +202 -0
  51. code_atlas/domains/registry.py +250 -0
  52. code_atlas/domains/resolution.py +65 -0
  53. code_atlas/domains/spark/__init__.py +31 -0
  54. code_atlas/domains/spark/adapter.py +146 -0
  55. code_atlas/domains/spark/emit.py +344 -0
  56. code_atlas/domains/spark/extract.py +108 -0
  57. code_atlas/domains/spark/sqllit.py +192 -0
  58. code_atlas/domains/spark/walk.py +1943 -0
  59. code_atlas/domains/sql/__init__.py +30 -0
  60. code_atlas/domains/sql/adapter.py +382 -0
  61. code_atlas/domains/sql/extract.py +1271 -0
  62. code_atlas/domains/sql/nodes.py +264 -0
  63. code_atlas/domains/sql/parser.py +1510 -0
  64. code_atlas/domains/sql/tokens.py +318 -0
  65. code_atlas/domains/summarize.py +126 -0
  66. code_atlas/domains/terraform/__init__.py +20 -0
  67. code_atlas/domains/terraform/adapter.py +127 -0
  68. code_atlas/domains/terraform/catalog.py +43 -0
  69. code_atlas/domains/terraform/extract.py +1277 -0
  70. code_atlas/domains/terraform/hcl.py +538 -0
  71. code_atlas/domains/terraform/refs.py +181 -0
  72. code_atlas/domains/terraform/tfjson.py +163 -0
  73. code_atlas/domains/terraform/tfvars.py +98 -0
  74. code_atlas/domains/validation.py +120 -0
  75. code_atlas/env_override.py +27 -0
  76. code_atlas/eval/__init__.py +26 -0
  77. code_atlas/eval/domain_eval.py +681 -0
  78. code_atlas/eval/ground_truth.py +688 -0
  79. code_atlas/eval/impact_truth.py +758 -0
  80. code_atlas/eval/metrics.py +178 -0
  81. code_atlas/eval/pack_value.py +610 -0
  82. code_atlas/federation/__init__.py +72 -0
  83. code_atlas/federation/federation.py +676 -0
  84. code_atlas/federation/model.py +355 -0
  85. code_atlas/federation/store.py +194 -0
  86. code_atlas/gitbin.py +48 -0
  87. code_atlas/graph/__init__.py +20 -0
  88. code_atlas/graph/builder.py +378 -0
  89. code_atlas/graph/identity.py +54 -0
  90. code_atlas/graph/queries.py +47 -0
  91. code_atlas/graph/validation.py +92 -0
  92. code_atlas/impact/__init__.py +37 -0
  93. code_atlas/impact/blast_radius.py +171 -0
  94. code_atlas/impact/contract_analyzer.py +104 -0
  95. code_atlas/impact/contracts.py +315 -0
  96. code_atlas/impact/diff_reader.py +142 -0
  97. code_atlas/impact/domain_traversal.py +768 -0
  98. code_atlas/impact/engine.py +392 -0
  99. code_atlas/impact/packs.py +128 -0
  100. code_atlas/impact/report.py +136 -0
  101. code_atlas/impact/revision_binding.py +220 -0
  102. code_atlas/impact/risk_classifier.py +83 -0
  103. code_atlas/impact/snapshot_resolver.py +136 -0
  104. code_atlas/impact/symbol_diff.py +210 -0
  105. code_atlas/impact/test_selector.py +166 -0
  106. code_atlas/indexing/__init__.py +5 -0
  107. code_atlas/indexing/cache.py +396 -0
  108. code_atlas/indexing/change_detector.py +278 -0
  109. code_atlas/indexing/coordinator.py +1032 -0
  110. code_atlas/indexing/dependency_planner.py +268 -0
  111. code_atlas/indexing/persist.py +436 -0
  112. code_atlas/indexing/reuse.py +85 -0
  113. code_atlas/install/__init__.py +7 -0
  114. code_atlas/install/cli.py +168 -0
  115. code_atlas/install/lifecycle.py +286 -0
  116. code_atlas/mcp.py +674 -0
  117. code_atlas/observability/__init__.py +19 -0
  118. code_atlas/observability/logging.py +199 -0
  119. code_atlas/parsers/__init__.py +43 -0
  120. code_atlas/parsers/contracts.py +209 -0
  121. code_atlas/parsers/engine.py +125 -0
  122. code_atlas/parsers/languages/__init__.py +1 -0
  123. code_atlas/parsers/languages/python.py +391 -0
  124. code_atlas/parsers/languages/tsx.py +28 -0
  125. code_atlas/parsers/languages/typescript.py +909 -0
  126. code_atlas/parsers/registry.py +51 -0
  127. code_atlas/parsers/tree_sitter_runtime.py +118 -0
  128. code_atlas/resolvers/__init__.py +33 -0
  129. code_atlas/resolvers/bootstrap.py +246 -0
  130. code_atlas/resolvers/capabilities.py +33 -0
  131. code_atlas/resolvers/contracts.py +133 -0
  132. code_atlas/resolvers/coordinator.py +96 -0
  133. code_atlas/resolvers/enrichment.py +318 -0
  134. code_atlas/resolvers/lsp/__init__.py +26 -0
  135. code_atlas/resolvers/lsp/adapter.py +256 -0
  136. code_atlas/resolvers/lsp/lifecycle.py +251 -0
  137. code_atlas/resolvers/lsp/spawn.py +92 -0
  138. code_atlas/resolvers/lsp/transport.py +240 -0
  139. code_atlas/resolvers/registry.py +33 -0
  140. code_atlas/resolvers/scip/__init__.py +49 -0
  141. code_atlas/resolvers/scip/decoder.py +216 -0
  142. code_atlas/resolvers/scip/importer.py +248 -0
  143. code_atlas/resolvers/scip/loader.py +90 -0
  144. code_atlas/resolvers/scip/mapper.py +271 -0
  145. code_atlas/resolvers/scip/provenance.py +211 -0
  146. code_atlas/resolvers/scip/resolver.py +289 -0
  147. code_atlas/resolvers/scip/validation.py +101 -0
  148. code_atlas/resolvers/syntactic/__init__.py +8 -0
  149. code_atlas/resolvers/syntactic/resolver.py +254 -0
  150. code_atlas/search/__init__.py +32 -0
  151. code_atlas/search/contracts.py +176 -0
  152. code_atlas/search/domain.py +561 -0
  153. code_atlas/search/engine.py +530 -0
  154. code_atlas/search/federated.py +276 -0
  155. code_atlas/search/graph.py +282 -0
  156. code_atlas/search/hybrid.py +151 -0
  157. code_atlas/search/intent.py +48 -0
  158. code_atlas/search/lexical.py +176 -0
  159. code_atlas/search/refs.py +359 -0
  160. code_atlas/search/structural.py +505 -0
  161. code_atlas/search/tokenizer.py +43 -0
  162. code_atlas/search/vector/__init__.py +35 -0
  163. code_atlas/search/vector/contracts.py +76 -0
  164. code_atlas/search/vector/embeddings.py +96 -0
  165. code_atlas/search/vector/index.py +169 -0
  166. code_atlas/search/vector/provider.py +50 -0
  167. code_atlas/storage/__init__.py +14 -0
  168. code_atlas/storage/db.py +47 -0
  169. code_atlas/storage/migrations.py +552 -0
  170. code_atlas/storage/store.py +1045 -0
  171. code_atlas/ui/__init__.py +29 -0
  172. code_atlas/ui/i18n.py +143 -0
  173. code_atlas/ui/kit.py +689 -0
  174. code_atlas/ui/wizard.py +317 -0
  175. code_atlas_forge-1.1.0.dist-info/METADATA +246 -0
  176. code_atlas_forge-1.1.0.dist-info/RECORD +181 -0
  177. code_atlas_forge-1.1.0.dist-info/WHEEL +5 -0
  178. code_atlas_forge-1.1.0.dist-info/entry_points.txt +2 -0
  179. code_atlas_forge-1.1.0.dist-info/licenses/LICENSE +202 -0
  180. code_atlas_forge-1.1.0.dist-info/licenses/NOTICE +17 -0
  181. code_atlas_forge-1.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,264 @@
1
+ """AST mínimo do adaptador SQL (lf-0111, Cycle 7 Phase 3).
2
+
3
+ O modelo é **orientado a extração**, não a validação: carrega apenas o que
4
+ a montagem de entidades/relações precisa — nomes de tabelas, colrefs,
5
+ aliases, itens de SELECT e subqueries. Expressões nunca viram árvores
6
+ interpretáveis; ``ExprRefs`` guarda as referências observadas (colunas,
7
+ ``*``, subqueries, marcador dinâmico) — suficiente para linhagem honesta.
8
+
9
+ Nomes normalizados: ``iname`` de palavras não-quotadas é lower-case;
10
+ ``qident`` preserva case. Cada ``*Name`` guarda ``written`` (como
11
+ escrito) para evidência/diagnóstico.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from dataclasses import dataclass, field
17
+
18
+ from code_atlas.parsers.contracts import SourceSpan
19
+
20
+
21
+ @dataclass(frozen=True)
22
+ class NameRef:
23
+ """Nome qualificado (``catalog.schema.table``) como escrito no SQL."""
24
+
25
+ parts: tuple[str, ...] # normalizado: word→lower, qident→case real
26
+ written: str
27
+ span: SourceSpan
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ class ColRef:
32
+ """Referência de coluna: 1..N partes (``a.b.c`` — aninhadas inclusas)."""
33
+
34
+ parts: tuple[str, ...]
35
+ span: SourceSpan
36
+
37
+
38
+ @dataclass(frozen=True)
39
+ class StarRef:
40
+ """``*`` ou ``qualifier.*`` numa posição de expressão."""
41
+
42
+ qualifier: tuple[str, ...]
43
+ span: SourceSpan
44
+
45
+
46
+ @dataclass
47
+ class ExprRefs:
48
+ """O que uma expressão referencia — coletado durante o scan.
49
+
50
+ ``cols`` são colrefs visíveis; ``stars`` inclui ``count(*)`` (qualifier
51
+ vazio); ``subqueries`` são selects aninhados encontrados na expressão
52
+ (correlated ou não); ``dynamic`` marca presença de token de template.
53
+ ``top_star`` é o star em nível zero (``*``/``alias.*``) — distingue
54
+ item-estrela de ``count(*)`` (que tem star só em nível interno).
55
+ """
56
+
57
+ cols: list[ColRef] = field(default_factory=list)
58
+ stars: list[StarRef] = field(default_factory=list)
59
+ subqueries: list[SelectStmt] = field(default_factory=list)
60
+ dynamic: bool = False
61
+ top_star: StarRef | None = None
62
+
63
+ def merge(self, other: ExprRefs) -> None:
64
+ self.cols.extend(other.cols)
65
+ self.stars.extend(other.stars)
66
+ self.subqueries.extend(other.subqueries)
67
+ self.dynamic = self.dynamic or other.dynamic
68
+ if other.top_star is not None:
69
+ self.top_star = other.top_star
70
+
71
+
72
+ @dataclass(frozen=True)
73
+ class SelectItem:
74
+ """Item da lista SELECT: expressão + alias declarado."""
75
+
76
+ refs: ExprRefs
77
+ alias: str | None
78
+ span: SourceSpan
79
+ star: StarRef | None = None # definido quando o item É `*`/`t.*`
80
+
81
+
82
+ @dataclass(frozen=True)
83
+ class Cte:
84
+ """``name [ (cols) ] AS ( query )`` dentro de WITH."""
85
+
86
+ name: str
87
+ columns: tuple[str, ...]
88
+ query: SelectStmt
89
+ span: SourceSpan
90
+ recursive: bool = False
91
+
92
+
93
+ # --- fontes do FROM ----------------------------------------------------
94
+
95
+
96
+ @dataclass(frozen=True)
97
+ class SrcTable:
98
+ """Fonte nomeada (tabela/view/CTE a resolver)."""
99
+
100
+ name: NameRef
101
+ alias: str | None
102
+ span: SourceSpan
103
+
104
+
105
+ @dataclass(frozen=True)
106
+ class SrcSub:
107
+ """``( SELECT … ) [AS] alias [ (cols) ]`` — subquery derivada."""
108
+
109
+ query: SelectStmt
110
+ alias: str | None
111
+ col_aliases: tuple[str, ...]
112
+ span: SourceSpan
113
+
114
+
115
+ @dataclass(frozen=True)
116
+ class SrcGroup:
117
+ """``( join … ) alias`` — fonte agrupada entre parênteses."""
118
+
119
+ inner: Source
120
+ alias: str | None
121
+ span: SourceSpan
122
+
123
+
124
+ @dataclass(frozen=True)
125
+ class SrcJoin:
126
+ """Join binário; ``kind`` preserva o texto do join para atributos."""
127
+
128
+ left: Source
129
+ right: Source
130
+ kind: str
131
+ span: SourceSpan
132
+
133
+
134
+ @dataclass(frozen=True)
135
+ class SrcValues:
136
+ """``VALUES (…)`` em posição de fonte — dados literais, sem upstream."""
137
+
138
+ alias: str | None
139
+ col_aliases: tuple[str, ...]
140
+ span: SourceSpan
141
+
142
+
143
+ @dataclass(frozen=True)
144
+ class SrcUnsupported:
145
+ """Fonte não-tabela que o parser reconhece mas não expande.
146
+
147
+ ``what``: ``unnest`` | ``lateral-view`` | ``table-function`` |
148
+ ``dynamic`` — vira diagnóstico honesto na extração.
149
+ """
150
+
151
+ what: str
152
+ written: str
153
+ span: SourceSpan
154
+
155
+
156
+ Source = SrcTable | SrcSub | SrcGroup | SrcJoin | SrcValues | SrcUnsupported
157
+
158
+
159
+ @dataclass
160
+ class SelectStmt:
161
+ """SELECT completo (um termo de UNION — branches ficam à parte)."""
162
+
163
+ ctes: list[Cte]
164
+ items: list[SelectItem]
165
+ sources: list[Source]
166
+ set_branches: list[SelectStmt] # membros UNION/INTERSECT/EXCEPT
167
+ set_ops: list[str] # paralelo a set_branches
168
+ tail_subqueries: list[SelectStmt] # subs achados em WHERE/ON/exprs
169
+ span: SourceSpan
170
+
171
+
172
+ # --- statements ----------------------------------------------------------
173
+
174
+
175
+ @dataclass
176
+ class Statement:
177
+ kind: str # select|insert|update|delete|merge|…|unsupported
178
+ span: SourceSpan
179
+ dynamic: bool = False
180
+
181
+
182
+ @dataclass
183
+ class SSelect(Statement):
184
+ query: SelectStmt | None = None
185
+ prepared_name: str = ""
186
+
187
+
188
+ @dataclass
189
+ class SInsert(Statement):
190
+ target: NameRef | None = None
191
+ columns: tuple[str, ...] | None = None
192
+ query: SelectStmt | None = None
193
+ value_rows: list[list[ExprRefs]] = field(default_factory=list)
194
+ overwrite: bool = False
195
+
196
+
197
+ @dataclass
198
+ class SUpdate(Statement):
199
+ target: NameRef | None = None
200
+ target_alias: str | None = None
201
+ sets: list[tuple[str, ExprRefs]] = field(default_factory=list)
202
+ sources: list[Source] = field(default_factory=list)
203
+ ctes: list[Cte] = field(default_factory=list)
204
+ tail_subqueries: list[SelectStmt] = field(default_factory=list)
205
+
206
+
207
+ @dataclass
208
+ class SDelete(Statement):
209
+ target: NameRef | None = None
210
+ sources: list[Source] = field(default_factory=list)
211
+ ctes: list[Cte] = field(default_factory=list)
212
+ tail_subqueries: list[SelectStmt] = field(default_factory=list)
213
+
214
+
215
+ @dataclass
216
+ class SMerge(Statement):
217
+ target: NameRef | None = None
218
+ target_alias: str | None = None
219
+ source: Source | None = None
220
+ sets: list[tuple[str, ExprRefs]] = field(default_factory=list)
221
+ insert_cols: tuple[str, ...] | None = None
222
+ insert_exprs: list[ExprRefs] = field(default_factory=list)
223
+ ctes: list[Cte] = field(default_factory=list)
224
+ tail_subqueries: list[SelectStmt] = field(default_factory=list)
225
+
226
+
227
+ @dataclass
228
+ class SCreateTable(Statement):
229
+ name: NameRef | None = None
230
+ columns: list[tuple[str, str]] = field(default_factory=list) # (nome, tipo)
231
+ query: SelectStmt | None = None
232
+ like: NameRef | None = None
233
+ temporary: bool = False
234
+ external: bool = False
235
+ or_replace: bool = False
236
+
237
+
238
+ @dataclass
239
+ class SCreateView(Statement):
240
+ name: NameRef | None = None
241
+ col_aliases: tuple[str, ...] = ()
242
+ query: SelectStmt | None = None
243
+ or_replace: bool = False
244
+ materialized: bool = False
245
+ temporary: bool = False
246
+
247
+
248
+ @dataclass
249
+ class SUse(Statement):
250
+ parts: tuple[str, ...] = ()
251
+ written: str = ""
252
+
253
+
254
+ @dataclass
255
+ class STruncate(Statement):
256
+ name: NameRef | None = None
257
+
258
+
259
+ @dataclass
260
+ class SUnsupported(Statement):
261
+ """Statement reconhecido como fora do escopo de extração."""
262
+
263
+ why: str = "" # ex.: "drop", "alter", "dynamic-exec", "grant"
264
+ head: str = "" # primeira palavra do statement (diagnóstico)