floe-python 0.4.0__tar.gz → 0.4.2__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 (228) hide show
  1. {floe_python-0.4.0 → floe_python-0.4.2}/Cargo.lock +3 -3
  2. {floe_python-0.4.0 → floe_python-0.4.2}/PKG-INFO +1 -1
  3. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/Cargo.toml +2 -2
  4. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/README.md +1 -1
  5. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/config/mod.rs +4 -1
  6. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/config/parse.rs +2 -2
  7. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/config/storage.rs +1 -1
  8. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/config/types.rs +35 -26
  9. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/config/validate.rs +7 -0
  10. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/iceberg.rs +35 -1
  11. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/lib.rs +34 -3
  12. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/lineage/mod.rs +99 -46
  13. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/manifest/builder.rs +111 -19
  14. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/manifest/mod.rs +2 -0
  15. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/manifest/model.rs +62 -0
  16. floe_python-0.4.2/crates/floe-core/src/manifest/reconstruct.rs +319 -0
  17. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/profile/parse.rs +14 -0
  18. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/profile/types.rs +3 -1
  19. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/profile/validate.rs +102 -0
  20. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/report/mod.rs +5 -0
  21. floe_python-0.4.2/crates/floe-core/src/run/context.rs +150 -0
  22. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/entity/incremental.rs +18 -4
  23. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/entity/mod.rs +18 -2
  24. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/entity/precheck.rs +6 -0
  25. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/entity/validate_split.rs +4 -0
  26. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/events.rs +4 -0
  27. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/mod.rs +49 -0
  28. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/state/mod.rs +13 -5
  29. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/config_validation.rs +32 -0
  30. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/lineage_validation.rs +48 -1
  31. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/entity/incremental.rs +55 -4
  32. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/lineage.rs +157 -1
  33. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/report.rs +4 -0
  34. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/Cargo.toml +2 -2
  35. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/src/functions.rs +5 -1
  36. {floe_python-0.4.0 → floe_python-0.4.2}/pyproject.toml +1 -1
  37. floe_python-0.4.0/crates/floe-core/src/run/context.rs +0 -73
  38. {floe_python-0.4.0 → floe_python-0.4.2}/Cargo.toml +0 -0
  39. {floe_python-0.4.0 → floe_python-0.4.2}/README.md +0 -0
  40. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/add_entity.rs +0 -0
  41. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/checks/cast.rs +0 -0
  42. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/checks/mismatch.rs +0 -0
  43. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/checks/mod.rs +0 -0
  44. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/checks/normalize.rs +0 -0
  45. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/checks/not_null.rs +0 -0
  46. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/checks/unique.rs +0 -0
  47. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/config/catalog.rs +0 -0
  48. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/config/location.rs +0 -0
  49. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/config/template.rs +0 -0
  50. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/config/yaml_decode.rs +0 -0
  51. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/errors.rs +0 -0
  52. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/format.rs +0 -0
  53. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/mod.rs +0 -0
  54. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/avro.rs +0 -0
  55. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/csv.rs +0 -0
  56. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/fixed_width.rs +0 -0
  57. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/json.rs +0 -0
  58. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/json_selector.rs +0 -0
  59. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/mod.rs +0 -0
  60. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/orc.rs +0 -0
  61. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/parquet.rs +0 -0
  62. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/xlsx.rs +0 -0
  63. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/xml.rs +0 -0
  64. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/read/xml_selector.rs +0 -0
  65. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/core/extensions.rs +0 -0
  66. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/core/mod.rs +0 -0
  67. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/core/paths.rs +0 -0
  68. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/core/placement.rs +0 -0
  69. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/core/planner.rs +0 -0
  70. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/core/uri.rs +0 -0
  71. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/core/validation.rs +0 -0
  72. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/mod.rs +0 -0
  73. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/object_store.rs +0 -0
  74. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/ops/archive.rs +0 -0
  75. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/ops/inputs.rs +0 -0
  76. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/ops/mod.rs +0 -0
  77. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/ops/output.rs +0 -0
  78. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/providers/adls.rs +0 -0
  79. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/providers/gcs.rs +0 -0
  80. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/providers/local.rs +0 -0
  81. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/providers/mod.rs +0 -0
  82. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/providers/s3.rs +0 -0
  83. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/storage/target.rs +0 -0
  84. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/unique_seed/mod.rs +0 -0
  85. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/accepted.rs +0 -0
  86. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/arrow_convert.rs +0 -0
  87. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/csv.rs +0 -0
  88. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/delta/commit_metrics.rs +0 -0
  89. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/delta/options.rs +0 -0
  90. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/delta/record_batch.rs +0 -0
  91. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/delta/unity.rs +0 -0
  92. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/delta/unity_tests.rs +0 -0
  93. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/delta.rs +0 -0
  94. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/iceberg/context.rs +0 -0
  95. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/iceberg/data_files.rs +0 -0
  96. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/iceberg/glue.rs +0 -0
  97. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/iceberg/metadata.rs +0 -0
  98. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/iceberg/rest.rs +0 -0
  99. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/iceberg/schema.rs +0 -0
  100. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/metrics.rs +0 -0
  101. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/mod.rs +0 -0
  102. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/parquet.rs +0 -0
  103. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/parts.rs +0 -0
  104. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/sink_format.rs +0 -0
  105. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/strategy/append.rs +0 -0
  106. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/strategy/merge/mod.rs +0 -0
  107. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/strategy/merge/scd1.rs +0 -0
  108. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/strategy/merge/scd2.rs +0 -0
  109. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/strategy/merge/shared.rs +0 -0
  110. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/strategy/mod.rs +0 -0
  111. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/io/write/strategy/overwrite.rs +0 -0
  112. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/log.rs +0 -0
  113. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/profile/mod.rs +0 -0
  114. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/report/build.rs +0 -0
  115. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/report/entity.rs +0 -0
  116. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/report/output.rs +0 -0
  117. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/entity/accepted_write.rs +0 -0
  118. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/entity/pii.rs +0 -0
  119. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/entity/process.rs +0 -0
  120. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/entity/resolve.rs +0 -0
  121. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/file.rs +0 -0
  122. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/output.rs +0 -0
  123. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/run/perf.rs +0 -0
  124. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/runner/mod.rs +0 -0
  125. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/runner/outcome.rs +0 -0
  126. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/runtime.rs +0 -0
  127. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/vars/mod.rs +0 -0
  128. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/vars/resolve.rs +0 -0
  129. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/src/warnings.rs +0 -0
  130. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/archive_run.rs +0 -0
  131. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/composite_unique.rs +0 -0
  132. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/delta_run.rs +0 -0
  133. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/dry_run.rs +0 -0
  134. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/fixed_width.rs +0 -0
  135. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/iceberg_gcs_run.rs +0 -0
  136. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/iceberg_glue_run.rs +0 -0
  137. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/iceberg_run.rs +0 -0
  138. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/iceberg_s3_run.rs +0 -0
  139. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/json_selectors.rs +0 -0
  140. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/local_run.rs +0 -0
  141. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/mod.rs +0 -0
  142. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/path_normalization.rs +0 -0
  143. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration/run_entities_filter.rs +0 -0
  144. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/integration.rs +0 -0
  145. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/common.rs +0 -0
  146. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/add_entity.rs +0 -0
  147. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/adls_storage.rs +0 -0
  148. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/adls_validation.rs +0 -0
  149. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/catalogs.rs +0 -0
  150. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/gcs_storage.rs +0 -0
  151. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/gcs_validation.rs +0 -0
  152. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/local_storage.rs +0 -0
  153. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/mod.rs +0 -0
  154. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/parse.rs +0 -0
  155. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/pii_validation.rs +0 -0
  156. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/remote_base.rs +0 -0
  157. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/config/templating.rs +0 -0
  158. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/format.rs +0 -0
  159. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/mod.rs +0 -0
  160. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/avro_input.rs +0 -0
  161. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/csv_nulls.rs +0 -0
  162. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/json_array.rs +0 -0
  163. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/json_ndjson.rs +0 -0
  164. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/json_selector.rs +0 -0
  165. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/mod.rs +0 -0
  166. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/orc_input.rs +0 -0
  167. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/parquet_input.rs +0 -0
  168. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/tsv.rs +0 -0
  169. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/xlsx_input.rs +0 -0
  170. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/xml.rs +0 -0
  171. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/read/xml_selector.rs +0 -0
  172. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/adls.rs +0 -0
  173. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/adls_integration.rs +0 -0
  174. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/gcs.rs +0 -0
  175. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/inputs.rs +0 -0
  176. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/local.rs +0 -0
  177. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/mod.rs +0 -0
  178. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/paths.rs +0 -0
  179. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/planner.rs +0 -0
  180. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/s3.rs +0 -0
  181. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/storage/target.rs +0 -0
  182. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/write/delta_merge.rs +0 -0
  183. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/write/delta_write.rs +0 -0
  184. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/write/iceberg_write.rs +0 -0
  185. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/write/metrics.rs +0 -0
  186. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/write/mod.rs +0 -0
  187. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/write/object_store.rs +0 -0
  188. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/write/parquet_write.rs +0 -0
  189. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/write/parts.rs +0 -0
  190. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/io/write/rejected_csv.rs +0 -0
  191. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/manifest/mod.rs +0 -0
  192. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/mod.rs +0 -0
  193. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/profile/mod.rs +0 -0
  194. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/profile/parse.rs +0 -0
  195. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/profile/validate.rs +0 -0
  196. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/report/accepted_output.rs +0 -0
  197. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/report/mod.rs +0 -0
  198. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/report/storage.rs +0 -0
  199. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/check_order.rs +0 -0
  200. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/checks.rs +0 -0
  201. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/entity/accepted_output.rs +0 -0
  202. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/entity/mod.rs +0 -0
  203. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/mod.rs +0 -0
  204. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/normalize.rs +0 -0
  205. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/pii.rs +0 -0
  206. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/run/schema_mismatch.rs +0 -0
  207. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/runner/adapter.rs +0 -0
  208. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/runner/mod.rs +0 -0
  209. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/state/mod.rs +0 -0
  210. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/vars/mod.rs +0 -0
  211. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit/vars/resolve.rs +0 -0
  212. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-core/tests/unit.rs +0 -0
  213. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/.gitignore +0 -0
  214. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/README.md +0 -0
  215. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/src/lib.rs +0 -0
  216. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/src/observer.rs +0 -0
  217. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/src/types/config.rs +0 -0
  218. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/src/types/errors.rs +0 -0
  219. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/src/types/mod.rs +0 -0
  220. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/src/types/outcome.rs +0 -0
  221. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/tests/fixtures/config.yml +0 -0
  222. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/tests/fixtures/in/customer/customers_valid.csv +0 -0
  223. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/tests/fixtures/invalid_config.yml +0 -0
  224. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/tests/fixtures/profile.yml +0 -0
  225. {floe_python-0.4.0 → floe_python-0.4.2}/crates/floe-python/tests/test_floe.py +0 -0
  226. {floe_python-0.4.0 → floe_python-0.4.2}/python/floe/__init__.py +0 -0
  227. {floe_python-0.4.0 → floe_python-0.4.2}/python/floe/_floe.pyi +0 -0
  228. {floe_python-0.4.0 → floe_python-0.4.2}/python/floe/py.typed +0 -0
