codmap 0.0.24__tar.gz → 0.0.25__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 (157) hide show
  1. {codmap-0.0.24/codmap.egg-info → codmap-0.0.25}/PKG-INFO +2 -2
  2. {codmap-0.0.24 → codmap-0.0.25}/README.md +1 -1
  3. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/behavior.py +5 -1
  4. {codmap-0.0.24 → codmap-0.0.25/codmap.egg-info}/PKG-INFO +2 -2
  5. {codmap-0.0.24 → codmap-0.0.25}/codmap.egg-info/SOURCES.txt +1 -0
  6. {codmap-0.0.24 → codmap-0.0.25}/pyproject.toml +1 -1
  7. codmap-0.0.25/tests/test_r1c75_reexported_class_calls.py +58 -0
  8. {codmap-0.0.24 → codmap-0.0.25}/LICENSE +0 -0
  9. {codmap-0.0.24 → codmap-0.0.25}/codemap/__init__.py +0 -0
  10. {codmap-0.0.24 → codmap-0.0.25}/codemap/apidiff.py +0 -0
  11. {codmap-0.0.24 → codmap-0.0.25}/codemap/arch.py +0 -0
  12. {codmap-0.0.24 → codmap-0.0.25}/codemap/cli.py +0 -0
  13. {codmap-0.0.24 → codmap-0.0.25}/codemap/diagnostics.py +0 -0
  14. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/__init__.py +0 -0
  15. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/attrflow.py +0 -0
  16. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/dataflow.py +0 -0
  17. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/dispatch.py +0 -0
  18. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/griffe_extractor.py +0 -0
  19. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/gsource.py +0 -0
  20. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/probe.py +0 -0
  21. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/roots.py +0 -0
  22. {codmap-0.0.24 → codmap-0.0.25}/codemap/extract/union.py +0 -0
  23. {codmap-0.0.24 → codmap-0.0.25}/codemap/freshness.py +0 -0
  24. {codmap-0.0.24 → codmap-0.0.25}/codemap/incremental.py +0 -0
  25. {codmap-0.0.24 → codmap-0.0.25}/codemap/integrations/__init__.py +0 -0
  26. {codmap-0.0.24 → codmap-0.0.25}/codemap/integrations/base.py +0 -0
  27. {codmap-0.0.24 → codmap-0.0.25}/codemap/integrations/cocoindex.py +0 -0
  28. {codmap-0.0.24 → codmap-0.0.25}/codemap/integrations/gate.py +0 -0
  29. {codmap-0.0.24 → codmap-0.0.25}/codemap/integrations/gitnexus.py +0 -0
  30. {codmap-0.0.24 → codmap-0.0.25}/codemap/integrations/registry.py +0 -0
  31. {codmap-0.0.24 → codmap-0.0.25}/codemap/integrations/transport.py +0 -0
  32. {codmap-0.0.24 → codmap-0.0.25}/codemap/model.py +0 -0
  33. {codmap-0.0.24 → codmap-0.0.25}/codemap/provenance.py +0 -0
  34. {codmap-0.0.24 → codmap-0.0.25}/codemap/query.py +0 -0
  35. {codmap-0.0.24 → codmap-0.0.25}/codemap/scope.py +0 -0
  36. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/__init__.py +0 -0
  37. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/_scip_pb2.py +0 -0
  38. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/api_surface.py +0 -0
  39. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/apidiff.py +0 -0
  40. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/architecture.py +0 -0
  41. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/audit.py +0 -0
  42. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/check.py +0 -0
  43. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/ctags.py +0 -0
  44. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/currency.py +0 -0
  45. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/impact.py +0 -0
  46. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/limits.py +0 -0
  47. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/livingdocs.py +0 -0
  48. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/mcp_server.py +0 -0
  49. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/mermaid.py +0 -0
  50. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/pack.py +0 -0
  51. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/rag.py +0 -0
  52. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/review.py +0 -0
  53. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/scip.py +0 -0
  54. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/semantic.py +0 -0
  55. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/server.py +0 -0
  56. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/session.py +0 -0
  57. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/subsystems.py +0 -0
  58. {codmap-0.0.24 → codmap-0.0.25}/codemap/serve/vault.py +0 -0
  59. {codmap-0.0.24 → codmap-0.0.25}/codemap/store.py +0 -0
  60. {codmap-0.0.24 → codmap-0.0.25}/codemap/tomlio.py +0 -0
  61. {codmap-0.0.24 → codmap-0.0.25}/codemap/watch.py +0 -0
  62. {codmap-0.0.24 → codmap-0.0.25}/codmap.egg-info/dependency_links.txt +0 -0
  63. {codmap-0.0.24 → codmap-0.0.25}/codmap.egg-info/entry_points.txt +0 -0
  64. {codmap-0.0.24 → codmap-0.0.25}/codmap.egg-info/requires.txt +0 -0
  65. {codmap-0.0.24 → codmap-0.0.25}/codmap.egg-info/top_level.txt +0 -0
  66. {codmap-0.0.24 → codmap-0.0.25}/setup.cfg +0 -0
  67. {codmap-0.0.24 → codmap-0.0.25}/tests/test_epistemic.py +0 -0
  68. {codmap-0.0.24 → codmap-0.0.25}/tests/test_gitnexus_router.py +0 -0
  69. {codmap-0.0.24 → codmap-0.0.25}/tests/test_impact_depth.py +0 -0
  70. {codmap-0.0.24 → codmap-0.0.25}/tests/test_integrations.py +0 -0
  71. {codmap-0.0.24 → codmap-0.0.25}/tests/test_issue3_serve_freshness.py +0 -0
  72. {codmap-0.0.24 → codmap-0.0.25}/tests/test_livingdocs.py +0 -0
  73. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m0_api_surface.py +0 -0
  74. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m11_argcontract.py +0 -0
  75. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m12_dataflow.py +0 -0
  76. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m15_review.py +0 -0
  77. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m16_architecture.py +0 -0
  78. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m17_mcp.py +0 -0
  79. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m18_freshness.py +0 -0
  80. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m1_5_semantics.py +0 -0
  81. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m1_query.py +0 -0
  82. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m2_views.py +0 -0
  83. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m32_watch.py +0 -0
  84. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m3_serve.py +0 -0
  85. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m4_behavior.py +0 -0
  86. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m5_deep.py +0 -0
  87. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m6_repo_scope.py +0 -0
  88. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m7_dispatch.py +0 -0
  89. {codmap-0.0.24 → codmap-0.0.25}/tests/test_m9_family.py +0 -0
  90. {codmap-0.0.24 → codmap-0.0.25}/tests/test_pack_honesty.py +0 -0
  91. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c13_callgraph_accuracy.py +0 -0
  92. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c13_grep_vs_graph.py +0 -0
  93. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c16_semantic.py +0 -0
  94. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c20_attribute_edges.py +0 -0
  95. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c21_flat_layout.py +0 -0
  96. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c22_source_visible_refs.py +0 -0
  97. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c23_hard_python.py +0 -0
  98. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c24_test_mapping.py +0 -0
  99. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c25_provenance.py +0 -0
  100. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c26_deep_union.py +0 -0
  101. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c27_config_honesty.py +0 -0
  102. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c28_limit_envelope.py +0 -0
  103. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c29_lazy_imports.py +0 -0
  104. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c2_ctags.py +0 -0
  105. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c30_local_import_calls.py +0 -0
  106. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c30f1_reexport_calls.py +0 -0
  107. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c30f2_check_scope.py +0 -0
  108. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c31_path_origin.py +0 -0
  109. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c32_report_json.py +0 -0
  110. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c33_query_signature.py +0 -0
  111. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c34_signature_kinds.py +0 -0
  112. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c35_contract_location.py +0 -0
  113. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c36_target_resolution.py +0 -0
  114. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c37_rule_mutation.py +0 -0
  115. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c38_tool_drift.py +0 -0
  116. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c39_edge_resolution.py +0 -0
  117. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c3_arch_contract.py +0 -0
  118. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c3_dogfood.py +0 -0
  119. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c40_flow_reach.py +0 -0
  120. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c41_scope_membership.py +0 -0
  121. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c42_deep_tier_stability.py +0 -0
  122. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c43_incremental_splice.py +0 -0
  123. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c44_absent_answers.py +0 -0
  124. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c45_repeat_union.py +0 -0
  125. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c46_shadowed_definitions.py +0 -0
  126. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c47_incremental_resample.py +0 -0
  127. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c48_type_checking_imports.py +0 -0
  128. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c49_type_only_cycles.py +0 -0
  129. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c4_complexity.py +0 -0
  130. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c50_flow_entry_points.py +0 -0
  131. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c53_narrowing_declared.py +0 -0
  132. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c54_deterministic_rendering.py +0 -0
  133. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c55_override_grade.py +0 -0
  134. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c56_stub_files.py +0 -0
  135. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c57_facade_package.py +0 -0
  136. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c58_cycle_tangles.py +0 -0
  137. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c59_completeness_drop.py +0 -0
  138. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c5_apidiff.py +0 -0
  139. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c60_nested_definitions.py +0 -0
  140. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c62_phantom_rules.py +0 -0
  141. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c63_answer_format.py +0 -0
  142. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c64_dependency_probe.py +0 -0
  143. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c66_pack_direction.py +0 -0
  144. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c68_dotted_imports.py +0 -0
  145. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c69_contract_validation.py +0 -0
  146. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c6_pack.py +0 -0
  147. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c70_check_graph_currency.py +0 -0
  148. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c71_attribute_chain_calls.py +0 -0
  149. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c72_flat_inference_in_packages.py +0 -0
  150. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c73_cli_version.py +0 -0
  151. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c74_call_site_conservation.py +0 -0
  152. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c7_edge_vocab.py +0 -0
  153. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c8_deadcode.py +0 -0
  154. {codmap-0.0.24 → codmap-0.0.25}/tests/test_r1c9_incremental.py +0 -0
  155. {codmap-0.0.24 → codmap-0.0.25}/tests/test_scip_export.py +0 -0
  156. {codmap-0.0.24 → codmap-0.0.25}/tests/test_scope.py +0 -0
  157. {codmap-0.0.24 → codmap-0.0.25}/tests/test_subsystems.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codmap
