coltrace 0.1.0.dev6__tar.gz → 0.1.0.dev8__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 (148) hide show
  1. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/PKG-INFO +57 -27
  2. coltrace-0.1.0.dev6/src/coltrace.egg-info/PKG-INFO → coltrace-0.1.0.dev8/README.md +313 -309
  3. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/backlog.md +92 -71
  4. coltrace-0.1.0.dev8/docs/compatibility-checkpoint.md +224 -0
  5. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/decisions.md +82 -61
  6. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/lineage-json.md +269 -223
  7. coltrace-0.1.0.dev8/docs/supported-patterns.md +518 -0
  8. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/troubleshooting.md +151 -93
  9. coltrace-0.1.0.dev8/examples/databricks_project/README.md +38 -0
  10. coltrace-0.1.0.dev8/examples/databricks_project/main_orchestrator.py +29 -0
  11. coltrace-0.1.0.dev8/examples/databricks_project/pipeline_a/extract/__init__.py +0 -0
  12. coltrace-0.1.0.dev8/examples/databricks_project/pipeline_a/extract/primary_extract.py +26 -0
  13. coltrace-0.1.0.dev8/examples/databricks_project/pipeline_a/extract/quality_extract.py +43 -0
  14. coltrace-0.1.0.dev8/examples/databricks_project/pipeline_a/main_orchestrator.py +34 -0
  15. coltrace-0.1.0.dev8/examples/databricks_project/pipeline_a/publish/__init__.py +0 -0
  16. coltrace-0.1.0.dev8/examples/databricks_project/pipeline_a/publish/serialize_webapp.py +19 -0
  17. coltrace-0.1.0.dev8/examples/databricks_project/pipeline_a/transform/__init__.py +0 -0
  18. coltrace-0.1.0.dev8/examples/databricks_project/pipeline_a/transform/priority_rank.py +21 -0
  19. coltrace-0.1.0.dev8/examples/databricks_project/shared/__init__.py +0 -0
  20. coltrace-0.1.0.dev8/examples/databricks_project/shared/config.py +8 -0
  21. coltrace-0.1.0.dev8/examples/databricks_project/shared/token_tracker.py +20 -0
  22. coltrace-0.1.0.dev8/examples/databricks_project/shared/topic_changes_extract.py +30 -0
  23. coltrace-0.1.0.dev8/examples/databricks_project/shared/warehouse.py +22 -0
  24. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/notebook_cell.py +186 -159
  25. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/pyproject.toml +54 -48
  26. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/__init__.py +22 -22
  27. coltrace-0.1.0.dev8/src/coltrace/analysis.py +8290 -0
  28. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/cli.py +723 -710
  29. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/compatibility.py +310 -172
  30. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/exporters.py +14 -2
  31. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/graph.py +93 -18
  32. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/journey.py +646 -587
  33. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/lineage_models.py +122 -115
  34. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/models.py +92 -92
  35. coltrace-0.1.0.dev8/src/coltrace/notebooks.py +253 -0
  36. coltrace-0.1.0.dev8/src/coltrace/pandas_api.py +1052 -0
  37. coltrace-0.1.0.dev8/src/coltrace/py.typed +0 -0
  38. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/scanner.py +430 -288
  39. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/sql_sources.py +561 -355
  40. coltrace-0.1.0.dev6/README.md → coltrace-0.1.0.dev8/src/coltrace.egg-info/PKG-INFO +338 -282
  41. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace.egg-info/SOURCES.txt +24 -0
  42. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_conditional_flow.py +354 -332
  43. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_database_sources.py +296 -287
  44. coltrace-0.1.0.dev8/tests/integration/test_databricks_example.py +280 -0
  45. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_lineage_acceptance.py +303 -253
  46. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_notebook_reporting.py +109 -77
  47. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_pandas_boundaries.py +328 -328
  48. coltrace-0.1.0.dev8/tests/integration/test_production_patterns.py +293 -0
  49. coltrace-0.1.0.dev8/tests/integration/test_project_compatibility.py +458 -0
  50. coltrace-0.1.0.dev8/tests/integration/test_public_project_patterns.py +285 -0
  51. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_sql_reader_boundaries.py +321 -300
  52. coltrace-0.1.0.dev8/tests/integration/test_sql_templates.py +310 -0
  53. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_analysis.py +498 -463
  54. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_compatibility.py +1 -1
  55. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_exporters.py +1 -1
  56. coltrace-0.1.0.dev8/tests/unit/test_notebooks.py +91 -0
  57. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_source_models.py +1 -1
  58. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_source_presentation.py +118 -116
  59. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_sql_sources.py +69 -0
  60. coltrace-0.1.0.dev6/docs/compatibility-checkpoint.md +0 -88
  61. coltrace-0.1.0.dev6/docs/supported-patterns.md +0 -257
  62. coltrace-0.1.0.dev6/src/coltrace/analysis.py +0 -3805
  63. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/LICENSE +0 -0
  64. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/MANIFEST.in +0 -0
  65. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/accuracy.md +0 -0
  66. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/architecture.md +0 -0
  67. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/column-history.md +0 -0
  68. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/column-journey-checkpoint.md +0 -0
  69. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/database-patterns.md +0 -0
  70. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/database-sources.md +0 -0
  71. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/discovery-json.md +0 -0
  72. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/graph-workspace-checkpoint.md +0 -0
  73. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/history-checkpoint.md +0 -0
  74. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/mvp-checkpoint.md +0 -0
  75. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/nlp-checkpoint.md +0 -0
  76. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/other-column-checkpoint.md +0 -0
  77. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/pandas-sources-proposal.md +0 -0
  78. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/phase-1.md +0 -0
  79. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/read-capture.md +0 -0
  80. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/docs/source-checkpoint.md +0 -0
  81. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/database_pipeline/README.md +0 -0
  82. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/database_pipeline/build_query.py +0 -0
  83. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/database_pipeline/pipeline.py +0 -0
  84. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/database_pipeline/pyproject.toml +0 -0
  85. /coltrace-0.1.0.dev6/src/coltrace/py.typed → /coltrace-0.1.0.dev8/examples/databricks_project/pipeline_a/__init__.py +0 -0
  86. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/pricing_pipeline/extract/prices.py +0 -0
  87. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/pricing_pipeline/features/pricing.py +0 -0
  88. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/pricing_pipeline/pipeline.py +0 -0
  89. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/pricing_pipeline/transform/pricing.py +0 -0
  90. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/read_capture/README.md +0 -0
  91. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/read_capture/project/input.csv +0 -0
  92. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/read_capture/project/pipeline.py +0 -0
  93. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/read_capture/run_capture.py +0 -0
  94. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/robustness_pipeline/README.md +0 -0
  95. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/robustness_pipeline/extract.py +0 -0
  96. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/robustness_pipeline/pipeline.py +0 -0
  97. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/robustness_pipeline/transform.py +0 -0
  98. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/sample_pipeline/prices.py +0 -0
  99. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/text_pipeline/README.md +0 -0
  100. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/text_pipeline/pipeline.py +0 -0
  101. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/text_pipeline/processing.py +0 -0
  102. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/text_pipeline/readers.py +0 -0
  103. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/examples/text_pipeline/text.py +0 -0
  104. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/setup.cfg +0 -0
  105. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/__main__.py +0 -0
  106. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/callbacks.py +0 -0
  107. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/capture.py +0 -0
  108. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/collector.py +0 -0
  109. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/history.py +0 -0
  110. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/nosql_sources.py +0 -0
  111. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/source_models.py +0 -0
  112. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/source_readers.py +0 -0
  113. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/templates/graph.html +0 -0
  114. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace/visual_layout.py +0 -0
  115. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace.egg-info/dependency_links.txt +0 -0
  116. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace.egg-info/entry_points.txt +0 -0
  117. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace.egg-info/requires.txt +0 -0
  118. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/src/coltrace.egg-info/top_level.txt +0 -0
  119. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/fixtures/sample_pipeline/extract/prices.py +0 -0
  120. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/fixtures/sample_pipeline/features/pricing.py +0 -0
  121. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/fixtures/sample_pipeline/pipeline.py +0 -0
  122. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/fixtures/sample_pipeline/transform/pricing.py +0 -0
  123. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_annotation_effects.py +0 -0
  124. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_callback_roles.py +0 -0
  125. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_capture_workflow.py +0 -0
  126. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_cli.py +0 -0
  127. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_column_story.py +0 -0
  128. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_compatibility_cli.py +0 -0
  129. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_journey_boundaries.py +0 -0
  130. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_nosql_extraction.py +0 -0
  131. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_other_column_stories.py +0 -0
  132. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_pandas_observation.py +0 -0
  133. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_reader_inventory.py +0 -0
  134. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_resolution_boundaries.py +0 -0
  135. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_scan_project.py +0 -0
  136. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_source_config.py +0 -0
  137. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_source_precision.py +0 -0
  138. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/integration/test_text_pipeline.py +0 -0
  139. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_callbacks.py +0 -0
  140. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_collector.py +0 -0
  141. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_graph.py +0 -0
  142. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_graph_workspace.py +0 -0
  143. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_history.py +0 -0
  144. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_journey.py +0 -0
  145. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_nosql_sources.py +0 -0
  146. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_read_capture.py +0 -0
  147. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_scanner.py +0 -0
  148. {coltrace-0.1.0.dev6 → coltrace-0.1.0.dev8}/tests/unit/test_visual_layout.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coltrace
