codeanalyzer-python 1.3.0__py3-none-any.whl → 1.4.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.
@@ -57,7 +57,9 @@ class RelType:
57
57
 
58
58
 
59
59
  # Labels layered onto a node in addition to its primary/specific label.
60
- MARKER_LABELS: List[str] = []
60
+ # ``PyCanNode`` (#173) rides every node keyed by a ``can://python/`` id — an index
61
+ # anchor for the prefix-scoped destructive statements (see ``rows.CAN_NODE``).
62
+ MARKER_LABELS: List[str] = ["PyCanNode"]
61
63
 
62
64
  _SPAN = {"start_line": "integer", "end_line": "integer"}
63
65
 
@@ -75,6 +77,8 @@ NODE_LABELS: List[NodeLabel] = [
75
77
  "repo_uri": "string",
76
78
  "source_revision": "string",
77
79
  "repo_dirty": "boolean",
80
+ "entrypoint_frameworks": "string[]",
81
+ "entrypoint_report_json": "string",
78
82
  },
79
83
  ),
80
84
  NodeLabel(
@@ -88,7 +92,6 @@ NODE_LABELS: List[NodeLabel] = [
88
92
  "content_hash": "string",
89
93
  "last_modified": "float",
90
94
  "file_size": "integer",
91
- "_module": "string",
92
95
  },
93
96
  ),
94
97
  NodeLabel(
@@ -104,7 +107,6 @@ NODE_LABELS: List[NodeLabel] = [
104
107
  "decorators": "string[]",
105
108
  "docstring": "string",
106
109
  **_SPAN,
107
- "_module": "string",
108
110
  "is_entrypoint": "boolean",
109
111
  "entrypoint_frameworks": "string[]",
110
112
  },
@@ -128,7 +130,6 @@ NODE_LABELS: List[NodeLabel] = [
128
130
  "modifiers": "string[]",
129
131
  "parameters_json": "string",
130
132
  "accessed_symbols_json": "string",
131
- "_module": "string",
132
133
  "is_entrypoint": "boolean",
133
134
  "entrypoint_frameworks": "string[]",
134
135
  },
@@ -157,7 +158,6 @@ NODE_LABELS: List[NodeLabel] = [
157
158
  "initializer": "string",
158
159
  "docstring": "string",
159
160
  **_SPAN,
160
- "_module": "string",
161
161
  },
162
162
  ),
163
163
  NodeLabel(
@@ -171,7 +171,6 @@ NODE_LABELS: List[NodeLabel] = [
171
171
  "initializer": "string",
172
172
  "scope": "string",
173
173
  **_SPAN,
174
- "_module": "string",
175
174
  },
176
175
  ),
177
176
  # Level-3 CPG overlay (present only at -a 3). The dataflow vocabulary is
@@ -198,7 +197,6 @@ NODE_LABELS: List[NodeLabel] = [
198
197
  "is_constructor_call": "boolean",
199
198
  "arguments_json": "string",
200
199
  **_SPAN,
201
- "_module": "string",
202
200
  },
203
201
  ),
204
202
  # Neutral artifact/dependency subgraph (spec 2026-08-27, Task 6). No `Py`
