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.
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/Cargo.lock +59 -5
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/Cargo.toml +23 -23
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/PKG-INFO +1 -1
- dlin_cli-0.2.0a2/crates/dlin/Cargo.toml +36 -0
- dlin_cli-0.2.0a2/crates/dlin/README.md +292 -0
- dlin_cli-0.2.0a2/crates/dlin/src/cli.rs +2230 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin}/src/main.rs +525 -28
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin}/tests/integration_test.rs +313 -3
- dlin_cli-0.2.0a2/crates/dlin-core/Cargo.toml +42 -0
- dlin_cli-0.2.0a2/crates/dlin-core/README.md +292 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/cache.rs +184 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/cross_model.rs +242 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/impact.rs +163 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/mod.rs +219 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/schema.rs +245 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/single_model.rs +192 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/tests/cache.rs +217 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/tests/core.rs +1557 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/tests/impact.rs +238 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/tests/mod.rs +794 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/graph/column_lineage/types.rs +88 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/filter.rs +5 -5
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/mod.rs +2 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/lib.rs +47 -1
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/cache.rs +1 -1
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/columns.rs +105 -19
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/manifest.rs +75 -6
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/column_graph.rs +621 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/dot.rs +1 -1
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/list.rs +1 -1
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/mermaid.rs +12 -28
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/mod.rs +21 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_mermaid.snap +13 -0
- 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
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain.snap +6 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain_multi_hop.snap +6 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_dotted_table_name.snap +13 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_id_collision_avoided.snap +13 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_label_escaping.snap +13 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_single_model.snap +13 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_no_sources.snap +6 -0
- dlin_cli-0.2.0a2/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_single_model.snap +7 -0
- dlin_cli-0.2.0a2/crates/dlin-core/tests/column_lineage_test.rs +346 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/pyproject.toml +1 -1
- dlin_cli-0.1.2a1/.github/workflows/check.yml +0 -86
- dlin_cli-0.1.2a1/.github/workflows/publish-crate.yml +0 -24
- dlin_cli-0.1.2a1/.github/workflows/publish-pypi.yml +0 -74
- dlin_cli-0.1.2a1/.github/workflows/release.yml +0 -296
- dlin_cli-0.1.2a1/.gitignore +0 -2
- dlin_cli-0.1.2a1/CHANGELOG.md +0 -11
- dlin_cli-0.1.2a1/assets/tui-demo.gif +0 -0
- dlin_cli-0.1.2a1/dist-workspace.toml +0 -23
- dlin_cli-0.1.2a1/src/cli.rs +0 -1245
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/.dlin_cache/.gitignore +0 -2
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/dbt_project.yml +0 -12
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/macros/order_totals.sql +0 -7
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/combined_orders.sql +0 -4
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/customers.sql +0 -12
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/order_summary.sql +0 -5
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/orders.sql +0 -9
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/marts/schema.yml +0 -16
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/schema.yml +0 -18
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_customers.sql +0 -6
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_online_orders.sql +0 -2
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_orders.sql +0 -6
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_payments.sql +0 -6
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/models/staging/stg_retail_orders.sql +0 -2
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/seeds/countries.csv +0 -4
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/target/manifest.json +0 -175
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/target/run_results.json +0 -76
- dlin_cli-0.1.2a1/tests/fixtures/simple_project/tests/assert_orders_positive_amount.sql +0 -3
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/LICENSE +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2}/README.md +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/error.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/builder.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/impact.rs +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/graph/types.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/input.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/discovery.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/jinja.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/mod.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/project.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/sql.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/parser/yaml_schema.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/ascii.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/html.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/impact.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/json.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/layout.rs +0 -0
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/plain.rs +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- {dlin_cli-0.1.2a1 → dlin_cli-0.2.0a2/crates/dlin-core}/src/render/summary.rs +0 -0
- {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.
|
|
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
|
-
[
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"
|
|
@@ -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
|
+
[](https://crates.io/crates/dlin)
|
|
4
|
+
[](https://pypi.org/project/dlin-cli/)
|
|
5
|
+
[](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
|