3
- Version: 0.0.24
3
+ Version: 0.0.25
4
4
  Summary: Static analyzer that turns a package's source into a queryable code graph.
5
5
  Author-email: kogriv <kogriv@gmail.com>
6
6
  License-Expression: MIT
@@ -44,7 +44,7 @@ and a **SCIP index** for interop with Sourcegraph / Glean and other precise-code
44
44
 
45
45
  [![CI](https://github.com/kogriv/codemap/actions/workflows/ci.yml/badge.svg)](https://github.com/kogriv/codemap/actions/workflows/ci.yml)
46
46
 
47
- **Status:** 🟢 M0–M20 implemented + research track (R1/R2) — schema 0.13, **1128 tests with no failures on
47
+ **Status:** 🟢 M0–M20 implemented + research track (R1/R2) — schema 0.13, **1130 tests with no failures on
48
48
  Python 3.11–3.14** ([in CI](docs/ci.md): the full suite including the dogfood pass, a determinism check, a
49
49
  wheel smoke test, and ctags/SCIP interop against the real CLIs), warm serve surface with 31 ops (28 exposed
50
50
  as MCP tools), and SCIP export. See **[DESIGN.md](DESIGN.md)** (product design &
@@ -8,7 +8,7 @@ and a **SCIP index** for interop with Sourcegraph / Glean and other precise-code
8
8
 
9
9
  [![CI](https://github.com/kogriv/codemap/actions/workflows/ci.yml/badge.svg)](https://github.com/kogriv/codemap/actions/workflows/ci.yml)
10
10
 
11
- **Status:** 🟢 M0–M20 implemented + research track (R1/R2) — schema 0.13, **1128 tests with no failures on
11
+ **Status:** 🟢 M0–M20 implemented + research track (R1/R2) — schema 0.13, **1130 tests with no failures on
12
12
  Python 3.11–3.14** ([in CI](docs/ci.md): the full suite including the dogfood pass, a determinism check, a
13
13
  wheel smoke test, and ctags/SCIP interop against the real CLIs), warm serve surface with 31 ops (28 exposed
14
14
  as MCP tools), and SCIP export. See **[DESIGN.md](DESIGN.md)** (product design &
@@ -682,7 +682,11 @@ def _resolve(call, modpath, class_prefix, imports, modmembers, members, reexport
682
682
  tgt = imports[head]
683
683
  if not _is_internal(tgt, modpath):
684
684
  return f"{tgt}.{'.'.join(parts)}", "external"
685
- cur = tgt
685
+ # R1-C75 (design ``reexported_class_calls.md``): the head first. A class bound through
686
+ # a package re-export (`from pkg import Cls`) is no node under the package's name, so
687
+ # `Cls.method()` died on its first hop while `Cls()` resolved. Unchanged for a head that
688
+ # is a node or names no re-export.
689
+ cur = _follow_reexport(tgt, reexports or {}, nodes)
686
690
  for part in parts:
687
691
  cur = _follow_reexport(f"{cur}.{part}", reexports or {}, nodes)
688
692
  if len(parts) == 1 or cur in nodes:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codmap
3
- Version: 0.0.24
3
+ Version: 0.0.25
4
4
  Summary: Static analyzer that turns a package's source into a queryable code graph.
5
5
  Author-email: kogriv <kogriv@gmail.com>
6
6
  License-Expression: MIT
@@ -44,7 +44,7 @@ and a **SCIP index** for interop with Sourcegraph / Glean and other precise-code
44
44
 
45
45
  [![CI](https://github.com/kogriv/codemap/actions/workflows/ci.yml/badge.svg)](https://github.com/kogriv/codemap/actions/workflows/ci.yml)
46
46
 
47
- **Status:** 🟢 M0–M20 implemented + research track (R1/R2) — schema 0.13, **1128 tests with no failures on
47
+ **Status:** 🟢 M0–M20 implemented + research track (R1/R2) — schema 0.13, **1130 tests with no failures on
48
48
  Python 3.11–3.14** ([in CI](docs/ci.md): the full suite including the dogfood pass, a determinism check, a
49
49
  wheel smoke test, and ctags/SCIP interop against the real CLIs), warm serve surface with 31 ops (28 exposed
50
50
  as MCP tools), and SCIP export. See **[DESIGN.md](DESIGN.md)** (product design &
@@ -146,6 +146,7 @@ tests/test_r1c71_attribute_chain_calls.py
146
146
  tests/test_r1c72_flat_inference_in_packages.py
147
147
  tests/test_r1c73_cli_version.py
148
148
  tests/test_r1c74_call_site_conservation.py
149
+ tests/test_r1c75_reexported_class_calls.py
149
150
  tests/test_r1c7_edge_vocab.py
150
151
  tests/test_r1c8_deadcode.py
151
152
  tests/test_r1c9_incremental.py
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
  # version. README says this plainly, since `pip install codmap` / `import codemap` is a
10
10
  # seam a reader will otherwise hit by surprise.
11
11
  name = "codmap"
12
- version = "0.0.24"
12
+ version = "0.0.25"
13
13
  description = "Static analyzer that turns a package's source into a queryable code graph."
14
14
  readme = "README.md"
15
15
  # M20/D1: measured, not assumed. Each release of the declared range runs the full suite in
@@ -0,0 +1,58 @@
1
+ """R1-C75 — a call through a class name that came in by a package re-export.
2
+
3
+ `from pkg.indicators import LibraryManager` + `LibraryManager.create_indicator()` was unresolved in the
4
+ fast tier, while the same call after a direct import of the defining module resolved, and so did a bare
5
+ `LibraryManager()` through the re-export. Design: docs/design/reexported_class_calls.md.
6
+ """
7
+ from codemap.extract import extract
8
+
9
+ FILES = {
10
+ "__init__.py": "",
11
+ "indicators/__init__.py": "from .library.manager import LibraryManager\n",
12
+ "indicators/library/__init__.py": "",
13
+ "indicators/library/manager.py": (
14
+ "class LibraryManager:\n"
15
+ " @classmethod\n def create_indicator(cls, name):\n return name\n\n"
16
+ " @staticmethod\n def load_all():\n return 1\n"),
17
+ "analysis/__init__.py": "",
18
+ "analysis/s/__init__.py": "",
19
+ "analysis/s/direct.py": (
20
+ "from ...indicators.library.manager import LibraryManager\n\n\n"
21
+ "def direct():\n return LibraryManager.create_indicator('x')\n"),
22
+ "analysis/s/viare.py": (
23
+ "from ...indicators import LibraryManager\n\n\n"
24
+ "def via_reexport():\n return LibraryManager.create_indicator('x'), LibraryManager.load_all()\n\n\n"
25
+ "def construct():\n return LibraryManager()\n"),
26
+ "analysis/s/absre.py": (
27
+ "from rpkg.indicators import LibraryManager\n\n\n"
28
+ "def absolute_reexport():\n return LibraryManager.create_indicator('x')\n"),
29
+ }
30
+ M = "rpkg.indicators.library.manager.LibraryManager"
31
+
32
+
33
+ def _graph(tmp_path):
34
+ root = tmp_path / "rpkg"
35
+ for rel, body in FILES.items():
36
+ p = root / rel
37
+ p.parent.mkdir(parents=True, exist_ok=True)
38
+ p.write_text(body)
39
+ return extract(str(root))
40
+
41
+
42
+ def _calls(g, src):
43
+ return sorted(e.target for e in g.edges if e.type == "calls" and e.source == src)
44
+
45
+
46
+ def test_a_method_of_a_reexported_class_resolves(tmp_path):
47
+ g = _graph(tmp_path)
48
+ assert _calls(g, "rpkg.analysis.s.viare.via_reexport") == [f"{M}.create_indicator", f"{M}.load_all"]
49
+ assert _calls(g, "rpkg.analysis.s.absre.absolute_reexport") == [f"{M}.create_indicator"]
50
+ for fn, n in (("viare.via_reexport", 2), ("absre.absolute_reexport", 1)):
51
+ c = g.nodes[f"rpkg.analysis.s.{fn}"].extras["calls"]
52
+ assert (c["resolved"], c["unresolved"]) == (n, 0)
53
+
54
+
55
+ def test_the_direct_import_and_the_bare_constructor_are_unchanged(tmp_path):
56
+ g = _graph(tmp_path)
57
+ assert _calls(g, "rpkg.analysis.s.direct.direct") == [f"{M}.create_indicator"]
58
+ assert _calls(g, "rpkg.analysis.s.viare.construct") == [M]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes