cg-code-graph 0.10.1__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 (174) hide show
  1. cg_code_graph-0.10.1.dist-info/METADATA +678 -0
  2. cg_code_graph-0.10.1.dist-info/RECORD +174 -0
  3. cg_code_graph-0.10.1.dist-info/WHEEL +5 -0
  4. cg_code_graph-0.10.1.dist-info/entry_points.txt +3 -0
  5. cg_code_graph-0.10.1.dist-info/licenses/LICENSE +21 -0
  6. cg_code_graph-0.10.1.dist-info/top_level.txt +1 -0
  7. codegraph/__init__.py +2 -0
  8. codegraph/aitools.py +129 -0
  9. codegraph/apps.py +76 -0
  10. codegraph/blindspots.py +428 -0
  11. codegraph/bridges.py +1701 -0
  12. codegraph/cli.py +725 -0
  13. codegraph/concepts.py +362 -0
  14. codegraph/config.py +559 -0
  15. codegraph/core/__init__.py +0 -0
  16. codegraph/core/cache.py +375 -0
  17. codegraph/core/detect.py +80 -0
  18. codegraph/core/extractors.py +187 -0
  19. codegraph/core/fsutil.py +61 -0
  20. codegraph/core/generated.py +575 -0
  21. codegraph/core/model.py +174 -0
  22. codegraph/core/paths.py +175 -0
  23. codegraph/core/plugin.py +160 -0
  24. codegraph/core/store.py +80 -0
  25. codegraph/core/syntax_errors.py +132 -0
  26. codegraph/coverage.py +928 -0
  27. codegraph/doctor.py +453 -0
  28. codegraph/external.py +613 -0
  29. codegraph/indexer.py +336 -0
  30. codegraph/link.py +434 -0
  31. codegraph/lint_async.py +524 -0
  32. codegraph/mcp_server.py +1303 -0
  33. codegraph/parity.py +473 -0
  34. codegraph/parity_structure.py +307 -0
  35. codegraph/payload.py +321 -0
  36. codegraph/plans.py +1285 -0
  37. codegraph/platform_scan.py +643 -0
  38. codegraph/platforms.py +1369 -0
  39. codegraph/plugins/__init__.py +0 -0
  40. codegraph/plugins/cfamily/__init__.py +0 -0
  41. codegraph/plugins/cfamily/plugin.py +930 -0
  42. codegraph/plugins/cfamily/syntax.py +881 -0
  43. codegraph/plugins/dart/__init__.py +0 -0
  44. codegraph/plugins/dart/bridges.py +345 -0
  45. codegraph/plugins/dart/extractor/bin/extract.dart +717 -0
  46. codegraph/plugins/dart/extractor/pubspec.lock +149 -0
  47. codegraph/plugins/dart/extractor/pubspec.yaml +7 -0
  48. codegraph/plugins/dart/http.py +904 -0
  49. codegraph/plugins/dart/models.py +308 -0
  50. codegraph/plugins/dart/plugin.py +625 -0
  51. codegraph/plugins/dart/program.py +907 -0
  52. codegraph/plugins/django/__init__.py +0 -0
  53. codegraph/plugins/django/extras.py +378 -0
  54. codegraph/plugins/django/models.py +508 -0
  55. codegraph/plugins/django/plugin.py +728 -0
  56. codegraph/plugins/django/schemas.py +339 -0
  57. codegraph/plugins/django/shapes.py +216 -0
  58. codegraph/plugins/django/urls.py +603 -0
  59. codegraph/plugins/express/__init__.py +0 -0
  60. codegraph/plugins/express/plugin.py +428 -0
  61. codegraph/plugins/flutter/__init__.py +0 -0
  62. codegraph/plugins/flutter/plugin.py +538 -0
  63. codegraph/plugins/kotlin/__init__.py +0 -0
  64. codegraph/plugins/kotlin/exact.py +457 -0
  65. codegraph/plugins/kotlin/plugin.py +1961 -0
  66. codegraph/plugins/kotlin/reparse.py +234 -0
  67. codegraph/plugins/laravel/__init__.py +0 -0
  68. codegraph/plugins/laravel/broadcast.py +351 -0
  69. codegraph/plugins/laravel/plugin.py +863 -0
  70. codegraph/plugins/laravel/tests.py +262 -0
  71. codegraph/plugins/laravel/values.py +728 -0
  72. codegraph/plugins/native/__init__.py +0 -0
  73. codegraph/plugins/native/gates.py +286 -0
  74. codegraph/plugins/native/runner.py +183 -0
  75. codegraph/plugins/native/scipread.py +194 -0
  76. codegraph/plugins/native/ts.py +54 -0
  77. codegraph/plugins/nest/__init__.py +0 -0
  78. codegraph/plugins/nest/plugin.py +654 -0
  79. codegraph/plugins/nextjs/__init__.py +0 -0
  80. codegraph/plugins/nextjs/plugin.py +336 -0
  81. codegraph/plugins/nuxt/__init__.py +0 -0
  82. codegraph/plugins/nuxt/plugin.py +308 -0
  83. codegraph/plugins/php/__init__.py +0 -0
  84. codegraph/plugins/php/extractor/composer.json +5 -0
  85. codegraph/plugins/php/extractor/composer.lock +76 -0
  86. codegraph/plugins/php/extractor/extract.php +743 -0
  87. codegraph/plugins/php/gating.py +573 -0
  88. codegraph/plugins/php/plugin.py +668 -0
  89. codegraph/plugins/php/strings.py +197 -0
  90. codegraph/plugins/python/__init__.py +0 -0
  91. codegraph/plugins/python/aitools.py +664 -0
  92. codegraph/plugins/python/external.py +245 -0
  93. codegraph/plugins/python/fields.py +107 -0
  94. codegraph/plugins/python/plugin.py +1733 -0
  95. codegraph/plugins/python/refs.py +485 -0
  96. codegraph/plugins/python/roots.py +412 -0
  97. codegraph/plugins/python/socketio.py +210 -0
  98. codegraph/plugins/python/subproc.py +864 -0
  99. codegraph/plugins/python/tests.py +1040 -0
  100. codegraph/plugins/python/values.py +179 -0
  101. codegraph/plugins/pyweb/__init__.py +0 -0
  102. codegraph/plugins/pyweb/plugin.py +1334 -0
  103. codegraph/plugins/pyweb/values.py +68 -0
  104. codegraph/plugins/rust/__init__.py +0 -0
  105. codegraph/plugins/rust/cargo.py +226 -0
  106. codegraph/plugins/rust/plugin.py +980 -0
  107. codegraph/plugins/rust/syntax.py +678 -0
  108. codegraph/plugins/scip/__init__.py +0 -0
  109. codegraph/plugins/scip/importer.py +129 -0
  110. codegraph/plugins/scip/scip.proto +962 -0
  111. codegraph/plugins/scip/scip_pb2.py +97 -0
  112. codegraph/plugins/stubs/__init__.py +0 -0
  113. codegraph/plugins/stubs/plugins.py +38 -0
  114. codegraph/plugins/swift/__init__.py +0 -0
  115. codegraph/plugins/swift/baseurl.py +109 -0
  116. codegraph/plugins/swift/exact.py +415 -0
  117. codegraph/plugins/swift/indexstore.py +209 -0
  118. codegraph/plugins/swift/packages.py +174 -0
  119. codegraph/plugins/swift/plugin.py +2890 -0
  120. codegraph/plugins/ts/__init__.py +0 -0
  121. codegraph/plugins/ts/baseurl.py +185 -0
  122. codegraph/plugins/ts/extractor/extract.mjs +2652 -0
  123. codegraph/plugins/ts/extractor/fw.mjs +685 -0
  124. codegraph/plugins/ts/extractor/package-lock.json +205 -0
  125. codegraph/plugins/ts/extractor/package.json +9 -0
  126. codegraph/plugins/ts/plugin.py +480 -0
  127. codegraph/plugins/tsweb/__init__.py +0 -0
  128. codegraph/plugins/tsweb/common.py +290 -0
  129. codegraph/plugins/tsweb/data.py +276 -0
  130. codegraph/presets/__init__.py +146 -0
  131. codegraph/presets/c_cpp.yaml +9 -0
  132. codegraph/presets/common.yaml +66 -0
  133. codegraph/presets/dart.yaml +9 -0
  134. codegraph/presets/django-ninja.yaml +15 -0
  135. codegraph/presets/django.yaml +25 -0
  136. codegraph/presets/djangorestframework.yaml +17 -0
  137. codegraph/presets/express.yaml +17 -0
  138. codegraph/presets/kotlin.yaml +11 -0
  139. codegraph/presets/laravel.yaml +40 -0
  140. codegraph/presets/nest.yaml +11 -0
  141. codegraph/presets/nextjs.yaml +15 -0
  142. codegraph/presets/nuxt.yaml +9 -0
  143. codegraph/presets/php.yaml +5 -0
  144. codegraph/presets/python.yaml +10 -0
  145. codegraph/presets/rust.yaml +5 -0
  146. codegraph/presets/swift.yaml +10 -0
  147. codegraph/presets/typescript.yaml +13 -0
  148. codegraph/process_runs.py +328 -0
  149. codegraph/protocols/__init__.py +299 -0
  150. codegraph/protocols/builtin.py +67 -0
  151. codegraph/protocols/matchers.py +144 -0
  152. codegraph/protocols/view.py +334 -0
  153. codegraph/query.py +2089 -0
  154. codegraph/realtime.py +260 -0
  155. codegraph/roundtrip.py +346 -0
  156. codegraph/routes.py +442 -0
  157. codegraph/starters.py +218 -0
  158. codegraph/tests_index.py +117 -0
  159. codegraph/viz/__init__.py +0 -0
  160. codegraph/viz/graph.py +369 -0
  161. codegraph/viz/server.py +198 -0
  162. codegraph/viz/static/app.css +148 -0
  163. codegraph/viz/static/app.js +1082 -0
  164. codegraph/viz/static/index.html +81 -0
  165. codegraph/viz/static/layered.js +237 -0
  166. codegraph/viz/static/vendor/VERSIONS.txt +4 -0
  167. codegraph/viz/static/vendor/cose-base.js +3214 -0
  168. codegraph/viz/static/vendor/cytoscape-fcose.js +1549 -0
  169. codegraph/viz/static/vendor/cytoscape.min.js +31 -0
  170. codegraph/viz/static/vendor/layout-base.js +5230 -0
  171. codegraph/viz/tools/package-lock.json +303 -0
  172. codegraph/viz/tools/package.json +7 -0
  173. codegraph/viz/tools/shoot.mjs +165 -0
  174. codegraph/xcode.py +251 -0
