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.
Files changed (131) hide show
  1. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/Cargo.lock +6 -22
  2. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/Cargo.toml +2 -2
  3. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/PKG-INFO +1 -1
  4. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/jinja.rs +107 -54
  5. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/sql.rs +299 -61
  6. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/LICENSE +0 -0
  7. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/README.md +0 -0
  8. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/Cargo.toml +0 -0
  9. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/README.md +0 -0
  10. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/src/cli.rs +0 -0
  11. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/src/main.rs +0 -0
  12. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/src/mcp.rs +0 -0
  13. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin/tests/integration_test.rs +0 -0
  14. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/Cargo.toml +0 -0
  15. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/README.md +0 -0
  16. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/error.rs +0 -0
  17. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/mod.rs +0 -0
  18. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/build_graph.rs +0 -0
  19. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/generic_tests.rs +0 -0
  20. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/mod.rs +0 -0
  21. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/ref_parsing.rs +0 -0
  22. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/builder/tests/versioned.rs +0 -0
  23. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/cache.rs +0 -0
  24. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/cross_model.rs +0 -0
  25. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/impact.rs +0 -0
  26. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/mod.rs +0 -0
  27. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/schema.rs +0 -0
  28. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/single_model.rs +0 -0
  29. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/tests/cache.rs +0 -0
  30. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/tests/core.rs +0 -0
  31. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/tests/impact.rs +0 -0
  32. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/tests/mod.rs +0 -0
  33. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/column_lineage/types.rs +0 -0
  34. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/mod.rs +0 -0
  35. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/collapse.rs +0 -0
  36. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/filter_graph.rs +0 -0
  37. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/mod.rs +0 -0
  38. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/output.rs +0 -0
  39. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/search.rs +0 -0
  40. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/selector.rs +0 -0
  41. {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
  42. {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
  43. {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
  44. {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
  45. {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
  46. {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
  47. {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
  48. {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
  49. {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
  50. {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
  51. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/transitive.rs +0 -0
  52. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/filter/tests/versioned.rs +0 -0
  53. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/impact.rs +0 -0
  54. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/mod.rs +0 -0
  55. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/graph/types.rs +0 -0
  56. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/input.rs +0 -0
  57. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/lib.rs +0 -0
  58. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/cache.rs +0 -0
  59. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/columns.rs +0 -0
  60. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/discovery.rs +0 -0
  61. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/manifest.rs +0 -0
  62. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/manifest_cache.rs +0 -0
  63. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/mod.rs +0 -0
  64. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/project.rs +0 -0
  65. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/parser/yaml_schema.rs +0 -0
  66. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/ascii.rs +0 -0
  67. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/column_graph.rs +0 -0
  68. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/dot.rs +0 -0
  69. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/html.rs +0 -0
  70. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/impact.rs +0 -0
  71. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/json.rs +0 -0
  72. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/layout.rs +0 -0
  73. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/list.rs +0 -0
  74. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/mermaid.rs +0 -0
  75. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/mod.rs +0 -0
  76. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/plain.rs +0 -0
  77. {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
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {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
  84. {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
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {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
  91. {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
  92. {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
  93. {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
  94. {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
  95. {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
  96. {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
  97. {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
  98. {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
  99. {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
  100. {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
  101. {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
  102. {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
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/summary.rs +0 -0
  129. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/src/render/svg.rs +0 -0
  130. {dlin_cli-0.2.2 → dlin_cli-0.2.3}/crates/dlin-core/tests/column_lineage_test.rs +0 -0
  131. {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.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.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.4.0"
790
+ version = "3.5.0"
806
791
  source = "registry+https://github.com/rust-lang/crates.io-index"
807
- checksum = "911bd979bf1070a3f3aa7b691a3b3e9968f339ceeec89e08c280a8a22207a32f"
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.4.0"
804
+ version = "3.5.0"
821
805
  source = "registry+https://github.com/rust-lang/crates.io-index"
822
- checksum = "0a7d91949b85b0d2fb687445e448b40d322b6b3e4af6b44a29b21d9a5f33e6d9"
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.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.2", path = "crates/dlin-core" }
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)'] }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dlin-cli
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -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) -> Option<JinjaExtraction> {
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
- ) -> Option<JinjaExtraction> {
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
- if let Some(incr) = render_with_incremental(&template, true, vars) {
47
- merge_extraction(&mut result, incr);
48
- }
58
+ let (incr, incr_ok) = render_with_incremental(&template, true, vars);
59
+ merge_extraction(&mut result, incr);
49
60
 
50
- Some(result)
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
- ) -> Option<JinjaExtraction> {
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 render_result = env.render_str(sql, ());
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
- match render_result {
299
- Ok(_) => {
300
- let result = Arc::try_unwrap(extraction)
301
- .expect("single owner")
302
- .into_inner()
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja_with_vars(sql, "", &vars).unwrap();
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 = extract_via_jinja_with_vars(sql, "", &vars).unwrap();
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 = extract_via_jinja_with_vars(sql, "", &vars).unwrap();
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 = extract_via_jinja_with_vars(sql, "", &vars).unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 = extract_via_jinja(sql, "").unwrap();
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 test_returns_none_on_unsupported_template() {
581
- // Unknown block tags should cause failure
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.is_none());
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 = extract_via_jinja(sql, macro_src).unwrap();
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 = extract_via_jinja(sql, macro_src).unwrap();
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 = extract_via_jinja(sql, macro_src).unwrap();
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 = extract_via_jinja(sql, &prefix).unwrap();
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 = extract_via_jinja(sql, &prefix).unwrap();
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
  }