sql-glider 0.1.24__tar.gz → 0.1.26__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 (166) hide show
  1. {sql_glider-0.1.24 → sql_glider-0.1.26}/PKG-INFO +1 -1
  2. {sql_glider-0.1.24 → sql_glider-0.1.26}/docs/docs/graph-lineage.md +14 -8
  3. sql_glider-0.1.26/docs/docs/static/plotly-dash-example.png +0 -0
  4. {sql_glider-0.1.24 → sql_glider-0.1.26}/examples/plotly_viewer.py +12 -3
  5. sql_glider-0.1.26/graph.json +5319 -0
  6. sql_glider-0.1.26/lineage.json +0 -0
  7. sql_glider-0.1.26/mm.md +0 -0
  8. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/_version.py +2 -2
  9. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/cli.py +7 -3
  10. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/graph/diagram_formatters.py +141 -35
  11. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/graph/test_diagram_formatters.py +150 -24
  12. {sql_glider-0.1.24 → sql_glider-0.1.26}/.github/workflows/ci.yml +0 -0
  13. {sql_glider-0.1.24 → sql_glider-0.1.26}/.github/workflows/docs.yml +0 -0
  14. {sql_glider-0.1.24 → sql_glider-0.1.26}/.github/workflows/publish.yml +0 -0
  15. {sql_glider-0.1.24 → sql_glider-0.1.26}/.gitignore +0 -0
  16. {sql_glider-0.1.24 → sql_glider-0.1.26}/.python-version +0 -0
  17. {sql_glider-0.1.24 → sql_glider-0.1.26}/ARCHITECTURE.md +0 -0
  18. {sql_glider-0.1.24 → sql_glider-0.1.26}/CLAUDE.md +0 -0
  19. {sql_glider-0.1.24 → sql_glider-0.1.26}/LICENSE +0 -0
  20. {sql_glider-0.1.24 → sql_glider-0.1.26}/README.md +0 -0
  21. {sql_glider-0.1.24 → sql_glider-0.1.26}/docs/.github/workflows/docs.yml +0 -0
  22. {sql_glider-0.1.24 → sql_glider-0.1.26}/docs/docs/catalogs.md +0 -0
  23. {sql_glider-0.1.24 → sql_glider-0.1.26}/docs/docs/index.md +0 -0
  24. {sql_glider-0.1.24 → sql_glider-0.1.26}/docs/docs/static/sqlglider-logo-transparent.png +0 -0
  25. {sql_glider-0.1.24 → sql_glider-0.1.26}/docs/docs/templating.md +0 -0
  26. {sql_glider-0.1.24 → sql_glider-0.1.26}/docs/zensical.toml +0 -0
  27. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-05-column-level-lineage.md +0 -0
  28. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-05-reverse-lineage.md +0 -0
  29. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-06-config-file-support.md +0 -0
  30. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-06-graph-lineage.md +0 -0
  31. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-06-unify-single-multi-query.md +0 -0
  32. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-07-sample-data-model.md +0 -0
  33. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-07-sql-templating.md +0 -0
  34. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-08-tables-command.md +0 -0
  35. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-09-graph-query-paths.md +0 -0
  36. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-13-dissect-command.md +0 -0
  37. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2025-12-14-tables-pull-command.md +0 -0
  38. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2026-01-25-fix-union-lineage-chain.md +0 -0
  39. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2026-01-26-file-scoped-schema-context.md +0 -0
  40. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2026-01-28-sparksql-table-extraction.md +0 -0
  41. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2026-01-29-no-star-flag.md +0 -0
  42. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2026-01-29-resolve-schema.md +0 -0
  43. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2026-01-29-schema-pruning-optimization.md +0 -0
  44. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2026-01-29-tables-scrape-command.md +0 -0
  45. {sql_glider-0.1.24 → sql_glider-0.1.26}/plans/2026-02-02-diagram-output-formats.md +0 -0
  46. {sql_glider-0.1.24 → sql_glider-0.1.26}/pyproject.toml +0 -0
  47. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/README.md +0 -0
  48. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/business/expire_dim_customer.sql +0 -0
  49. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/business/load_fact_orders.sql +0 -0
  50. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/business/load_fact_payments.sql +0 -0
  51. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/business/merge_dim_customer.sql +0 -0
  52. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/business/merge_dim_product.sql +0 -0
  53. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/business/update_dim_customer_metrics.sql +0 -0
  54. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/complex/conditional_merge.sql +0 -0
  55. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/complex/cte_insert.sql +0 -0
  56. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/complex/multi_table_transform.sql +0 -0
  57. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/dim_customer.sql +0 -0
  58. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/dim_product.sql +0 -0
  59. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/fact_orders.sql +0 -0
  60. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/fact_payments.sql +0 -0
  61. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/raw_addresses.sql +0 -0
  62. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/raw_customers.sql +0 -0
  63. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/raw_order_items.sql +0 -0
  64. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/raw_orders.sql +0 -0
  65. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/raw_payments.sql +0 -0
  66. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/raw_products.sql +0 -0
  67. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/stg_customers.sql +0 -0
  68. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/stg_orders.sql +0 -0
  69. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/stg_payments.sql +0 -0
  70. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/ddl/stg_products.sql +0 -0
  71. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/incremental/incr_fact_orders.sql +0 -0
  72. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/incremental/incr_fact_payments.sql +0 -0
  73. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/incremental/incr_pres_sales_summary.sql +0 -0
  74. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/maintenance/delete_expired_customers.sql +0 -0
  75. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/maintenance/update_product_status.sql +0 -0
  76. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/presentation/load_pres_customer_360.sql +0 -0
  77. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/presentation/load_pres_customer_cohort.sql +0 -0
  78. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/presentation/load_pres_product_performance.sql +0 -0
  79. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/presentation/load_pres_sales_summary.sql +0 -0
  80. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/staging/load_stg_customers.sql +0 -0
  81. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/staging/load_stg_orders.sql +0 -0
  82. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/staging/load_stg_payments.sql +0 -0
  83. {sql_glider-0.1.24 → sql_glider-0.1.26}/sample_data_model/staging/load_stg_products.sql +0 -0
  84. {sql_glider-0.1.24 → sql_glider-0.1.26}/sqlglider.toml.example +0 -0
  85. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/__init__.py +0 -0
  86. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/catalog/__init__.py +0 -0
  87. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/catalog/base.py +0 -0
  88. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/catalog/databricks.py +0 -0
  89. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/catalog/registry.py +0 -0
  90. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/dissection/__init__.py +0 -0
  91. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/dissection/analyzer.py +0 -0
  92. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/dissection/formatters.py +0 -0
  93. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/dissection/models.py +0 -0
  94. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/global_models.py +0 -0
  95. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/graph/__init__.py +0 -0
  96. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/graph/builder.py +0 -0
  97. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/graph/formatters.py +0 -0
  98. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/graph/merge.py +0 -0
  99. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/graph/models.py +0 -0
  100. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/graph/query.py +0 -0
  101. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/graph/serialization.py +0 -0
  102. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/lineage/__init__.py +0 -0
  103. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/lineage/analyzer.py +0 -0
  104. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/lineage/formatters.py +0 -0
  105. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/schema/__init__.py +0 -0
  106. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/schema/extractor.py +0 -0
  107. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/templating/__init__.py +0 -0
  108. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/templating/base.py +0 -0
  109. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/templating/jinja.py +0 -0
  110. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/templating/registry.py +0 -0
  111. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/templating/variables.py +0 -0
  112. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/utils/__init__.py +0 -0
  113. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/utils/config.py +0 -0
  114. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/utils/file_utils.py +0 -0
  115. {sql_glider-0.1.24 → sql_glider-0.1.26}/src/sqlglider/utils/schema.py +0 -0
  116. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/__init__.py +0 -0
  117. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/multi_file_queries/analytics_pipeline.sql +0 -0
  118. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/multi_file_queries/analytics_pipeline_union_merge.sql +0 -0
  119. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/multi_file_queries/customers.sql +0 -0
  120. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/multi_file_queries/orders.sql +0 -0
  121. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/multi_file_queries/reports.sql +0 -0
  122. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/multi_file_queries/view_based_merge.sql +0 -0
  123. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_cte.sql +0 -0
  124. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_cte_query.sql +0 -0
  125. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_cte_view_star.sql +0 -0
  126. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_generated_column_query.sql +0 -0
  127. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_multi.sql +0 -0
  128. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_multi_query.sql +0 -0
  129. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_single_query.sql +0 -0
  130. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_subquery.sql +0 -0
  131. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_tables.sql +0 -0
  132. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_view.sql +0 -0
  133. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/original_queries/test_view_window_cte.sql +0 -0
  134. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/fixtures/sample_manifest.csv +0 -0
  135. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/__init__.py +0 -0
  136. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/catalog/__init__.py +0 -0
  137. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/catalog/test_base.py +0 -0
  138. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/catalog/test_databricks.py +0 -0
  139. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/catalog/test_registry.py +0 -0
  140. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/dissection/__init__.py +0 -0
  141. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/dissection/test_analyzer.py +0 -0
  142. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/dissection/test_formatters.py +0 -0
  143. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/dissection/test_models.py +0 -0
  144. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/graph/__init__.py +0 -0
  145. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/graph/test_builder.py +0 -0
  146. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/graph/test_formatters.py +0 -0
  147. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/graph/test_merge.py +0 -0
  148. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/graph/test_models.py +0 -0
  149. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/graph/test_query.py +0 -0
  150. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/graph/test_serialization.py +0 -0
  151. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/lineage/__init__.py +0 -0
  152. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/lineage/test_analyzer.py +0 -0
  153. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/lineage/test_formatters.py +0 -0
  154. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/schema/__init__.py +0 -0
  155. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/schema/test_extractor.py +0 -0
  156. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/templating/__init__.py +0 -0
  157. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/templating/test_base.py +0 -0
  158. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/templating/test_jinja.py +0 -0
  159. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/templating/test_registry.py +0 -0
  160. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/templating/test_variables.py +0 -0
  161. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/test_cli.py +0 -0
  162. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/utils/__init__.py +0 -0
  163. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/utils/test_config.py +0 -0
  164. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/utils/test_file_utils.py +0 -0
  165. {sql_glider-0.1.24 → sql_glider-0.1.26}/tests/sqlglider/utils/test_schema.py +0 -0
  166. {sql_glider-0.1.24 → sql_glider-0.1.26}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sql-glider