File without changes
@@ -0,0 +1,129 @@
1
+ """SCIP import path: any SCIP-producing indexer (scip-php, scip-typescript, scip-clang,
2
+ rust-analyzer scip, scip-go, scip-python, scip-java) can feed the same graph.
3
+
4
+ Mapping
5
+ definition occurrence -> node (kind from the SCIP descriptor suffix: '#' type, '().' method,
6
+ '.' term, '/' namespace); id uses the same FQN scheme as native
7
+ plugins when the separator is known, so native + SCIP data merge.
8
+ reference occurrence -> edge from the innermost enclosing definition in the same document
9
+ (enclosing_range when the indexer provides it, else the nearest
10
+ preceding definition; confidence 'resolved' resp. 'heuristic').
11
+ """
12
+ from __future__ import annotations
13
+
14
+ import re
15
+ import sys
16
+ from collections import defaultdict
17
+ from pathlib import Path
18
+
19
+ sys.path.insert(0, str(Path(__file__).parent))
20
+ import scip_pb2 # noqa: E402 (generated from scip.proto with grpc_tools.protoc)
21
+
22
+ from ...core.model import HEURISTIC, RESOLVED # noqa: E402
23
+ from ...core.plugin import GraphBuilder # noqa: E402
24
+ from ..native.scipread import has_position, health_warning, occ_enclosing, occ_range # noqa: E402
25
+
26
+ NS_SEP = {"php": "\\", "go": "/", "rust": "::", "c_cpp": "::", "typescript": "/", "python": ".", "java": "."}
27
+
28
+
29
+ def parse_symbol(sym: str):
30
+ """'scheme manager pkg ver descriptors' -> (descriptor string, kind, fqn parts)."""
31
+ if sym.startswith("local "):
32
+ return None
33
+ parts = sym.split(" ", 4)
34
+ if len(parts) < 5:
35
+ return None
36
+ desc = parts[4]
37
+ toks = re.findall(r"(`[^`]*`|[^/#.()\[\]:!]+)([/#.:!]|\(\)\.|\([^)]*\)\.|\[[^\]]*\])", desc)
38
+ if not toks:
39
+ return None
40
+ names = [(t[0].strip("`"), t[1]) for t in toks]
41
+ last_name, last_suf = names[-1]
42
+ if last_suf.startswith("("):
43
+ kind = "method"
44
+ elif last_suf == "#":
45
+ kind = "class"
46
+ elif last_suf == "/":
47
+ kind = "namespace"
48
+ elif last_suf in (".", ":"):
49
+ kind = "term"
50
+ else:
51
+ kind = "other"
52
+ return desc, kind, names
53
+
54
+
55
+ def to_node(sym: str, lang: str):
56
+ p = parse_symbol(sym)
57
+ if not p:
58
+ return None
59
+ desc, kind, names = p
60
+ sep = NS_SEP.get(lang, "/")
61
+ ns = [n for n, s in names if s == "/"]
62
+ types = [n for n, s in names if s == "#"]
63
+ cls = sep.join(ns + types[:1]) if types else None
64
+ if kind == "class":
65
+ return "class", sep.join(ns + types), names[-1][0]
66
+ if kind == "method":
67
+ owner = sep.join(ns + types) if types else sep.join(ns)
68
+ return "method", f"{owner}::{names[-1][0]}" if types else f"{owner}{sep}{names[-1][0]}", names[-1][0]
69
+ if kind == "term" and types:
70
+ n = names[-1][0]
71
+ if n.startswith("$"):
72
+ return "property", f"{sep.join(ns + types)}::{n}", n
73
+ return "const", f"{sep.join(ns + types)}::{n}", n
74
+ return None
75
+
76
+
77
+ def import_scip(path: str | Path, builder: GraphBuilder, lang: str = "php", skip_prefixes=("tests/",)) -> dict:
78
+ idx = scip_pb2.Index()
79
+ idx.ParseFromString(Path(path).read_bytes())
80
+ stats = defaultdict(int)
81
+ for doc in idx.documents:
82
+ rel = doc.relative_path
83
+ if rel.startswith(skip_prefixes):
84
+ stats["docs_skipped"] += 1
85
+ continue
86
+ stats["docs"] += 1
87
+ defs = [] # (start_line, end_line or None, node_id)
88
+ for o in doc.occurrences:
89
+ if o.symbol and not o.symbol.startswith("local "):
90
+ stats["occurrences"] += 1
91
+ stats["positioned"] += has_position(o)
92
+ if o.symbol_roles & scip_pb2.SymbolRole.Definition:
93
+ n = to_node(o.symbol, lang)
94
+ if not n:
95
+ continue
96
+ kind, key, name = n
97
+ start = occ_range(o)[0]
98
+ nid = builder.add_node(kind, key, name=name, fqn=key, file=rel, line=start + 1, lang=lang,
99
+ attrs={"scip_symbol": o.symbol})
100
+ er = occ_enclosing(o)
101
+ defs.append((start, er[2] if er else None, nid, kind))
102
+ stats["definitions"] += 1
103
+ defs.sort(key=lambda d: (d[0], -1 if d[1] is None else d[1], d[2]))
104
+ callables = [d for d in defs if d[3] in ("method",)]
105
+ for o in doc.occurrences:
106
+ if o.symbol_roles & scip_pb2.SymbolRole.Definition:
107
+ continue
108
+ n = to_node(o.symbol, lang)
109
+ if not n:
110
+ continue
111
+ kind, key, _ = n
112
+ line = occ_range(o)[0]
113
+ src, conf = None, HEURISTIC
114
+ for (sl, el, nid, k) in callables:
115
+ if sl <= line and (el is None or line <= el):
116
+ src = nid
117
+ conf = RESOLVED if el is not None else HEURISTIC
118
+ if src is None:
119
+ stats["refs_without_enclosing"] += 1
120
+ continue
121
+ dst = f"{kind}:{key}"
122
+ builder.add_edge(src, dst, "CALLS" if kind == "method" else "REFERENCES", rel, line + 1, conf, source="scip")
123
+ stats["references"] += 1
124
+ out = dict(stats)
125
+ w = health_warning(Path(path).name, out.get("occurrences", 0), out.get("positioned", 0),
126
+ out.get("definitions", 0))
127
+ if w:
128
+ out["warning"] = w
129
+ return out