@@ -210,7 +208,7 @@ NODE_LABELS: List[NodeLabel] = [
210
208
  NodeLabel("Artifact", "Artifact", "id", {
211
209
  "id": "string", "path": "string", "format": "string",
212
210
  "roles": "string[]", "size_bytes": "integer", "sha256": "string",
213
- "source": "string", "text_truncated": "boolean", "extraction": "string",
211
+ "source": "string", "extraction": "string",
214
212
  }),
215
213
  NodeLabel("Package", "Package", "id", {
216
214
  "id": "string", "ecosystem": "string", "name": "string",
@@ -336,6 +334,10 @@ INDEXES: List[str] = [
336
334
  "CREATE INDEX py_callable_name IF NOT EXISTS FOR (c:PyCallable) ON (c.name)",
337
335
  "CREATE INDEX py_class_name IF NOT EXISTS FOR (c:PyClass) ON (c.name)",
338
336
  "CREATE FULLTEXT INDEX py_code_fts IF NOT EXISTS FOR (c:PyCallable) ON EACH [c.code, c.docstring]",
337
+ # #173: every destructive statement is ``MATCH (x:PyCanNode) WHERE x.id STARTS WITH $p``.
338
+ # A range index on the marker makes that a prefix seek; without it, a store scan per
339
+ # changed module. STARTS WITH is index-backed; CONTAINS / ENDS WITH are not.
340
+ "CREATE INDEX py_can_node_id IF NOT EXISTS FOR (n:PyCanNode) ON (n.id)",
339
341
  ]
340
342
 
341
343
 
@@ -43,7 +43,6 @@ class AnalysisOptions:
43
43
  clear_cache: bool = False
44
44
  verbosity: int = 0
45
45
  entrypoint_rules: Tuple[Path, ...] = ()
46
- # Artifact text-capture controls (#157 follow-up): whether to capture
47
- # `source` at all, and the per-file byte cap before it truncates.
46
+ # Artifact text capture (#157 follow-up): whether to capture `source` at
47
+ # all. There is no byte cap -- `source` is the whole file or "" (#172).
48
48
  artifact_text: bool = True
49
- artifact_text_max_bytes: int = 262144
@@ -23,6 +23,23 @@ def ordinal_id(callable_id: str, tag: str) -> str:
23
23
  return f"{callable_id}@{tag}"
24
24
 
25
25
 
26
+ def global_ordinal(callable_id: str, local_key: str) -> str:
27
+ """The GLOBAL ordinal id of a body node from its LOCAL key: synthetic keys
28
+ (`@entry`, `@formal_in:0`) already carry the `@`; positional keys (`15:2`,
29
+ `15:2/actual_in:0`) get one. This is the :PyBodyNode merge key and, since
30
+ #176, `BodyNode.id` — the one implementation both projections share."""
31
+ return f"{callable_id}{local_key}" if local_key.startswith("@") else f"{callable_id}@{local_key}"
32
+
33
+
34
+ def stamp_body_ids(callable) -> None:
35
+ """Stamp `id` on every body node and parameter of one callable (#176).
36
+ Idempotent; each body emitter calls it after writing its nodes."""
37
+ for key, node in callable.body.items():
38
+ node.id = global_ordinal(callable.id, key)
39
+ for i, p in enumerate(callable.parameters or []):
40
+ p.id = ordinal_id(callable.id, f"formal_in:{i}")
41
+
42
+
26
43
  def artifact_id(app_name: str, rel_path: str) -> str:
27
44
  """Language-neutral artifact id: ``can://artifact/<app>/<rel-path>``.
28
45
 
@@ -1,6 +1,7 @@
1
1
  """L1 body population: materialize `call` nodes from existing call sites.
2
2
  `callee` is left None here — the sanctioned null→id refinement happens at L2."""
3
3
  from __future__ import annotations
4
+ from codeanalyzer.schema.ids import stamp_body_ids
4
5
  from codeanalyzer.schema.py_schema import PyApplication, PyClass, PyCallable, BodyNode, Span, byte_offsets
5
6
 
6
7
  def _do_callable(source: str, c: PyCallable) -> None:
@@ -20,6 +21,7 @@ def _do_callable(source: str, c: PyCallable) -> None:
20
21
  is_constructor_call=cs.is_constructor_call,
21
22
  arguments=list(cs.arguments or []),
22
23
  )
24
+ stamp_body_ids(c)
23
25
  for ic in (c.callables or {}).values():
24
26
  _do_callable(source, ic)
25
27
  for icl in (c.types or {}).values():
@@ -128,6 +128,9 @@ class BodyNode(BaseModel):
128
128
  """A node in a callable's `body`: an AST region (statement/call/branch/…) or
129
129
  a synthetic analysis vertex (entry/exit/formal_in/out/actual_in/out)."""
130
130
  kind: str
131
+ # #176: the GLOBAL ordinal id — `<callable-id>@<local>` — the same value the
132
+ # Neo4j projection merges :PyBodyNode on. Stamped by `ids.stamp_body_ids`.
133
+ id: str = ""
131
134
  span: Optional[Span] = None
132
135
  callee: Optional[str] = None # only on `call` nodes; the sanctioned null→id slot
133
136
  of: Optional[str] = None # param vertices: the variable/return they carry
@@ -287,6 +290,9 @@ class PyCallableParameter(BaseModel):
287
290
  """Represents a parameter of a Python callable (function/method)."""
288
291
 
289
292
  name: str
293
+ # #176: `<callable-id>@formal_in:<i>` for position i — the L4 formal_in vertex
294
+ # that carries this parameter. A forward reference below level 4.
295
+ id: str = ""
290
296
  type: Optional[str] = None
291
297
  default_value: Optional[str] = None
292
298
  decorators: List[PyDecorator] = []
@@ -512,9 +518,8 @@ class PyArtifact(BaseModel):
512
518
  format: str # toml|yaml|json|ini|properties|requirements|dockerfile|text|binary
513
519
  roles: List[str] = []
514
520
  size_bytes: int = 0
515
- sha256: str = "" # always the full file's hash, even when source is truncated/empty
516
- source: str = "" # verbatim by default; "" for binary or when capture is disabled
517
- text_truncated: bool = False # True when `source` is a prefix, not the full file
521
+ sha256: str = "" # always the full file's hash, even when source is empty
522
+ source: str = "" # the WHOLE file, or "" for binary / when capture is disabled -- never a prefix
518
523
  extraction: str = "none" # none|partial|full
519
524
  config_keys: List[PyConfigKey] = [] # flattened config keys (#152); [] when not namespace-eligible
520
525
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codeanalyzer-python
3
- Version: 1.3.0
3
+ Version: 1.4.1
4
4
  Summary: Static analysis for Python — canonical schema v2 (symbol table, call graph, and native CFG/PDG/SDG dataflow) as analysis.json or a Neo4j property graph.
5
5
  Author-email: Rahul Krishna <i.m.ralk@gmail.com>
6
6
  License-File: LICENSE
@@ -99,7 +99,9 @@ needs.
99
99
  **interprocedural SDG** (synthetic parameter vertices, `param_in`/`param_out`/`summary`,
100
100
  alias-aware DDG) at level 4 — all built in-process from the stdlib `ast`.
101
101
  - **Neo4j output** — project the analysis into a labeled property graph: a self-contained
102
- `graph.cypher` snapshot, or an **incremental** push to a live database over Bolt.
102
+ `graph.cypher` snapshot, or an **incremental** push to a live database over Bolt. A push is
103
+ **additive by default** and never deletes: `--eager` is what permits it to remove declarations
104
+ and edges the source no longer has.
103
105
  - **Versioned schema** — a machine-readable, version-stamped Neo4j schema contract (`--emit schema`),
104
106
  checked in as `schema.neo4j.json` (`2.0.0`) and shipped with every release.
105
107
  - **Incremental cache** — per-file results are cached under `.codeanalyzer`; `--lazy` (default)
@@ -300,7 +302,19 @@ $ canpy --help
300
302
  │ --eager --lazy Enable eager or │
301
303
  │ lazy analysis. │
302
304
  │ Defaults to │
303
- │ lazy.
305
+ │ lazy. Also gates
306
+ │ every │
307
+ │ destructive step │
308
+ │ of a '--emit │
309
+ │ neo4j' Bolt │
310
+ │ push: a lazy │
311
+ │ push only adds │
312
+ │ and updates, an │
313
+ │ eager one also │
314
+ │ removes │
315
+ │ declarations and │
316
+ │ edges the source │
317
+ │ no longer has. │
304
318
  │ [default: lazy] │
305
319
  │ --skip-tests --include-tests Skip test files │
306
320
  │ in analysis. │
@@ -361,26 +375,18 @@ $ canpy --help
361
375
  │ `source` text on │
362
376
  │ discovered │
363
377
  │ artifacts. │
378
+ │ `source` is the │
379
+ │ whole file; │
364
380
  │ --no-artifact-t… │
365
- │ empties `source`
381
+ │ empties it
366
382
  │ everywhere │
367
383
  │ (inventory │
368
384
  │ unchanged). │
369
- │ [default: │
370
- │ artifact-text] │
371
- │ --artifact-text-… <int range> Per-file byte │
372
- │ [x>=1] cap on captured │
373
- │ artifact │
374
- │ `source`; a │
375
- │ decodable file │
376
- │ over the cap is │
377
- │ truncated │
378
- │ (text_truncated… │
379
385
  │ sha256/size_byt… │
380
386
  │ always reflect │
381
387
  │ the full file. │
382
388
  │ [default: │
383
- 262144]
389
+ artifact-text]
384
390
  │ --help Show this │
385
391
  │ message and │
386
392
  │ exit. │
@@ -453,7 +459,7 @@ levels are cumulative and additive — `analysis.json(-a 1) ⊆ … ⊆ analysis
453
459
  | **1** | `-a 1` (default) | Symbol table, Jedi call graph, and `call` nodes in each callable's `body` | `body` calls (`callee: null`) |
454
460
  | **2** | `-a 2` | Defuse-linker call-graph enrichment; each call's `callee` backfilled to a `can://` id | `call_graph`, `body` callees |
455
461
  | **3** | `-a 3` | Native **intraprocedural** CFG/CDG/DDG (syntactic, name-equality, `prov: ["ssa"]`) | `cfg`, `cdg`, `ddg`, `@entry`/`@exit` on each callable |
456
- | **4** | `-a 4` | **Interprocedural** SDG: synthetic param vertices, alias-aware DDG (`prov: ["points-to"]`) | `param_in`, `param_out`, `summary`, semantic `ddg` |
462
+ | **4** | `-a 4` | **Interprocedural** SDG: synthetic param vertices, alias-aware DDG (`prov: ["points-to"]`), port-wiring DDG between statements and param vertices (`prov: ["reaching-defs"]`) | `param_in`, `param_out`, `summary`, semantic `ddg` |
457
463
 
458
464
  `-a 1`/`-a 2` timings and output are unaffected by the heavier levels — nothing at level 3+ runs
459
465
  unless requested. Flag gating: `--graphs sdg` requires `-a 4`; `--graphs cfg,dfg,pdg` and
@@ -475,7 +481,11 @@ symbol-table signature by construction
475
481
  - **Points-to oracle (level 4):** the **Scalpel** may-alias oracle — `ScalpelAliasOracle`
476
482
  (`codeanalyzer/dataflow/scalpel_oracle.py`) — consumes Scalpel's SSA copy/const facts to answer
477
483
  `may_alias(path_a, path_b)`, adding the alias-aware DDG edges (`prov: ["points-to"]`) and the
478
- interprocedural summaries. Scalpel is **vendored** a `typed_ast`-free slice built into the
484
+ interprocedural summaries. Level 4 also wires the statement-level DDG to the param
485
+ vertices (def → `actual_in`, `actual_out` → call site, `formal_in` → use, def → `formal_out`)
486
+ with `prov: ["reaching-defs"]`; without those the SDG would be two disconnected graphs. So
487
+ `prov` takes three values: `ssa` (syntactic, L3), `reaching-defs` (port wiring, L4) and
488
+ `points-to` (alias-derived, L4). Scalpel is **vendored** — a `typed_ast`-free slice built into the
479
489
  package under `codeanalyzer/dataflow/scalpel/` — so it is the **default** level-4 oracle with no
480
490
  external dependency to install; the analyzer falls back to the built-in `TypeBasedAliasOracle`
481
491
  (Jedi-inferred types; unknown types conservatively alias) only when Scalpel can't resolve a
@@ -540,7 +550,8 @@ A **callable** (function or method) carries its own CPG, keyed by node id:
540
550
  "body": { // node id → node
541
551
  "@entry": { "kind": "entry" },
542
552
  "6:4": { "kind": "statement", "span": { … } },
543
- "6:8": { "kind": "call", "span": { … }, "callee": "can://…/helper(x)" }, // callee null until L2
553
+ "6:8": { "id": "can://…/main()@6:8", "kind": "call", "span": { … },
554
+ "callee": "can://…/helper(x)" }, // callee null until L2
544
555
  "@formal_in:0": { "kind": "formal_in", "of": "a" }, // L4 param vertices
545
556
  "6:4/actual_in:0": { "kind": "actual_in", "of": "a", "parent": "6:4" },
546
557
  "@exit": { "kind": "exit" }
@@ -680,6 +691,10 @@ RETURN DISTINCT c.id
680
691
  MATCH (m:PyCallable {is_entrypoint: true})
681
692
  RETURN m.id, m.entrypoint_frameworks
682
693
 
694
+ // did the entrypoint pass find anything? (no entrypoints vs. nothing detected)
695
+ MATCH (a:PyApplication)
696
+ RETURN a.entrypoint_frameworks, a.entrypoint_report_json
697
+
683
698
  // data dependences into one statement (level 3+)
684
699
  MATCH (s:PyBodyNode {id: $stmt})<-[d:PY_DDG]-(src:PyBodyNode)
685
700
  RETURN src.id, d.var, d.prov
@@ -1,29 +1,29 @@
1
1
  codeanalyzer/__init__.py,sha256=BZ3Kuwl-F_F-8H8cepLnVJ4Ku4NNUjjqg0Y6ujPQSsI,108
2
- codeanalyzer/__main__.py,sha256=VVGmkwLGkcfCdbikp2FdXzpGZEA1md8n8WhNSxJWz1E,16080
3
- codeanalyzer/core.py,sha256=yJ14_jL2V4qDD6pEMEltfeOLcFYTMRkRnh0dyP6RVR4,46715
2
+ codeanalyzer/__main__.py,sha256=o5_9ct61l3T7ryIsag8bz304NabVV-el_ooGD8tnbhA,15968
3
+ codeanalyzer/core.py,sha256=tk_3dz81ECXXv8CEciWTIVfBAHHIfTVCsZte1GAZ080,46620
4
4
  codeanalyzer/provenance.py,sha256=DT-DqwdVwO7g-GyK3sC0_4vDNCUjZYEY1fyYCt-7VRM,2306
5
5
  codeanalyzer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  codeanalyzer/artifacts/__init__.py,sha256=317sEeZLS1AYsfYDYIk7tLR3AdDFwWw_cmkeZDabkJo,906
7
7
  codeanalyzer/artifacts/config_keys.py,sha256=ovwptAErLYutlCzUwvyim2kH6-6vUKxuRcBV2KJS71Y,26843
8
8
  codeanalyzer/artifacts/config_use.py,sha256=1-jGacW249dwF7b6DOrTFuJ7sA5Ho9khgrgZqND0nro,27173
9
9
  codeanalyzer/artifacts/config_use_rules.yml,sha256=fNgI6IceOsj78LYmgoDH-vQ4-Mfb2ZFGKIQhLuoL4ik,1483
10
- codeanalyzer/artifacts/dependencies.py,sha256=bURMUbBzHaF8bInRk-INp1GaGujsUSXnFqLtNyECUMI,10888
11
- codeanalyzer/artifacts/discovery.py,sha256=8as4RD5oNgZM2qyg19HUqsdq9eETwPDGQUOn4fZLOsQ,7427
10
+ codeanalyzer/artifacts/dependencies.py,sha256=h_-XV5KhrT-1Ytguw0c4fyI9zSFzn9Aj7kR66omvL3M,10853
11
+ codeanalyzer/artifacts/discovery.py,sha256=cUVRSdV82G2hVGhkRGV7u24-tEAxUBmH9nkTg24ur0Y,5968
12
12
  codeanalyzer/artifacts/parsers.py,sha256=xOjC53tT0Mv0k7ONGwzl5XUvpBLnZlEcGmyrX5DS45k,9035
13
13
  codeanalyzer/dataflow/__init__.py,sha256=HCNOH24rAGLUMG94N9aC-2SsAWSntk3uys7e39ipU5o,1725
14
14
  codeanalyzer/dataflow/access_paths.py,sha256=wC8Q9qD-RZzkoFWMVvu_6uNNmYP8z48OGp9h9v3F1d4,23623
15
15
  codeanalyzer/dataflow/alias.py,sha256=ZYKY0DiR3GHv6YJr7C001Lode9rZsk6-gxdomUyIvwg,3928
16
- codeanalyzer/dataflow/builder.py,sha256=OOj5J-O0WgBnLMSu6hhixkM8dVkUopwBR-wlQq0INhE,32463
16
+ codeanalyzer/dataflow/builder.py,sha256=kUjI_oBHn5H8cfcSYxj40OHxiqXX-IbxXqahNLgffyQ,32812
17
17
  codeanalyzer/dataflow/cfg.py,sha256=u5YXJjAaDshdgv-9kWWITbBJFP-MwXKq6hbNh0fhDm8,25307
18
18
  codeanalyzer/dataflow/defuse.py,sha256=LrX1ToOZzR79NlAGg5T647UAFkpiEqEnT7t0K5RXOiI,4377
19
19
  codeanalyzer/dataflow/dominance.py,sha256=X7Ki1QRdVqaseYsJtiUL7m9MbcC2WHEv9b8bczSLFUA,5086
20
- codeanalyzer/dataflow/identity.py,sha256=WAIal6XchmQqdnXbvbEgu8J6vJdXNRdie1KHz1vJBl8,3906
20
+ codeanalyzer/dataflow/identity.py,sha256=6aAz3iPSOpoS7l_moC7XGr2RS_GqJp_FlsWGglMJDjM,3812
21
21
  codeanalyzer/dataflow/pdg.py,sha256=1Bm7AnoRqXBryZulII2idPw0feV8eZQ1VqqprQ8PW-g,3731
22
22
  codeanalyzer/dataflow/scalpel_oracle.py,sha256=FxRadKrTWar0VKHyQJM40n3cq25sld3Sj4lMdOm5NFk,11494
23
23
  codeanalyzer/dataflow/scc.py,sha256=Doa_0-5f3agCu_5UmeEDlCUErg34TtniKIv8Uqd7Jiw,3493
24
- codeanalyzer/dataflow/sdg.py,sha256=sTUUlYMB9uTKg9Yxiw-ScTBXogaQKcrSP6vksKXG14M,17841
24
+ codeanalyzer/dataflow/sdg.py,sha256=taDXkIg0BZUtDEJUjRJB_dxrFl6tKNOUdFyj0zCiso0,18533
25
25
  codeanalyzer/dataflow/slicing.py,sha256=lWZ7jHhlR8m7rECWJQXvwfs5GNZeJY55Cud3Ji5UbNU,3654
26
- codeanalyzer/dataflow/summaries.py,sha256=DOgesiymL6WgePrtkQBiS_Rd7SuCr3McD4Eq05Msb50,8023
26
+ codeanalyzer/dataflow/summaries.py,sha256=TLtc5h4bLBC4lViuMhMlEp5rp_nBpDPOl4_wfBuRUY4,9210
27
27
  codeanalyzer/dataflow/syntactic.py,sha256=AbHyXjKX_1xkGgKH48BpXYCWBauActGUwSMF_OD-uys,1124
28
28
  codeanalyzer/dataflow/scalpel/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
29
29
  codeanalyzer/dataflow/scalpel/README.md,sha256=YN-LxqYYDekIdhx39AG28sg9UySMmqvLQJivTvR2Fz8,1543
@@ -38,28 +38,28 @@ codeanalyzer/dataflow/scalpel/core/func_call_visitor.py,sha256=ps0snjTchBXilhor3
38
38
  codeanalyzer/dataflow/scalpel/core/vars_visitor.py,sha256=gE5fNyJS6jslD6vsMRbFLoy3n1xTwH-b54mBcNYO72M,5660
39
39
  codeanalyzer/entrypoints/__init__.py,sha256=VaMd4mSEPLuPlRxxAve_nTJ9ZH62stXZGTPNwU_BQ50,99
40
40
  codeanalyzer/entrypoints/detect.py,sha256=fsWRQz1njvB9d3LIJEHxsNFE1GrB7q52KCvozw_UIUQ,4594
41
- codeanalyzer/entrypoints/matching.py,sha256=vXrhCsPOeaYHp8tYyILk5kNh9_3rwV_1wi6Z47PqG80,6427
42
- codeanalyzer/entrypoints/pipeline.py,sha256=PDptL_o105BpofpnQHWZYOtFYVelqTB4zktp0PVPbEc,5540
43
- codeanalyzer/entrypoints/rules.py,sha256=aYwCiX-J3tvj8qJrrb-tph5zovin5wIdmzc49iR3h2U,5318
44
- codeanalyzer/entrypoints/rules.yml,sha256=rgDglVOcUNXnQ5FXLMfnJbfI7xHRiRmegTP5bmiemSQ,3112
41
+ codeanalyzer/entrypoints/matching.py,sha256=rQeY_w2dyG36DBUjle7GLXxqDKsoMhJYPjN4s11OGtM,7948
42
+ codeanalyzer/entrypoints/pipeline.py,sha256=vVSdttMfSAWour2fsC3LomMtwFLzRqmJHixJS82VY1I,7828
43
+ codeanalyzer/entrypoints/rules.py,sha256=yG772JHmNc2L10jIpxfg1xTh-QouJa6lNU9ubo3EZYg,6003
44
+ codeanalyzer/entrypoints/rules.yml,sha256=sguICRfDDNGjJPfZz-JSwkI_hzbTJaau1liHV_y4rTA,4637
45
45
  codeanalyzer/jedi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  codeanalyzer/jedi/jedi.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  codeanalyzer/neo4j/__init__.py,sha256=8Ei6uThTOqmul6GhnKoGOjLXJZbyDwF5Jo-8I8NxnAk,1574
48
- codeanalyzer/neo4j/bolt.py,sha256=qEBtQlBjaMPpLQPUCOAR9jEqLxpXYJG5mtxdYAhjtMI,10134
49
- codeanalyzer/neo4j/cypher.py,sha256=a7YSmxxDbPcYc5gI4TW9sM6_WOE3RgLXTGBR9K8W8kw,5321
50
- codeanalyzer/neo4j/emit.py,sha256=QdrZWG3_IQHMcKCX4bFINpXvqZU2Qfsi9beIJovC2p4,3493
51
- codeanalyzer/neo4j/project.py,sha256=DcymijKIy9TvBUhzlB_0fDmoSA8WRufJU-1oVP1hH1w,35102
52
- codeanalyzer/neo4j/rows.py,sha256=med0XFa63PPUVUhJMq1TtVcJxgaVW39sgxBRZJDIJ_w,7811
53
- codeanalyzer/neo4j/schema.py,sha256=HXM-rG-NBuujXU2fXGAUb65sGRKKTXDGB7jr360qEYQ,14330
48
+ codeanalyzer/neo4j/bolt.py,sha256=kcBhujHuUst6s1eZD-vARDn0iuKUAxSHrN14nrsKGM8,13472
49
+ codeanalyzer/neo4j/cypher.py,sha256=y2AW9OUAbZJ4TVHkFpHChJU3r_K7q81tTZKt0VNve6g,5677
50
+ codeanalyzer/neo4j/emit.py,sha256=OBCO77TDTaNpqk9Di3JIQzBouLpHPdgoXuPSs44iJuU,3587
51
+ codeanalyzer/neo4j/project.py,sha256=zoLsr2XGywlZbqnwlYvlhIpgu1jmIvSMTyAgIJZkmeM,38494
52
+ codeanalyzer/neo4j/rows.py,sha256=PMlJEyLVIrKITkkK5TOutIzDgBuKLA1RGAkrQ1HLpZo,9579
53
+ codeanalyzer/neo4j/schema.py,sha256=TyT3-Tu9thfWJTuvRtZ3BAIM4kQk13uUEJ-sgr9YAdE,14716
54
54
  codeanalyzer/options/__init__.py,sha256=6NewN0a-1HAEgKcxQjYyVn2WEDLrhax8h3WLgZddeqI,94
55
- codeanalyzer/options/options.py,sha256=3GF1m4AI-9NN2sWmhl8wrvi2HjMwofec-We3WqKs_HA,1642
55
+ codeanalyzer/options/options.py,sha256=2jDCcs74iSEOhz90LoRGts6PC8yV9IDPVxnLPNmonOA,1609
56
56
  codeanalyzer/schema/__init__.py,sha256=hIyz02abUJNPW8yUgguaeKflZjTmOZWbDiKICNBD7yk,4141
57
57
  codeanalyzer/schema/assign_ids.py,sha256=pQHluLaO5a6hFREp3vjVRsUeAfTYSJ95RXS9TZvnoys,1590
58
58
  codeanalyzer/schema/call_graph_ids.py,sha256=mWAhJDBsW8i-siJiINOHCXEm4qM6F_5se9-HuHWIFqU,568
59
- codeanalyzer/schema/ids.py,sha256=aOzsgVaOo6x72dnRgNxlnt6b5wbZzhTm0JOz6pdI57I,1672
60
- codeanalyzer/schema/l1_body.py,sha256=5Su347kwAPNflJDf7SvBR3sNXx9PVdGEml2pOpQCwo0,1684
59
+ codeanalyzer/schema/ids.py,sha256=gBjpOlx4S_1JULlXoAHGommd5e81D5dwd5JSopYwdo8,2543
60
+ codeanalyzer/schema/l1_body.py,sha256=_sca0mTkMRb-5lasep87faGjDxZJd9jGB0hmBx3uCgk,1757
61
61
  codeanalyzer/schema/l2_callees.py,sha256=CTcBeGoO04DstDC6h-1sHMbbIrHDEOMxP01U9VLBcfc,2327
62
- codeanalyzer/schema/py_schema.py,sha256=pN03WJcb96LegGSFs7HIBWzTE8bnn8T2adH9M9FJGgQ,23966
62
+ codeanalyzer/schema/py_schema.py,sha256=lbW7fIRWOdVLH0Ql0yYCYZzaS-iaACBLOuDPmXesjKs,24238
63
63
  codeanalyzer/semantic_analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
64
  codeanalyzer/semantic_analysis/call_graph.py,sha256=6YEB_wTn5-oQYLrbIhJYE0BsHl4fpWPoy5Hwd9mTnGc,11918
65
65
  codeanalyzer/semantic_analysis/defuse_linker.py,sha256=bSn1rCun28OQqSd2NOc9aVBSm47Gt9Iul4r_gwfqO1w,64930
@@ -70,9 +70,9 @@ codeanalyzer/syntactic_analysis/symbol_table_builder.py,sha256=eTknBDlUuuQd3JEwb
70
70
  codeanalyzer/utils/__init__.py,sha256=hC6VWdR5rerSqBxzu9KQHTASWqwrrYJv-CMDwrTlzkc,137
71
71
  codeanalyzer/utils/logging.py,sha256=Fw0tattPAOMs3o0JMjjXhRVLIF64f-SCcygUXF9jqeg,904
72
72
  codeanalyzer/utils/progress_bar.py,sha256=C9JtzVdd10lIxTv-KA6PebqjKWueC_vMGwVzAtHuHIw,2818
73
- codeanalyzer_python-1.3.0.dist-info/METADATA,sha256=QAUQ1DK8997qsSI8-g4d294RfI7wLPljdOL4gi42Ofo,42305
74
- codeanalyzer_python-1.3.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
75
- codeanalyzer_python-1.3.0.dist-info/entry_points.txt,sha256=v4Vux0Nnx7sOntVk_CH7W9RX6SkIkvR1FQYq73oVlCQ,105
76
- codeanalyzer_python-1.3.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
77
- codeanalyzer_python-1.3.0.dist-info/licenses/NOTICE,sha256=MdVkNYqHJ20on2FmWvgD4WpMsX5mir33xdyPvTXd0A0,1223
78
- codeanalyzer_python-1.3.0.dist-info/RECORD,,
73
+ codeanalyzer_python-1.4.1.dist-info/METADATA,sha256=tmpHTz20bMUPMGvpJp66Guu8NtDqo-SIFso_Sk0BoHI,43485
74
+ codeanalyzer_python-1.4.1.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
75
+ codeanalyzer_python-1.4.1.dist-info/entry_points.txt,sha256=v4Vux0Nnx7sOntVk_CH7W9RX6SkIkvR1FQYq73oVlCQ,105
76
+ codeanalyzer_python-1.4.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
77
+ codeanalyzer_python-1.4.1.dist-info/licenses/NOTICE,sha256=MdVkNYqHJ20on2FmWvgD4WpMsX5mir33xdyPvTXd0A0,1223
78
+ codeanalyzer_python-1.4.1.dist-info/RECORD,,