dlin-cli 0.2.4rc3__tar.gz → 0.2.6rc1__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.2.4rc3 → dlin_cli-0.2.6rc1}/Cargo.lock +29 -27
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/Cargo.toml +3 -3
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/PKG-INFO +20 -11
- {dlin_cli-0.2.4rc3/crates/dlin → dlin_cli-0.2.6rc1}/README.md +19 -10
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin/Cargo.toml +1 -0
- {dlin_cli-0.2.4rc3/crates/dlin-core → dlin_cli-0.2.6rc1/crates/dlin}/README.md +19 -10
- dlin_cli-0.2.6rc1/crates/dlin/src/cli/column.rs +240 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/cli/command.rs +247 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/cli/common.rs +126 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/cli/graph.rs +309 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/cli/misc.rs +163 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/cli/mod.rs +13 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/cli/summary.rs +321 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/commands/column.rs +315 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/commands/debug.rs +143 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/commands/graph.rs +529 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/commands/manifest.rs +383 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/commands/mod.rs +13 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/commands/shared.rs +331 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/main.rs +129 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/mcp/mod.rs +7 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/mcp/protocol.rs +227 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/mcp/tests.rs +824 -0
- dlin_cli-0.2.6rc1/crates/dlin/src/mcp/tools.rs +529 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/artifacts.rs +47 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/cli.rs +682 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/error_format.rs +163 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/freshness.rs +359 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/generic_test_metadata.rs +654 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/manifest_only.rs +686 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/manifest_only_rest.rs +590 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/parsing.rs +65 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/render_failure.rs +255 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration/sql_mode_test_warning.rs +154 -0
- dlin_cli-0.2.6rc1/crates/dlin/tests/integration_test.rs +82 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/Cargo.toml +1 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1/crates/dlin-core}/README.md +19 -10
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/error.rs +15 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/mod.rs +49 -440
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/project_yaml.rs +194 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/semantic_layer.rs +200 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/tests/build_graph/basic.rs +552 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/tests/build_graph/mod.rs +6 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/tests/build_graph/semantic_layer.rs +228 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/builder/tests/build_graph/yaml_snapshots.rs +428 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/tests/versioned.rs +4 -4
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/mod.rs +0 -8
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/sqllineage.rs +20 -16
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/cache.rs +171 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/cross_model.rs +88 -55
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/impact.rs +24 -42
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/mod.rs +137 -47
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/schema.rs +154 -53
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/backend_regression/basic.rs +226 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/backend_regression/discovery.rs +424 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/backend_regression/mod.rs +324 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/backend_regression/set_operations.rs +575 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/cache.rs +618 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/core_cross_model/mod.rs +580 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/core_cross_model/scenarios.rs +701 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/core_star.rs +2 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/core_util.rs +21 -26
- dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/tests/impact.rs → dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/impact/core.rs +22 -241
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/impact/edge_cases.rs +117 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/tests/impact/mod.rs +188 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/regression_fixtures.rs +18 -3
- dlin_cli-0.2.6rc1/crates/dlin-core/src/graph/column_lineage/types.rs +390 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/mod.rs +161 -34
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/filter_graph.rs +120 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/output.rs +90 -1
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/selector.rs +44 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/types.rs +6 -3
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/input.rs +86 -10
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/cache.rs +790 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/parser/discovery.rs +97 -15
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/mod.rs +143 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/reachability/analysis.rs +67 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/reachability/catalog.rs +131 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/reachability/mod.rs +318 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/reachability/tests.rs +210 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/render.rs +736 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/source.rs +305 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/jinja/tests.rs +1131 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/graph.rs +480 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/mod.rs +454 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/report/decode.rs +493 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/report/mod.rs +571 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/report/tests.rs +562 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/compatibility.rs +366 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/contents.rs +255 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/graph.rs +785 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/identifiers.rs +95 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/mod.rs +8 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest/tests/semantic_layer.rs +141 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/manifest_cache.rs +307 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/parser/mod.rs +1 -1
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/project.rs +753 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/sql/mod.rs +388 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/sql/recovery.rs +246 -0
- dlin_cli-0.2.6rc1/crates/dlin-core/src/parser/sql/tests.rs +1232 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/column_graph.rs +2 -491
- dlin_cli-0.2.6rc1/crates/dlin-core/src/render/column_graph_tests.rs +489 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/tests/column_lineage_test.rs +29 -61
- dlin_cli-0.2.4rc3/crates/dlin/src/cli.rs +0 -2429
- dlin_cli-0.2.4rc3/crates/dlin/src/main.rs +0 -1736
- dlin_cli-0.2.4rc3/crates/dlin/src/mcp.rs +0 -1454
- dlin_cli-0.2.4rc3/crates/dlin/tests/integration_test.rs +0 -2812
- dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/builder/tests/build_graph.rs +0 -1077
- dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/cache.rs +0 -305
- dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/tests/backend_regression.rs +0 -1329
- dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/tests/cache.rs +0 -546
- dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/tests/core_cross_model.rs +0 -282
- dlin_cli-0.2.4rc3/crates/dlin-core/src/graph/column_lineage/types.rs +0 -174
- dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/cache.rs +0 -497
- dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/jinja.rs +0 -753
- dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/manifest.rs +0 -1879
- dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/manifest_cache.rs +0 -207
- dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/project.rs +0 -228
- dlin_cli-0.2.4rc3/crates/dlin-core/src/parser/sql.rs +0 -829
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/LICENSE +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/tests/generic_tests.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/tests/mod.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/builder/tests/ref_parsing.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/catalog.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/catalog_provider.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/dialect.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/backend/types.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/relation.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/alias.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/core_basic.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/core_star_chain.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/column_lineage/tests/mod.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/collapse.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/mod.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/search.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_bfs_pseudoendpoint.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_endpoints_fan_out.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_endpoints_leaf_model.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_multiple_focus_models.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_no_source_exposure.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot_preserve_focus.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__snapshot_transitive_node_type_filter.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__snapshot_transitive_select_filter.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__snapshot_transitive_select_with_node_type.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/transitive.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/filter/tests/versioned.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/impact.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/graph/mod.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/lib.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/parser/columns.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/parser/yaml_schema.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/ascii.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/dot.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/html.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/impact.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/json.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/layout.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/list.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/mermaid.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/mod.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/plain.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_all_transformation_types.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_escapes_special_chars.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_id_collision_avoided.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_impact_indirect.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_impact_single.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_single_model.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_via_path.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_mermaid.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_mermaid_indirect_edge_label.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain_multi_hop.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain_non_direct_intermediate.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_dotted_table_name.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_id_collision_avoided.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_label_escaping.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_single_model.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_model_path_non_direct_annotation.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_no_sources.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_single_model.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__group_by_node_type.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_all_edge_types.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_direction_tb.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_direction_tb_grouped.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_group_by_directory.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_lineage.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_transitive_edges.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__html__tests__snapshot_html_json.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_json.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_json_with_sql.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_text.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_text_with_sql.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_json_with_sql.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_lineage.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_node_metadata.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__list__tests__snapshot_list_json.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__list__tests__snapshot_list_plain.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__group_by_node_type.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__mixed_direct_and_transitive_edges.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_escapes_quotes.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_lineage.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_single_model.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_with_collapse.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_with_grouping.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_direction_tb.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_direction_tb_grouped.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_group_by_directory.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_lineage.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__transitive_edge_rendering.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__plain__tests__snapshot_plain.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__summary__tests__snapshot_summary_json.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/snapshots/dlin_core__render__summary__tests__snapshot_summary_text.snap +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/summary.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/crates/dlin-core/src/render/svg.rs +0 -0
- {dlin_cli-0.2.4rc3 → dlin_cli-0.2.6rc1}/pyproject.toml +0 -0
|
@@ -139,9 +139,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
|
139
139
|
|
|
140
140
|
[[package]]
|
|
141
141
|
name = "clap"
|
|
142
|
-
version = "4.6.
|
|
142
|
+
version = "4.6.7"
|
|
143
143
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
144
|
-
checksum = "
|
|
144
|
+
checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946"
|
|
145
145
|
dependencies = [
|
|
146
146
|
"clap_builder",
|
|
147
147
|
"clap_derive",
|
|
@@ -149,9 +149,9 @@ dependencies = [
|
|
|
149
149
|
|
|
150
150
|
[[package]]
|
|
151
151
|
name = "clap_builder"
|
|
152
|
-
version = "4.6.
|
|
152
|
+
version = "4.6.7"
|
|
153
153
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
154
|
-
checksum = "
|
|
154
|
+
checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d"
|
|
155
155
|
dependencies = [
|
|
156
156
|
"anstream",
|
|
157
157
|
"anstyle",
|
|
@@ -161,9 +161,9 @@ dependencies = [
|
|
|
161
161
|
|
|
162
162
|
[[package]]
|
|
163
163
|
name = "clap_derive"
|
|
164
|
-
version = "4.6.
|
|
164
|
+
version = "4.6.7"
|
|
165
165
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
166
|
-
checksum = "
|
|
166
|
+
checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0"
|
|
167
167
|
dependencies = [
|
|
168
168
|
"heck",
|
|
169
169
|
"proc-macro2",
|
|
@@ -230,12 +230,13 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
|
|
230
230
|
|
|
231
231
|
[[package]]
|
|
232
232
|
name = "dlin"
|
|
233
|
-
version = "0.2.
|
|
233
|
+
version = "0.2.6-rc.1"
|
|
234
234
|
dependencies = [
|
|
235
235
|
"anyhow",
|
|
236
236
|
"clap",
|
|
237
237
|
"dlin-core",
|
|
238
238
|
"filetime",
|
|
239
|
+
"insta",
|
|
239
240
|
"libc",
|
|
240
241
|
"path-slash",
|
|
241
242
|
"regex",
|
|
@@ -247,11 +248,12 @@ dependencies = [
|
|
|
247
248
|
|
|
248
249
|
[[package]]
|
|
249
250
|
name = "dlin-core"
|
|
250
|
-
version = "0.2.
|
|
251
|
+
version = "0.2.6-rc.1"
|
|
251
252
|
dependencies = [
|
|
252
253
|
"anyhow",
|
|
253
254
|
"clap",
|
|
254
255
|
"colored",
|
|
256
|
+
"filetime",
|
|
255
257
|
"globset",
|
|
256
258
|
"indexmap",
|
|
257
259
|
"insta",
|
|
@@ -400,9 +402,9 @@ dependencies = [
|
|
|
400
402
|
|
|
401
403
|
[[package]]
|
|
402
404
|
name = "globset"
|
|
403
|
-
version = "0.4.
|
|
405
|
+
version = "0.4.20"
|
|
404
406
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
405
|
-
checksum = "
|
|
407
|
+
checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988"
|
|
406
408
|
dependencies = [
|
|
407
409
|
"aho-corasick",
|
|
408
410
|
"bstr",
|
|
@@ -413,9 +415,9 @@ dependencies = [
|
|
|
413
415
|
|
|
414
416
|
[[package]]
|
|
415
417
|
name = "granit-parser"
|
|
416
|
-
version = "1.0
|
|
418
|
+
version = "1.3.0"
|
|
417
419
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
418
|
-
checksum = "
|
|
420
|
+
checksum = "e20f99e46474f56bd905c56e817ebddcf377a611f94c53ac4649e4d3fa3c0cd0"
|
|
419
421
|
dependencies = [
|
|
420
422
|
"arraydeque",
|
|
421
423
|
"smallvec",
|
|
@@ -444,9 +446,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
|
444
446
|
|
|
445
447
|
[[package]]
|
|
446
448
|
name = "indexmap"
|
|
447
|
-
version = "2.14.
|
|
449
|
+
version = "2.14.2"
|
|
448
450
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
449
|
-
checksum = "
|
|
451
|
+
checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855"
|
|
450
452
|
dependencies = [
|
|
451
453
|
"equivalent",
|
|
452
454
|
"hashbrown 0.17.1",
|
|
@@ -694,9 +696,9 @@ dependencies = [
|
|
|
694
696
|
|
|
695
697
|
[[package]]
|
|
696
698
|
name = "regex"
|
|
697
|
-
version = "1.
|
|
699
|
+
version = "1.13.1"
|
|
698
700
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
699
|
-
checksum = "
|
|
701
|
+
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
|
|
700
702
|
dependencies = [
|
|
701
703
|
"aho-corasick",
|
|
702
704
|
"memchr",
|
|
@@ -706,9 +708,9 @@ dependencies = [
|
|
|
706
708
|
|
|
707
709
|
[[package]]
|
|
708
710
|
name = "regex-automata"
|
|
709
|
-
version = "0.4.
|
|
711
|
+
version = "0.4.18"
|
|
710
712
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
711
|
-
checksum = "
|
|
713
|
+
checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
|
|
712
714
|
dependencies = [
|
|
713
715
|
"aho-corasick",
|
|
714
716
|
"memchr",
|
|
@@ -717,9 +719,9 @@ dependencies = [
|
|
|
717
719
|
|
|
718
720
|
[[package]]
|
|
719
721
|
name = "regex-syntax"
|
|
720
|
-
version = "0.8.
|
|
722
|
+
version = "0.8.11"
|
|
721
723
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
722
|
-
checksum = "
|
|
724
|
+
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
|
723
725
|
|
|
724
726
|
[[package]]
|
|
725
727
|
name = "rustix"
|
|
@@ -761,9 +763,9 @@ dependencies = [
|
|
|
761
763
|
|
|
762
764
|
[[package]]
|
|
763
765
|
name = "serde-saphyr"
|
|
764
|
-
version = "1.0
|
|
766
|
+
version = "1.3.0"
|
|
765
767
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
766
|
-
checksum = "
|
|
768
|
+
checksum = "b8050abb251097357e24aff63ba2c52a6309ecb7d23a5474023df960a02694d8"
|
|
767
769
|
dependencies = [
|
|
768
770
|
"annotate-snippets",
|
|
769
771
|
"base64",
|
|
@@ -861,7 +863,7 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
|
|
861
863
|
[[package]]
|
|
862
864
|
name = "sqllineage"
|
|
863
865
|
version = "0.2.0"
|
|
864
|
-
source = "git+https://github.com/funcpp/sqllineage.git?rev=
|
|
866
|
+
source = "git+https://github.com/funcpp/sqllineage.git?rev=b010d8083c60aee977055ea36f8a6807c1d51c62#b010d8083c60aee977055ea36f8a6807c1d51c62"
|
|
865
867
|
dependencies = [
|
|
866
868
|
"serde",
|
|
867
869
|
"serde_json",
|
|
@@ -947,18 +949,18 @@ dependencies = [
|
|
|
947
949
|
|
|
948
950
|
[[package]]
|
|
949
951
|
name = "thiserror"
|
|
950
|
-
version = "2.0.
|
|
952
|
+
version = "2.0.21"
|
|
951
953
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
952
|
-
checksum = "
|
|
954
|
+
checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
|
|
953
955
|
dependencies = [
|
|
954
956
|
"thiserror-impl",
|
|
955
957
|
]
|
|
956
958
|
|
|
957
959
|
[[package]]
|
|
958
960
|
name = "thiserror-impl"
|
|
959
|
-
version = "2.0.
|
|
961
|
+
version = "2.0.21"
|
|
960
962
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
961
|
-
checksum = "
|
|
963
|
+
checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
|
|
962
964
|
dependencies = [
|
|
963
965
|
"proc-macro2",
|
|
964
966
|
"quote",
|
|
@@ -3,7 +3,7 @@ members = ["crates/*"]
|
|
|
3
3
|
resolver = "3"
|
|
4
4
|
|
|
5
5
|
[workspace.package]
|
|
6
|
-
version = "0.2.
|
|
6
|
+
version = "0.2.6-rc.1"
|
|
7
7
|
edition = "2024"
|
|
8
8
|
license = "MIT"
|
|
9
9
|
repository = "https://github.com/eitsupi/dlin"
|
|
@@ -23,7 +23,7 @@ indexmap = "2"
|
|
|
23
23
|
minijinja = "2"
|
|
24
24
|
rayon = "1"
|
|
25
25
|
globset = "0.4"
|
|
26
|
-
sqllineage = { git = "https://github.com/funcpp/sqllineage.git", rev = "
|
|
26
|
+
sqllineage = { git = "https://github.com/funcpp/sqllineage.git", rev = "b010d8083c60aee977055ea36f8a6807c1d51c62", default-features = false }
|
|
27
27
|
# Must stay in lockstep with the sqlparser version sqllineage depends on; see
|
|
28
28
|
# `sqlparser_version_matches_sqllineage` in dlin-core.
|
|
29
29
|
sqlparser = { version = "0.62", features = ["serde", "visitor"] }
|
|
@@ -38,7 +38,7 @@ insta = "1"
|
|
|
38
38
|
serial_test = "4.0.1"
|
|
39
39
|
|
|
40
40
|
# internal
|
|
41
|
-
dlin-core = { version = "0.2.
|
|
41
|
+
dlin-core = { version = "0.2.6-rc.1", path = "crates/dlin-core" }
|
|
42
42
|
|
|
43
43
|
[workspace.lints.rust]
|
|
44
44
|
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dlin-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6rc1
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Environment :: Console
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -30,7 +30,7 @@ dbt model lineage CLI. Parses SQL files directly or reads a compiled `manifest.j
|
|
|
30
30
|
|
|
31
31
|
Works for developers navigating live SQL files, analysts exploring a shared manifest, AI agents via CLI prompt or MCP server, and CI pipelines.
|
|
32
32
|
|
|
33
|
-
Column-level lineage (`dlin column upstream` / `dlin column downstream`)
|
|
33
|
+
Column-level lineage (`dlin column upstream` / `dlin column downstream`) requires a compiled `manifest.json` and is usable in practice while remaining Experimental for coverage reasons.
|
|
34
34
|
|
|
35
35
|
## Motivation
|
|
36
36
|
|
|
@@ -40,7 +40,7 @@ dlin is designed to fill that gap: a CLI tool that lets AI agents understand a d
|
|
|
40
40
|
|
|
41
41
|
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.
|
|
42
42
|
|
|
43
|
-
The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage
|
|
43
|
+
The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage fast and provides column-level lineage for deeper analysis.
|
|
44
44
|
|
|
45
45
|
## Install
|
|
46
46
|
|
|
@@ -94,9 +94,9 @@ git diff --name-only main | dlin graph -o json
|
|
|
94
94
|
|
|
95
95
|
dlin supports two source modes for model-level commands.
|
|
96
96
|
|
|
97
|
-
**SQL parse mode (default)** is for developers
|
|
97
|
+
**SQL parse mode (default)** is for developers editing a live dbt project. It reads `ref()` and `source()` directly from SQL without waiting for `dbt compile`, so model-level lineage quickly identifies the related models. Read the relevant SQL for exact transformation behavior.
|
|
98
98
|
|
|
99
|
-
**Manifest mode** (`--source manifest`) is for analysts or agents
|
|
99
|
+
**Manifest mode** (`--source manifest`) is for analysts or agents analyzing compiled state rather than editing live SQL. A developer compiles once and shares `manifest.json`; users explore the resolved graph without SQL or Python. Use column-level lineage when a field-level trace is needed; it requires the compiled manifest.
|
|
100
100
|
|
|
101
101
|
```sh
|
|
102
102
|
# SQL parse mode: reads SQL files directly (default)
|
|
@@ -111,7 +111,7 @@ For model-name inputs, `manifest.json` is the only file needed in manifest mode.
|
|
|
111
111
|
|
|
112
112
|
### Limitations of SQL parse mode
|
|
113
113
|
|
|
114
|
-
- `var()` resolves from `dbt_project.yml`
|
|
114
|
+
- `var()` resolves from `vars.yml` or `dbt_project.yml` (`--vars` CLI overrides not supported)
|
|
115
115
|
- Runtime context (`target.type`, `env_var()`) is not evaluated
|
|
116
116
|
- Conditional Jinja branches use default values; non-default paths may be missed
|
|
117
117
|
- 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
|
|
@@ -168,7 +168,7 @@ Pass `--dialect` to match your project's SQL dialect for accurate column lineage
|
|
|
168
168
|
- **Impact analysis with severity**: `dlin impact` scores downstream nodes and flags exposure reachability
|
|
169
169
|
- **Composable**: stdin accepts model names or file paths; pipe with `jq`, `dlin list`, `git diff`, etc.
|
|
170
170
|
- **Agent-friendly**: `--error-format json` emits structured `{"level","what","why","hint"}` on stderr; `--help` is designed for tool discovery
|
|
171
|
-
- **Column-level lineage** (experimental): traces columns across models with transformation classification; requires `manifest.json`
|
|
171
|
+
- **Column-level lineage** (experimental): traces columns across models with transformation classification through the Rust lineage backend; requires `manifest.json`
|
|
172
172
|
|
|
173
173
|
## Mermaid diagrams
|
|
174
174
|
|
|
@@ -304,10 +304,7 @@ Output formats: ASCII (default), JSON, Mermaid, Graphviz DOT, Plain, SVG, HTML.
|
|
|
304
304
|
|
|
305
305
|
## Column-level lineage (Experimental)
|
|
306
306
|
|
|
307
|
-
|
|
308
|
-
> Column-level lineage uses [sqllineage](https://github.com/funcpp/sqllineage) for SQL parsing and lineage extraction. The production backend directly supports Generic, PostgreSQL, MySQL, Hive, Databricks, Snowflake, BigQuery, DuckDB, SQLite, Spark, Trino, Redshift, T-SQL, and ClickHouse. The `dlin` CLI and MCP resolve other recognized dialects to Generic with a warning; direct `dlin-core` API callers receive an unsupported-dialect error instead. Coverage still varies by SQL complexity and dialect, and patterns such as `SELECT *` chains, STRUCT expansion, and some database-specific syntax may remain unresolved.
|
|
309
|
-
|
|
310
|
-
`dlin column upstream` and `dlin column downstream` trace columns across models. Unlike model-level commands, they always require a compiled `manifest.json`. Run `dbt compile` first.
|
|
307
|
+
`dlin column upstream` and `dlin column downstream` trace columns across models. They require a compiled `manifest.json`, so run `dbt compile` first. Regression fixtures and real dbt project validation show that column-level lineage is usable in practice. Experimental reflects the Rust stack's shorter production history and remaining cross-dialect and complex-SQL coverage gaps, not a prototype-only status.
|
|
311
308
|
|
|
312
309
|
```sh
|
|
313
310
|
# Where does each output column of orders come from?
|
|
@@ -424,6 +421,18 @@ flowchart LR
|
|
|
424
421
|
|
|
425
422
|
`stg_orders.order_id` flows directly into `orders.order_id` and `order_enriched.order_id`. `orders.order_id` is then aggregated into `customers.order_count`. Each edge shows its per-hop transformation type.
|
|
426
423
|
|
|
424
|
+
### Performance benchmark
|
|
425
|
+
|
|
426
|
+
Correctness-gated means from the synthetic scalability run (3 runs, 1 warmup):
|
|
427
|
+
|
|
428
|
+
| Workload | dlin 0.2.4 | [Parrant 0.17.2](https://pypi.org/project/parrant/0.17.2/) | [dbt-meta 0.3.8](https://pypi.org/project/dbt-meta/0.3.8/) |
|
|
429
|
+
| --- | ---: | ---: | ---: |
|
|
430
|
+
| Volume, 100,150 columns, single upstream | 88.9 ms | 37.4 s | build >120 s timeout; query not run |
|
|
431
|
+
| Deep 64, single upstream | 115 ms | 1.42 s | build 4.86 s; query 411 ms |
|
|
432
|
+
| Fan-out 128, downstream | 114 ms | 1.78 s | build 6.47 s; query 363 ms |
|
|
433
|
+
|
|
434
|
+
These synthetic results use artifacts derived from the real dbt fixture. Native Rust avoids Python startup and dlin showed lower latency here; dlin uses `--no-cache`, Parrant includes parsing, and dbt-meta query excludes build. They are not a general ranking; see the [full results and reproduction](benchmarks/column-lineage/results/published/scalability/summary.md).
|
|
435
|
+
|
|
427
436
|
### Known limitations
|
|
428
437
|
|
|
429
438
|
- **Requires `dbt compile`**: no SQL parse mode fallback; manifest with compiled SQL is always needed
|
|
@@ -8,7 +8,7 @@ dbt model lineage CLI. Parses SQL files directly or reads a compiled `manifest.j
|
|
|
8
8
|
|
|
9
9
|
Works for developers navigating live SQL files, analysts exploring a shared manifest, AI agents via CLI prompt or MCP server, and CI pipelines.
|
|
10
10
|
|
|
11
|
-
Column-level lineage (`dlin column upstream` / `dlin column downstream`)
|
|
11
|
+
Column-level lineage (`dlin column upstream` / `dlin column downstream`) requires a compiled `manifest.json` and is usable in practice while remaining Experimental for coverage reasons.
|
|
12
12
|
|
|
13
13
|
## Motivation
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@ dlin is designed to fill that gap: a CLI tool that lets AI agents understand a d
|
|
|
18
18
|
|
|
19
19
|
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.
|
|
20
20
|
|
|
21
|
-
The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage
|
|
21
|
+
The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage fast and provides column-level lineage for deeper analysis.
|
|
22
22
|
|
|
23
23
|
## Install
|
|
24
24
|
|
|
@@ -72,9 +72,9 @@ git diff --name-only main | dlin graph -o json
|
|
|
72
72
|
|
|
73
73
|
dlin supports two source modes for model-level commands.
|
|
74
74
|
|
|
75
|
-
**SQL parse mode (default)** is for developers
|
|
75
|
+
**SQL parse mode (default)** is for developers editing a live dbt project. It reads `ref()` and `source()` directly from SQL without waiting for `dbt compile`, so model-level lineage quickly identifies the related models. Read the relevant SQL for exact transformation behavior.
|
|
76
76
|
|
|
77
|
-
**Manifest mode** (`--source manifest`) is for analysts or agents
|
|
77
|
+
**Manifest mode** (`--source manifest`) is for analysts or agents analyzing compiled state rather than editing live SQL. A developer compiles once and shares `manifest.json`; users explore the resolved graph without SQL or Python. Use column-level lineage when a field-level trace is needed; it requires the compiled manifest.
|
|
78
78
|
|
|
79
79
|
```sh
|
|
80
80
|
# SQL parse mode: reads SQL files directly (default)
|
|
@@ -89,7 +89,7 @@ For model-name inputs, `manifest.json` is the only file needed in manifest mode.
|
|
|
89
89
|
|
|
90
90
|
### Limitations of SQL parse mode
|
|
91
91
|
|
|
92
|
-
- `var()` resolves from `dbt_project.yml`
|
|
92
|
+
- `var()` resolves from `vars.yml` or `dbt_project.yml` (`--vars` CLI overrides not supported)
|
|
93
93
|
- Runtime context (`target.type`, `env_var()`) is not evaluated
|
|
94
94
|
- Conditional Jinja branches use default values; non-default paths may be missed
|
|
95
95
|
- 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
|
|
@@ -146,7 +146,7 @@ Pass `--dialect` to match your project's SQL dialect for accurate column lineage
|
|
|
146
146
|
- **Impact analysis with severity**: `dlin impact` scores downstream nodes and flags exposure reachability
|
|
147
147
|
- **Composable**: stdin accepts model names or file paths; pipe with `jq`, `dlin list`, `git diff`, etc.
|
|
148
148
|
- **Agent-friendly**: `--error-format json` emits structured `{"level","what","why","hint"}` on stderr; `--help` is designed for tool discovery
|
|
149
|
-
- **Column-level lineage** (experimental): traces columns across models with transformation classification; requires `manifest.json`
|
|
149
|
+
- **Column-level lineage** (experimental): traces columns across models with transformation classification through the Rust lineage backend; requires `manifest.json`
|
|
150
150
|
|
|
151
151
|
## Mermaid diagrams
|
|
152
152
|
|
|
@@ -282,10 +282,7 @@ Output formats: ASCII (default), JSON, Mermaid, Graphviz DOT, Plain, SVG, HTML.
|
|
|
282
282
|
|
|
283
283
|
## Column-level lineage (Experimental)
|
|
284
284
|
|
|
285
|
-
|
|
286
|
-
> Column-level lineage uses [sqllineage](https://github.com/funcpp/sqllineage) for SQL parsing and lineage extraction. The production backend directly supports Generic, PostgreSQL, MySQL, Hive, Databricks, Snowflake, BigQuery, DuckDB, SQLite, Spark, Trino, Redshift, T-SQL, and ClickHouse. The `dlin` CLI and MCP resolve other recognized dialects to Generic with a warning; direct `dlin-core` API callers receive an unsupported-dialect error instead. Coverage still varies by SQL complexity and dialect, and patterns such as `SELECT *` chains, STRUCT expansion, and some database-specific syntax may remain unresolved.
|
|
287
|
-
|
|
288
|
-
`dlin column upstream` and `dlin column downstream` trace columns across models. Unlike model-level commands, they always require a compiled `manifest.json`. Run `dbt compile` first.
|
|
285
|
+
`dlin column upstream` and `dlin column downstream` trace columns across models. They require a compiled `manifest.json`, so run `dbt compile` first. Regression fixtures and real dbt project validation show that column-level lineage is usable in practice. Experimental reflects the Rust stack's shorter production history and remaining cross-dialect and complex-SQL coverage gaps, not a prototype-only status.
|
|
289
286
|
|
|
290
287
|
```sh
|
|
291
288
|
# Where does each output column of orders come from?
|
|
@@ -402,6 +399,18 @@ flowchart LR
|
|
|
402
399
|
|
|
403
400
|
`stg_orders.order_id` flows directly into `orders.order_id` and `order_enriched.order_id`. `orders.order_id` is then aggregated into `customers.order_count`. Each edge shows its per-hop transformation type.
|
|
404
401
|
|
|
402
|
+
### Performance benchmark
|
|
403
|
+
|
|
404
|
+
Correctness-gated means from the synthetic scalability run (3 runs, 1 warmup):
|
|
405
|
+
|
|
406
|
+
| Workload | dlin 0.2.4 | [Parrant 0.17.2](https://pypi.org/project/parrant/0.17.2/) | [dbt-meta 0.3.8](https://pypi.org/project/dbt-meta/0.3.8/) |
|
|
407
|
+
| --- | ---: | ---: | ---: |
|
|
408
|
+
| Volume, 100,150 columns, single upstream | 88.9 ms | 37.4 s | build >120 s timeout; query not run |
|
|
409
|
+
| Deep 64, single upstream | 115 ms | 1.42 s | build 4.86 s; query 411 ms |
|
|
410
|
+
| Fan-out 128, downstream | 114 ms | 1.78 s | build 6.47 s; query 363 ms |
|
|
411
|
+
|
|
412
|
+
These synthetic results use artifacts derived from the real dbt fixture. Native Rust avoids Python startup and dlin showed lower latency here; dlin uses `--no-cache`, Parrant includes parsing, and dbt-meta query excludes build. They are not a general ranking; see the [full results and reproduction](benchmarks/column-lineage/results/published/scalability/summary.md).
|
|
413
|
+
|
|
405
414
|
### Known limitations
|
|
406
415
|
|
|
407
416
|
- **Requires `dbt compile`**: no SQL parse mode fallback; manifest with compiled SQL is always needed
|
|
@@ -8,7 +8,7 @@ dbt model lineage CLI. Parses SQL files directly or reads a compiled `manifest.j
|
|
|
8
8
|
|
|
9
9
|
Works for developers navigating live SQL files, analysts exploring a shared manifest, AI agents via CLI prompt or MCP server, and CI pipelines.
|
|
10
10
|
|
|
11
|
-
Column-level lineage (`dlin column upstream` / `dlin column downstream`)
|
|
11
|
+
Column-level lineage (`dlin column upstream` / `dlin column downstream`) requires a compiled `manifest.json` and is usable in practice while remaining Experimental for coverage reasons.
|
|
12
12
|
|
|
13
13
|
## Motivation
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@ dlin is designed to fill that gap: a CLI tool that lets AI agents understand a d
|
|
|
18
18
|
|
|
19
19
|
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.
|
|
20
20
|
|
|
21
|
-
The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage
|
|
21
|
+
The key idea behind dlin is that finding the right models fast is what matters most. The hard part for agents is knowing which models to look at in the first place. dlin focuses on making model-level lineage fast and provides column-level lineage for deeper analysis.
|
|
22
22
|
|
|
23
23
|
## Install
|
|
24
24
|
|
|
@@ -72,9 +72,9 @@ git diff --name-only main | dlin graph -o json
|
|
|
72
72
|
|
|
73
73
|
dlin supports two source modes for model-level commands.
|
|
74
74
|
|
|
75
|
-
**SQL parse mode (default)** is for developers
|
|
75
|
+
**SQL parse mode (default)** is for developers editing a live dbt project. It reads `ref()` and `source()` directly from SQL without waiting for `dbt compile`, so model-level lineage quickly identifies the related models. Read the relevant SQL for exact transformation behavior.
|
|
76
76
|
|
|
77
|
-
**Manifest mode** (`--source manifest`) is for analysts or agents
|
|
77
|
+
**Manifest mode** (`--source manifest`) is for analysts or agents analyzing compiled state rather than editing live SQL. A developer compiles once and shares `manifest.json`; users explore the resolved graph without SQL or Python. Use column-level lineage when a field-level trace is needed; it requires the compiled manifest.
|
|
78
78
|
|
|
79
79
|
```sh
|
|
80
80
|
# SQL parse mode: reads SQL files directly (default)
|
|
@@ -89,7 +89,7 @@ For model-name inputs, `manifest.json` is the only file needed in manifest mode.
|
|
|
89
89
|
|
|
90
90
|
### Limitations of SQL parse mode
|
|
91
91
|
|
|
92
|
-
- `var()` resolves from `dbt_project.yml`
|
|
92
|
+
- `var()` resolves from `vars.yml` or `dbt_project.yml` (`--vars` CLI overrides not supported)
|
|
93
93
|
- Runtime context (`target.type`, `env_var()`) is not evaluated
|
|
94
94
|
- Conditional Jinja branches use default values; non-default paths may be missed
|
|
95
95
|
- 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
|
|
@@ -146,7 +146,7 @@ Pass `--dialect` to match your project's SQL dialect for accurate column lineage
|
|
|
146
146
|
- **Impact analysis with severity**: `dlin impact` scores downstream nodes and flags exposure reachability
|
|
147
147
|
- **Composable**: stdin accepts model names or file paths; pipe with `jq`, `dlin list`, `git diff`, etc.
|
|
148
148
|
- **Agent-friendly**: `--error-format json` emits structured `{"level","what","why","hint"}` on stderr; `--help` is designed for tool discovery
|
|
149
|
-
- **Column-level lineage** (experimental): traces columns across models with transformation classification; requires `manifest.json`
|
|
149
|
+
- **Column-level lineage** (experimental): traces columns across models with transformation classification through the Rust lineage backend; requires `manifest.json`
|
|
150
150
|
|
|
151
151
|
## Mermaid diagrams
|
|
152
152
|
|
|
@@ -282,10 +282,7 @@ Output formats: ASCII (default), JSON, Mermaid, Graphviz DOT, Plain, SVG, HTML.
|
|
|
282
282
|
|
|
283
283
|
## Column-level lineage (Experimental)
|
|
284
284
|
|
|
285
|
-
|
|
286
|
-
> Column-level lineage uses [sqllineage](https://github.com/funcpp/sqllineage) for SQL parsing and lineage extraction. The production backend directly supports Generic, PostgreSQL, MySQL, Hive, Databricks, Snowflake, BigQuery, DuckDB, SQLite, Spark, Trino, Redshift, T-SQL, and ClickHouse. The `dlin` CLI and MCP resolve other recognized dialects to Generic with a warning; direct `dlin-core` API callers receive an unsupported-dialect error instead. Coverage still varies by SQL complexity and dialect, and patterns such as `SELECT *` chains, STRUCT expansion, and some database-specific syntax may remain unresolved.
|
|
287
|
-
|
|
288
|
-
`dlin column upstream` and `dlin column downstream` trace columns across models. Unlike model-level commands, they always require a compiled `manifest.json`. Run `dbt compile` first.
|
|
285
|
+
`dlin column upstream` and `dlin column downstream` trace columns across models. They require a compiled `manifest.json`, so run `dbt compile` first. Regression fixtures and real dbt project validation show that column-level lineage is usable in practice. Experimental reflects the Rust stack's shorter production history and remaining cross-dialect and complex-SQL coverage gaps, not a prototype-only status.
|
|
289
286
|
|
|
290
287
|
```sh
|
|
291
288
|
# Where does each output column of orders come from?
|
|
@@ -402,6 +399,18 @@ flowchart LR
|
|
|
402
399
|
|
|
403
400
|
`stg_orders.order_id` flows directly into `orders.order_id` and `order_enriched.order_id`. `orders.order_id` is then aggregated into `customers.order_count`. Each edge shows its per-hop transformation type.
|
|
404
401
|
|
|
402
|
+
### Performance benchmark
|
|
403
|
+
|
|
404
|
+
Correctness-gated means from the synthetic scalability run (3 runs, 1 warmup):
|
|
405
|
+
|
|
406
|
+
| Workload | dlin 0.2.4 | [Parrant 0.17.2](https://pypi.org/project/parrant/0.17.2/) | [dbt-meta 0.3.8](https://pypi.org/project/dbt-meta/0.3.8/) |
|
|
407
|
+
| --- | ---: | ---: | ---: |
|
|
408
|
+
| Volume, 100,150 columns, single upstream | 88.9 ms | 37.4 s | build >120 s timeout; query not run |
|
|
409
|
+
| Deep 64, single upstream | 115 ms | 1.42 s | build 4.86 s; query 411 ms |
|
|
410
|
+
| Fan-out 128, downstream | 114 ms | 1.78 s | build 6.47 s; query 363 ms |
|
|
411
|
+
|
|
412
|
+
These synthetic results use artifacts derived from the real dbt fixture. Native Rust avoids Python startup and dlin showed lower latency here; dlin uses `--no-cache`, Parrant includes parsing, and dbt-meta query excludes build. They are not a general ranking; see the [full results and reproduction](benchmarks/column-lineage/results/published/scalability/summary.md).
|
|
413
|
+
|
|
405
414
|
### Known limitations
|
|
406
415
|
|
|
407
416
|
- **Requires `dbt compile`**: no SQL parse mode fallback; manifest with compiled SQL is always needed
|