3
- Version: 0.1.24
3
+ Version: 0.1.26
4
4
  Summary: SQL Utility Toolkit for better understanding, use, and governance of your queries in a native environment.
5
5
  Project-URL: Homepage, https://github.com/rycowhi/sql-glider/
6
6
  Project-URL: Repository, https://github.com/rycowhi/sql-glider/
@@ -258,7 +258,7 @@ sqlglider graph query graph.json --downstream orders.order_total -f dot
258
258
  sqlglider graph query graph.json --upstream total_spent -f plotly
259
259
  ```
260
260
 
261
- Query diagrams include color-coded nodes and a legend:
261
+ Query diagrams include color-coded nodes, edge labels showing the source SQL file, and a legend:
262
262
 
263
263
  | Color | Meaning |
264
264
  |--------|---------|
@@ -266,6 +266,8 @@ Query diagrams include color-coded nodes and a legend:
266
266
  | Teal | Root node (no upstream dependencies) |
267
267
  | Violet | Leaf node (no downstream consumers) |
268
268
 
269
+ Each edge in the diagram is labeled with the SQL filename that defines that relationship, making it easy to trace data flow back to the source code.
270
+
269
271
  **Example:** Imagine a pipeline where a `revenue` report column draws from multiple sources through several transformation layers. Querying `--upstream revenue` would produce a diagram like this:
270
272
 
271
273
  ```mermaid