3
- Version: 0.1.0.dev6
3
+ Version: 0.1.0.dev8
4
4
  Summary: Static Pandas column lineage, impact analysis, and local dependency graphs
5
5
  Author: Cristiano Diniz
6
6
  License-Expression: MIT
@@ -32,7 +32,7 @@ column versions across direct function calls. Static scanning never imports or
32
32
  executes the project or reads its input data. Optional read capture observes
33
33
  column labels while you explicitly execute your own pipeline.
34
34
 
35
- **Development preview: `0.1.0.dev6`.** The supported subset is deliberately small.
35
+ **Development preview: `0.1.0.dev8`.** The supported subset is deliberately small.
36
36
  Unsupported operations produce diagnostics and may interrupt lineage. A graph
37
37
  with no edge is not proof that a dependency does not exist.
38
38
 
@@ -58,10 +58,13 @@ separate release step; these commands install the local project.
58
58
 
59
59
  The source checkpoint recognizes supported SQL-to-Pandas and NoSQL-to-Pandas
60
60
  extractions. Literal SQL projections, aliases and expressions describe source
61
- fields before their first Python use. Query filters are control metadata rather
62
- than value dependencies of every output. The supplied
63
- `spark.sql(build_query(table)).toPandas()` pattern works with a resolved Spark
64
- session or an explicit source contract for an injected session.
61
+ fields before their first Python use. Every database column the SQL reads is a
62
+ selectable lineage node (`origin="table"`), so a column used only inside
63
+ `SUM(...)` or a `WHERE` clause can be traced to the DataFrame columns it feeds.
64
+ Query filters are control metadata rather than value dependencies of every
65
+ output. `spark.sql(build_query(table)).toPandas()` keeps its SQL text even with
66
+ an injected, unresolved session; SQL assembled from f-strings, `.format`, `%`
67
+ and joins keeps its known text, with unknown parts shown as `{expression}`.
65
68
 
