graphitect 0.2.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.
- graphify/__init__.py +30 -0
- graphify/__main__.py +757 -0
- graphify/_minhash.py +107 -0
- graphify/affected.py +318 -0
- graphify/always_on/agents-md.md +12 -0
- graphify/always_on/antigravity-rules.md +14 -0
- graphify/always_on/claude-md.md +9 -0
- graphify/always_on/gemini-md.md +9 -0
- graphify/always_on/kiro-steering.md +5 -0
- graphify/always_on/vscode-instructions.md +17 -0
- graphify/analyze.py +769 -0
- graphify/benchmark.py +152 -0
- graphify/build.py +2300 -0
- graphify/cache.py +1746 -0
- graphify/callflow_html.py +2051 -0
- graphify/cargo_introspect.py +109 -0
- graphify/cli.py +4745 -0
- graphify/cluster.py +409 -0
- graphify/command-kilo.md +15 -0
- graphify/cross_repo_calls.py +216 -0
- graphify/cross_repo_types.py +75 -0
- graphify/csharp_dispatch.py +154 -0
- graphify/dedup.py +1213 -0
- graphify/detect.py +2566 -0
- graphify/diagnostics.py +406 -0
- graphify/export.py +1349 -0
- graphify/exporters/__init__.py +1 -0
- graphify/exporters/base.py +14 -0
- graphify/exporters/graphdb.py +173 -0
- graphify/exporters/html.py +637 -0
- graphify/extract.py +7856 -0
- graphify/extractors/MIGRATION.md +107 -0
- graphify/extractors/__init__.py +66 -0
- graphify/extractors/apex.py +215 -0
- graphify/extractors/base.py +85 -0
- graphify/extractors/bash.py +579 -0
- graphify/extractors/blade.py +53 -0
- graphify/extractors/commonlisp.py +540 -0
- graphify/extractors/csharp.py +448 -0
- graphify/extractors/dart.py +564 -0
- graphify/extractors/dm.py +494 -0
- graphify/extractors/elixir.py +241 -0
- graphify/extractors/engine.py +6509 -0
- graphify/extractors/fortran.py +311 -0
- graphify/extractors/go.py +527 -0
- graphify/extractors/json_config.py +240 -0
- graphify/extractors/julia.py +289 -0
- graphify/extractors/markdown.py +408 -0
- graphify/extractors/models.py +131 -0
- graphify/extractors/objc.py +566 -0
- graphify/extractors/ocaml.py +289 -0
- graphify/extractors/pascal.py +688 -0
- graphify/extractors/pascal_forms.py +196 -0
- graphify/extractors/powershell.py +522 -0
- graphify/extractors/razor.py +192 -0
- graphify/extractors/resolution.py +3584 -0
- graphify/extractors/robot.py +296 -0
- graphify/extractors/rust.py +470 -0
- graphify/extractors/sln.py +92 -0
- graphify/extractors/sql.py +720 -0
- graphify/extractors/terraform.py +181 -0
- graphify/extractors/verilog.py +329 -0
- graphify/extractors/zig.py +181 -0
- graphify/file_slice.py +246 -0
- graphify/global_graph.py +194 -0
- graphify/google_workspace.py +237 -0
- graphify/hooks.py +933 -0
- graphify/ids.py +93 -0
- graphify/ingest.py +358 -0
- graphify/install.py +2366 -0
- graphify/llm.py +3544 -0
- graphify/manifest.py +4 -0
- graphify/manifest_ingest.py +311 -0
- graphify/mcp_ingest.py +386 -0
- graphify/multigraph_compat.py +212 -0
- graphify/pascal_resolution.py +129 -0
- graphify/paths.py +436 -0
- graphify/pg_introspect.py +165 -0
- graphify/prs.py +770 -0
- graphify/querylog.py +80 -0
- graphify/reflect.py +882 -0
- graphify/report.py +346 -0
- graphify/resolver_registry.py +85 -0
- graphify/ruby_resolution.py +242 -0
- graphify/scip_ingest.py +363 -0
- graphify/security.py +460 -0
- graphify/semantic_cleanup.py +336 -0
- graphify/serve.py +2608 -0
- graphify/skill-agents.md +710 -0
- graphify/skill-aider.md +1283 -0
- graphify/skill-amp.md +710 -0
- graphify/skill-claw.md +713 -0
- graphify/skill-codex.md +710 -0
- graphify/skill-copilot.md +713 -0
- graphify/skill-devin.md +1410 -0
- graphify/skill-droid.md +710 -0
- graphify/skill-kilo.md +722 -0
- graphify/skill-kiro.md +713 -0
- graphify/skill-opencode.md +705 -0
- graphify/skill-pi.md +713 -0
- graphify/skill-trae.md +711 -0
- graphify/skill-vscode.md +709 -0
- graphify/skill-windows.md +755 -0
- graphify/skill.md +713 -0
- graphify/skills/agents/references/add-watch.md +56 -0
- graphify/skills/agents/references/exports.md +87 -0
- graphify/skills/agents/references/extraction-spec.md +70 -0
- graphify/skills/agents/references/github-and-merge.md +46 -0
- graphify/skills/agents/references/hooks.md +33 -0
- graphify/skills/agents/references/query.md +311 -0
- graphify/skills/agents/references/transcribe.md +52 -0
- graphify/skills/agents/references/update.md +210 -0
- graphify/skills/amp/references/add-watch.md +56 -0
- graphify/skills/amp/references/exports.md +87 -0
- graphify/skills/amp/references/extraction-spec.md +70 -0
- graphify/skills/amp/references/github-and-merge.md +46 -0
- graphify/skills/amp/references/hooks.md +33 -0
- graphify/skills/amp/references/query.md +311 -0
- graphify/skills/amp/references/transcribe.md +52 -0
- graphify/skills/amp/references/update.md +210 -0
- graphify/skills/claude/references/add-watch.md +56 -0
- graphify/skills/claude/references/exports.md +87 -0
- graphify/skills/claude/references/extraction-spec.md +70 -0
- graphify/skills/claude/references/github-and-merge.md +46 -0
- graphify/skills/claude/references/hooks.md +33 -0
- graphify/skills/claude/references/query.md +311 -0
- graphify/skills/claude/references/transcribe.md +52 -0
- graphify/skills/claude/references/update.md +210 -0
- graphify/skills/claw/references/add-watch.md +56 -0
- graphify/skills/claw/references/exports.md +87 -0
- graphify/skills/claw/references/extraction-spec.md +31 -0
- graphify/skills/claw/references/github-and-merge.md +46 -0
- graphify/skills/claw/references/hooks.md +33 -0
- graphify/skills/claw/references/query.md +311 -0
- graphify/skills/claw/references/transcribe.md +52 -0
- graphify/skills/claw/references/update.md +210 -0
- graphify/skills/codex/references/add-watch.md +56 -0
- graphify/skills/codex/references/exports.md +87 -0
- graphify/skills/codex/references/extraction-spec.md +31 -0
- graphify/skills/codex/references/github-and-merge.md +46 -0
- graphify/skills/codex/references/hooks.md +33 -0
- graphify/skills/codex/references/query.md +311 -0
- graphify/skills/codex/references/transcribe.md +52 -0
- graphify/skills/codex/references/update.md +210 -0
- graphify/skills/copilot/references/add-watch.md +56 -0
- graphify/skills/copilot/references/exports.md +87 -0
- graphify/skills/copilot/references/extraction-spec.md +70 -0
- graphify/skills/copilot/references/github-and-merge.md +46 -0
- graphify/skills/copilot/references/hooks.md +33 -0
- graphify/skills/copilot/references/query.md +311 -0
- graphify/skills/copilot/references/transcribe.md +52 -0
- graphify/skills/copilot/references/update.md +210 -0
- graphify/skills/droid/references/add-watch.md +56 -0
- graphify/skills/droid/references/exports.md +87 -0
- graphify/skills/droid/references/extraction-spec.md +70 -0
- graphify/skills/droid/references/github-and-merge.md +46 -0
- graphify/skills/droid/references/hooks.md +33 -0
- graphify/skills/droid/references/query.md +311 -0
- graphify/skills/droid/references/transcribe.md +52 -0
- graphify/skills/droid/references/update.md +210 -0
- graphify/skills/kilo/references/add-watch.md +56 -0
- graphify/skills/kilo/references/exports.md +87 -0
- graphify/skills/kilo/references/extraction-spec.md +70 -0
- graphify/skills/kilo/references/github-and-merge.md +46 -0
- graphify/skills/kilo/references/hooks.md +33 -0
- graphify/skills/kilo/references/query.md +311 -0
- graphify/skills/kilo/references/transcribe.md +52 -0
- graphify/skills/kilo/references/update.md +210 -0
- graphify/skills/kiro/references/add-watch.md +56 -0
- graphify/skills/kiro/references/exports.md +87 -0
- graphify/skills/kiro/references/extraction-spec.md +31 -0
- graphify/skills/kiro/references/github-and-merge.md +46 -0
- graphify/skills/kiro/references/hooks.md +33 -0
- graphify/skills/kiro/references/query.md +311 -0
- graphify/skills/kiro/references/transcribe.md +52 -0
- graphify/skills/kiro/references/update.md +210 -0
- graphify/skills/opencode/references/add-watch.md +56 -0
- graphify/skills/opencode/references/exports.md +87 -0
- graphify/skills/opencode/references/extraction-spec.md +70 -0
- graphify/skills/opencode/references/github-and-merge.md +46 -0
- graphify/skills/opencode/references/hooks.md +33 -0
- graphify/skills/opencode/references/query.md +311 -0
- graphify/skills/opencode/references/transcribe.md +52 -0
- graphify/skills/opencode/references/update.md +210 -0
- graphify/skills/pi/references/add-watch.md +56 -0
- graphify/skills/pi/references/exports.md +87 -0
- graphify/skills/pi/references/extraction-spec.md +31 -0
- graphify/skills/pi/references/github-and-merge.md +46 -0
- graphify/skills/pi/references/hooks.md +33 -0
- graphify/skills/pi/references/query.md +311 -0
- graphify/skills/pi/references/transcribe.md +52 -0
- graphify/skills/pi/references/update.md +210 -0
- graphify/skills/trae/references/add-watch.md +56 -0
- graphify/skills/trae/references/exports.md +87 -0
- graphify/skills/trae/references/extraction-spec.md +70 -0
- graphify/skills/trae/references/github-and-merge.md +46 -0
- graphify/skills/trae/references/hooks.md +35 -0
- graphify/skills/trae/references/query.md +311 -0
- graphify/skills/trae/references/transcribe.md +52 -0
- graphify/skills/trae/references/update.md +210 -0
- graphify/skills/vscode/references/add-watch.md +56 -0
- graphify/skills/vscode/references/exports.md +87 -0
- graphify/skills/vscode/references/extraction-spec.md +70 -0
- graphify/skills/vscode/references/github-and-merge.md +46 -0
- graphify/skills/vscode/references/hooks.md +33 -0
- graphify/skills/vscode/references/query.md +311 -0
- graphify/skills/vscode/references/transcribe.md +52 -0
- graphify/skills/vscode/references/update.md +210 -0
- graphify/skills/windows/references/add-watch.md +56 -0
- graphify/skills/windows/references/exports.md +87 -0
- graphify/skills/windows/references/extraction-spec.md +70 -0
- graphify/skills/windows/references/github-and-merge.md +46 -0
- graphify/skills/windows/references/hooks.md +33 -0
- graphify/skills/windows/references/query.md +311 -0
- graphify/skills/windows/references/transcribe.md +52 -0
- graphify/skills/windows/references/update.md +210 -0
- graphify/symbol_resolution.py +556 -0
- graphify/transcribe.py +186 -0
- graphify/tree_html.py +603 -0
- graphify/validate.py +95 -0
- graphify/watch.py +2280 -0
- graphify/wiki.py +405 -0
- graphitect/__init__.py +28 -0
- graphitect/__main__.py +4 -0
- graphitect/_vendor/__init__.py +2 -0
- graphitect/_vendor/archify/LICENSE +22 -0
- graphitect/_vendor/archify/SKILL.md +137 -0
- graphitect/_vendor/archify/THIRD_PARTY_NOTICES.md +69 -0
- graphitect/_vendor/archify/assets/JetBrainsMono-OFL.txt +93 -0
- graphitect/_vendor/archify/assets/template.html +14935 -0
- graphitect/_vendor/archify/bin/archify.mjs +2091 -0
- graphitect/_vendor/archify/bin/open-artifact.mjs +86 -0
- graphitect/_vendor/archify/bin/preview.mjs +653 -0
- graphitect/_vendor/archify/bin/visual-check.mjs +829 -0
- graphitect/_vendor/archify/brand-marks/README.md +31 -0
- graphitect/_vendor/archify/brand-marks/catalog.json +131 -0
- graphitect/_vendor/archify/delta/architecture-delta.mjs +1221 -0
- graphitect/_vendor/archify/examples/agent-run.lifecycle.json +60 -0
- graphitect/_vendor/archify/examples/agent-tool-call.workflow.json +94 -0
- graphitect/_vendor/archify/examples/async-job-roundtrip.sequence.json +61 -0
- graphitect/_vendor/archify/examples/brand-aware-delivery.architecture.json +47 -0
- graphitect/_vendor/archify/examples/cache-miss-request.sequence.json +82 -0
- graphitect/_vendor/archify/examples/checkout-platform.base.architecture.json +31 -0
- graphitect/_vendor/archify/examples/checkout-platform.head.architecture.json +31 -0
- graphitect/_vendor/archify/examples/dataflow-product-analytics.html +15045 -0
- graphitect/_vendor/archify/examples/deployment-release.lifecycle.json +49 -0
- graphitect/_vendor/archify/examples/event-stream.dataflow.json +57 -0
- graphitect/_vendor/archify/examples/incident-response.workflow.json +64 -0
- graphitect/_vendor/archify/examples/lifecycle-agent-run.html +14980 -0
- graphitect/_vendor/archify/examples/product-analytics.dataflow.json +76 -0
- graphitect/_vendor/archify/examples/production-deployment.architecture.json +71 -0
- graphitect/_vendor/archify/examples/release-delivery.workflow.json +62 -0
- graphitect/_vendor/archify/examples/sequence-cache-miss-request.html +15060 -0
- graphitect/_vendor/archify/examples/web-app-rendered.html +15009 -0
- graphitect/_vendor/archify/examples/web-app.architecture.json +46 -0
- graphitect/_vendor/archify/examples/workflow-agent-tool-call-rendered.html +15051 -0
- graphitect/_vendor/archify/migrations/workflow-v2.mjs +279 -0
- graphitect/_vendor/archify/package-lock.json +149 -0
- graphitect/_vendor/archify/package.json +39 -0
- graphitect/_vendor/archify/recipes/scenarios.mjs +391 -0
- graphitect/_vendor/archify/references/authoring-contract.md +243 -0
- graphitect/_vendor/archify/references/brand-marks.md +65 -0
- graphitect/_vendor/archify/references/delivery-contract.md +120 -0
- graphitect/_vendor/archify/references/viewer-runtime.md +45 -0
- graphitect/_vendor/archify/renderers/architecture/grid.mjs +62 -0
- graphitect/_vendor/archify/renderers/architecture/render-architecture.mjs +1078 -0
- graphitect/_vendor/archify/renderers/dataflow/README.md +104 -0
- graphitect/_vendor/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- graphitect/_vendor/archify/renderers/lifecycle/README.md +115 -0
- graphitect/_vendor/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- graphitect/_vendor/archify/renderers/sequence/README.md +114 -0
- graphitect/_vendor/archify/renderers/sequence/render-sequence.mjs +464 -0
- graphitect/_vendor/archify/renderers/shared/brand-marks.mjs +563 -0
- graphitect/_vendor/archify/renderers/shared/cli.mjs +218 -0
- graphitect/_vendor/archify/renderers/shared/desktop-readability.mjs +26 -0
- graphitect/_vendor/archify/renderers/shared/diagnostics.mjs +127 -0
- graphitect/_vendor/archify/renderers/shared/engineering-profiles.mjs +157 -0
- graphitect/_vendor/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- graphitect/_vendor/archify/renderers/shared/generated-validators.mjs +13 -0
- graphitect/_vendor/archify/renderers/shared/geometry.mjs +1423 -0
- graphitect/_vendor/archify/renderers/shared/i18n.mjs +595 -0
- graphitect/_vendor/archify/renderers/shared/layout-report.mjs +40 -0
- graphitect/_vendor/archify/renderers/shared/legend.mjs +217 -0
- graphitect/_vendor/archify/renderers/shared/output-path.mjs +340 -0
- graphitect/_vendor/archify/renderers/shared/repository-evidence.mjs +238 -0
- graphitect/_vendor/archify/renderers/shared/repository-location.mjs +58 -0
- graphitect/_vendor/archify/renderers/shared/text-fit.mjs +49 -0
- graphitect/_vendor/archify/renderers/shared/utils.mjs +232 -0
- graphitect/_vendor/archify/renderers/shared/validator.mjs +86 -0
- graphitect/_vendor/archify/renderers/workflow/README.md +223 -0
- graphitect/_vendor/archify/renderers/workflow/render-workflow.mjs +35 -0
- graphitect/_vendor/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- graphitect/_vendor/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- graphitect/_vendor/archify/schemas/README.md +211 -0
- graphitect/_vendor/archify/schemas/architecture.schema.json +178 -0
- graphitect/_vendor/archify/schemas/common.schema.json +115 -0
- graphitect/_vendor/archify/schemas/dataflow.schema.json +243 -0
- graphitect/_vendor/archify/schemas/lifecycle.schema.json +266 -0
- graphitect/_vendor/archify/schemas/sequence.schema.json +223 -0
- graphitect/_vendor/archify/schemas/workflow.schema.json +428 -0
- graphitect/_vendor/archify/scripts/check-render-output.mjs +836 -0
- graphitect/_vendor/archify/scripts/check-update.mjs +1667 -0
- graphitect/_vendor/archify/scripts/generate-brand-marks.mjs +141 -0
- graphitect/_vendor/archify/scripts/generate-validators.mjs +66 -0
- graphitect/_vendor/archify/scripts/render-examples.mjs +26 -0
- graphitect/_vendor/archify/scripts/update-contract.mjs +182 -0
- graphitect/_vendor/archify/skill-release.json +10 -0
- graphitect/cli.py +981 -0
- graphitect/deliver/__init__.py +5 -0
- graphitect/deliver/archify_adapter.py +1877 -0
- graphitect/deliver/archify_ir.py +160 -0
- graphitect/deliver/archify_repair.py +135 -0
- graphitect/deliver/doc_compiler.py +916 -0
- graphitect/ground/__init__.py +5 -0
- graphitect/ground/describe_source.py +27 -0
- graphitect/ground/fullread_source.py +56 -0
- graphitect/ground/graphify_source.py +107 -0
- graphitect/models.py +118 -0
- graphitect/skill/SKILL.md +80 -0
- graphitect/skill/agents/openai.yaml +4 -0
- graphitect/synthesize/__init__.py +5 -0
- graphitect/synthesize/engine.py +281 -0
- graphitect/synthesize/llm_backend.py +331 -0
- graphitect/synthesize/questions.py +139 -0
- graphitect/synthesize/rubric.py +104 -0
- graphitect-0.2.0.dist-info/METADATA +284 -0
- graphitect-0.2.0.dist-info/RECORD +336 -0
- graphitect-0.2.0.dist-info/WHEEL +5 -0
- graphitect-0.2.0.dist-info/entry_points.txt +2 -0
- graphitect-0.2.0.dist-info/licenses/LICENSE +21 -0
- graphitect-0.2.0.dist-info/licenses/LICENSE-ARCHIFY-MIT +22 -0
- graphitect-0.2.0.dist-info/licenses/LICENSE-GRAPHIFY-APACHE-2.0 +202 -0
- graphitect-0.2.0.dist-info/licenses/LICENSE-GRAPHIFY-MIT +21 -0
- graphitect-0.2.0.dist-info/licenses/NOTICE-ARCHIFY-THIRD-PARTY.md +69 -0
- graphitect-0.2.0.dist-info/licenses/NOTICE-GRAPHIFY +8 -0
- graphitect-0.2.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"""ASP.NET Razor component extractor. Moved verbatim from graphify/extract.py."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import re
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from graphify.extractors.base import _file_stem, _make_id
|
|
8
|
+
from graphify.security import sanitize_metadata
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def extract_razor(path: Path) -> dict:
|
|
12
|
+
"""Extract directives, component refs, and @code methods from .razor/.cshtml."""
|
|
13
|
+
try:
|
|
14
|
+
src = path.read_text(encoding="utf-8", errors="replace")
|
|
15
|
+
except OSError:
|
|
16
|
+
return {"nodes": [], "edges": [], "error": f"cannot read {path}"}
|
|
17
|
+
|
|
18
|
+
file_nid = _make_id(str(path))
|
|
19
|
+
str_path = str(path)
|
|
20
|
+
nodes: list[dict] = [{"id": file_nid, "label": path.name, "file_type": "code",
|
|
21
|
+
"source_file": str_path, "source_location": None}]
|
|
22
|
+
edges: list[dict] = []
|
|
23
|
+
seen_ids: set[str] = set()
|
|
24
|
+
seen_ids.add(file_nid)
|
|
25
|
+
|
|
26
|
+
def _add_ref(target_name: str, relation: str, line: int) -> None:
|
|
27
|
+
tgt_nid = _make_id(target_name)
|
|
28
|
+
if not tgt_nid:
|
|
29
|
+
return
|
|
30
|
+
if tgt_nid not in seen_ids:
|
|
31
|
+
seen_ids.add(tgt_nid)
|
|
32
|
+
nodes.append({"id": tgt_nid, "label": target_name,
|
|
33
|
+
"file_type": "code", "source_file": str_path,
|
|
34
|
+
"source_location": f"L{line}"})
|
|
35
|
+
edges.append({"source": file_nid, "target": tgt_nid,
|
|
36
|
+
"relation": relation, "confidence": "EXTRACTED",
|
|
37
|
+
"source_file": str_path, "source_location": f"L{line}",
|
|
38
|
+
"weight": 1.0})
|
|
39
|
+
|
|
40
|
+
for i, line in enumerate(src.splitlines(), 1):
|
|
41
|
+
m = re.match(r'@using\s+(.+)', line)
|
|
42
|
+
if m:
|
|
43
|
+
raw_using = m.group(1).strip().rstrip(";")
|
|
44
|
+
using_kind = "namespace"
|
|
45
|
+
alias = None
|
|
46
|
+
target_fqn = raw_using
|
|
47
|
+
if raw_using.startswith("static "):
|
|
48
|
+
using_kind = "static"
|
|
49
|
+
target_fqn = raw_using[len("static "):].strip()
|
|
50
|
+
elif "=" in raw_using:
|
|
51
|
+
lhs, rhs = raw_using.split("=", 1)
|
|
52
|
+
using_kind = "alias"
|
|
53
|
+
alias = lhs.strip()
|
|
54
|
+
target_fqn = rhs.strip()
|
|
55
|
+
if target_fqn:
|
|
56
|
+
tgt_nid = _make_id(target_fqn)
|
|
57
|
+
if tgt_nid and tgt_nid not in seen_ids:
|
|
58
|
+
seen_ids.add(tgt_nid)
|
|
59
|
+
nodes.append({"id": tgt_nid, "label": target_fqn,
|
|
60
|
+
"file_type": "code", "source_file": str_path,
|
|
61
|
+
"source_location": f"L{i}"})
|
|
62
|
+
md = {
|
|
63
|
+
"using_kind": using_kind,
|
|
64
|
+
"target_fqn": target_fqn,
|
|
65
|
+
"scope_kind": "file",
|
|
66
|
+
"scope_id": None,
|
|
67
|
+
}
|
|
68
|
+
if alias:
|
|
69
|
+
md["alias"] = alias
|
|
70
|
+
edges.append({
|
|
71
|
+
"source": file_nid,
|
|
72
|
+
"target": tgt_nid,
|
|
73
|
+
"relation": "imports",
|
|
74
|
+
"context": "import",
|
|
75
|
+
"confidence": "EXTRACTED",
|
|
76
|
+
"source_file": str_path,
|
|
77
|
+
"source_location": f"L{i}",
|
|
78
|
+
"weight": 1.0,
|
|
79
|
+
"metadata": sanitize_metadata({k: v for k, v in md.items() if v is not None}),
|
|
80
|
+
})
|
|
81
|
+
continue
|
|
82
|
+
|
|
83
|
+
m = re.match(r'@inject\s+([\w.<>\[\]]+)\s+(\w+)', line)
|
|
84
|
+
if m:
|
|
85
|
+
raw_type = m.group(1).strip()
|
|
86
|
+
base_type = raw_type.split("<", 1)[0].strip()
|
|
87
|
+
qualified = "." in base_type
|
|
88
|
+
if qualified:
|
|
89
|
+
prefix, _, ref_token = base_type.rpartition(".")
|
|
90
|
+
else:
|
|
91
|
+
prefix = ""
|
|
92
|
+
ref_token = base_type
|
|
93
|
+
if ref_token:
|
|
94
|
+
tgt_nid = _make_id(ref_token)
|
|
95
|
+
if tgt_nid and tgt_nid not in seen_ids:
|
|
96
|
+
seen_ids.add(tgt_nid)
|
|
97
|
+
nodes.append({
|
|
98
|
+
"id": tgt_nid,
|
|
99
|
+
"label": ref_token,
|
|
100
|
+
"file_type": "code",
|
|
101
|
+
"source_file": "",
|
|
102
|
+
"source_location": "",
|
|
103
|
+
"origin_file": str_path,
|
|
104
|
+
})
|
|
105
|
+
md = {"ref_token": ref_token}
|
|
106
|
+
if qualified:
|
|
107
|
+
md["qualified"] = True
|
|
108
|
+
if prefix:
|
|
109
|
+
md["ref_qualifier"] = prefix
|
|
110
|
+
edges.append({
|
|
111
|
+
"source": file_nid,
|
|
112
|
+
"target": tgt_nid,
|
|
113
|
+
"relation": "references",
|
|
114
|
+
"context": "field",
|
|
115
|
+
"confidence": "EXTRACTED",
|
|
116
|
+
"source_file": str_path,
|
|
117
|
+
"source_location": f"L{i}",
|
|
118
|
+
"weight": 1.0,
|
|
119
|
+
"metadata": sanitize_metadata(md),
|
|
120
|
+
})
|
|
121
|
+
continue
|
|
122
|
+
|
|
123
|
+
m = re.match(r'@inherits\s+([\w.<>\[\]]+)', line)
|
|
124
|
+
if m:
|
|
125
|
+
_add_ref(m.group(1), "inherits", i)
|
|
126
|
+
continue
|
|
127
|
+
|
|
128
|
+
m = re.match(r'@model\s+([\w.<>\[\]]+)', line)
|
|
129
|
+
if m:
|
|
130
|
+
_add_ref(m.group(1), "references", i)
|
|
131
|
+
continue
|
|
132
|
+
|
|
133
|
+
m = re.match(r'@page\s+"([^"]+)"', line)
|
|
134
|
+
if m:
|
|
135
|
+
route = m.group(1)
|
|
136
|
+
route_nid = _make_id("route", route)
|
|
137
|
+
if route_nid and route_nid not in seen_ids:
|
|
138
|
+
seen_ids.add(route_nid)
|
|
139
|
+
nodes.append({"id": route_nid, "label": f"route:{route}",
|
|
140
|
+
"file_type": "concept", "source_file": str_path,
|
|
141
|
+
"source_location": f"L{i}"})
|
|
142
|
+
edges.append({"source": file_nid, "target": route_nid,
|
|
143
|
+
"relation": "references", "confidence": "EXTRACTED",
|
|
144
|
+
"source_file": str_path, "weight": 1.0})
|
|
145
|
+
continue
|
|
146
|
+
|
|
147
|
+
_COMPONENT_RE = re.compile(r'<([A-Z][A-Za-z0-9]+)[\s/>]')
|
|
148
|
+
_HTML_TAGS = frozenset({
|
|
149
|
+
"DOCTYPE", "Html", "Head", "Body", "Div", "Span", "Table", "Form",
|
|
150
|
+
"Input", "Button", "Select", "Option", "Label", "Textarea",
|
|
151
|
+
"Script", "Style", "Link", "Meta", "Title", "Header", "Footer",
|
|
152
|
+
"Nav", "Main", "Section", "Article", "Aside",
|
|
153
|
+
})
|
|
154
|
+
for m in _COMPONENT_RE.finditer(src):
|
|
155
|
+
comp_name = m.group(1)
|
|
156
|
+
if comp_name in _HTML_TAGS:
|
|
157
|
+
continue
|
|
158
|
+
line_num = src[:m.start()].count("\n") + 1
|
|
159
|
+
_add_ref(comp_name, "calls", line_num)
|
|
160
|
+
|
|
161
|
+
_CODE_BLOCK_RE = re.compile(r'@code\s*\{', re.MULTILINE)
|
|
162
|
+
for m in _CODE_BLOCK_RE.finditer(src):
|
|
163
|
+
block_start = m.end()
|
|
164
|
+
depth = 1
|
|
165
|
+
pos = block_start
|
|
166
|
+
while pos < len(src) and depth > 0:
|
|
167
|
+
if src[pos] == '{':
|
|
168
|
+
depth += 1
|
|
169
|
+
elif src[pos] == '}':
|
|
170
|
+
depth -= 1
|
|
171
|
+
pos += 1
|
|
172
|
+
code_block = src[block_start:pos - 1] if depth == 0 else ""
|
|
173
|
+
|
|
174
|
+
_METHOD_RE = re.compile(
|
|
175
|
+
r'(?:public|private|protected|internal|static|async|override|virtual|abstract)\s+'
|
|
176
|
+
r'[\w<>\[\],\s]+\s+(\w+)\s*\('
|
|
177
|
+
)
|
|
178
|
+
for mm in _METHOD_RE.finditer(code_block):
|
|
179
|
+
method_name = mm.group(1)
|
|
180
|
+
abs_pos = block_start + mm.start()
|
|
181
|
+
method_line = src[:abs_pos].count("\n") + 1
|
|
182
|
+
method_nid = _make_id(_file_stem(path), method_name)
|
|
183
|
+
if method_nid and method_nid not in seen_ids:
|
|
184
|
+
seen_ids.add(method_nid)
|
|
185
|
+
nodes.append({"id": method_nid, "label": method_name,
|
|
186
|
+
"file_type": "code", "source_file": str_path,
|
|
187
|
+
"source_location": f"L{method_line}"})
|
|
188
|
+
edges.append({"source": file_nid, "target": method_nid,
|
|
189
|
+
"relation": "contains", "confidence": "EXTRACTED",
|
|
190
|
+
"source_file": str_path, "weight": 1.0})
|
|
191
|
+
|
|
192
|
+
return {"nodes": nodes, "edges": edges}
|