@@ -3399,7 +3399,7 @@ dependencies = [
3399
3399
 
3400
3400
  [[package]]
3401
3401
  name = "floe-cli"
3402
- version = "0.4.0"
3402
+ version = "0.4.2"
3403
3403
  dependencies = [
3404
3404
  "assert_cmd",
3405
3405
  "clap",
@@ -3412,7 +3412,7 @@ dependencies = [
3412
3412
 
3413
3413
  [[package]]
3414
3414
  name = "floe-core"
3415
- version = "0.4.0"
3415
+ version = "0.4.2"
3416
3416
  dependencies = [
3417
3417
  "apache-avro 0.16.0",
3418
3418
  "arrow",
@@ -3455,7 +3455,7 @@ dependencies = [
3455
3455
 
3456
3456
  [[package]]
3457
3457
  name = "floe-python"
3458
- version = "0.4.0"
3458
+ version = "0.4.2"
3459
3459
  dependencies = [
3460
3460
  "floe-core",
3461
3461
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: floe-python
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "floe-core"
3
- version = "0.4.0"
3
+ version = "0.4.2"
4
4
  edition = "2021"
5
5
  description = "Core library for Floe, a YAML-driven technical ingestion tool."
6
6
  license = "MIT"
@@ -41,7 +41,7 @@ uuid = "1"
41
41
  arrow = "57"
42
42
  iceberg = "0.9.0"
43
43
  iceberg-catalog-rest = "0.9.0"
44
- iceberg-storage-opendal = { version = "0.9.1", features = ["opendal-gcs"] }
44
+ iceberg-storage-opendal = { version = "0.9.1", features = ["opendal-s3", "opendal-gcs"] }
45
45
  df-interchange = { version = "0.3.2", features = ["arrow_57", "polars_0_52"] }
46
46
  orc-rust = "0.7.1"
47
47
 
@@ -73,7 +73,7 @@ floe run -c config.yml # run the pipeline
73
73
  | S3 storage | [docs/storages/s3.md](docs/storages/s3.md) |
74
74
  | ADLS storage | [docs/storages/adls.md](docs/storages/adls.md) |
75
75
  | GCS storage | [docs/storages/gcs.md](docs/storages/gcs.md) |
76
- | Incremental ingestion | [docs/profiles.md](docs/profiles.md) |
76
+ | Environement specific profile config | [docs/profiles.md](docs/profiles.md) [docs/variables.md](docs/variables.md) |
77
77
  | Run reports | [docs/report.md](docs/report.md) |
78
78
  | CLI reference | [docs/cli.md](docs/cli.md) |
79
79
  | Orchestration (Dagster / Airflow) | [docs/summary.md](docs/summary.md) |
@@ -13,6 +13,9 @@ pub use storage::{resolve_local_path, ConfigBase, ResolvedPath, StorageResolver}
13
13
  pub use types::*;
14
14
 
15
15
  pub use parse::extract_raw_env_vars;
16
- pub(crate) use parse::{parse_catalogs_with_context, parse_config, parse_config_with_vars};
16
+ pub(crate) use parse::{
17
+ parse_catalogs_with_context, parse_config, parse_config_with_vars, parse_lineage_config,
18
+ parse_storages,
19
+ };
17
20
  pub(crate) use template::apply_templates_with_vars;
18
21
  pub(crate) use validate::{extract_first_n, extract_last_n, validate_config};
@@ -658,7 +658,7 @@ fn parse_sink_delta_options(value: &Yaml, ctx: &str) -> FloeResult<DeltaSinkTarg
658
658
  })
659
659
  }
660
660
 
661
- fn parse_storages(value: &Yaml) -> FloeResult<StoragesConfig> {
661
+ pub(crate) fn parse_storages(value: &Yaml) -> FloeResult<StoragesConfig> {
662
662
  let hash = yaml_hash(value, "storages")?;
663
663
  validate_known_keys(hash, "storages", &["default", "definitions"])?;
664
664
  let definitions_yaml = match hash_get(hash, "definitions") {
@@ -1129,7 +1129,7 @@ fn parse_pii_column(value: &Yaml) -> FloeResult<PiiColumnConfig> {
1129
1129
  })
1130
1130
  }
1131
1131
 
1132
- fn parse_lineage_config(value: &Yaml) -> FloeResult<LineageConfig> {
1132
+ pub(crate) fn parse_lineage_config(value: &Yaml) -> FloeResult<LineageConfig> {
1133
1133
  let hash = yaml_hash(value, "lineage")?;
1134
1134
  validate_known_keys(
1135
1135
  hash,
@@ -615,7 +615,7 @@ fn parent_prefix(key: &str) -> String {
615
615
  }
616
616
  }
617
617
 
618
- fn is_remote_uri(value: &str) -> bool {
618
+ pub(crate) fn is_remote_uri(value: &str) -> bool {
619
619
  value.starts_with("s3://") || value.starts_with("gs://") || value.starts_with("abfs://")
620
620
  }
621
621
 
@@ -1,6 +1,8 @@
1
1
  use std::collections::HashMap;
2
2
  use std::path::Path;
3
3
 
4
+ use serde::{Deserialize, Serialize};
5
+
4
6
  use polars::polars_utils::pl_str::PlSmallStr;
5
7
  use polars::prelude::{
6
8
  CsvEncoding, CsvParseOptions, CsvReadOptions, DataType, NullValues, TimeUnit,
@@ -21,7 +23,7 @@ pub struct RootConfig {
21
23
  pub entities: Vec<EntityConfig>,
22
24
  }
23
25
 
24
- #[derive(Debug, Clone)]
26
+ #[derive(Debug, Clone, Serialize, Deserialize)]
25
27
  pub struct LineageConfig {
26
28
  pub url: String,
27
29
  pub api_key: Option<String>,
@@ -66,12 +68,12 @@ pub struct EntityConfig {
66
68
  pub pii: Option<PiiConfig>,
67
69
  }
68
70
 
69
- #[derive(Debug)]
71
+ #[derive(Debug, Serialize, Deserialize)]
70
72
  pub struct PiiConfig {
71
73
  pub columns: Vec<PiiColumnConfig>,
72
74
  }
73
75
 
74
- #[derive(Debug)]
76
+ #[derive(Debug, Serialize, Deserialize)]
75
77
  pub struct PiiColumnConfig {
76
78
  pub name: String,
77
79
  pub strategy: PiiStrategy,
@@ -79,7 +81,8 @@ pub struct PiiColumnConfig {
79
81
  pub redact_value: Option<String>,
80
82
  }
81
83
 
82
- #[derive(Debug, Clone, Copy, PartialEq, Eq)]
84
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
85
+ #[serde(rename_all = "lowercase")]
83
86
  pub enum PiiStrategy {
84
87
  Hash,
85
88
  Drop,
@@ -103,7 +106,8 @@ impl EntityConfig {
103
106
  }
104
107
  }
105
108
 
106
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
109
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
110
+ #[serde(rename_all = "lowercase")]
107
111
  pub enum IncrementalMode {
108
112
  #[default]
109
113
  None,
@@ -146,7 +150,7 @@ pub struct SourceConfig {
146
150
  pub cast_mode: Option<String>,
147
151
  }
148
152
 
149
- #[derive(Debug, Clone)]
153
+ #[derive(Debug, Clone, Deserialize)]
150
154
  pub struct SourceOptions {
151
155
  pub header: Option<bool>,
152
156
  pub separator: Option<String>,
@@ -262,7 +266,8 @@ pub struct SinkConfig {
262
266
  pub archive: Option<ArchiveTarget>,
263
267
  }
264
268
 
265
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
269
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
270
+ #[serde(rename_all = "snake_case")]
266
271
  pub enum WriteMode {
267
272
  #[default]
268
273
  Overwrite,
@@ -300,34 +305,34 @@ pub const DEFAULT_SCD2_CURRENT_FLAG_COLUMN: &str = "__floe_is_current";
300
305
  pub const DEFAULT_SCD2_VALID_FROM_COLUMN: &str = "__floe_valid_from";
301
306
  pub const DEFAULT_SCD2_VALID_TO_COLUMN: &str = "__floe_valid_to";
302
307
 
303
- #[derive(Debug, Clone)]
308
+ #[derive(Debug, Clone, Serialize, Deserialize)]
304
309
  pub struct MergeOptionsConfig {
305
310
  pub ignore_columns: Option<Vec<String>>,
306
311
  pub compare_columns: Option<Vec<String>>,
307
312
  pub scd2: Option<MergeScd2OptionsConfig>,
308
313
  }
309
314
 
310
- #[derive(Debug, Clone)]
315
+ #[derive(Debug, Clone, Serialize, Deserialize)]
311
316
  pub struct MergeScd2OptionsConfig {
312
317
  pub current_flag_column: Option<String>,
313
318
  pub valid_from_column: Option<String>,
314
319
  pub valid_to_column: Option<String>,
315
320
  }
316
321
 
317
- #[derive(Debug)]
322
+ #[derive(Debug, Serialize, Deserialize)]
318
323
  pub struct SinkOptions {
319
324
  pub compression: Option<String>,
320
325
  pub row_group_size: Option<u64>,
321
326
  pub max_size_per_file: Option<u64>,
322
327
  }
323
328
 
324
- #[derive(Debug, Clone)]
329
+ #[derive(Debug, Clone, Serialize, Deserialize)]
325
330
  pub struct IcebergPartitionFieldConfig {
326
331
  pub column: String,
327
332
  pub transform: String,
328
333
  }
329
334
 
330
- #[derive(Debug, Clone)]
335
+ #[derive(Debug, Clone, Serialize, Deserialize)]
331
336
  pub struct IcebergSinkTargetConfig {
332
337
  pub catalog: Option<String>,
333
338
  pub namespace: Option<String>,
@@ -335,7 +340,7 @@ pub struct IcebergSinkTargetConfig {
335
340
  pub location: Option<String>,
336
341
  }
337
342
 
338
- #[derive(Debug, Clone)]
343
+ #[derive(Debug, Clone, Serialize, Deserialize)]
339
344
  pub struct DeltaSinkTargetConfig {
340
345
  /// Name of the catalog definition to use (falls back to `catalogs.default`).
341
346
  pub catalog: Option<String>,
@@ -345,13 +350,13 @@ pub struct DeltaSinkTargetConfig {
345
350
  pub table: Option<String>,
346
351
  }
347
352
 
348
- #[derive(Debug, Clone)]
353
+ #[derive(Debug, Clone, Serialize, Deserialize)]
349
354
  pub struct StoragesConfig {
350
355
  pub default: Option<String>,
351
356
  pub definitions: Vec<StorageDefinition>,
352
357
  }
353
358
 
354
- #[derive(Debug, Clone)]
359
+ #[derive(Debug, Clone, Serialize, Deserialize)]
355
360
  pub struct StorageDefinition {
356
361
  pub name: String,
357
362
  pub fs_type: String,
@@ -362,7 +367,7 @@ pub struct StorageDefinition {
362
367
  pub prefix: Option<String>,
363
368
  }
364
369
 
365
- #[derive(Debug, Clone)]
370
+ #[derive(Debug, Clone, Serialize, Deserialize)]
366
371
  pub struct CatalogsConfig {
367
372
  pub default: Option<String>,
368
373
  pub definitions: Vec<CatalogDefinition>,
@@ -371,7 +376,8 @@ pub struct CatalogsConfig {
371
376
  /// Type-specific configuration for a catalog definition.
372
377
  /// Each variant carries only the fields relevant to that catalog type.
373
378
  /// Add a new variant here when supporting a new catalog type.
374
- #[derive(Debug, Clone)]
379
+ #[derive(Debug, Clone, Serialize, Deserialize)]
380
+ #[serde(tag = "type", rename_all = "lowercase")]
375
381
  pub enum CatalogTypeConfig {
376
382
  Glue {
377
383
  region: String,
@@ -419,7 +425,7 @@ impl CatalogTypeConfig {
419
425
  }
420
426
  }
421
427
 
422
- #[derive(Debug, Clone)]
428
+ #[derive(Debug, Clone, Serialize, Deserialize)]
423
429
  pub struct CatalogDefinition {
424
430
  pub name: String,
425
431
  pub type_config: CatalogTypeConfig,
@@ -440,7 +446,8 @@ pub struct ArchiveTarget {
440
446
  pub storage: Option<String>,
441
447
  }
442
448
 
443
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
449
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
450
+ #[serde(rename_all = "lowercase")]
444
451
  pub enum PolicySeverity {
445
452
  #[default]
446
453
  Warn,
@@ -469,7 +476,7 @@ pub struct PolicyConfig {
469
476
  pub severity: PolicySeverity,
470
477
  }
471
478
 
472
- #[derive(Debug)]
479
+ #[derive(Debug, Serialize)]
473
480
  pub struct SchemaConfig {
474
481
  pub normalize_columns: Option<NormalizeColumnsConfig>,
475
482
  pub mismatch: Option<SchemaMismatchConfig>,
@@ -485,19 +492,20 @@ impl SchemaConfig {
485
492
  }
486
493
  }
487
494
 
488
- #[derive(Debug)]
495
+ #[derive(Debug, Serialize, Deserialize)]
489
496
  pub struct NormalizeColumnsConfig {
490
497
  pub enabled: Option<bool>,
491
498
  pub strategy: Option<String>,
492
499
  }
493
500
 
494
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
501
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
495
502
  pub struct SchemaEvolutionConfig {
496
503
  pub mode: SchemaEvolutionMode,
497
504
  pub on_incompatible: SchemaEvolutionIncompatibleAction,
498
505
  }
499
506
 
500
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
507
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
508
+ #[serde(rename_all = "snake_case")]
501
509
  pub enum SchemaEvolutionMode {
502
510
  #[default]
503
511
  Strict,
@@ -513,7 +521,8 @@ impl SchemaEvolutionMode {
513
521
  }
514
522
  }
515
523
 
516
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
524
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
525
+ #[serde(rename_all = "lowercase")]
517
526
  pub enum SchemaEvolutionIncompatibleAction {
518
527
  #[default]
519
528
  Fail,
@@ -527,13 +536,13 @@ impl SchemaEvolutionIncompatibleAction {
527
536
  }
528
537
  }
529
538
 
530
- #[derive(Debug)]
539
+ #[derive(Debug, Serialize, Deserialize)]
531
540
  pub struct SchemaMismatchConfig {
532
541
  pub missing_columns: Option<String>,
533
542
  pub extra_columns: Option<String>,
534
543
  }
535
544
 
536
- #[derive(Debug, Clone)]
545
+ #[derive(Debug, Clone, Serialize)]
537
546
  pub struct ColumnConfig {
538
547
  pub name: String,
539
548
  pub source: Option<String>,
@@ -1,5 +1,6 @@
1
1
  use std::collections::HashSet;
2
2
 
3
+ use crate::config::storage::is_remote_uri;
3
4
  use crate::config::{
4
5
  CatalogDefinition, CatalogTypeConfig, EntityConfig, IncrementalMode, PolicySeverity,
5
6
  RootConfig, SourceOptions, StorageDefinition,
@@ -128,6 +129,12 @@ fn validate_report(
128
129
  ) -> FloeResult<()> {
129
130
  let storage_name = storages.resolve_report_name(report.storage.as_deref())?;
130
131
  storages.validate_report_reference("report.storage", &storage_name)?;
132
+ if storages.definition_type(&storage_name) == Some("local") && is_remote_uri(&report.path) {
133
+ return Err(Box::new(ConfigError(format!(
134
+ "report.path must be a local path (got {})",
135
+ report.path
136
+ ))));
137
+ }
131
138
  Ok(())
132
139
  }
133
140
 
@@ -8,6 +8,7 @@ use iceberg::memory::{MemoryCatalogBuilder, MEMORY_CATALOG_WAREHOUSE};
8
8
  use iceberg::spec::{Schema, UnboundPartitionSpec};
9
9
  use iceberg::transaction::{ApplyTransactionAction, Transaction};
10
10
  use iceberg::{Catalog, CatalogBuilder, NamespaceIdent, TableIdent};
11
+ use iceberg_storage_opendal::OpenDalStorageFactory;
11
12
  use polars::prelude::DataFrame;
12
13
 
13
14
  use crate::errors::RunError;
@@ -375,6 +376,7 @@ async fn write_iceberg_table_async(
375
376
  catalog_props.insert(MEMORY_CATALOG_WAREHOUSE.to_string(), table_root_uri.clone());
376
377
 
377
378
  let is_local = !table_root_uri.starts_with("s3://")
379
+ && !table_root_uri.starts_with("s3a://")
378
380
  && !table_root_uri.starts_with("gs://")
379
381
  && !table_root_uri.starts_with("az://")
380
382
  && !table_root_uri.starts_with("abfss://");
@@ -382,6 +384,20 @@ async fn write_iceberg_table_async(
382
384
  if is_local {
383
385
  catalog_builder =
384
386
  catalog_builder.with_storage_factory(std::sync::Arc::new(LocalFsStorageFactory));
387
+ } else if table_root_uri.starts_with("s3://") || table_root_uri.starts_with("s3a://") {
388
+ let scheme = table_root_uri
389
+ .split("://")
390
+ .next()
391
+ .unwrap_or("s3")
392
+ .to_string();
393
+ catalog_builder =
394
+ catalog_builder.with_storage_factory(std::sync::Arc::new(OpenDalStorageFactory::S3 {
395
+ configured_scheme: scheme,
396
+ customized_credential_load: None,
397
+ }));
398
+ } else if table_root_uri.starts_with("gs://") {
399
+ catalog_builder =
400
+ catalog_builder.with_storage_factory(std::sync::Arc::new(OpenDalStorageFactory::Gcs));
385
401
  }
386
402
  let catalog = catalog_builder
387
403
  .load(catalog_name, catalog_props)
@@ -698,17 +714,35 @@ async fn collect_iceberg_batches(
698
714
  use iceberg::{Catalog, CatalogBuilder, NamespaceIdent, TableIdent};
699
715
 
700
716
  let is_local = !warehouse_location.starts_with("s3://")
717
+ && !warehouse_location.starts_with("s3a://")
701
718
  && !warehouse_location.starts_with("gs://")
702
719
  && !warehouse_location.starts_with("az://")
703
720
  && !warehouse_location.starts_with("abfss://");
704
721
 
705
722
  let mut props = catalog_props;
706
- props.insert(MEMORY_CATALOG_WAREHOUSE.to_string(), warehouse_location);
723
+ props.insert(
724
+ MEMORY_CATALOG_WAREHOUSE.to_string(),
725
+ warehouse_location.clone(),
726
+ );
707
727
 
708
728
  let mut catalog_builder = MemoryCatalogBuilder::default();
709
729
  if is_local {
710
730
  catalog_builder =
711
731
  catalog_builder.with_storage_factory(std::sync::Arc::new(LocalFsStorageFactory));
732
+ } else if warehouse_location.starts_with("s3://") || warehouse_location.starts_with("s3a://") {
733
+ let scheme = warehouse_location
734
+ .split("://")
735
+ .next()
736
+ .unwrap_or("s3")
737
+ .to_string();
738
+ catalog_builder =
739
+ catalog_builder.with_storage_factory(std::sync::Arc::new(OpenDalStorageFactory::S3 {
740
+ configured_scheme: scheme,
741
+ customized_credential_load: None,
742
+ }));
743
+ } else if warehouse_location.starts_with("gs://") {
744
+ catalog_builder =
745
+ catalog_builder.with_storage_factory(std::sync::Arc::new(OpenDalStorageFactory::Gcs));
712
746
  }
713
747
  let catalog = catalog_builder.load(ICEBERG_CATALOG_NAME, props).await?;
714
748
 
@@ -17,18 +17,23 @@ pub mod state;
17
17
  pub mod vars;
18
18
  pub mod warnings;
19
19
 
20
- pub use crate::state::{inspect_entity_state_with_base, reset_entity_state_with_base};
20
+ pub use crate::state::{
21
+ inspect_entity_state, inspect_entity_state_with_base, reset_entity_state,
22
+ reset_entity_state_with_base,
23
+ };
21
24
  pub use add_entity::{add_entity_to_config, AddEntityOptions, AddEntityOutcome};
22
25
  pub use checks as check;
23
26
  pub use config::{resolve_config_location, ConfigLocation};
24
27
  pub use errors::ConfigError;
25
- pub use manifest::build_common_manifest_json;
28
+ pub use manifest::{build_common_manifest_json, config_from_manifest_json};
26
29
  pub use profile::{
27
30
  detect_malformed_placeholder, detect_unresolved_placeholders, parse_profile,
28
31
  parse_profile_from_str, validate_merged_vars, validate_profile, ProfileConfig,
29
32
  };
30
33
  pub use run::events::{set_observer, MultiObserver, RunEvent, RunObserver};
31
- pub use run::{run, run_with_base, DryRunEntityPreview, EntityOutcome, RunOutcome};
34
+ pub use run::{
35
+ run, run_with_base, run_with_manifest_path, DryRunEntityPreview, EntityOutcome, RunOutcome,
36
+ };
32
37
  pub use runner::{parse_run_status_from_logs, ConnectorRunStatus};
33
38
  pub use runtime::{DefaultRuntime, Runtime};
34
39
  pub use vars::{resolve_vars, VarSources};
@@ -40,6 +45,8 @@ pub struct ValidateOptions {
40
45
  pub entities: Vec<String>,
41
46
  pub profile_vars: std::collections::HashMap<String, String>,
42
47
  pub profile_catalogs: Option<config::CatalogsConfig>,
48
+ pub profile_storages: Option<config::StoragesConfig>,
49
+ pub profile_lineage: Option<config::LineageConfig>,
43
50
  }
44
51
 
45
52
  #[derive(Debug, Default)]
@@ -62,6 +69,8 @@ pub fn validate_with_base(
62
69
  ) -> FloeResult<()> {
63
70
  let mut config = config::parse_config_with_vars(config_path, &options.profile_vars)?;
64
71
  apply_profile_catalogs(&mut config, options.profile_catalogs.as_ref());
72
+ apply_profile_storages(&mut config, options.profile_storages.as_ref());
73
+ apply_profile_lineage(&mut config, options.profile_lineage.as_ref());
65
74
  config::validate_config(&config)?;
66
75
 
67
76
  if !options.entities.is_empty() {
@@ -86,9 +95,13 @@ pub fn load_config_with_profile_overrides(
86
95
  config_path: &Path,
87
96
  profile_vars: &std::collections::HashMap<String, String>,
88
97
  profile_catalogs: Option<&config::CatalogsConfig>,
98
+ profile_storages: Option<&config::StoragesConfig>,
99
+ profile_lineage: Option<&config::LineageConfig>,
89
100
  ) -> FloeResult<config::RootConfig> {
90
101
  let mut config = config::parse_config_with_vars(config_path, profile_vars)?;
91
102
  apply_profile_catalogs(&mut config, profile_catalogs);
103
+ apply_profile_storages(&mut config, profile_storages);
104
+ apply_profile_lineage(&mut config, profile_lineage);
92
105
  Ok(config)
93
106
  }
94
107
 
@@ -107,6 +120,24 @@ pub(crate) fn apply_profile_catalogs(
107
120
  }
108
121
  }
109
122
 
123
+ pub(crate) fn apply_profile_storages(
124
+ config: &mut config::RootConfig,
125
+ profile_storages: Option<&config::StoragesConfig>,
126
+ ) {
127
+ if let Some(storages) = profile_storages {
128
+ config.storages = Some(storages.clone());
129
+ }
130
+ }
131
+
132
+ pub(crate) fn apply_profile_lineage(
133
+ config: &mut config::RootConfig,
134
+ profile_lineage: Option<&config::LineageConfig>,
135
+ ) {
136
+ if let Some(lineage) = profile_lineage {
137
+ config.lineage = Some(lineage.clone());
138
+ }
139
+ }
140
+
110
141
  pub fn extract_config_env_vars(
111
142
  config_path: &Path,
112
143
  ) -> FloeResult<std::collections::HashMap<String, String>> {