dlin-cli 0.1.2a1__tar.gz → 0.2.0a2__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 (134) hide show
  1. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/Cargo.lock +59 -5
  2. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/Cargo.toml +23 -23
  3. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/PKG-INFO +1 -1
  4. dlin_cli-0.2.0a2/crates/dlin/Cargo.toml +36 -0
  5. dlin_cli-0.2.0a2/crates/dlin/README.md +292 -0
  6. dlin_cli-0.2.0a2/crates/dlin/src/cli.rs +2230 -0
  7. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin}/src/main.rs +525 -28
  8. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin}/tests/integration_test.rs +313 -3
  9. dlin_cli-0.2.0a2/crates/dlin-core/Cargo.toml +42 -0
  10. dlin_cli-0.2.0a2/crates/dlin-core/README.md +292 -0
  11. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/cache.rs +184 -0
  12. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/cross_model.rs +242 -0
  13. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/impact.rs +163 -0
  14. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/mod.rs +219 -0
  15. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/schema.rs +245 -0
  16. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/single_model.rs +192 -0
  17. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/tests/cache.rs +217 -0
  18. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/tests/core.rs +1557 -0
  19. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/tests/impact.rs +238 -0
  20. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/tests/mod.rs +794 -0
  21. dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/types.rs +88 -0
  22. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/filter.rs +5 -5
  23. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/mod.rs +2 -0
  24. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/lib.rs +47 -1
  25. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/cache.rs +1 -1
  26. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/columns.rs +105 -19
  27. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/manifest.rs +75 -6
  28. dlin_cli-0.2.0a2/crates/dlin-core/src/render/column_graph.rs +621 -0
  29. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/dot.rs +1 -1
  30. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/list.rs +1 -1
  31. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/mermaid.rs +12 -28
  32. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/mod.rs +21 -0
  33. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_mermaid.snap +13 -0
  34. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_mermaid_indirect_edge_label.snap +13 -0
  35. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain.snap +6 -0
  36. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain_multi_hop.snap +6 -0
  37. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_dotted_table_name.snap +13 -0
  38. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_id_collision_avoided.snap +13 -0
  39. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_label_escaping.snap +13 -0
  40. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_single_model.snap +13 -0
  41. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_no_sources.snap +6 -0
  42. dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_single_model.snap +7 -0
  43. dlin_cli-0.2.0a2/crates/dlin-core/tests/column_lineage_test.rs +346 -0
  44. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/pyproject.toml +1 -1
  45. dlin_cli-0.1.2a1/.github/workflows/check.yml +0 -86
  46. dlin_cli-0.1.2a1/.github/workflows/publish-crate.yml +0 -24
  47. dlin_cli-0.1.2a1/.github/workflows/publish-pypi.yml +0 -74
  48. dlin_cli-0.1.2a1/.github/workflows/release.yml +0 -296
  49. dlin_cli-0.1.2a1/.gitignore +0 -2
  50. dlin_cli-0.1.2a1/CHANGELOG.md +0 -11
  51. dlin_cli-0.1.2a1/assets/tui-demo.gif +0 -0
  52. dlin_cli-0.1.2a1/dist-workspace.toml +0 -23
  53. dlin_cli-0.1.2a1/src/cli.rs +0 -1245
  54. dlin_cli-0.1.2a1/tests/fixtures/simple_project/.dlin_cache/.gitignore +0 -2
  55. dlin_cli-0.1.2a1/tests/fixtures/simple_project/dbt_project.yml +0 -12
  56. dlin_cli-0.1.2a1/tests/fixtures/simple_project/macros/order_totals.sql +0 -7
  57. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/combined_orders.sql +0 -4
  58. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/customers.sql +0 -12
  59. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/order_summary.sql +0 -5
  60. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/orders.sql +0 -9
  61. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/schema.yml +0 -16
  62. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/schema.yml +0 -18
  63. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_customers.sql +0 -6
  64. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_online_orders.sql +0 -2
  65. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_orders.sql +0 -6
  66. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_payments.sql +0 -6
  67. dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_retail_orders.sql +0 -2
  68. dlin_cli-0.1.2a1/tests/fixtures/simple_project/seeds/countries.csv +0 -4
  69. dlin_cli-0.1.2a1/tests/fixtures/simple_project/target/manifest.json +0 -175
  70. dlin_cli-0.1.2a1/tests/fixtures/simple_project/target/run_results.json +0 -76
  71. dlin_cli-0.1.2a1/tests/fixtures/simple_project/tests/assert_orders_positive_amount.sql +0 -3
  72. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/LICENSE +0 -0
  73. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/README.md +0 -0
  74. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/error.rs +0 -0
  75. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/builder.rs +0 -0
  76. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/impact.rs +0 -0
  77. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__collapse_snapshot.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__collapse_snapshot.snap +0 -0
  78. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__collapse_snapshot_bfs_pseudoendpoint.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__collapse_snapshot_bfs_pseudoendpoint.snap +0 -0
  79. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__collapse_snapshot_endpoints_fan_out.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__collapse_snapshot_endpoints_fan_out.snap +0 -0
  80. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__collapse_snapshot_endpoints_leaf_model.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__collapse_snapshot_endpoints_leaf_model.snap +0 -0
  81. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__collapse_snapshot_multiple_focus_models.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__collapse_snapshot_multiple_focus_models.snap +0 -0
  82. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__collapse_snapshot_no_source_exposure.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__collapse_snapshot_no_source_exposure.snap +0 -0
  83. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__collapse_snapshot_preserve_focus.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__collapse_snapshot_preserve_focus.snap +0 -0
  84. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__snapshot_transitive_node_type_filter.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__snapshot_transitive_node_type_filter.snap +0 -0
  85. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__snapshot_transitive_select_filter.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__snapshot_transitive_select_filter.snap +0 -0
  86. /dlin_cli-0.1.2a1/src/graph/snapshots/dlin__graph__filter__tests__snapshot_transitive_select_with_node_type.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/graph/snapshots/dlin_core__graph__filter__tests__snapshot_transitive_select_with_node_type.snap +0 -0
  87. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/types.rs +0 -0
  88. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/input.rs +0 -0
  89. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/discovery.rs +0 -0
  90. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/jinja.rs +0 -0
  91. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/mod.rs +0 -0
  92. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/project.rs +0 -0
  93. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/sql.rs +0 -0
  94. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/yaml_schema.rs +0 -0
  95. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/ascii.rs +0 -0
  96. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/html.rs +0 -0
  97. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/impact.rs +0 -0
  98. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/json.rs +0 -0
  99. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/layout.rs +0 -0
  100. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/plain.rs +0 -0
  101. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__dot__tests__group_by_node_type.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__group_by_node_type.snap +0 -0
  102. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__dot__tests__snapshot_all_edge_types.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_all_edge_types.snap +0 -0
  103. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__dot__tests__snapshot_direction_tb.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_direction_tb.snap +0 -0
  104. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__dot__tests__snapshot_direction_tb_grouped.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_direction_tb_grouped.snap +0 -0
  105. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__dot__tests__snapshot_group_by_directory.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_group_by_directory.snap +0 -0
  106. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__dot__tests__snapshot_lineage.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_lineage.snap +0 -0
  107. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__dot__tests__snapshot_transitive_edges.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_transitive_edges.snap +0 -0
  108. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__html__tests__snapshot_html_json.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__html__tests__snapshot_html_json.snap +0 -0
  109. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__impact__tests__snapshot_impact_json.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_json.snap +0 -0
  110. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__impact__tests__snapshot_impact_json_with_sql.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_json_with_sql.snap +0 -0
  111. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__impact__tests__snapshot_impact_text.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_text.snap +0 -0
  112. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__impact__tests__snapshot_impact_text_with_sql.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_text_with_sql.snap +0 -0
  113. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__json__tests__snapshot_json_with_sql.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_json_with_sql.snap +0 -0
  114. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__json__tests__snapshot_lineage.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_lineage.snap +0 -0
  115. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__json__tests__snapshot_node_metadata.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_node_metadata.snap +0 -0
  116. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__list__tests__snapshot_list_json.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__list__tests__snapshot_list_json.snap +0 -0
  117. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__list__tests__snapshot_list_plain.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__list__tests__snapshot_list_plain.snap +0 -0
  118. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__group_by_node_type.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__group_by_node_type.snap +0 -0
  119. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__mixed_direct_and_transitive_edges.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__mixed_direct_and_transitive_edges.snap +0 -0
  120. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__show_columns_escapes_quotes.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_escapes_quotes.snap +0 -0
  121. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__show_columns_lineage.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_lineage.snap +0 -0
  122. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__show_columns_single_model.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_single_model.snap +0 -0
  123. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__show_columns_with_collapse.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_with_collapse.snap +0 -0
  124. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__show_columns_with_grouping.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_with_grouping.snap +0 -0
  125. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__snapshot_direction_tb.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_direction_tb.snap +0 -0
  126. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__snapshot_direction_tb_grouped.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_direction_tb_grouped.snap +0 -0
  127. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__snapshot_group_by_directory.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_group_by_directory.snap +0 -0
  128. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__snapshot_lineage.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_lineage.snap +0 -0
  129. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__mermaid__tests__transitive_edge_rendering.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__transitive_edge_rendering.snap +0 -0
  130. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__plain__tests__snapshot_plain.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__plain__tests__snapshot_plain.snap +0 -0
  131. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__summary__tests__snapshot_summary_json.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__summary__tests__snapshot_summary_json.snap +0 -0
  132. /dlin_cli-0.1.2a1/src/render/snapshots/dlin__render__summary__tests__snapshot_summary_text.snap → /dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__summary__tests__snapshot_summary_text.snap +0 -0
  133. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/summary.rs +0 -0
  134. {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/svg.rs +0 -0
@@ -231,7 +231,23 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
231
231
 
232
232
  [[package]]
233
233
  name = "dlin"
234
- version = "0.1.2-alpha.1"
234
+ version = "0.2.0-alpha.2"
235
+ dependencies = [
236
+ "anyhow",
237
+ "clap",
238
+ "dlin-core",
239
+ "libc",
240
+ "path-slash",
241
+ "polyglot-sql",
242
+ "regex",
243
+ "serde-saphyr",
244
+ "serde_json",
245
+ "tempfile",
246
+ ]
247
+
248
+ [[package]]
249
+ name = "dlin-core"
250
+ version = "0.2.0-alpha.2"
235
251
  dependencies = [
236
252
  "anyhow",
237
253
  "clap",
@@ -239,10 +255,10 @@ dependencies = [
239
255
  "globset",
240
256
  "indexmap",
241
257
  "insta",
242
- "libc",
243
258
  "minijinja",
244
259
  "path-slash",
245
260
  "petgraph",
261
+ "polyglot-sql",
246
262
  "rayon",
247
263
  "regex",
248
264
  "serde",
@@ -250,7 +266,7 @@ dependencies = [
250
266
  "serde_json",
251
267
  "serial_test",
252
268
  "tempfile",
253
- "thiserror",
269
+ "thiserror 2.0.18",
254
270
  "walkdir",
255
271
  ]
256
272
 
@@ -599,6 +615,18 @@ version = "0.2.17"
599
615
  source = "registry+https://github.com/rust-lang/crates.io-index"
600
616
  checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
601
617
 
618
+ [[package]]
619
+ name = "polyglot-sql"
620
+ version = "0.4.0"
621
+ source = "registry+https://github.com/rust-lang/crates.io-index"
622
+ checksum = "b155f49ed6a6bb331a4aead9dc2f5f69a70f2130edd2614a0387a82ac1eee5e6"
623
+ dependencies = [
624
+ "serde",
625
+ "serde_json",
626
+ "thiserror 1.0.69",
627
+ "unicode-segmentation",
628
+ ]
629
+
602
630
  [[package]]
603
631
  name = "prettyplease"
604
632
  version = "0.2.37"
@@ -733,7 +761,7 @@ checksum = "d55ae5ea09894b6d5382621db78f586df37ef18ab581bf32c754e75076b124b1"
733
761
  dependencies = [
734
762
  "arraydeque",
735
763
  "smallvec",
736
- "thiserror",
764
+ "thiserror 2.0.18",
737
765
  ]
738
766
 
739
767
  [[package]]
@@ -900,13 +928,33 @@ dependencies = [
900
928
  "windows-sys 0.61.2",
901
929
  ]
902
930
 
931
+ [[package]]
932
+ name = "thiserror"
933
+ version = "1.0.69"
934
+ source = "registry+https://github.com/rust-lang/crates.io-index"
935
+ checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
936
+ dependencies = [
937
+ "thiserror-impl 1.0.69",
938
+ ]
939
+
903
940
  [[package]]
904
941
  name = "thiserror"
905
942
  version = "2.0.18"
906
943
  source = "registry+https://github.com/rust-lang/crates.io-index"
907
944
  checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
908
945
  dependencies = [
909
- "thiserror-impl",
946
+ "thiserror-impl 2.0.18",
947
+ ]
948
+
949
+ [[package]]
950
+ name = "thiserror-impl"
951
+ version = "1.0.69"
952
+ source = "registry+https://github.com/rust-lang/crates.io-index"
953
+ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
954
+ dependencies = [
955
+ "proc-macro2",
956
+ "quote",
957
+ "syn",
910
958
  ]
911
959
 
912
960
  [[package]]
@@ -926,6 +974,12 @@ version = "1.0.24"
926
974
  source = "registry+https://github.com/rust-lang/crates.io-index"
927
975
  checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
928
976
 
977
+ [[package]]
978
+ name = "unicode-segmentation"
979
+ version = "1.13.2"
980
+ source = "registry+https://github.com/rust-lang/crates.io-index"
981
+ checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
982
+
929
983
  [[package]]
930
984
  name = "unicode-width"
931
985
  version = "0.2.2"
@@ -1,21 +1,15 @@
1
- [package]
2
- name = "dlin"
3
- version = "0.1.2-alpha.1"
1
+ [workspace]
2
+ members = ["crates/*"]
3
+ resolver = "3"
4
+
5
+ [workspace.package]
6
+ version = "0.2.0-alpha.2"
4
7
  edition = "2024"
5
- description = "A fast CLI tool for dbt model lineage analysis"
6
8
  license = "MIT"
7
9
  repository = "https://github.com/eitsupi/dlin"
8
10
  homepage = "https://github.com/eitsupi/dlin"
9
- readme = "README.md"
10
- keywords = ["dbt", "lineage", "dag", "sql", "cli"]
11
- categories = ["command-line-utilities", "visualization"]
12
-
13
- [[bin]]
14
- name = "dlin"
15
- path = "src/main.rs"
16
11
 
17
- [dependencies]
18
- clap = { version = "4", features = ["derive", "env"] }
12
+ [workspace.dependencies]
19
13
  petgraph = "0.6"
20
14
  serde = { version = "1", features = ["derive"] }
21
15
  serde_json = "1"
@@ -29,24 +23,30 @@ indexmap = "2"
29
23
  minijinja = "2"
30
24
  rayon = "1"
31
25
  globset = "0.4"
26
+ polyglot-sql = { version = "0.4.0", default-features = false, features = ["all-dialects", "semantic"] }
32
27
  path-slash = "0.2.1"
33
-
34
- [target.'cfg(unix)'.dependencies]
28
+ clap = { version = "4", features = ["derive", "env"] }
35
29
  libc = "0.2"
36
30
 
37
- [lints.rust]
31
+ # dev
32
+ tempfile = "3"
33
+ insta = "1"
34
+ serial_test = "3.4.0"
35
+
36
+ # internal
37
+ dlin-core = { version = "0.2.0-alpha.2", path = "crates/dlin-core" }
38
+
39
+ [workspace.lints.rust]
38
40
  unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] }
39
41
 
40
42
  [profile.dist]
41
43
  inherits = "release"
42
- lto = "fat"
44
+ # FIXME: fat LTO causes polyglot-sql's large match statements to be inlined into
45
+ # the dlin binary, bloating it from ~7.5 MB to ~12 MB. Use thin LTO until the
46
+ # upstream semantic→generate feature dependency is removed from polyglot-sql,
47
+ # after which generator.rs will be excluded from the build entirely.
48
+ lto = "thin"
43
49
  codegen-units = 1
44
50
  strip = true
45
51
  opt-level = "s"
46
52
  panic = "abort"
47
-
48
- [dev-dependencies]
49
- tempfile = "3"
50
- regex = "1"
51
- insta = "1"
52
- serial_test = "3.4.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dlin-cli
3
- Version: 0.1.2a1
3
+ Version: 0.2.0a2
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -0,0 +1,36 @@
1
+ [package]
2
+ name = "dlin"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+ license.workspace = true
6
+ repository.workspace = true
7
+ homepage.workspace = true
8
+ description = "A fast CLI tool for dbt model lineage analysis"
9
+ readme = "README.md"
10
+ keywords = ["dbt", "lineage", "dag", "sql", "cli"]
11
+ categories = ["command-line-utilities", "visualization"]
12
+
13
+ [[bin]]
14
+ name = "dlin"
15
+ path = "src/main.rs"
16
+
17
+ [dependencies]
18
+ dlin-core = { workspace = true, features = ["clap", "column-lineage"] }
19
+ clap = { workspace = true }
20
+ anyhow = { workspace = true }
21
+ serde_json = { workspace = true }
22
+ path-slash = { workspace = true }
23
+ polyglot-sql = { workspace = true }
24
+
25
+ [target.'cfg(unix)'.dependencies]
26
+ libc = { workspace = true }
27
+
28
+ [dev-dependencies]
29
+ dlin-core = { workspace = true }
30
+ tempfile = { workspace = true }
31
+ regex = { workspace = true }
32
+ serde_json = { workspace = true }
33
+ serde-saphyr = { workspace = true }
34
+
35
+ [lints]
36
+ workspace = true
@@ -0,0 +1,292 @@
1
+ # dlin
2
+
3
+ [![Crates.io](https://img.shields.io/crates/v/dlin)](https://crates.io/crates/dlin)
4
+ [![PyPI](https://img.shields.io/pypi/v/dlin-cli)](https://pypi.org/project/dlin-cli/)
5
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/eitsupi/dlin)
6
+
7
+ dbt lineage analysis CLI that parses SQL files directly. No `dbt compile`, no Python, no `manifest.json`.
8
+
9
+ Builds a dependency graph from `ref()` and `source()` calls in SQL. Designed for AI agents and CI pipelines.
10
+
11
+ ## Motivation
12
+
13
+ When I edited dbt models in VS Code, [dbt Power User](https://marketplace.visualstudio.com/items?itemName=innoverio.vscode-dbt-power-user) was my go-to companion for navigating lineage. AI agents have no such companion. I watched them `grep` through dbt projects to find model dependencies. It works, but they end up calling `grep` repeatedly and relying on fragile string matching to piece together `ref()` and `source()` relationships.
14
+
15
+ dlin is designed to fill that gap: a CLI tool that lets AI agents understand a dbt project's structure without falling back to `grep`. It is equally useful for humans, and its stdin/stdout interface makes it easy to combine with `jq`, `git diff`, and other CLI tools.
16
+
17
+ To replace `grep`, speed and size matter. dlin is a small, self-contained binary with no runtime dependencies. It parses SQL directly, evaluates common Jinja patterns without Python, parallelizes file I/O, and caches aggressively.
18
+
19
+ The key idea behind dlin is that finding the right models fast is what matters most. AI agents can read SQL and trace column-level relationships on their own; the hard part is knowing which models to look at in the first place. So dlin focuses on model-level lineage and makes that as fast as possible.
20
+
21
+ ## Install
22
+
23
+ ### Cargo (Rust)
24
+
25
+ ```sh
26
+ cargo install dlin
27
+ ```
28
+
29
+ ### pip / uv (Python)
30
+
31
+ For convenience, dlin is also available as a Python package. The installed binary is native and does not require Python at runtime.
32
+
33
+ ```sh
34
+ pip install dlin-cli # or: uv tool install dlin-cli
35
+ ```
36
+
37
+ ### GitHub Releases
38
+
39
+ Pre-built binaries for Linux, macOS, and Windows are available on the [Releases](https://github.com/eitsupi/dlin/releases) page. You can also use the installer scripts:
40
+
41
+ macOS / Linux:
42
+
43
+ ```sh
44
+ curl --proto '=https' --tlsv1.2 -LsSf https://github.com/eitsupi/dlin/releases/latest/download/dlin-installer.sh | sh
45
+ ```
46
+
47
+ Windows (PowerShell):
48
+
49
+ ```powershell
50
+ powershell -ExecutionPolicy Bypass -c "irm https://github.com/eitsupi/dlin/releases/latest/download/dlin-installer.ps1 | iex"
51
+ ```
52
+
53
+ ## Quick start
54
+
55
+ ```sh
56
+ # Full lineage graph
57
+ dlin graph -p path/to/dbt/project
58
+
59
+ # Downstream impact analysis
60
+ dlin impact orders
61
+
62
+ # List models as JSON
63
+ dlin list -o json --json-fields unique_id,file_path
64
+
65
+ # Pipe changed files into lineage
66
+ git diff --name-only main | dlin graph -o json
67
+ ```
68
+
69
+ ## AI agent integration
70
+
71
+ No MCP server or tool configuration needed.
72
+ Just install dlin and add the following to your `AGENTS.md`, `CLAUDE.md`, or system prompt:
73
+
74
+ ````md
75
+ ## dbt project structure analysis
76
+
77
+ Use `dlin` to explore dbt model dependencies.
78
+ Do NOT grep/cat/find through SQL files.
79
+
80
+ ```bash
81
+ dlin summary # Project overview (start here)
82
+ dlin graph <model> -u 2 -d 1 -q # Upstream/downstream lineage
83
+ dlin impact <model> # Downstream impact with severity
84
+ dlin list -o json --json-fields unique_id,sql_content # Read SQL content
85
+ git diff --name-only main | dlin graph -q # Lineage of changed files
86
+ ```
87
+
88
+ For full option reference: `dlin --help`, `dlin graph --help`, etc.
89
+ ````
90
+
91
+ The key line is **"Do NOT grep/cat/find through SQL files"** — without it, agents default to familiar tools. `dlin --help` is designed for tool discovery, so the prompt can stay minimal.
92
+
93
+ ## Features
94
+
95
+ - **No dependencies**: single binary, no Python, no `manifest.json`
96
+ - **Recursive upstream / downstream**: `-u N` / `-d N` to control traversal depth
97
+ - **Impact analysis with severity**: `dlin impact` scores downstream nodes and flags exposure reachability
98
+ - **Composable**: stdin accepts model names or file paths; pipe with `jq`, `dlin list`, `git diff`, etc.
99
+ - **Agent-friendly**: `--error-format json` emits structured `{"level","what","why","hint"}` on stderr; `--help` is designed for tool discovery
100
+
101
+ ## Mermaid diagrams
102
+
103
+ dlin outputs Mermaid flowcharts that render natively on GitHub, GitLab, Notion, and other Markdown environments.
104
+
105
+ ### Simplified graphs with `--collapse`
106
+
107
+ Automatically remove intermediate nodes to see just the endpoints (nodes with no predecessors or no successors); everything in between becomes transitive "(via N)" edges:
108
+
109
+ ```sh
110
+ # Collapse intermediate models — only endpoints remain
111
+ dlin graph --collapse -o mermaid
112
+
113
+ # Focal mode: keep only sources, exposures, and specified focus models
114
+ # (ignores BFS window pseudo-endpoints — ideal with -u/-d limits)
115
+ dlin graph orders --collapse=focal -u 3 -o mermaid
116
+ ```
117
+
118
+ ```mermaid
119
+ flowchart LR
120
+ exposure_weekly_report>"weekly_report"]
121
+ model_combined_orders["combined_orders"]
122
+ model_order_summary["order_summary"]
123
+ source_raw_customers(["raw.customers"])
124
+ source_raw_orders(["raw.orders"])
125
+ source_raw_payments(["raw.payments"])
126
+
127
+ source_raw_customers ==>|"exposure (via 2)"| exposure_weekly_report
128
+ source_raw_orders ==>|"exposure (via 3)"| exposure_weekly_report
129
+ source_raw_orders -.->|"source (via 1)"| model_combined_orders
130
+ source_raw_orders -.->|"source (via 1)"| model_order_summary
131
+ source_raw_payments ==>|"exposure (via 3)"| exposure_weekly_report
132
+ source_raw_payments -.->|"source (via 1)"| model_order_summary
133
+
134
+ classDef model fill:#4A90D9,stroke:#333,color:#fff
135
+ classDef source fill:#27AE60,stroke:#333,color:#fff
136
+ classDef exposure fill:#E74C3C,stroke:#333,color:#fff
137
+ class exposure_weekly_report exposure
138
+ class model_combined_orders model
139
+ class model_order_summary model
140
+ class source_raw_customers source
141
+ class source_raw_orders source
142
+ class source_raw_payments source
143
+ ```
144
+
145
+ Positional focus models are always preserved during collapse, so `dlin graph orders --collapse` keeps `orders` even if it would otherwise be intermediate.
146
+
147
+ ### Pipe to build focused diagrams
148
+
149
+ Combine `dlin list`, `jq`, and `dlin graph` to extract exactly the nodes you want:
150
+
151
+ ```sh
152
+ # Staging models → 1 hop downstream, models only, grouped by directory
153
+ dlin list -s 'path:models/staging' -o json | jq -r '.[].label' |
154
+ dlin graph -d 1 --node-type model --group-by directory -o mermaid
155
+ ```
156
+
157
+ ```mermaid
158
+ flowchart LR
159
+ subgraph models_marts["models/marts"]
160
+ model_combined_orders["combined_orders"]
161
+ model_customers["customers"]
162
+ model_order_summary["order_summary"]
163
+ model_orders["orders"]
164
+ end
165
+ subgraph models_staging["models/staging"]
166
+ model_stg_customers["stg_customers"]
167
+ model_stg_online_orders["stg_online_orders"]
168
+ model_stg_orders["stg_orders"]
169
+ model_stg_payments["stg_payments"]
170
+ model_stg_retail_orders["stg_retail_orders"]
171
+ end
172
+
173
+ model_orders -->|ref| model_customers
174
+ model_stg_customers -->|ref| model_customers
175
+ model_stg_online_orders -->|ref| model_combined_orders
176
+ model_stg_orders -->|ref| model_order_summary
177
+ model_stg_orders -->|ref| model_orders
178
+ model_stg_payments -->|ref| model_order_summary
179
+ model_stg_payments -->|ref| model_orders
180
+ model_stg_retail_orders -->|ref| model_combined_orders
181
+
182
+ classDef model fill:#4A90D9,stroke:#333,color:#fff
183
+ class model_combined_orders model
184
+ class model_customers model
185
+ class model_order_summary model
186
+ class model_orders model
187
+ class model_stg_customers model
188
+ class model_stg_online_orders model
189
+ class model_stg_orders model
190
+ class model_stg_payments model
191
+ class model_stg_retail_orders model
192
+ ```
193
+
194
+ ### Column names in nodes with `--show-columns`
195
+
196
+ Add `--show-columns` to include column names inside Mermaid node labels — useful for understanding what each model produces at a glance:
197
+
198
+ ```sh
199
+ dlin graph orders -u 1 -d 0 --show-columns --node-type model,source -o mermaid
200
+ ```
201
+
202
+ ```mermaid
203
+ flowchart LR
204
+ model_orders["orders<br/>---<br/>order_id, customer_id, order_date, status, total_amount, payment_method"]
205
+ model_stg_orders["stg_orders<br/>---<br/>order_id, customer_id, order_date, status"]
206
+ model_stg_payments["stg_payments<br/>---<br/>payment_id, order_id, amount, payment_method"]
207
+
208
+ model_stg_orders -->|ref| model_orders
209
+ model_stg_payments -->|ref| model_orders
210
+
211
+ classDef model fill:#4A90D9,stroke:#333,color:#fff
212
+ class model_orders model
213
+ class model_stg_orders model
214
+ class model_stg_payments model
215
+ ```
216
+
217
+ Combines well with `--collapse` to show rich detail on fewer endpoint nodes.
218
+
219
+ ### Other graph options
220
+
221
+ ```sh
222
+ dlin graph orders -u 2 -d 1 # focus on specific model
223
+ dlin graph -o mermaid --collapse --show-columns # columns in collapsed nodes
224
+ dlin graph orders --collapse=focal -u 3 -o mermaid # focal: sources + exposures + orders
225
+ dlin graph -o mermaid --group-by directory # group by directory
226
+ dlin graph -o mermaid --direction tb # top-to-bottom layout
227
+ dlin graph --node-type source,exposure # filter by node type
228
+ dlin graph -o dot | dot -Tsvg > out.svg # Graphviz rendering
229
+ ```
230
+
231
+ Output formats: ASCII (default), JSON, Mermaid, Graphviz DOT, Plain, SVG, HTML.
232
+
233
+ ## Key subcommands
234
+
235
+ ### `list`
236
+
237
+ ```sh
238
+ dlin list # all models and sources
239
+ dlin list orders -o json --json-fields unique_id,file_path # specific model as JSON
240
+ dlin list --node-type source # sources only
241
+ ```
242
+
243
+ ### `impact`
244
+
245
+ ```sh
246
+ $ dlin impact orders
247
+ Impact Analysis: orders
248
+ ==================================================
249
+ Overall Severity: CRITICAL
250
+
251
+ Summary:
252
+ Affected models: 1
253
+ Affected tests: 1
254
+ Affected exposures: 1
255
+
256
+ Impacted Nodes:
257
+ [critical] weekly_report (exposure, distance: 1)
258
+ [high ] customers (model, distance: 1) [models/marts/customers.sql]
259
+ [low ] assert_orders_positive_amount (test, distance: 1)
260
+ ```
261
+
262
+ ## Filtering
263
+
264
+ ```sh
265
+ dlin graph -s tag:finance,path:marts # selector expressions (union)
266
+ dlin graph --node-type model,source # filter by node type
267
+ ```
268
+
269
+ ## Data sources
270
+
271
+ dlin aims to work without `dbt compile`. By default it parses SQL files directly, but it can also leverage a pre-compiled `manifest.json` for additional accuracy when one is available.
272
+
273
+ **SQL parsing (default)**: extracts `ref()` and `source()` from SQL via regex + Jinja template evaluation. No Python or dbt needed. Generic tests (`not_null`, `unique`, `relationships`, etc.) are inferred from YAML schema declarations.
274
+
275
+ **Manifest mode** (`--source manifest`): reads a pre-compiled `manifest.json` for full accuracy with complex Jinja logic.
276
+
277
+ ### Limitations of SQL parse mode
278
+
279
+ - `var()` resolves from `dbt_project.yml` only (`--vars` CLI overrides not supported)
280
+ - Runtime context (`target.type`, `env_var()`) is not evaluated
281
+ - Conditional Jinja branches use default values; non-default paths may be missed
282
+ - Generic test IDs are dlin-specific (e.g. `test.not_null.orders.order_id`) and do not match dbt's naming; use manifest mode when exact test IDs matter
283
+
284
+ When these limitations matter, use `--source manifest`.
285
+
286
+ ## Credits
287
+
288
+ Hard fork of [dbt-lineage-viewer](https://github.com/sipemu/dbt-lineage-viewer) by Simon Muller (MIT license). The original focused on TUI-based exploration; dlin removes the TUI and targets non-interactive use: scripting, CI, and AI agents.
289
+
290
+ ## License
291
+
292
+ MIT