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.
- code_atlas/__init__.py +6 -0
- code_atlas/__main__.py +6 -0
- code_atlas/api/__init__.py +5 -0
- code_atlas/api/handlers.py +1514 -0
- code_atlas/api/server.py +394 -0
- code_atlas/cli.py +2084 -0
- code_atlas/config.py +149 -0
- code_atlas/context/__init__.py +66 -0
- code_atlas/context/contracts.py +277 -0
- code_atlas/context/domain.py +760 -0
- code_atlas/context/engine.py +442 -0
- code_atlas/context/expand.py +133 -0
- code_atlas/context/renderers.py +71 -0
- code_atlas/context/tokenizer.py +37 -0
- code_atlas/contracts/__init__.py +38 -0
- code_atlas/contracts/enums.py +67 -0
- code_atlas/contracts/models.py +175 -0
- code_atlas/contracts/ports.py +70 -0
- code_atlas/discovery/__init__.py +25 -0
- code_atlas/discovery/gitignore.py +119 -0
- code_atlas/discovery/identity.py +52 -0
- code_atlas/discovery/models.py +204 -0
- code_atlas/discovery/scanner.py +495 -0
- code_atlas/domains/__init__.py +107 -0
- code_atlas/domains/api/__init__.py +28 -0
- code_atlas/domains/api/adapter.py +405 -0
- code_atlas/domains/api/common.py +308 -0
- code_atlas/domains/api/consumers.py +224 -0
- code_atlas/domains/api/emit.py +231 -0
- code_atlas/domains/api/openapi.py +398 -0
- code_atlas/domains/api/routes.py +582 -0
- code_atlas/domains/api/yaml_subset.py +683 -0
- code_atlas/domains/aws/__init__.py +28 -0
- code_atlas/domains/aws/adapter.py +382 -0
- code_atlas/domains/aws/common.py +261 -0
- code_atlas/domains/aws/configs.py +1164 -0
- code_atlas/domains/aws/emit.py +411 -0
- code_atlas/domains/aws/pyfiles.py +2220 -0
- code_atlas/domains/aws/sqlbridge.py +448 -0
- code_atlas/domains/cicd/__init__.py +50 -0
- code_atlas/domains/cicd/adapter.py +762 -0
- code_atlas/domains/cicd/classify.py +136 -0
- code_atlas/domains/cicd/workflow.py +504 -0
- code_atlas/domains/cicd/yamlmini.py +946 -0
- code_atlas/domains/cli_surface.py +739 -0
- code_atlas/domains/contracts.py +274 -0
- code_atlas/domains/crossresolve.py +1208 -0
- code_atlas/domains/evidence.py +57 -0
- code_atlas/domains/identity.py +149 -0
- code_atlas/domains/model.py +202 -0
- code_atlas/domains/registry.py +250 -0
- code_atlas/domains/resolution.py +65 -0
- code_atlas/domains/spark/__init__.py +31 -0
- code_atlas/domains/spark/adapter.py +146 -0
- code_atlas/domains/spark/emit.py +344 -0
- code_atlas/domains/spark/extract.py +108 -0
- code_atlas/domains/spark/sqllit.py +192 -0
- code_atlas/domains/spark/walk.py +1943 -0
- code_atlas/domains/sql/__init__.py +30 -0
- code_atlas/domains/sql/adapter.py +382 -0
- code_atlas/domains/sql/extract.py +1271 -0
- code_atlas/domains/sql/nodes.py +264 -0
- code_atlas/domains/sql/parser.py +1510 -0
- code_atlas/domains/sql/tokens.py +318 -0
- code_atlas/domains/summarize.py +126 -0
- code_atlas/domains/terraform/__init__.py +20 -0
- code_atlas/domains/terraform/adapter.py +127 -0
- code_atlas/domains/terraform/catalog.py +43 -0
- code_atlas/domains/terraform/extract.py +1277 -0
- code_atlas/domains/terraform/hcl.py +538 -0
- code_atlas/domains/terraform/refs.py +181 -0
- code_atlas/domains/terraform/tfjson.py +163 -0
- code_atlas/domains/terraform/tfvars.py +98 -0
- code_atlas/domains/validation.py +120 -0
- code_atlas/env_override.py +27 -0
- code_atlas/eval/__init__.py +26 -0
- code_atlas/eval/domain_eval.py +681 -0
- code_atlas/eval/ground_truth.py +688 -0
- code_atlas/eval/impact_truth.py +758 -0
- code_atlas/eval/metrics.py +178 -0
- code_atlas/eval/pack_value.py +610 -0
- code_atlas/federation/__init__.py +72 -0
- code_atlas/federation/federation.py +676 -0
- code_atlas/federation/model.py +355 -0
- code_atlas/federation/store.py +194 -0
- code_atlas/gitbin.py +48 -0
- code_atlas/graph/__init__.py +20 -0
- code_atlas/graph/builder.py +378 -0
- code_atlas/graph/identity.py +54 -0
- code_atlas/graph/queries.py +47 -0
- code_atlas/graph/validation.py +92 -0
- code_atlas/impact/__init__.py +37 -0
- code_atlas/impact/blast_radius.py +171 -0
- code_atlas/impact/contract_analyzer.py +104 -0
- code_atlas/impact/contracts.py +315 -0
- code_atlas/impact/diff_reader.py +142 -0
- code_atlas/impact/domain_traversal.py +768 -0
- code_atlas/impact/engine.py +392 -0
- code_atlas/impact/packs.py +128 -0
- code_atlas/impact/report.py +136 -0
- code_atlas/impact/revision_binding.py +220 -0
- code_atlas/impact/risk_classifier.py +83 -0
- code_atlas/impact/snapshot_resolver.py +136 -0
- code_atlas/impact/symbol_diff.py +210 -0
- code_atlas/impact/test_selector.py +166 -0
- code_atlas/indexing/__init__.py +5 -0
- code_atlas/indexing/cache.py +396 -0
- code_atlas/indexing/change_detector.py +278 -0
- code_atlas/indexing/coordinator.py +1032 -0
- code_atlas/indexing/dependency_planner.py +268 -0
- code_atlas/indexing/persist.py +436 -0
- code_atlas/indexing/reuse.py +85 -0
- code_atlas/install/__init__.py +7 -0
- code_atlas/install/cli.py +168 -0
- code_atlas/install/lifecycle.py +286 -0
- code_atlas/mcp.py +674 -0
- code_atlas/observability/__init__.py +19 -0
- code_atlas/observability/logging.py +199 -0
- code_atlas/parsers/__init__.py +43 -0
- code_atlas/parsers/contracts.py +209 -0
- code_atlas/parsers/engine.py +125 -0
- code_atlas/parsers/languages/__init__.py +1 -0
- code_atlas/parsers/languages/python.py +391 -0
- code_atlas/parsers/languages/tsx.py +28 -0
- code_atlas/parsers/languages/typescript.py +909 -0
- code_atlas/parsers/registry.py +51 -0
- code_atlas/parsers/tree_sitter_runtime.py +118 -0
- code_atlas/resolvers/__init__.py +33 -0
- code_atlas/resolvers/bootstrap.py +246 -0
- code_atlas/resolvers/capabilities.py +33 -0
- code_atlas/resolvers/contracts.py +133 -0
- code_atlas/resolvers/coordinator.py +96 -0
- code_atlas/resolvers/enrichment.py +318 -0
- code_atlas/resolvers/lsp/__init__.py +26 -0
- code_atlas/resolvers/lsp/adapter.py +256 -0
- code_atlas/resolvers/lsp/lifecycle.py +251 -0
- code_atlas/resolvers/lsp/spawn.py +92 -0
- code_atlas/resolvers/lsp/transport.py +240 -0
- code_atlas/resolvers/registry.py +33 -0
- code_atlas/resolvers/scip/__init__.py +49 -0
- code_atlas/resolvers/scip/decoder.py +216 -0
- code_atlas/resolvers/scip/importer.py +248 -0
- code_atlas/resolvers/scip/loader.py +90 -0
- code_atlas/resolvers/scip/mapper.py +271 -0
- code_atlas/resolvers/scip/provenance.py +211 -0
- code_atlas/resolvers/scip/resolver.py +289 -0
- code_atlas/resolvers/scip/validation.py +101 -0
- code_atlas/resolvers/syntactic/__init__.py +8 -0
- code_atlas/resolvers/syntactic/resolver.py +254 -0
- code_atlas/search/__init__.py +32 -0
- code_atlas/search/contracts.py +176 -0
- code_atlas/search/domain.py +561 -0
- code_atlas/search/engine.py +530 -0
- code_atlas/search/federated.py +276 -0
- code_atlas/search/graph.py +282 -0
- code_atlas/search/hybrid.py +151 -0
- code_atlas/search/intent.py +48 -0
- code_atlas/search/lexical.py +176 -0
- code_atlas/search/refs.py +359 -0
- code_atlas/search/structural.py +505 -0
- code_atlas/search/tokenizer.py +43 -0
- code_atlas/search/vector/__init__.py +35 -0
- code_atlas/search/vector/contracts.py +76 -0
- code_atlas/search/vector/embeddings.py +96 -0
- code_atlas/search/vector/index.py +169 -0
- code_atlas/search/vector/provider.py +50 -0
- code_atlas/storage/__init__.py +14 -0
- code_atlas/storage/db.py +47 -0
- code_atlas/storage/migrations.py +552 -0
- code_atlas/storage/store.py +1045 -0
- code_atlas/ui/__init__.py +29 -0
- code_atlas/ui/i18n.py +143 -0
- code_atlas/ui/kit.py +689 -0
- code_atlas/ui/wizard.py +317 -0
- code_atlas_forge-1.1.0.dist-info/METADATA +246 -0
- code_atlas_forge-1.1.0.dist-info/RECORD +181 -0
- code_atlas_forge-1.1.0.dist-info/WHEEL +5 -0
- code_atlas_forge-1.1.0.dist-info/entry_points.txt +2 -0
- code_atlas_forge-1.1.0.dist-info/licenses/LICENSE +202 -0
- code_atlas_forge-1.1.0.dist-info/licenses/NOTICE +17 -0
- 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)
|