66
69
  `report.readers` inventories resolved `pd.read_*` calls with file, line, context,
67
70
  return shape and resulting DataFrame identity. File schemas are unknown unless
@@ -91,22 +94,37 @@ See [database source usage](docs/database-sources.md), the
91
94
  [executable capture example](examples/read_capture/README.md).
92
95
  The [source checkpoint](docs/source-checkpoint.md) records validation and limits.
93
96
 
94
- ## Common Python scaffolding
95
-
96
- The dev6 checkpoint preserves independent DataFrame lineage across ordinary
97
- type annotations and unrelated configuration expressions. It supports bounded
98
- `copy(deep=True)`, `head(n)` and immutable `shape` observations.
99
-
100
- Selected `if`, `try`, `with` and loop paths are inspected independently. Facts
101
- from uncertain paths have inferred evidence. Mutated pre-existing frames and
102
- incompatible bindings remain explicit join boundaries; general path merging is
103
- not claimed. This makes previously skipped reads visible without treating every
104
- alternative as confirmed execution. Static scanning still executes no project
105
- code. See the [compatibility checkpoint](docs/compatibility-checkpoint.md) and
97
+ ## Notebook projects and common Python structure
98
+
99
+ Databricks notebook source (`# Databricks notebook source`, `# COMMAND ----------`,
100
+ `# MAGIC`) and raw magics such as `%pip` are parsed with the magics neutralized
101
+ in place. `%run ./child` includes the child notebook in the caller's namespace,
102
+ statically. Nothing is executed. `.ipynb` files and live cells are not inputs.
103
+
104
+ Branches, `try` blocks, loops and early returns are joined: a column that may
105
+ hold different values after alternative paths gets an inferred merge version
106
+ reading each possibility, so lineage continues without being claimed as
107
+ confirmed. Loops over configured label collections (`for c in COLS`) are
108
+ unrolled exactly. Classes, nested functions and closures, decorators,
109
+ `*args/**kwargs`, `+=`, unpacking, comprehensions and ternaries are interpreted
110
+ rather than erasing state.
111
+
112
+ A documented catalog of Pandas/NumPy semantics covers common Series methods and
113
+ accessors, `np.where`/`pd.to_numeric`-style functions, row-selecting DataFrame
114
+ methods (`sort_values`, `head`, `reset_index`, `query`, …), whole-frame value
115
+ methods (`fillna`, `astype`, …), partial `.loc[mask, col]` updates and
116
+ `merge`/`concat` (inferred). When data enters through an injected helper such as
117
+ `run_query(sql)`, ColTrace follows the closure when possible; otherwise, a result
118
+ used as a DataFrame becomes an inferred frame whose SQL SELECT list seeds its
119
+ columns, and the scan suggests a source contract to confirm it.
120
+
121
+ See the [compatibility checkpoint](docs/compatibility-checkpoint.md), the
122
+ [Databricks-style example](examples/databricks_project/README.md) and the
106
123
  [multi-module example](examples/robustness_pipeline/README.md).
107
124
 
108
125
  Notebook output separates discovered files from modeled frames/columns, shows
109
- configuration and versions, prints errors first, and saves full diagnostics
126
+ configuration and versions, prints errors first, separates informational notes
127
+ (inferences) from warnings, and saves full diagnostics outside the analyzed tree
110
128
  before attempting column selection. Listed static labels are not runtime
111
129
  `df.columns`. Capture remains opt-in.
112
130
 
@@ -206,20 +224,25 @@ the shortest eligible distance, so a node reached both ways appears as direct.
206
224
  | --- | --- |
207
225
  | Explicit Pandas imports and aliases | Recognized origins; names such as `df` alone are insufficient |
208
226
  | Resolved `pd.read_*` calls | Located inventory; supported DataFrame readers plus explicit/observed source schemas; iterators/collections remain distinct |
209
- | SQL-to-Pandas extraction | Bounded SQL projections, aliases, expressions and helpers; documented readers/conversions or explicit contracts |
227
+ | SQL-to-Pandas extraction | Bounded SQL projections, aliases, expressions and helpers; documented readers/conversions or explicit contracts; database columns as nodes; dialect fallback |
210
228
  | MongoDB / DynamoDB extraction | Literal projections and bounded Mongo expressions; candidate fields stay partial without observed schema |
211
229
  | Literal dictionary `DataFrame` construction | String column keys and literal values |
212
- | `frame["column"]`, `frame.loc[:, "column"]` | Single literal string labels, all rows |
213
- | `frame["c"] = frame["a"] + frame["b"]` | Arithmetic, scalar constants, temporary values, versions |
230
+ | `frame["column"]`, `frame.loc[:, "column"]` | Literal or statically known labels (`for c in COLS`, f-strings) |
231
+ | `frame["c"] = frame["a"] + frame["b"]` | Arithmetic, masks, ternaries, scalar constants, temporary values, versions |
214
232
  | `alias = frame` | Same abstract object and shared mutation |
215
233
  | `copy(deep=True)`, `head(n)`, `shape` | Bounded independent copies, row previews and immutable metadata observations |
216
- | Selected conditional/exception/context blocks | Separate inferred paths; explicit uncertainty at joins |
234
+ | Conditional/exception/context/loop blocks, early returns | Separate inferred paths joined with inferred merge versions |
235
+ | Databricks notebook source, `%pip`, `%run` | Magics neutralized; `%run` included statically in the caller namespace |
236
+ | Series/DataFrame/NumPy catalog | Documented derivations, row selections, value methods, exports; see the subset |
237
+ | `merge`, `join`, `concat` | Inferred frame whose columns may come from any input |
238
+ | Classes, closures, decorators, unpacking | Interpreted; decorators assumed transparent (inferred) |
239
+ | Injected `run_query(sql)` helpers | Followed through closures, or inferred from DataFrame use with SQL columns |
217
240
  | `rename(columns={"old": "new"})` | Literal, non-colliding map; new DataFrame, or shared mutation with `inplace=True` |
218
241
  | `assign(b=lambda x: x["a"] * 2)` | Sequential simple lambdas; eager arguments use their original scope |
219
242
  | `Series.apply(clean_text)` | Resolved scalar callbacks; bounded summaries and inferred evidence |
220
243
  | `frame[["a", "b"]] = DataFrame(results.tolist(), index=frame.index)` | Fixed callback output width and matching source index |
221
244
  | `dropna`, literal projection, boolean row filters | Preserve value lineage; predicate consumption tracked separately |
222
- | `to_parquet` / `to_csv` | Located export consumption with literal options |
245
+ | `to_parquet`, `to_csv`, `to_excel`, `to_dict`, … | Located export/serialization consumption |
223
246
  | Direct synchronous function calls | Explicit arguments/returns, bounded acyclic contexts and explicit imports |
224
247
  | Annotated, uncalled functions | Separate inferred templates, not evidence of pipeline connections |
225
248
 
@@ -268,7 +291,7 @@ print(report.to_json())
268
291
 
269
292
  The earlier `scan_project` API remains available for raw occurrences and receiver
270
293
  evidence. Its discovery report (`0.1`) is a different format from the lineage
271
- snapshot (`0.4`). See [discovery JSON](docs/discovery-json.md) and
294
+ snapshot (`0.5`). See [discovery JSON](docs/discovery-json.md) and
272
295
  [lineage JSON](docs/lineage-json.md). Public facts are dataclasses; their serialized
273
296
  form is independent of NetworkX and contains no AST or executable objects.
274
297
 
@@ -283,8 +306,15 @@ exclude = ["generated", "legacy/*.py", "*_test.py"]
283
306
 
284
307
  Glob patterns match case-sensitive, project-relative POSIX paths. Patterns with
285
308
  no `/` also match individual path components. Built-in exclusions cover `.venv`,
286
- `venv`, `.git`, `__pycache__`, `.coltrace`, pytest/mypy/Ruff caches, `build`, and
287
- `dist`. Linked files/directories and Windows reparse points are skipped.
309
+ `venv`, `.git`, `__pycache__`, `.coltrace`, `.ipynb_checkpoints`, `node_modules`,
310
+ tox/nox and pytest/mypy/Ruff caches, `build`, and `dist`. Linked files/directories
311
+ and Windows reparse points are skipped. A `.coltraceignore` file at the analyzed
312
+ root uses gitignore syntax (root-level subset, including `!` negation). The root
313
+ `.gitignore` is also applied unless `respect_gitignore = false` is set.
314
+ `sql_dialect = "bigquery"` names the dialect of SQL text whose reader does not;
315
+ text that does not parse is still retried in common dialects and reported.
316
+ `observers = ["notify_team", "client.*"]` declares project helpers that only read
317
+ the DataFrames they receive, so they do not interrupt lineage.
288
318
  `ScanConfig(exclude=("generated",))` overrides TOML settings and extends built-ins.
289
319
 
290
320
  ## Development