codeanalyzer-python 1.5.0__tar.gz → 1.5.1__tar.gz

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 (97) hide show
  1. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/PKG-INFO +3 -2
  2. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/README.md +2 -1
  3. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/builder.py +1 -0
  4. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/neo4j/project.py +6 -0
  5. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/schema/py_schema.py +5 -0
  6. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/pyproject.toml +1 -1
  7. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/.gitignore +0 -0
  8. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/LICENSE +0 -0
  9. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/NOTICE +0 -0
  10. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/__init__.py +0 -0
  11. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/__main__.py +0 -0
  12. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/artifacts/__init__.py +0 -0
  13. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/artifacts/config_keys.py +0 -0
  14. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/artifacts/config_use.py +0 -0
  15. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/artifacts/config_use_rules.yml +0 -0
  16. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/artifacts/dependencies.py +0 -0
  17. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/artifacts/discovery.py +0 -0
  18. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/artifacts/parsers.py +0 -0
  19. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/core.py +0 -0
  20. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/__init__.py +0 -0
  21. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/access_paths.py +0 -0
  22. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/alias.py +0 -0
  23. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/cfg.py +0 -0
  24. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/defuse.py +0 -0
  25. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/dominance.py +0 -0
  26. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/identity.py +0 -0
  27. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/pdg.py +0 -0
  28. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/LICENSE +0 -0
  29. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/README.md +0 -0
  30. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/SSA/__init__.py +0 -0
  31. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/SSA/const.py +0 -0
  32. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/__init__.py +0 -0
  33. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/cfg/__init__.py +0 -0
  34. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/cfg/builder.py +0 -0
  35. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/cfg/model.py +0 -0
  36. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/core/__init__.py +0 -0
  37. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/core/func_call_visitor.py +0 -0
  38. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel/core/vars_visitor.py +0 -0
  39. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scalpel_oracle.py +0 -0
  40. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/scc.py +0 -0
  41. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/sdg.py +0 -0
  42. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/slicing.py +0 -0
  43. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/summaries.py +0 -0
  44. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/dataflow/syntactic.py +0 -0
  45. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/entrypoints/__init__.py +0 -0
  46. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/entrypoints/detect.py +0 -0
  47. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/entrypoints/matching.py +0 -0
  48. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/entrypoints/pipeline.py +0 -0
  49. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/entrypoints/rules.py +0 -0
  50. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/entrypoints/rules.yml +0 -0
  51. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/jedi/__init__.py +0 -0
  52. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/jedi/jedi.py +0 -0
  53. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/neo4j/__init__.py +0 -0
  54. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/neo4j/bolt.py +0 -0
  55. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/neo4j/cypher.py +0 -0
  56. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/neo4j/emit.py +0 -0
  57. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/neo4j/rows.py +0 -0
  58. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/neo4j/schema.py +0 -0
  59. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/options/__init__.py +0 -0
  60. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/options/options.py +0 -0
  61. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/provenance.py +0 -0
  62. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/py.typed +0 -0
  63. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/schema/__init__.py +0 -0
  64. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/schema/assign_ids.py +0 -0
  65. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/schema/call_graph_ids.py +0 -0
  66. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/schema/ids.py +0 -0
  67. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/schema/l1_body.py +0 -0
  68. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/schema/l2_callees.py +0 -0
  69. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/semantic_analysis/__init__.py +0 -0
  70. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/semantic_analysis/call_graph.py +0 -0
  71. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/semantic_analysis/defuse_linker.py +0 -0
  72. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/syntactic_analysis/__init__.py +0 -0
  73. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/syntactic_analysis/exceptions.py +0 -0
  74. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/syntactic_analysis/import_resolver.py +0 -0
  75. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/syntactic_analysis/symbol_table_builder.py +0 -0
  76. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/utils/__init__.py +0 -0
  77. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/utils/logging.py +0 -0
  78. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/codeanalyzer/utils/progress_bar.py +0 -0
  79. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/docs/handoff/README.md +0 -0
  80. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/docs/handoff/schema.neo4j.json +0 -0
  81. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/schema-uml.drawio +0 -0
  82. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/schema.neo4j.json +0 -0
  83. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/flask/README.md +0 -0
  84. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/flask/examples/celery/README.md +0 -0
  85. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/flask/requirements-skip/README.md +0 -0
  86. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/flask/src/flask/sansio/README.md +0 -0
  87. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/requests/LICENSE +0 -0
  88. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/requests/NOTICE +0 -0
  89. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/requests/README.md +0 -0
  90. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/requests/docs/_themes/LICENSE +0 -0
  91. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/requests/ext/LICENSE +0 -0
  92. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/xarray/LICENSE +0 -0
  93. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/xarray/README.md +0 -0
  94. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/xarray/properties/README.md +0 -0
  95. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/xarray/xarray/datatree_/LICENSE +0 -0
  96. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/xarray/xarray/datatree_/README.md +0 -0
  97. {codeanalyzer_python-1.5.0 → codeanalyzer_python-1.5.1}/test/fixtures/whole_applications/xarray/xarray/datatree_/docs/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codeanalyzer-python
