snowflake-code-unit-registry 0.8.38__tar.gz → 0.8.41__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 (97) hide show
  1. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/Cargo.lock +49 -49
  2. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/Cargo.toml +1 -1
  3. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/PKG-INFO +1 -1
  4. snowflake_code_unit_registry-0.8.41/crates/scai-state-core/examples/script-code-unit.example.json +168 -0
  5. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/schemas/code-unit.schema.json +105 -0
  6. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/bindings.rs +22 -1
  7. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/generated/schema_constraints.rs +5 -0
  8. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/lib.rs +1 -0
  9. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry/tests.rs +251 -6
  10. snowflake_code_unit_registry-0.8.38/crates/scai-state-core/src/validation.rs → snowflake_code_unit_registry-0.8.41/crates/scai-state-core/src/validation/mod.rs +34 -24
  11. snowflake_code_unit_registry-0.8.41/crates/scai-state-core/src/validation/script_io.rs +271 -0
  12. snowflake_code_unit_registry-0.8.41/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_script_metadata.json +5 -0
  13. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/src/lib.rs +25 -0
  14. snowflake_code_unit_registry-0.8.41/crates/scai-state-python/tests/test_script_metadata.py +154 -0
  15. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/pyproject.toml +1 -1
  16. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/python/snowflake_code_unit_registry/__init__.py +52 -1
  17. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/python/snowflake_code_unit_registry/types.py +146 -5
  18. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/README.md +0 -0
  19. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-error-derive/Cargo.toml +0 -0
  20. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-error-derive/src/lib.rs +0 -0
  21. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-error-derive/tests/derive_integration.rs +0 -0
  22. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-log/Cargo.toml +0 -0
  23. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-log/src/lib.rs +0 -0
  24. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-log/src/tests.rs +0 -0
  25. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/Cargo.toml +0 -0
  26. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/build/file_path_fields.rs +0 -0
  27. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/build/main.rs +0 -0
  28. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/build/output.rs +0 -0
  29. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/build/query_reference.rs +0 -0
  30. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/build/schema.rs +0 -0
  31. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/build/schema_constraints.rs +0 -0
  32. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/build/typify.rs +0 -0
  33. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/build/updated_at_paths.rs +0 -0
  34. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/examples/code-unit.example.json +0 -0
  35. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/examples/etl-code-unit.example.json +0 -0
  36. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/schemas/history/README.md +0 -0
  37. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/schemas/query-reference.rs.tmpl +0 -0
  38. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/schemas/query-reference.tmpl +0 -0
  39. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/canonical_name.rs +0 -0
  40. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/checksum.rs +0 -0
  41. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/dependency_view.rs +0 -0
  42. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/error.rs +0 -0
  43. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/error_trace.rs +0 -0
  44. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/filter.rs +0 -0
  45. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/generated/file_path_fields.rs +0 -0
  46. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/generated/mod.rs +0 -0
  47. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/generated/query_reference.rs +0 -0
  48. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/generated/updated_at_paths.rs +0 -0
  49. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/identity.rs +0 -0
  50. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/migration/mod.rs +0 -0
  51. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/migration/versions/mod.rs +0 -0
  52. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry/README.md +0 -0
  53. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry/graph.rs +0 -0
  54. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry/in_memory.rs +0 -0
  55. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry/loader.rs +0 -0
  56. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry/paths.rs +0 -0
  57. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry/query.rs +0 -0
  58. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry/test_helpers.rs +0 -0
  59. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry/test_hooks.rs +0 -0
  60. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/src/registry.rs +0 -0
  61. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/etl_part_cloud_status_data_migration.json +0 -0
  62. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/etl_part_cloud_status_data_validation.json +0 -0
  63. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/etl_part_model_name_on_non_dbt.json +0 -0
  64. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/etl_root_cloud_status.json +0 -0
  65. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/etl_root_dependencies.json +0 -0
  66. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/etl_root_issues.json +0 -0
  67. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/etl_root_source_format.json +0 -0
  68. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/etl_signature.json +0 -0
  69. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_clean.json +0 -0
  70. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_cloud_status.json +0 -0
  71. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_code_status.json +0 -0
  72. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_files.json +0 -0
  73. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_issues.json +0 -0
  74. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_parts.json +0 -0
  75. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_planning.json +0 -0
  76. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_script_bindings.json +0 -0
  77. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_signature.json +0 -0
  78. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_source_format.json +0 -0
  79. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/parameterized_reference_with_target_format.json +0 -0
  80. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/sql_with_parts.json +0 -0
  81. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-core/tests/fixtures/kind-rules/sql_with_stabilization.json +0 -0
  82. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/Cargo.toml +0 -0
  83. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/README.md +0 -0
  84. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/conftest.py +0 -0
  85. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_batch.py +0 -0
  86. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_checksum.py +0 -0
  87. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_cloud_state.py +0 -0
  88. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_crud.py +0 -0
  89. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_errors.py +0 -0
  90. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_logging.py +0 -0
  91. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_migration.py +0 -0
  92. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_query.py +0 -0
  93. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_refresh.py +0 -0
  94. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_script_bindings.py +0 -0
  95. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_serialization.py +0 -0
  96. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/crates/scai-state-python/tests/test_validation.py +0 -0
  97. {snowflake_code_unit_registry-0.8.38 → snowflake_code_unit_registry-0.8.41}/python/snowflake_code_unit_registry/cloud_state.py +0 -0