@@ -277,12 +279,12 @@ flowchart TD
277
279
  staging_orders_tax_amount["staging_orders.tax_amount"]
278
280
  mart_orders_total_usd["mart_orders.total_usd"]
279
281
  revenue["revenue"]
280
- raw_orders_amount --> staging_orders_subtotal
281
- raw_orders_tax --> staging_orders_tax_amount
282
- staging_orders_subtotal --> mart_orders_total_usd
283
- staging_orders_tax_amount --> mart_orders_total_usd
284
- raw_exchange_rates_rate --> mart_orders_total_usd
285
- mart_orders_total_usd --> revenue
282
+ raw_orders_amount -->|staging_orders.sql| staging_orders_subtotal
283
+ raw_orders_tax -->|staging_orders.sql| staging_orders_tax_amount
284
+ staging_orders_subtotal -->|mart_orders.sql| mart_orders_total_usd
285
+ staging_orders_tax_amount -->|mart_orders.sql| mart_orders_total_usd
286
+ raw_exchange_rates_rate -->|mart_orders.sql| mart_orders_total_usd
287
+ mart_orders_total_usd -->|reports.sql| revenue
286
288
 
287
289
  style revenue fill:#e6a843,stroke:#b8860b,stroke-width:3px
288
290
  style raw_orders_amount fill:#4ecdc4,stroke:#2b9e96