3
- Version: 1.5.0
3
+ Version: 1.5.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
@@ -535,7 +535,8 @@ just populate more of the same tree:
535
535
  { "id": "can://<app>/@external/os/getcwd", "kind": "external",
536
536
  "name": "getcwd", "module": "os" }
537
537
  },
538
- "param_in": [ { "src": "can://…/main(a)@6:4/actual_in:0", "dst": "can://…/helper(x)@formal_in:0" } ],
538
+ "param_in": [ { "src": "can://…/main(a)@6:4/actual_in:0", "dst": "can://…/helper(x)@formal_in:0",
539
+ "var": "x" } ], // var = the callee formal
539
540
  "param_out": [ { "src": "can://…/helper(x)@formal_out", "dst": "can://…/main(a)@6:4/actual_out" } ]
540
541
  }
541
542
  }
@@ -502,7 +502,8 @@ just populate more of the same tree:
502
502
  { "id": "can://<app>/@external/os/getcwd", "kind": "external",
503
503
  "name": "getcwd", "module": "os" }
504
504
  },
505
- "param_in": [ { "src": "can://…/main(a)@6:4/actual_in:0", "dst": "can://…/helper(x)@formal_in:0" } ],
505
+ "param_in": [ { "src": "can://…/main(a)@6:4/actual_in:0", "dst": "can://…/helper(x)@formal_in:0",
506
+ "var": "x" } ], // var = the callee formal
506
507
  "param_out": [ { "src": "can://…/helper(x)@formal_out", "dst": "can://…/main(a)@6:4/actual_out" } ]
507
508
  }
508
509
  }
@@ -565,6 +565,7 @@ def emit_l4(
565
565
  edge = ParamEdge(
566
566
  src=src_im.global_id(e.source_node),
567
567
  dst=dst_im.global_id(e.target_node),
568
+ var=e.var,
568
569
  )
569
570
  (app.param_in if e.type == "PARAM_IN" else app.param_out).append(edge)
570
571
 
@@ -257,17 +257,23 @@ def _project_program_graphs(
257
257
  # endpoint functions' identity maps), so they land on the very PyBodyNode ids
258
258
  # projected above — a formal_in global id equals _global_ordinal(callee.id,
259
259
  # "@formal_in:0"). No dangling references.
260
+ # `var` (#195): the callee-side formal's variable, set on every edge by the
261
+ # SDG assembler and carried on `ParamEdge.var`. The catalog declared it and
262
+ # nothing wrote it, so `r.var` predicates went three-valued across every
263
+ # call boundary.
260
264
  for e in app.param_in or []:
261
265
  b.edge(
262
266
  "PY_PARAM_IN",
263
267
  NodeRef("PyBodyNode", "id", e.src),
264
268
  NodeRef("PyBodyNode", "id", e.dst),
269
+ prune({"var": e.var}),
265
270
  )
266
271
  for e in app.param_out or []:
267
272
  b.edge(
268
273
  "PY_PARAM_OUT",
269
274
  NodeRef("PyBodyNode", "id", e.src),
270
275
  NodeRef("PyBodyNode", "id", e.dst),
276
+ prune({"var": e.var}),
271
277
  )
272
278
 
273
279
 
@@ -171,7 +171,12 @@ class SummaryEdge(BaseModel):
171
171
 
172
172
  @builder
173
173
  class ParamEdge(BaseModel):
174
+ """A `param_in` (actual_in → formal_in) or `param_out` (formal_out → actual_out)
175
+ edge at application scope. `var` is the callee-side formal's variable — the
176
+ parameter name, or `<return>` for the return port — always set (#195), the
177
+ same value codeanalyzer-typescript carries on its `param_in[].var`."""
174
178
  src: str; dst: str
179
+ var: Optional[str] = None
175
180
 
176
181
 
177
182
  @builder
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "codeanalyzer-python"
3
- version = "1.5.0"
3
+ version = "1.5.1"
4
4
  description = "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
  readme = "README.md"
6
6
  authors = [