@@ -84,9 +84,9 @@ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
84
84
 
85
85
  [[package]]
86
86
  name = "ar_archive_writer"
87
- version = "0.5.1"
87
+ version = "0.5.2"
88
88
  source = "registry+https://github.com/rust-lang/crates.io-index"
89
- checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b"
89
+ checksum = "4087686b4b0a3427190bae57a1d9a478dbb2d40c5dc1bd6e2b6d797913bdd348"
90
90
  dependencies = [
91
91
  "object",
92
92
  ]
@@ -245,9 +245,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
245
245
 
246
246
  [[package]]
247
247
  name = "cc"
248
- version = "1.2.63"
248
+ version = "1.2.64"
249
249
  source = "registry+https://github.com/rust-lang/crates.io-index"
250
- checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f"
250
+ checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f"
251
251
  dependencies = [
252
252
  "find-msvc-tools",
253
253
  "jobserver",
@@ -979,9 +979,9 @@ dependencies = [
979
979
 
980
980
  [[package]]
981
981
  name = "h2"
982
- version = "0.4.14"
982
+ version = "0.4.15"
983
983
  source = "registry+https://github.com/rust-lang/crates.io-index"
984
- checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733"
984
+ checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155"
985
985
  dependencies = [
986
986
  "atomic-waker",
987
987
  "bytes",
@@ -1506,9 +1506,9 @@ dependencies = [
1506
1506
 
1507
1507
  [[package]]
1508
1508
  name = "js-sys"
1509
- version = "0.3.100"
1509
+ version = "0.3.102"
1510
1510
  source = "registry+https://github.com/rust-lang/crates.io-index"
1511
- checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162"
1511
+ checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
1512
1512
  dependencies = [
1513
1513
  "cfg-if",
1514
1514
  "futures-util",
@@ -1607,9 +1607,9 @@ checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a"
1607
1607
 
1608
1608
  [[package]]
1609
1609
  name = "memchr"
1610
- version = "2.8.1"
1610
+ version = "2.8.2"
1611
1611
  source = "registry+https://github.com/rust-lang/crates.io-index"
1612
- checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
1612
+ checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
1613
1613
 
1614
1614
  [[package]]
1615
1615
  name = "memmap2"
@@ -1654,9 +1654,9 @@ checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
1654
1654
 
1655
1655
  [[package]]
1656
1656
  name = "napi"
1657
- version = "3.9.0"
1657
+ version = "3.9.2"
1658
1658
  source = "registry+https://github.com/rust-lang/crates.io-index"
1659
- checksum = "f1d395473824516f38dd1071a1a37bc57daa7be65b293ebba4ead5f7abb017a2"
1659
+ checksum = "26d3c7dd60231116a47854321c9ac8df6f13435d11aa3a59d8533a76e07a3730"
1660
1660
  dependencies = [
1661
1661
  "bitflags 2.13.0",
1662
1662
  "ctor",
@@ -1704,9 +1704,9 @@ dependencies = [
1704
1704
 
1705
1705
  [[package]]
1706
1706
  name = "napi-sys"
1707
- version = "3.2.1"
1707
+ version = "3.2.2"
1708
1708
  source = "registry+https://github.com/rust-lang/crates.io-index"
1709
- checksum = "8eb602b84d7c1edae45e50bbf1374696548f36ae179dfa667f577e384bb90c2b"
1709
+ checksum = "1f5bcdf71abd3a50d00b49c1c2c75251cb3c913777d6139cd37dabc093a5e400"
1710
1710
  dependencies = [
1711
1711
  "libloading",
1712
1712
  ]
@@ -2398,9 +2398,9 @@ dependencies = [
2398
2398
 
2399
2399
  [[package]]
2400
2400
  name = "regex"
2401
- version = "1.12.3"
2401
+ version = "1.12.4"
2402
2402
  source = "registry+https://github.com/rust-lang/crates.io-index"
2403
- checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
2403
+ checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
2404
2404
  dependencies = [
2405
2405
  "aho-corasick",
2406
2406
  "memchr",
@@ -2421,9 +2421,9 @@ dependencies = [
2421
2421
 
2422
2422
  [[package]]
2423
2423
  name = "regex-syntax"
2424
- version = "0.8.10"
2424
+ version = "0.8.11"
2425
2425
  source = "registry+https://github.com/rust-lang/crates.io-index"
2426
- checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
2426
+ checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
2427
2427
 
2428
2428
  [[package]]
2429
2429
  name = "regress"
@@ -2622,7 +2622,7 @@ dependencies = [
2622
2622
 
2623
2623
  [[package]]
2624
2624
  name = "scai-error-derive"
2625
- version = "0.8.38"
2625
+ version = "0.8.41"
2626
2626
  dependencies = [
2627
2627
  "err_code",
2628
2628
  "heck",
@@ -2636,7 +2636,7 @@ dependencies = [
2636
2636
 
2637
2637
  [[package]]
2638
2638
  name = "scai-log"
2639
- version = "0.8.38"
2639
+ version = "0.8.41"
2640
2640
  dependencies = [
2641
2641
  "chrono",
2642
2642
  "serde",
@@ -2645,7 +2645,7 @@ dependencies = [
2645
2645
 
2646
2646
  [[package]]
2647
2647
  name = "scai-state-core"
2648
- version = "0.8.38"
2648
+ version = "0.8.41"
2649
2649
  dependencies = [
2650
2650
  "chrono",
2651
2651
  "err_code",
@@ -2671,7 +2671,7 @@ dependencies = [
2671
2671
 
2672
2672
  [[package]]
2673
2673
  name = "scai-state-csharp"
2674
- version = "0.8.38"
2674
+ version = "0.8.41"
2675
2675
  dependencies = [
2676
2676
  "interoptopus",
2677
2677
  "interoptopus_backend_csharp",
@@ -2683,7 +2683,7 @@ dependencies = [
2683
2683
 
2684
2684
  [[package]]
2685
2685
  name = "scai-state-node"
2686
- version = "0.8.38"
2686
+ version = "0.8.41"
2687
2687
  dependencies = [
2688
2688
  "napi",
2689
2689
  "napi-build",
@@ -2696,7 +2696,7 @@ dependencies = [
2696
2696
 
2697
2697
  [[package]]
2698
2698
  name = "scai-state-perf"
2699
- version = "0.8.38"
2699
+ version = "0.8.41"
2700
2700
  dependencies = [
2701
2701
  "chrono",
2702
2702
  "criterion",
@@ -2712,7 +2712,7 @@ dependencies = [
2712
2712
 
2713
2713
  [[package]]
2714
2714
  name = "scai-state-python"
2715
- version = "0.8.38"
2715
+ version = "0.8.41"
2716
2716
  dependencies = [
2717
2717
  "pyo3",
2718
2718
  "pythonize",
@@ -2917,9 +2917,9 @@ dependencies = [
2917
2917
 
2918
2918
  [[package]]
2919
2919
  name = "smallvec"
2920
- version = "1.15.1"
2920
+ version = "1.15.2"
2921
2921
  source = "registry+https://github.com/rust-lang/crates.io-index"
2922
- checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
2922
+ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
2923
2923
 
2924
2924
  [[package]]
2925
2925
  name = "snafu"
@@ -3392,9 +3392,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
3392
3392
 
3393
3393
  [[package]]
3394
3394
  name = "uuid"
3395
- version = "1.23.2"
3395
+ version = "1.23.3"
3396
3396
  source = "registry+https://github.com/rust-lang/crates.io-index"
3397
- checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7"
3397
+ checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7"
3398
3398
  dependencies = [
3399
3399
  "getrandom 0.4.2",
3400
3400
  "js-sys",
@@ -3450,9 +3450,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
3450
3450
 
3451
3451
  [[package]]
3452
3452
  name = "wasip2"
3453
- version = "1.0.3+wasi-0.2.9"
3453
+ version = "1.0.4+wasi-0.2.12"
3454
3454
  source = "registry+https://github.com/rust-lang/crates.io-index"
3455
- checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
3455
+ checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
3456
3456
  dependencies = [
3457
3457
  "wit-bindgen 0.57.1",
3458
3458
  ]
@@ -3468,9 +3468,9 @@ dependencies = [
3468
3468
 
3469
3469
  [[package]]
3470
3470
  name = "wasm-bindgen"
3471
- version = "0.2.123"
3471
+ version = "0.2.125"
3472
3472
  source = "registry+https://github.com/rust-lang/crates.io-index"
3473
- checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563"
3473
+ checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
3474
3474
  dependencies = [
3475
3475
  "cfg-if",
3476
3476
  "once_cell",
@@ -3481,9 +3481,9 @@ dependencies = [
3481
3481
 
3482
3482
  [[package]]
3483
3483
  name = "wasm-bindgen-futures"
3484
- version = "0.4.73"
3484
+ version = "0.4.75"
3485
3485
  source = "registry+https://github.com/rust-lang/crates.io-index"
3486
- checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf"
3486
+ checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280"
3487
3487
  dependencies = [
3488
3488
  "js-sys",
3489
3489
  "wasm-bindgen",
@@ -3491,9 +3491,9 @@ dependencies = [
3491
3491
 
3492
3492
  [[package]]
3493
3493
  name = "wasm-bindgen-macro"
3494
- version = "0.2.123"
3494
+ version = "0.2.125"
3495
3495
  source = "registry+https://github.com/rust-lang/crates.io-index"
3496
- checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc"
3496
+ checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
3497
3497
  dependencies = [
3498
3498
  "quote",
3499
3499
  "wasm-bindgen-macro-support",
@@ -3501,9 +3501,9 @@ dependencies = [
3501
3501
 
3502
3502
  [[package]]
3503
3503
  name = "wasm-bindgen-macro-support"
3504
- version = "0.2.123"
3504
+ version = "0.2.125"
3505
3505
  source = "registry+https://github.com/rust-lang/crates.io-index"
3506
- checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b"
3506
+ checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
3507
3507
  dependencies = [
3508
3508
  "bumpalo",
3509
3509
  "proc-macro2",
@@ -3514,9 +3514,9 @@ dependencies = [
3514
3514
 
3515
3515
  [[package]]
3516
3516
  name = "wasm-bindgen-shared"
3517
- version = "0.2.123"
3517
+ version = "0.2.125"
3518
3518
  source = "registry+https://github.com/rust-lang/crates.io-index"
3519
- checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92"
3519
+ checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
3520
3520
  dependencies = [
3521
3521
  "unicode-ident",
3522
3522
  ]
@@ -3557,9 +3557,9 @@ dependencies = [
3557
3557
 
3558
3558
  [[package]]
3559
3559
  name = "web-sys"
3560
- version = "0.3.100"
3560
+ version = "0.3.102"
3561
3561
  source = "registry+https://github.com/rust-lang/crates.io-index"
3562
- checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69"
3562
+ checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d"
3563
3563
  dependencies = [
3564
3564
  "js-sys",
3565
3565
  "wasm-bindgen",
@@ -3890,18 +3890,18 @@ dependencies = [
3890
3890
 
3891
3891
  [[package]]
3892
3892
  name = "zerocopy"
3893
- version = "0.8.50"
3893
+ version = "0.8.52"
3894
3894
  source = "registry+https://github.com/rust-lang/crates.io-index"
3895
- checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1"
3895
+ checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
3896
3896
  dependencies = [
3897
3897
  "zerocopy-derive",
3898
3898
  ]
3899
3899
 
3900
3900
  [[package]]
3901
3901
  name = "zerocopy-derive"
3902
- version = "0.8.50"
3902
+ version = "0.8.52"
3903
3903
  source = "registry+https://github.com/rust-lang/crates.io-index"
3904
- checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639"
3904
+ checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
3905
3905
  dependencies = [
3906
3906
  "proc-macro2",
3907
3907
  "quote",
@@ -3931,9 +3931,9 @@ dependencies = [
3931
3931
 
3932
3932
  [[package]]
3933
3933
  name = "zeroize"
3934
- version = "1.8.2"
3934
+ version = "1.9.0"
3935
3935
  source = "registry+https://github.com/rust-lang/crates.io-index"
3936
- checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
3936
+ checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
3937
3937
 
3938
3938
  [[package]]
3939
3939
  name = "zerotrie"
@@ -3,7 +3,7 @@ resolver = "2"
3
3
  members = ["crates/scai-error-derive", "crates/scai-log", "crates/scai-state-core", "crates/scai-state-python"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.8.38"
6
+ version = "0.8.41"
7
7
  edition = "2021"
8
8
  license = "SEE LICENSE IN LICENSE"
9
9
  repository = "https://github.com/snowflake-eng/scai-state"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: snowflake-code-unit-registry
3
- Version: 0.8.38
3
+ Version: 0.8.41
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: Apache Software License
@@ -0,0 +1,168 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "isMissing": false,
4
+ "inScope": true,
5
+ "kind": "script",
6
+ "id": "f7e6d5c4-b3a2-1098-7654-3210fedcba98",
7
+ "updatedAt": "2026-05-10T16:00:00Z",
8
+ "source": {
9
+ "platform": "teradata",
10
+ "format": "bteq",
11
+ "database": "database",
12
+ "schema": "schema",
13
+ "package": "package",
14
+ "name": "load_sales",
15
+ "canonicalName": "teradata:bteq:source/etl/daily/load_sales.btq"
16
+ },
17
+ "target": {
18
+ "format": "python",
19
+ "database": "database",
20
+ "schema": "schema",
21
+ "name": "LOAD_SALES",
22
+ "canonicalName": "snowflake:python:converted/etl/daily/load_sales.py"
23
+ },
24
+ "files": {
25
+ "source": {
26
+ "path": "source/etl/daily/load_sales.btq",
27
+ "checksum": "22577339f5b42811229a31d0fd851d54"
28
+ },
29
+ "converted": {
30
+ "path": "converted/etl/daily/load_sales.py",
31
+ "checksum": "f6889e957f19ac657f517a43ad5360a4"
32
+ },
33
+ "snapshot": {
34
+ "path": "snapshots/etl/daily/load_sales.btq",
35
+ "checksum": "f463829d48a5379a540cc0f34e1f6efb"
36
+ },
37
+ "artifacts": {
38
+ "path": "artifacts/etl/daily/load_sales"
39
+ }
40
+ },
41
+ "codeStatus": {
42
+ "registration": {
43
+ "status": "completed",
44
+ "extractorVersion": "2.4.1",
45
+ "updatedAt": "2026-05-10T09:00:00Z",
46
+ "sourceId": "src-teradata-bteq-001"
47
+ },
48
+ "conversion": {
49
+ "status": "completed",
50
+ "converterVersion": "3.1.0",
51
+ "updatedAt": "2026-05-10T16:00:00Z"
52
+ },
53
+ "resync": {
54
+ "status": "completed",
55
+ "updatedAt": "2026-05-10T16:00:00Z"
56
+ },
57
+ "aiVerification": {
58
+ "status": "completed",
59
+ "convertedChecksum": "6bc70d40a29e8f6f5ca410c9d10bdf89"
60
+ },
61
+ "assessment": {
62
+ "status": "completed",
63
+ "containsCommit": false
64
+ }
65
+ },
66
+ "cloudStatus": {
67
+ "testing": {
68
+ "status": "pending",
69
+ "updatedAt": "2026-06-11T05:35:46.3551540+00:00",
70
+ "details": {}
71
+ },
72
+ "deployment": {
73
+ "status": "pending",
74
+ "updatedAt": "2026-06-11T05:35:46.3551590+00:00",
75
+ "deployedTo": "deployedTo",
76
+ "details": {}
77
+ },
78
+ "dataMigration": {
79
+ "status": "pending",
80
+ "updatedAt": "2026-06-11T05:35:46.3551650+00:00",
81
+ "details": {}
82
+ },
83
+ "dataValidation": {
84
+ "status": "pending",
85
+ "updatedAt": "2026-06-11T05:35:46.3551700+00:00",
86
+ "details": {}
87
+ }
88
+ },
89
+ "dependencies": {
90
+ "dependsOn": [],
91
+ "requiredBy": [],
92
+ "hasTransitiveMissingDependencies": false
93
+ },
94
+ "planning": {
95
+ "wave": 5,
96
+ "topologicalRank": 1,
97
+ "generatedBy": "auto-planner-v1"
98
+ },
99
+ "issues": [],
100
+ "extensions": {},
101
+ "scriptBindings": [
102
+ {
103
+ "name": "err_file",
104
+ "kind": "file"
105
+ },
106
+ {
107
+ "name": "dif_out",
108
+ "kind": "file"
109
+ }
110
+ ],
111
+ "scriptMetadata": {
112
+ "IO": [
113
+ {
114
+ "direction": "write",
115
+ "format": "text",
116
+ "formatNative": "report",
117
+ "ordinal": 0,
118
+ "reachability": "always",
119
+ "path": {
120
+ "kind": "binding",
121
+ "name": "err_file",
122
+ "source": "${err_file}",
123
+ "target": "<%err_file%>"
124
+ },
125
+ "formatOptions": {
126
+ "projection": "columnar"
127
+ }
128
+ },
129
+ {
130
+ "direction": "read",
131
+ "format": "delimited",
132
+ "formatNative": "vartext",
133
+ "ordinal": 1,
134
+ "reachability": "conditional",
135
+ "guard": "MODE = 'A'",
136
+ "path": {
137
+ "kind": "literal",
138
+ "source": "${IMPORT_DIR}/customers.dat",
139
+ "target": "<%IMPORT_DIR%>/customers.dat"
140
+ },
141
+ "formatOptions": {
142
+ "separator": "|",
143
+ "quote": "\"",
144
+ "escape": "\\",
145
+ "recordDelimiter": "\n",
146
+ "headerRow": false,
147
+ "encoding": "UTF-8"
148
+ }
149
+ },
150
+ {
151
+ "direction": "write",
152
+ "format": "structured",
153
+ "formatNative": "dif",
154
+ "ordinal": 2,
155
+ "reachability": "always",
156
+ "path": {
157
+ "kind": "binding",
158
+ "name": "dif_out",
159
+ "source": "${dif_out}",
160
+ "target": "<%dif_out%>"
161
+ },
162
+ "formatOptions": {
163
+ "specVersion": "1.0"
164
+ }
165
+ }
166
+ ]
167
+ }
168
+ }
@@ -165,6 +165,106 @@
165
165
  "x-allowed-when": { "format": ["dbt"] }
166
166
  }
167
167
  }
168
+ },
169
+ "ScriptIoDirection": {
170
+ "type": "string",
171
+ "title": "ScriptIoDirection",
172
+ "enum": ["read", "write"],
173
+ "description": "Direction of a script I/O block. read = .IMPORT; write = .EXPORT."
174
+ },
175
+ "ScriptIoFormat": {
176
+ "type": "string",
177
+ "title": "ScriptIoFormat",
178
+ "enum": ["text", "binary", "delimited", "structured", "opaque"],
179
+ "description": "Comparison-strategy selector for a script I/O block. opaque (e.g. AXSMOD) marks the script untestable."
180
+ },
181
+ "ScriptIoReachability": {
182
+ "type": "string",
183
+ "title": "ScriptIoReachability",
184
+ "enum": ["always", "conditional"],
185
+ "description": "always = unconditional fall-through; conditional = reachable only under .IF/.GOTO/.LABEL flow (or unresolvable flow). Drives the missing-file rule downstream."
186
+ },
187
+ "ScriptIoProjection": {
188
+ "type": "string",
189
+ "title": "ScriptIoProjection",
190
+ "enum": ["columnar", "concatenated"],
191
+ "description": "REPORT/text output shape detected at extraction: columnar = multiple fixed-width columns; concatenated = a single ||-joined column."
192
+ },
193
+ "ScriptIoPath": {
194
+ "type": "object",
195
+ "title": "ScriptIoPath",
196
+ "description": "Per-side path for a script I/O block. kind=binding references a scriptBindings[] kind:file entry by name (a foreign key); kind=literal is an inline path. source and target hold the path text as written on each side and may embed binding tokens in that side's wrapper syntax (e.g. ${...} on the source script, <%...%> on the Snow CLI target). find_all substitutes each side in place from the supplied binding map, exactly as it does for the source.* / target.* slots; identity keying uses (kind, name) for bindings and (kind, source) for literals.",
197
+ "properties": {
198
+ "kind": {
199
+ "type": "string",
200
+ "enum": ["binding", "literal"],
201
+ "description": "binding = path comes from a named scriptBindings[] entry; literal = path is an inline string (possibly templated with binding tokens)."
202
+ },
203
+ "name": {
204
+ "type": "string",
205
+ "description": "Binding name referenced when kind=binding. Foreign key into scriptBindings[]."
206
+ },
207
+ "source": {
208
+ "type": "string",
209
+ "description": "Path text as written on the source side; may embed binding tokens in the source dialect's wrapper (e.g. ${name}). find_all substitutes it in place when a binding map is supplied."
210
+ },
211
+ "target": {
212
+ "type": "string",
213
+ "description": "Path text as written on the target side; may embed binding tokens in the target's wrapper (e.g. <%name%>). find_all substitutes it in place when a binding map is supplied."
214
+ }
215
+ }
216
+ },
217
+ "ScriptIoFormatOptions": {
218
+ "type": "object",
219
+ "title": "ScriptIoFormatOptions",
220
+ "description": "Comparator configuration for a script I/O block; which keys apply depends on format. delimited: separator/quote/escape/recordDelimiter/headerRow/encoding. structured: specVersion/encoding. text/report: projection.",
221
+ "additionalProperties": true,
222
+ "properties": {
223
+ "separator": { "type": "string", "description": "Field separator (delimited)." },
224
+ "quote": { "type": "string", "description": "Quote character (delimited)." },
225
+ "escape": { "type": "string", "description": "Escape character (delimited)." },
226
+ "recordDelimiter": { "type": "string", "description": "Record delimiter (delimited)." },
227
+ "headerRow": { "type": "boolean", "description": "Whether a header row is present (delimited)." },
228
+ "encoding": { "type": "string", "description": "Character encoding (delimited/structured)." },
229
+ "specVersion": { "type": "string", "description": "Format spec version (structured, e.g. DIF version)." },
230
+ "projection": { "$ref": "#/definitions/ScriptIoProjection" }
231
+ }
232
+ },
233
+ "ScriptIoEntry": {
234
+ "type": "object",
235
+ "title": "ScriptIoEntry",
236
+ "description": "One .IMPORT/.EXPORT block declaration, dialect-neutral. BTEQ extractor in v1.",
237
+ "properties": {
238
+ "direction": { "$ref": "#/definitions/ScriptIoDirection" },
239
+ "format": { "$ref": "#/definitions/ScriptIoFormat" },
240
+ "formatNative": {
241
+ "type": "string",
242
+ "description": "Dialect-native format name. Open string. Well-known BTEQ values: report, data, indicdata, vartext, dif, axsmod."
243
+ },
244
+ "ordinal": {
245
+ "type": "integer",
246
+ "description": "0-based block index in source order."
247
+ },
248
+ "reachability": { "$ref": "#/definitions/ScriptIoReachability" },
249
+ "guard": {
250
+ "type": "string",
251
+ "description": "Optional source-form condition text (e.g. \"MODE = 'A'\"); diagnostics only, never evaluated. Present only when reachability=conditional."
252
+ },
253
+ "path": { "$ref": "#/definitions/ScriptIoPath" },
254
+ "formatOptions": { "$ref": "#/definitions/ScriptIoFormatOptions" }
255
+ }
256
+ },
257
+ "ScriptMetadata": {
258
+ "type": "object",
259
+ "title": "ScriptMetadata",
260
+ "description": "Structural metadata for script-kind units used in testing and validation. Concept-sibling to scriptBindings; the flat scriptBindings field migrates under this container in a follow-up.",
261
+ "properties": {
262
+ "IO": {
263
+ "type": "array",
264
+ "description": "One entry per .IMPORT/.EXPORT read/write block, in source order. Dialect-neutral; populated by the per-dialect extractor at conversion time.",
265
+ "items": { "$ref": "#/definitions/ScriptIoEntry" }
266
+ }
267
+ }
168
268
  }
169
269
  },
170
270
  "properties": {
@@ -573,6 +673,11 @@
573
673
  }
574
674
  }
575
675
  }
676
+ },
677
+ "scriptMetadata": {
678
+ "$ref": "#/definitions/ScriptMetadata",
679
+ "x-allowed-when": { "kind": ["script"] },
680
+ "x-query-help": false
576
681
  }
577
682
  }
578
683
  }
@@ -122,8 +122,15 @@ fn substitute_literal(s: &str, sorted_keys: &[&str], bindings: &HashMap<String,
122
122
  }
123
123
 
124
124
  /// Apply literal-token substitution to every string slot under `source.*`
125
- /// and `target.*` of `unit`. Other fields (including `dependsOn[].id`) are
125
+ /// and `target.*` of `unit`, and to each `scriptMetadata.IO[].path`'s per-side
126
+ /// `source` / `target` slots. Other fields (including `dependsOn[].id`) are
126
127
  /// untouched. No-op when `bindings` is empty.
128
+ ///
129
+ /// `scriptMetadata.IO[].path` resolution substitutes the per-side `source` and
130
+ /// `target` slots in place using the same `bindings` map — the same generic,
131
+ /// map-key-based pass `parameterizedReference` slots use, with no wrapper
132
+ /// spelling baked into CUR. A source-side map (e.g. keyed by `${name}`)
133
+ /// resolves `source` and leaves `target` untouched, and vice versa.
127
134
  pub(crate) fn apply_bindings(unit: &mut CodeUnit, bindings: &HashMap<String, String>) {
128
135
  if bindings.is_empty() {
129
136
  return;
@@ -156,4 +163,18 @@ pub(crate) fn apply_bindings(unit: &mut CodeUnit, bindings: &HashMap<String, Str
156
163
  }
157
164
  }
158
165
  }
166
+
167
+ // Substitute scriptMetadata.IO path slots in place — the same generic pass
168
+ // applied to source.* / target.* above.
169
+ if let Some(meta) = unit.script_metadata.as_mut() {
170
+ for entry in meta.io.iter_mut() {
171
+ if let Some(path) = entry.path.as_mut() {
172
+ for slot in [&mut path.source, &mut path.target] {
173
+ if let Some(v) = slot.as_mut() {
174
+ *v = substitute_literal(v, &sorted_keys, bindings);
175
+ }
176
+ }
177
+ }
178
+ }
179
+ }
159
180
  }
@@ -57,6 +57,11 @@ pub const ALLOWED_WHEN_CONSTRAINTS: &[AllowedWhen] = &[
57
57
  leaf_name: "scriptBindings",
58
58
  when: &[("kind", &["script"])],
59
59
  },
60
+ AllowedWhen {
61
+ parent_pointer: "",
62
+ leaf_name: "scriptMetadata",
63
+ when: &[("kind", &["script"])],
64
+ },
60
65
  AllowedWhen {
61
66
  parent_pointer: "",
62
67
  leaf_name: "signature",
@@ -45,6 +45,7 @@ pub use registry::WriteOptions;
45
45
  pub use registry::UNKNOWN_ID;
46
46
 
47
47
  // Re-export validation types
48
+ pub use validation::script_io::{validate_script_io, ProvidedIo, ScriptIoDiff};
48
49
  pub use validation::ValidationIssue;
49
50
  pub use validation::ValidationIssueKind;
50
51
  pub use validation::ValidationReport;