@@ -299,7 +301,7 @@ flowchart TD
299
301
  style legend_leaf fill:#c084fc,stroke:#7c3aed
300
302
  ```
301
303
 
302
- The amber node is the column you queried (`revenue`), teal nodes are ultimate root sources with no further upstream dependencies (`raw_orders.amount`, `raw_orders.tax`, `raw_exchange_rates.rate`), and intermediate nodes (`staging_orders.*`, `mart_orders.*`) appear in the default style. The legend is included automatically.
304
+ The amber node is the column you queried (`revenue`), teal nodes are ultimate root sources with no further upstream dependencies (`raw_orders.amount`, `raw_orders.tax`, `raw_exchange_rates.rate`), and intermediate nodes (`staging_orders.*`, `mart_orders.*`) appear in the default style. Each edge is labeled with the SQL file that defines that relationship. The legend is included automatically.
303
305
 
304
306
  ### Mermaid Markdown Format
305
307
 
@@ -356,6 +358,10 @@ The Plotly output uses the same color scheme as Mermaid and DOT diagrams:
356
358
  | Teal | Root node (no upstream dependencies) |
357
359
  | Violet | Leaf node (no downstream consumers) |
358
360
 
361
+ See an example of a plot loaded into Dash below:
362
+
363
+ ![Plotly-Dash Example](./static/plotly-dash-example.png)
364
+
359
365
  ### Rendering Diagrams
360
366
 
361
367
  **Mermaid:**
@@ -33,13 +33,19 @@ def load_figure(source: str | Path | None = None) -> dict:
33
33
  # Read from stdin
34
34
  if sys.stdin.isatty():
35
35
  print("Usage: python plotly_viewer.py <lineage.json>", file=sys.stderr)
36
- print(" or: sqlglider graph visualize graph.json -f plotly | python plotly_viewer.py", file=sys.stderr)
36
+ print(
37
+ " or: sqlglider graph visualize graph.json -f plotly | python plotly_viewer.py",
38
+ file=sys.stderr,
39
+ )
37
40
  sys.exit(1)
38
41
  content = sys.stdin.read()
39
42
  if not content.strip():
40
43
  print("Error: No input received from stdin", file=sys.stderr)
41
44
  print("Note: On Windows, piping may not work reliably.", file=sys.stderr)
42
- print("Try: sqlglider graph query ... -f plotly -o output.json", file=sys.stderr)
45
+ print(
46
+ "Try: sqlglider graph query ... -f plotly -o output.json",
47
+ file=sys.stderr,
48
+ )
43
49
  print("Then: python plotly_viewer.py output.json", file=sys.stderr)
44
50
  sys.exit(1)
45
51
  else:
@@ -55,7 +61,10 @@ def load_figure(source: str | Path | None = None) -> dict:
55
61
  except UnicodeDecodeError:
56
62
  continue
57
63
  else:
58
- print(f"Error: Could not decode file with UTF-8 or UTF-16 encoding", file=sys.stderr)
64
+ print(
65
+ "Error: Could not decode file with UTF-8 or UTF-16 encoding",
66
+ file=sys.stderr,
67
+ )
59
68
  sys.exit(1)
60
69
 
61
70
  try: