dlin-cli 0.2.2__tar.gz → 0.2.3__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.2 → dlin_cli-0.2.3}/Cargo.lock +6 -22
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/Cargo.toml +2 -2
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/PKG-INFO +1 -1
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/jinja.rs +107 -54
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/sql.rs +299 -61
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/LICENSE +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/README.md +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/Cargo.toml +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/README.md +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/src/cli.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/src/main.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/src/mcp.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/tests/integration_test.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/Cargo.toml +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/README.md +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/error.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/mod.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/build_graph.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/generic_tests.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/mod.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/ref_parsing.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/versioned.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/cache.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/cross_model.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/impact.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/mod.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/schema.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/single_model.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/tests/cache.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/tests/core.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/tests/impact.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/tests/mod.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/types.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/mod.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/collapse.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/filter_graph.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/mod.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/output.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/search.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/selector.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/snapshots/dlin_core__graph__filter__tests__collapse__collapse_snapshot.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/transitive.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/versioned.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/impact.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/mod.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/types.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/input.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/lib.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/cache.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/columns.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/discovery.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/manifest.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/manifest_cache.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/mod.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/project.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/yaml_schema.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/ascii.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/column_graph.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/dot.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/html.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/impact.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/json.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/layout.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/list.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/mermaid.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/mod.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/plain.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_all_transformation_types.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_escapes_special_chars.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_id_collision_avoided.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_impact_indirect.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_impact_single.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_single_model.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__dot_via_path.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_mermaid.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_mermaid_indirect_edge_label.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain_multi_hop.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__impact_plain_non_direct_intermediate.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_dotted_table_name.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_id_collision_avoided.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_label_escaping.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__mermaid_single_model.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/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.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_no_sources.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__column_graph__tests__plain_single_model.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__group_by_node_type.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_all_edge_types.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_direction_tb.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_direction_tb_grouped.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_group_by_directory.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_lineage.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__dot__tests__snapshot_transitive_edges.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__html__tests__snapshot_html_json.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_json.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_json_with_sql.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_text.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__impact__tests__snapshot_impact_text_with_sql.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_json_with_sql.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_lineage.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__json__tests__snapshot_node_metadata.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__list__tests__snapshot_list_json.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__list__tests__snapshot_list_plain.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__group_by_node_type.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__mixed_direct_and_transitive_edges.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_escapes_quotes.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_lineage.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_single_model.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_with_collapse.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__show_columns_with_grouping.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_direction_tb.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_direction_tb_grouped.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_group_by_directory.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__snapshot_lineage.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__mermaid__tests__transitive_edge_rendering.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__plain__tests__snapshot_plain.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__summary__tests__snapshot_summary_json.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/snapshots/dlin_core__render__summary__tests__snapshot_summary_text.snap +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/summary.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/svg.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/tests/column_lineage_test.rs +0 -0
- {dlin_cli-0.2.2 → dlin_cli-0.2.3}/pyproject.toml +0 -0
|
@@ -230,7 +230,7 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
|
|
230
230
|
|
|
231
231
|
[[package]]
|
|
232
232
|
name = "dlin"
|
|
233
|
-
version = "0.2.
|
|
233
|
+
version = "0.2.3"
|
|
234
234
|
dependencies = [
|
|
235
235
|
"anyhow",
|
|
236
236
|
"clap",
|
|
@@ -247,7 +247,7 @@ dependencies = [
|
|
|
247
247
|
|
|
248
248
|
[[package]]
|
|
249
249
|
name = "dlin-core"
|
|
250
|
-
version = "0.2.
|
|
250
|
+
version = "0.2.3"
|
|
251
251
|
dependencies = [
|
|
252
252
|
"anyhow",
|
|
253
253
|
"clap",
|
|
@@ -717,27 +717,12 @@ dependencies = [
|
|
|
717
717
|
"winapi-util",
|
|
718
718
|
]
|
|
719
719
|
|
|
720
|
-
[[package]]
|
|
721
|
-
name = "scc"
|
|
722
|
-
version = "2.4.0"
|
|
723
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
724
|
-
checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc"
|
|
725
|
-
dependencies = [
|
|
726
|
-
"sdd",
|
|
727
|
-
]
|
|
728
|
-
|
|
729
720
|
[[package]]
|
|
730
721
|
name = "scopeguard"
|
|
731
722
|
version = "1.2.0"
|
|
732
723
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
733
724
|
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
|
734
725
|
|
|
735
|
-
[[package]]
|
|
736
|
-
name = "sdd"
|
|
737
|
-
version = "3.0.10"
|
|
738
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
739
|
-
checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca"
|
|
740
|
-
|
|
741
726
|
[[package]]
|
|
742
727
|
name = "serde"
|
|
743
728
|
version = "1.0.228"
|
|
@@ -802,24 +787,23 @@ dependencies = [
|
|
|
802
787
|
|
|
803
788
|
[[package]]
|
|
804
789
|
name = "serial_test"
|
|
805
|
-
version = "3.
|
|
790
|
+
version = "3.5.0"
|
|
806
791
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
807
|
-
checksum = "
|
|
792
|
+
checksum = "699f4197115b8a7e7ff19c9a315a4bd6fffec26cc4626ef45ecaea389e081c6d"
|
|
808
793
|
dependencies = [
|
|
809
794
|
"futures-executor",
|
|
810
795
|
"futures-util",
|
|
811
796
|
"log",
|
|
812
797
|
"once_cell",
|
|
813
798
|
"parking_lot",
|
|
814
|
-
"scc",
|
|
815
799
|
"serial_test_derive",
|
|
816
800
|
]
|
|
817
801
|
|
|
818
802
|
[[package]]
|
|
819
803
|
name = "serial_test_derive"
|
|
820
|
-
version = "3.
|
|
804
|
+
version = "3.5.0"
|
|
821
805
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
822
|
-
checksum = "
|
|
806
|
+
checksum = "94e153fc76e1c6a068703d6d29c508a0b15c061c4b7e43da59cc097bc342673c"
|
|
823
807
|
dependencies = [
|
|
824
808
|
"proc-macro2",
|
|
825
809
|
"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.3"
|
|
7
7
|
edition = "2024"
|
|
8
8
|
license = "MIT"
|
|
9
9
|
repository = "https://github.com/eitsupi/dlin"
|
|
@@ -34,7 +34,7 @@ insta = "1"
|
|
|
34
34
|
serial_test = "3.4.0"
|
|
35
35
|
|
|
36
36
|
# internal
|
|
37
|
-
dlin-core = { version = "0.2.
|
|
37
|
+
dlin-core = { version = "0.2.3", path = "crates/dlin-core" }
|
|
38
38
|
|
|
39
39
|
[workspace.lints.rust]
|
|
40
40
|
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] }
|
|
@@ -14,15 +14,27 @@ pub struct JinjaExtraction {
|
|
|
14
14
|
pub config: SqlConfig,
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
/// Result of a Jinja-based extraction attempt.
|
|
18
|
+
///
|
|
19
|
+
/// minijinja evaluates function arguments before resolving the callee, so even
|
|
20
|
+
/// when rendering fails (e.g. on an unknown macro) the refs/sources recorded up
|
|
21
|
+
/// to the failure point are valid. `complete` tells the caller whether rendering
|
|
22
|
+
/// finished; if not, the regex fallback should be merged in to cover anything
|
|
23
|
+
/// after the failure point.
|
|
24
|
+
#[derive(Debug, Clone, Default)]
|
|
25
|
+
pub struct JinjaOutcome {
|
|
26
|
+
pub extraction: JinjaExtraction,
|
|
27
|
+
pub complete: bool,
|
|
28
|
+
}
|
|
29
|
+
|
|
17
30
|
/// Try to extract refs, sources, and config from SQL content using minijinja.
|
|
18
31
|
/// Renders twice (with `is_incremental()` returning both false and true) and
|
|
19
32
|
/// merges results to capture refs/sources from all conditional branches.
|
|
20
|
-
/// Returns `None` if the template fails to render (caller should fall back to regex).
|
|
21
33
|
///
|
|
22
34
|
/// `macro_prefix` is the pre-built concatenation of valid macro SQL files.
|
|
23
35
|
/// It is prepended to the template so that custom macros containing
|
|
24
36
|
/// ref()/source() calls are expanded and tracked.
|
|
25
|
-
pub fn extract_via_jinja(sql: &str, macro_prefix: &str) ->
|
|
37
|
+
pub fn extract_via_jinja(sql: &str, macro_prefix: &str) -> JinjaOutcome {
|
|
26
38
|
extract_via_jinja_with_vars(sql, macro_prefix, &HashMap::new())
|
|
27
39
|
}
|
|
28
40
|
|
|
@@ -32,7 +44,7 @@ pub fn extract_via_jinja_with_vars(
|
|
|
32
44
|
sql: &str,
|
|
33
45
|
macro_prefix: &str,
|
|
34
46
|
vars: &HashMap<String, serde_json::Value>,
|
|
35
|
-
) ->
|
|
47
|
+
) -> JinjaOutcome {
|
|
36
48
|
let template = if macro_prefix.is_empty() {
|
|
37
49
|
sql.to_string()
|
|
38
50
|
} else {
|
|
@@ -40,14 +52,16 @@ pub fn extract_via_jinja_with_vars(
|
|
|
40
52
|
};
|
|
41
53
|
|
|
42
54
|
// Render with is_incremental=false first (full-load path)
|
|
43
|
-
let mut result = render_with_incremental(&template, false, vars)
|
|
55
|
+
let (mut result, full_ok) = render_with_incremental(&template, false, vars);
|
|
44
56
|
|
|
45
57
|
// Render again with is_incremental=true to capture incremental-only refs
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
58
|
+
let (incr, incr_ok) = render_with_incremental(&template, true, vars);
|
|
59
|
+
merge_extraction(&mut result, incr);
|
|
49
60
|
|
|
50
|
-
|
|
61
|
+
JinjaOutcome {
|
|
62
|
+
extraction: result,
|
|
63
|
+
complete: full_ok && incr_ok,
|
|
64
|
+
}
|
|
51
65
|
}
|
|
52
66
|
|
|
53
67
|
/// Build a macro prefix string from individual macro sources, skipping
|
|
@@ -76,7 +90,7 @@ pub fn build_macro_prefix(macro_sources: &[String]) -> String {
|
|
|
76
90
|
}
|
|
77
91
|
|
|
78
92
|
/// Merge `other` into `base`, adding only deduplicated refs and sources
|
|
79
|
-
fn merge_extraction(base: &mut JinjaExtraction, other: JinjaExtraction) {
|
|
93
|
+
pub(super) fn merge_extraction(base: &mut JinjaExtraction, other: JinjaExtraction) {
|
|
80
94
|
for r in other.refs {
|
|
81
95
|
if !base.refs.contains(&r) {
|
|
82
96
|
base.refs.push(r);
|
|
@@ -87,7 +101,14 @@ fn merge_extraction(base: &mut JinjaExtraction, other: JinjaExtraction) {
|
|
|
87
101
|
base.sources.push(s);
|
|
88
102
|
}
|
|
89
103
|
}
|
|
90
|
-
// config from first render takes precedence
|
|
104
|
+
// config from the first render takes precedence; fill in fields the
|
|
105
|
+
// first render did not produce (e.g. it failed before reaching config())
|
|
106
|
+
if base.config.materialized.is_none() {
|
|
107
|
+
base.config.materialized = other.config.materialized;
|
|
108
|
+
}
|
|
109
|
+
if base.config.tags.is_empty() {
|
|
110
|
+
base.config.tags = other.config.tags;
|
|
111
|
+
}
|
|
91
112
|
}
|
|
92
113
|
|
|
93
114
|
/// Convert a `serde_json::Value` to a `minijinja::Value`.
|
|
@@ -96,11 +117,16 @@ fn json_to_minijinja(v: &serde_json::Value) -> Value {
|
|
|
96
117
|
}
|
|
97
118
|
|
|
98
119
|
/// Render a dbt SQL template once with the given `is_incremental` value.
|
|
120
|
+
///
|
|
121
|
+
/// Returns the extraction together with a flag indicating whether rendering
|
|
122
|
+
/// succeeded. On failure the extraction still holds everything recorded up to
|
|
123
|
+
/// the failure point (minijinja evaluates call arguments before resolving the
|
|
124
|
+
/// callee, so e.g. `{{ unknown_macro(ref('a')) }}` records `ref('a')`).
|
|
99
125
|
fn render_with_incremental(
|
|
100
126
|
sql: &str,
|
|
101
127
|
is_incremental: bool,
|
|
102
128
|
vars: &HashMap<String, serde_json::Value>,
|
|
103
|
-
) ->
|
|
129
|
+
) -> (JinjaExtraction, bool) {
|
|
104
130
|
let extraction = Arc::new(Mutex::new(JinjaExtraction::default()));
|
|
105
131
|
|
|
106
132
|
let mut env = Environment::new();
|
|
@@ -292,29 +318,45 @@ fn render_with_incremental(
|
|
|
292
318
|
env.add_global("model", Value::from("__dbt_model__"));
|
|
293
319
|
env.add_global("execute", Value::from(true));
|
|
294
320
|
|
|
295
|
-
let
|
|
321
|
+
let render_ok = env.render_str(sql, ()).is_ok();
|
|
322
|
+
// Both env (function closures) and a render error (its debug info can
|
|
323
|
+
// capture referenced template values) hold clones of the extraction Arc,
|
|
324
|
+
// so they must be gone before unwrapping.
|
|
296
325
|
drop(env);
|
|
297
326
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
.unwrap_or_else(|e| e.into_inner());
|
|
304
|
-
Some(result)
|
|
305
|
-
}
|
|
306
|
-
Err(_) => None,
|
|
307
|
-
}
|
|
327
|
+
let result = Arc::try_unwrap(extraction)
|
|
328
|
+
.expect("single owner")
|
|
329
|
+
.into_inner()
|
|
330
|
+
.unwrap_or_else(|e| e.into_inner());
|
|
331
|
+
(result, render_ok)
|
|
308
332
|
}
|
|
309
333
|
|
|
310
334
|
#[cfg(test)]
|
|
311
335
|
mod tests {
|
|
312
336
|
use super::*;
|
|
313
337
|
|
|
338
|
+
/// Extract and assert the template rendered to completion.
|
|
339
|
+
fn extract_complete(sql: &str, macro_prefix: &str) -> JinjaExtraction {
|
|
340
|
+
let outcome = extract_via_jinja(sql, macro_prefix);
|
|
341
|
+
assert!(outcome.complete, "expected template to render completely");
|
|
342
|
+
outcome.extraction
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/// Like [`extract_complete`] with project vars.
|
|
346
|
+
fn extract_complete_with_vars(
|
|
347
|
+
sql: &str,
|
|
348
|
+
macro_prefix: &str,
|
|
349
|
+
vars: &HashMap<String, serde_json::Value>,
|
|
350
|
+
) -> JinjaExtraction {
|
|
351
|
+
let outcome = extract_via_jinja_with_vars(sql, macro_prefix, vars);
|
|
352
|
+
assert!(outcome.complete, "expected template to render completely");
|
|
353
|
+
outcome.extraction
|
|
354
|
+
}
|
|
355
|
+
|
|
314
356
|
#[test]
|
|
315
357
|
fn test_simple_ref() {
|
|
316
358
|
let sql = "SELECT * FROM {{ ref('stg_orders') }}";
|
|
317
|
-
let ext =
|
|
359
|
+
let ext = extract_complete(sql, "");
|
|
318
360
|
assert_eq!(ext.refs.len(), 1);
|
|
319
361
|
assert_eq!(ext.refs[0].name, "stg_orders");
|
|
320
362
|
assert!(ext.refs[0].package.is_none());
|
|
@@ -323,7 +365,7 @@ mod tests {
|
|
|
323
365
|
#[test]
|
|
324
366
|
fn test_two_arg_ref() {
|
|
325
367
|
let sql = "SELECT * FROM {{ ref('other_pkg', 'stg_orders') }}";
|
|
326
|
-
let ext =
|
|
368
|
+
let ext = extract_complete(sql, "");
|
|
327
369
|
assert_eq!(ext.refs.len(), 1);
|
|
328
370
|
assert_eq!(ext.refs[0].package.as_deref(), Some("other_pkg"));
|
|
329
371
|
assert_eq!(ext.refs[0].name, "stg_orders");
|
|
@@ -332,7 +374,7 @@ mod tests {
|
|
|
332
374
|
#[test]
|
|
333
375
|
fn test_source() {
|
|
334
376
|
let sql = "SELECT * FROM {{ source('raw', 'orders') }}";
|
|
335
|
-
let ext =
|
|
377
|
+
let ext = extract_complete(sql, "");
|
|
336
378
|
assert_eq!(ext.sources.len(), 1);
|
|
337
379
|
assert_eq!(ext.sources[0].source_name, "raw");
|
|
338
380
|
assert_eq!(ext.sources[0].table_name, "orders");
|
|
@@ -341,7 +383,7 @@ mod tests {
|
|
|
341
383
|
#[test]
|
|
342
384
|
fn test_config() {
|
|
343
385
|
let sql = "{{ config(materialized='incremental', tags=['nightly', 'finance']) }}\nSELECT 1";
|
|
344
|
-
let ext =
|
|
386
|
+
let ext = extract_complete(sql, "");
|
|
345
387
|
assert_eq!(ext.config.materialized.as_deref(), Some("incremental"));
|
|
346
388
|
assert_eq!(ext.config.tags, vec!["nightly", "finance"]);
|
|
347
389
|
}
|
|
@@ -356,7 +398,7 @@ mod tests {
|
|
|
356
398
|
FROM {{ ref('stg_orders') }} o
|
|
357
399
|
JOIN {{ source('raw', 'customers') }} c ON o.customer_id = c.id
|
|
358
400
|
"#;
|
|
359
|
-
let ext =
|
|
401
|
+
let ext = extract_complete(sql, "");
|
|
360
402
|
assert_eq!(ext.refs.len(), 1);
|
|
361
403
|
assert_eq!(ext.sources.len(), 1);
|
|
362
404
|
assert_eq!(ext.config.materialized.as_deref(), Some("table"));
|
|
@@ -368,7 +410,7 @@ mod tests {
|
|
|
368
410
|
{% set orders = ref('stg_orders') %}
|
|
369
411
|
SELECT * FROM {{ orders }}
|
|
370
412
|
"#;
|
|
371
|
-
let ext =
|
|
413
|
+
let ext = extract_complete(sql, "");
|
|
372
414
|
assert_eq!(ext.refs.len(), 1);
|
|
373
415
|
assert_eq!(ext.refs[0].name, "stg_orders");
|
|
374
416
|
}
|
|
@@ -383,7 +425,7 @@ mod tests {
|
|
|
383
425
|
SELECT * FROM {{ ref('stg_full_orders') }}
|
|
384
426
|
{% endif %}
|
|
385
427
|
"#;
|
|
386
|
-
let ext =
|
|
428
|
+
let ext = extract_complete(sql, "");
|
|
387
429
|
// Both branches are rendered: unique refs from each branch
|
|
388
430
|
assert_eq!(ext.refs.len(), 2);
|
|
389
431
|
assert!(ext.refs.iter().any(|r| r.name == "stg_full_orders"));
|
|
@@ -396,7 +438,7 @@ mod tests {
|
|
|
396
438
|
{# This is a comment with {{ ref('should_be_ignored') }} #}
|
|
397
439
|
SELECT * FROM {{ ref('actual_model') }}
|
|
398
440
|
"#;
|
|
399
|
-
let ext =
|
|
441
|
+
let ext = extract_complete(sql, "");
|
|
400
442
|
assert_eq!(ext.refs.len(), 1);
|
|
401
443
|
assert_eq!(ext.refs[0].name, "actual_model");
|
|
402
444
|
}
|
|
@@ -404,7 +446,7 @@ mod tests {
|
|
|
404
446
|
#[test]
|
|
405
447
|
fn test_whitespace_control() {
|
|
406
448
|
let sql = "SELECT * FROM {{- ref('stg_orders') -}}";
|
|
407
|
-
let ext =
|
|
449
|
+
let ext = extract_complete(sql, "");
|
|
408
450
|
assert_eq!(ext.refs.len(), 1);
|
|
409
451
|
assert_eq!(ext.refs[0].name, "stg_orders");
|
|
410
452
|
}
|
|
@@ -412,7 +454,7 @@ mod tests {
|
|
|
412
454
|
#[test]
|
|
413
455
|
fn test_var_with_default() {
|
|
414
456
|
let sql = "SELECT * FROM {{ ref('model_' ~ var('suffix', 'default')) }}";
|
|
415
|
-
let ext =
|
|
457
|
+
let ext = extract_complete(sql, "");
|
|
416
458
|
assert_eq!(ext.refs.len(), 1);
|
|
417
459
|
assert_eq!(ext.refs[0].name, "model_default");
|
|
418
460
|
}
|
|
@@ -425,7 +467,7 @@ mod tests {
|
|
|
425
467
|
"suffix".to_string(),
|
|
426
468
|
serde_json::Value::String("prod".to_string()),
|
|
427
469
|
);
|
|
428
|
-
let ext =
|
|
470
|
+
let ext = extract_complete_with_vars(sql, "", &vars);
|
|
429
471
|
assert_eq!(ext.refs.len(), 1);
|
|
430
472
|
assert_eq!(ext.refs[0].name, "model_prod");
|
|
431
473
|
}
|
|
@@ -446,7 +488,7 @@ mod tests {
|
|
|
446
488
|
"product_categories".to_string(),
|
|
447
489
|
serde_json::json!(["electronics", "clothing"]),
|
|
448
490
|
);
|
|
449
|
-
let ext =
|
|
491
|
+
let ext = extract_complete_with_vars(sql, "", &vars);
|
|
450
492
|
assert_eq!(ext.refs.len(), 2);
|
|
451
493
|
assert!(ext.refs.iter().any(|r| r.name == "stg_electronics_summary"));
|
|
452
494
|
assert!(ext.refs.iter().any(|r| r.name == "stg_clothing_summary"));
|
|
@@ -462,7 +504,7 @@ mod tests {
|
|
|
462
504
|
"env".to_string(),
|
|
463
505
|
serde_json::Value::String("staging".to_string()),
|
|
464
506
|
);
|
|
465
|
-
let ext =
|
|
507
|
+
let ext = extract_complete_with_vars(sql, "", &vars);
|
|
466
508
|
assert_eq!(ext.refs.len(), 1);
|
|
467
509
|
assert_eq!(ext.refs[0].name, "model_staging");
|
|
468
510
|
}
|
|
@@ -476,7 +518,7 @@ mod tests {
|
|
|
476
518
|
"other_var".to_string(),
|
|
477
519
|
serde_json::Value::String("unused".to_string()),
|
|
478
520
|
);
|
|
479
|
-
let ext =
|
|
521
|
+
let ext = extract_complete_with_vars(sql, "", &vars);
|
|
480
522
|
assert_eq!(ext.refs.len(), 1);
|
|
481
523
|
assert_eq!(ext.refs[0].name, "model_fallback");
|
|
482
524
|
}
|
|
@@ -489,7 +531,7 @@ mod tests {
|
|
|
489
531
|
{% if not loop.last %}UNION ALL{% endif %}
|
|
490
532
|
{% endfor %}
|
|
491
533
|
"#;
|
|
492
|
-
let ext =
|
|
534
|
+
let ext = extract_complete(sql, "");
|
|
493
535
|
assert_eq!(ext.sources.len(), 2);
|
|
494
536
|
assert_eq!(ext.sources[0].source_name, "raw");
|
|
495
537
|
assert_eq!(ext.sources[0].table_name, "orders");
|
|
@@ -500,7 +542,7 @@ mod tests {
|
|
|
500
542
|
#[test]
|
|
501
543
|
fn test_config_with_extra_kwargs() {
|
|
502
544
|
let sql = "{{ config(materialized='incremental', schema='analytics', unique_key='id', tags=['nightly']) }}\nSELECT 1";
|
|
503
|
-
let ext =
|
|
545
|
+
let ext = extract_complete(sql, "");
|
|
504
546
|
assert_eq!(ext.config.materialized.as_deref(), Some("incremental"));
|
|
505
547
|
assert_eq!(ext.config.tags, vec!["nightly"]);
|
|
506
548
|
}
|
|
@@ -508,7 +550,7 @@ mod tests {
|
|
|
508
550
|
#[test]
|
|
509
551
|
fn test_ref_with_version_kwarg() {
|
|
510
552
|
let sql = "SELECT * FROM {{ ref('my_model', version=2) }}";
|
|
511
|
-
let ext =
|
|
553
|
+
let ext = extract_complete(sql, "");
|
|
512
554
|
assert_eq!(ext.refs.len(), 1);
|
|
513
555
|
assert_eq!(ext.refs[0].name, "my_model");
|
|
514
556
|
assert_eq!(ext.refs[0].version.as_deref(), Some("2"));
|
|
@@ -518,7 +560,7 @@ mod tests {
|
|
|
518
560
|
#[test]
|
|
519
561
|
fn test_ref_with_version_kwarg_and_package() {
|
|
520
562
|
let sql = "SELECT * FROM {{ ref('mypkg', 'my_model', version=3) }}";
|
|
521
|
-
let ext =
|
|
563
|
+
let ext = extract_complete(sql, "");
|
|
522
564
|
assert_eq!(ext.refs.len(), 1);
|
|
523
565
|
assert_eq!(ext.refs[0].package.as_deref(), Some("mypkg"));
|
|
524
566
|
assert_eq!(ext.refs[0].name, "my_model");
|
|
@@ -528,14 +570,14 @@ mod tests {
|
|
|
528
570
|
#[test]
|
|
529
571
|
fn test_ref_without_version_has_none() {
|
|
530
572
|
let sql = "SELECT * FROM {{ ref('my_model') }}";
|
|
531
|
-
let ext =
|
|
573
|
+
let ext = extract_complete(sql, "");
|
|
532
574
|
assert_eq!(ext.refs[0].version, None);
|
|
533
575
|
}
|
|
534
576
|
|
|
535
577
|
#[test]
|
|
536
578
|
fn test_ref_with_v_shorthand_kwarg() {
|
|
537
579
|
let sql = "SELECT * FROM {{ ref('my_model', v=2) }}";
|
|
538
|
-
let ext =
|
|
580
|
+
let ext = extract_complete(sql, "");
|
|
539
581
|
assert_eq!(ext.refs.len(), 1);
|
|
540
582
|
assert_eq!(ext.refs[0].name, "my_model");
|
|
541
583
|
assert_eq!(ext.refs[0].version.as_deref(), Some("2"));
|
|
@@ -545,7 +587,7 @@ mod tests {
|
|
|
545
587
|
#[test]
|
|
546
588
|
fn test_ref_with_v_shorthand_kwarg_and_package() {
|
|
547
589
|
let sql = "SELECT * FROM {{ ref('mypkg', 'my_model', v=3) }}";
|
|
548
|
-
let ext =
|
|
590
|
+
let ext = extract_complete(sql, "");
|
|
549
591
|
assert_eq!(ext.refs.len(), 1);
|
|
550
592
|
assert_eq!(ext.refs[0].package.as_deref(), Some("mypkg"));
|
|
551
593
|
assert_eq!(ext.refs[0].name, "my_model");
|
|
@@ -556,7 +598,7 @@ mod tests {
|
|
|
556
598
|
fn test_ref_with_string_version_kwarg() {
|
|
557
599
|
// version='alpha' (non-numeric string) passes through unchanged
|
|
558
600
|
let sql = "SELECT * FROM {{ ref('my_model', version='alpha') }}";
|
|
559
|
-
let ext =
|
|
601
|
+
let ext = extract_complete(sql, "");
|
|
560
602
|
assert_eq!(ext.refs[0].version.as_deref(), Some("alpha"));
|
|
561
603
|
}
|
|
562
604
|
|
|
@@ -564,7 +606,7 @@ mod tests {
|
|
|
564
606
|
fn test_ref_with_padded_integer_version_kwarg() {
|
|
565
607
|
// version='02' (string kwarg) must normalize to "2"
|
|
566
608
|
let sql = "SELECT * FROM {{ ref('my_model', version='02') }}";
|
|
567
|
-
let ext =
|
|
609
|
+
let ext = extract_complete(sql, "");
|
|
568
610
|
assert_eq!(ext.refs[0].version.as_deref(), Some("2"));
|
|
569
611
|
}
|
|
570
612
|
|
|
@@ -572,16 +614,27 @@ mod tests {
|
|
|
572
614
|
fn test_ref_with_decimal_version_kwarg() {
|
|
573
615
|
// version='2.0' stays as "2.0" — matching YAML `v: "2.0"` which also keeps "2.0".
|
|
574
616
|
let sql = "SELECT * FROM {{ ref('my_model', version='2.0') }}";
|
|
575
|
-
let ext =
|
|
617
|
+
let ext = extract_complete(sql, "");
|
|
576
618
|
assert_eq!(ext.refs[0].version.as_deref(), Some("2.0"));
|
|
577
619
|
}
|
|
578
620
|
|
|
579
621
|
#[test]
|
|
580
|
-
fn
|
|
581
|
-
// Unknown block tags should
|
|
622
|
+
fn test_incomplete_on_unsupported_template() {
|
|
623
|
+
// Unknown block tags should mark the outcome as incomplete
|
|
582
624
|
let sql = "{% materialization table, default %} SELECT 1 {% endmaterialization %}";
|
|
583
625
|
let result = extract_via_jinja(sql, "");
|
|
584
|
-
assert!(result.
|
|
626
|
+
assert!(!result.complete);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
#[test]
|
|
630
|
+
fn test_partial_extraction_salvaged_on_render_failure() {
|
|
631
|
+
// minijinja evaluates call arguments before resolving the callee, so
|
|
632
|
+
// refs passed to an unknown macro are recorded before the failure.
|
|
633
|
+
let sql = "{{ shared_macros.import_cte([('orders', ref('int_orders'))]) }}";
|
|
634
|
+
let outcome = extract_via_jinja(sql, "");
|
|
635
|
+
assert!(!outcome.complete);
|
|
636
|
+
assert_eq!(outcome.extraction.refs.len(), 1);
|
|
637
|
+
assert_eq!(outcome.extraction.refs[0].name, "int_orders");
|
|
585
638
|
}
|
|
586
639
|
|
|
587
640
|
#[test]
|
|
@@ -592,7 +645,7 @@ mod tests {
|
|
|
592
645
|
{% endmacro %}
|
|
593
646
|
"#;
|
|
594
647
|
let sql = "SELECT * FROM ({{ my_cte() }})";
|
|
595
|
-
let ext =
|
|
648
|
+
let ext = extract_complete(sql, macro_src);
|
|
596
649
|
assert_eq!(ext.refs.len(), 1);
|
|
597
650
|
assert_eq!(ext.refs[0].name, "base_model");
|
|
598
651
|
}
|
|
@@ -605,7 +658,7 @@ mod tests {
|
|
|
605
658
|
{% endmacro %}
|
|
606
659
|
"#;
|
|
607
660
|
let sql = "SELECT * FROM ({{ raw_data('orders') }})";
|
|
608
|
-
let ext =
|
|
661
|
+
let ext = extract_complete(sql, macro_src);
|
|
609
662
|
assert_eq!(ext.sources.len(), 1);
|
|
610
663
|
assert_eq!(ext.sources[0].source_name, "raw");
|
|
611
664
|
assert_eq!(ext.sources[0].table_name, "orders");
|
|
@@ -621,7 +674,7 @@ mod tests {
|
|
|
621
674
|
{% endmacro %}
|
|
622
675
|
"#;
|
|
623
676
|
let sql = "{{ join_tables('day') }}";
|
|
624
|
-
let ext =
|
|
677
|
+
let ext = extract_complete(sql, macro_src);
|
|
625
678
|
assert_eq!(ext.refs.len(), 2);
|
|
626
679
|
assert!(ext.refs.iter().any(|r| r.name == "deals"));
|
|
627
680
|
assert!(ext.refs.iter().any(|r| r.name == "providers"));
|
|
@@ -647,7 +700,7 @@ mod tests {
|
|
|
647
700
|
];
|
|
648
701
|
let prefix = build_macro_prefix(&sources);
|
|
649
702
|
let sql = "{{ get_orders() }} UNION ALL {{ get_customers() }}";
|
|
650
|
-
let ext =
|
|
703
|
+
let ext = extract_complete(sql, &prefix);
|
|
651
704
|
assert_eq!(ext.refs.len(), 2);
|
|
652
705
|
assert!(ext.refs.iter().any(|r| r.name == "stg_orders"));
|
|
653
706
|
assert!(ext.refs.iter().any(|r| r.name == "stg_customers"));
|
|
@@ -693,7 +746,7 @@ mod tests {
|
|
|
693
746
|
];
|
|
694
747
|
let prefix = build_macro_prefix(&sources);
|
|
695
748
|
let sql = "SELECT * FROM {{ ref('orders') }}";
|
|
696
|
-
let ext =
|
|
749
|
+
let ext = extract_complete(sql, &prefix);
|
|
697
750
|
assert_eq!(ext.refs.len(), 1);
|
|
698
751
|
assert_eq!(ext.refs[0].name, "orders");
|
|
699
752
|
}
|