floe-python 0.4.1__tar.gz → 0.4.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 (229) hide show
  1. {floe_python-0.4.1 → floe_python-0.4.3}/Cargo.lock +3 -3
  2. {floe_python-0.4.1 → floe_python-0.4.3}/PKG-INFO +42 -1
  3. {floe_python-0.4.1/crates/floe-python → floe_python-0.4.3}/README.md +41 -0
  4. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/Cargo.toml +1 -1
  5. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/README.md +1 -1
  6. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/config/location.rs +1 -1
  7. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/config/mod.rs +1 -0
  8. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/config/parse.rs +2 -0
  9. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/config/types.rs +36 -26
  10. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/lib.rs +17 -3
  11. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/lineage/mod.rs +206 -56
  12. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/manifest/builder.rs +111 -19
  13. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/manifest/mod.rs +2 -0
  14. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/manifest/model.rs +62 -0
  15. floe_python-0.4.3/crates/floe-core/src/manifest/reconstruct.rs +319 -0
  16. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/report/mod.rs +5 -0
  17. floe_python-0.4.3/crates/floe-core/src/run/context.rs +177 -0
  18. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/entity/incremental.rs +18 -4
  19. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/entity/mod.rs +18 -2
  20. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/entity/precheck.rs +6 -0
  21. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/entity/validate_split.rs +4 -0
  22. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/events.rs +4 -0
  23. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/mod.rs +43 -0
  24. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/state/mod.rs +13 -5
  25. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/lineage_validation.rs +49 -1
  26. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/entity/incremental.rs +55 -4
  27. floe_python-0.4.3/crates/floe-core/tests/unit/run/lineage.rs +923 -0
  28. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/report.rs +4 -0
  29. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/Cargo.toml +2 -2
  30. {floe_python-0.4.1 → floe_python-0.4.3/crates/floe-python}/README.md +41 -0
  31. {floe_python-0.4.1 → floe_python-0.4.3}/pyproject.toml +1 -1
  32. floe_python-0.4.1/crates/floe-core/src/run/context.rs +0 -87
  33. floe_python-0.4.1/crates/floe-core/tests/unit/run/lineage.rs +0 -210
  34. {floe_python-0.4.1 → floe_python-0.4.3}/Cargo.toml +0 -0
  35. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/add_entity.rs +0 -0
  36. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/checks/cast.rs +0 -0
  37. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/checks/mismatch.rs +0 -0
  38. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/checks/mod.rs +0 -0
  39. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/checks/normalize.rs +0 -0
  40. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/checks/not_null.rs +0 -0
  41. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/checks/unique.rs +0 -0
  42. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/config/catalog.rs +0 -0
  43. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/config/storage.rs +0 -0
  44. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/config/template.rs +0 -0
  45. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/config/validate.rs +0 -0
  46. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/config/yaml_decode.rs +0 -0
  47. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/errors.rs +0 -0
  48. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/format.rs +0 -0
  49. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/mod.rs +0 -0
  50. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/avro.rs +0 -0
  51. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/csv.rs +0 -0
  52. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/fixed_width.rs +0 -0
  53. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/json.rs +0 -0
  54. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/json_selector.rs +0 -0
  55. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/mod.rs +0 -0
  56. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/orc.rs +0 -0
  57. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/parquet.rs +0 -0
  58. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/xlsx.rs +0 -0
  59. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/xml.rs +0 -0
  60. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/read/xml_selector.rs +0 -0
  61. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/core/extensions.rs +0 -0
  62. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/core/mod.rs +0 -0
  63. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/core/paths.rs +0 -0
  64. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/core/placement.rs +0 -0
  65. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/core/planner.rs +0 -0
  66. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/core/uri.rs +0 -0
  67. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/core/validation.rs +0 -0
  68. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/mod.rs +0 -0
  69. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/object_store.rs +0 -0
  70. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/ops/archive.rs +0 -0
  71. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/ops/inputs.rs +0 -0
  72. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/ops/mod.rs +0 -0
  73. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/ops/output.rs +0 -0
  74. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/providers/adls.rs +0 -0
  75. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/providers/gcs.rs +0 -0
  76. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/providers/local.rs +0 -0
  77. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/providers/mod.rs +0 -0
  78. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/providers/s3.rs +0 -0
  79. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/storage/target.rs +0 -0
  80. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/unique_seed/mod.rs +0 -0
  81. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/accepted.rs +0 -0
  82. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/arrow_convert.rs +0 -0
  83. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/csv.rs +0 -0
  84. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/delta/commit_metrics.rs +0 -0
  85. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/delta/options.rs +0 -0
  86. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/delta/record_batch.rs +0 -0
  87. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/delta/unity.rs +0 -0
  88. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/delta/unity_tests.rs +0 -0
  89. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/delta.rs +0 -0
  90. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/iceberg/context.rs +0 -0
  91. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/iceberg/data_files.rs +0 -0
  92. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/iceberg/glue.rs +0 -0
  93. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/iceberg/metadata.rs +0 -0
  94. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/iceberg/rest.rs +0 -0
  95. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/iceberg/schema.rs +0 -0
  96. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/iceberg.rs +0 -0
  97. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/metrics.rs +0 -0
  98. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/mod.rs +0 -0
  99. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/parquet.rs +0 -0
  100. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/parts.rs +0 -0
  101. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/sink_format.rs +0 -0
  102. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/strategy/append.rs +0 -0
  103. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/strategy/merge/mod.rs +0 -0
  104. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/strategy/merge/scd1.rs +0 -0
  105. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/strategy/merge/scd2.rs +0 -0
  106. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/strategy/merge/shared.rs +0 -0
  107. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/strategy/mod.rs +0 -0
  108. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/io/write/strategy/overwrite.rs +0 -0
  109. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/log.rs +0 -0
  110. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/profile/mod.rs +0 -0
  111. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/profile/parse.rs +0 -0
  112. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/profile/types.rs +0 -0
  113. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/profile/validate.rs +0 -0
  114. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/report/build.rs +0 -0
  115. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/report/entity.rs +0 -0
  116. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/report/output.rs +0 -0
  117. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/entity/accepted_write.rs +0 -0
  118. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/entity/pii.rs +0 -0
  119. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/entity/process.rs +0 -0
  120. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/entity/resolve.rs +0 -0
  121. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/file.rs +0 -0
  122. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/output.rs +0 -0
  123. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/run/perf.rs +0 -0
  124. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/runner/mod.rs +0 -0
  125. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/runner/outcome.rs +0 -0
  126. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/runtime.rs +0 -0
  127. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/vars/mod.rs +0 -0
  128. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/vars/resolve.rs +0 -0
  129. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/src/warnings.rs +0 -0
  130. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/archive_run.rs +0 -0
  131. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/composite_unique.rs +0 -0
  132. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/delta_run.rs +0 -0
  133. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/dry_run.rs +0 -0
  134. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/fixed_width.rs +0 -0
  135. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/iceberg_gcs_run.rs +0 -0
  136. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/iceberg_glue_run.rs +0 -0
  137. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/iceberg_run.rs +0 -0
  138. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/iceberg_s3_run.rs +0 -0
  139. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/json_selectors.rs +0 -0
  140. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/local_run.rs +0 -0
  141. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/mod.rs +0 -0
  142. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/path_normalization.rs +0 -0
  143. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration/run_entities_filter.rs +0 -0
  144. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/integration.rs +0 -0
  145. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/common.rs +0 -0
  146. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/add_entity.rs +0 -0
  147. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/adls_storage.rs +0 -0
  148. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/adls_validation.rs +0 -0
  149. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/catalogs.rs +0 -0
  150. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/config_validation.rs +0 -0
  151. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/gcs_storage.rs +0 -0
  152. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/gcs_validation.rs +0 -0
  153. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/local_storage.rs +0 -0
  154. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/mod.rs +0 -0
  155. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/parse.rs +0 -0
  156. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/pii_validation.rs +0 -0
  157. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/remote_base.rs +0 -0
  158. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/config/templating.rs +0 -0
  159. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/format.rs +0 -0
  160. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/mod.rs +0 -0
  161. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/avro_input.rs +0 -0
  162. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/csv_nulls.rs +0 -0
  163. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/json_array.rs +0 -0
  164. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/json_ndjson.rs +0 -0
  165. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/json_selector.rs +0 -0
  166. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/mod.rs +0 -0
  167. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/orc_input.rs +0 -0
  168. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/parquet_input.rs +0 -0
  169. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/tsv.rs +0 -0
  170. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/xlsx_input.rs +0 -0
  171. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/xml.rs +0 -0
  172. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/read/xml_selector.rs +0 -0
  173. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/adls.rs +0 -0
  174. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/adls_integration.rs +0 -0
  175. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/gcs.rs +0 -0
  176. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/inputs.rs +0 -0
  177. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/local.rs +0 -0
  178. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/mod.rs +0 -0
  179. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/paths.rs +0 -0
  180. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/planner.rs +0 -0
  181. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/s3.rs +0 -0
  182. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/storage/target.rs +0 -0
  183. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/write/delta_merge.rs +0 -0
  184. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/write/delta_write.rs +0 -0
  185. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/write/iceberg_write.rs +0 -0
  186. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/write/metrics.rs +0 -0
  187. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/write/mod.rs +0 -0
  188. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/write/object_store.rs +0 -0
  189. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/write/parquet_write.rs +0 -0
  190. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/write/parts.rs +0 -0
  191. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/io/write/rejected_csv.rs +0 -0
  192. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/manifest/mod.rs +0 -0
  193. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/mod.rs +0 -0
  194. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/profile/mod.rs +0 -0
  195. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/profile/parse.rs +0 -0
  196. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/profile/validate.rs +0 -0
  197. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/report/accepted_output.rs +0 -0
  198. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/report/mod.rs +0 -0
  199. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/report/storage.rs +0 -0
  200. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/check_order.rs +0 -0
  201. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/checks.rs +0 -0
  202. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/entity/accepted_output.rs +0 -0
  203. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/entity/mod.rs +0 -0
  204. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/mod.rs +0 -0
  205. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/normalize.rs +0 -0
  206. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/pii.rs +0 -0
  207. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/run/schema_mismatch.rs +0 -0
  208. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/runner/adapter.rs +0 -0
  209. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/runner/mod.rs +0 -0
  210. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/state/mod.rs +0 -0
  211. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/vars/mod.rs +0 -0
  212. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit/vars/resolve.rs +0 -0
  213. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-core/tests/unit.rs +0 -0
  214. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/.gitignore +0 -0
  215. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/src/functions.rs +0 -0
  216. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/src/lib.rs +0 -0
  217. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/src/observer.rs +0 -0
  218. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/src/types/config.rs +0 -0
  219. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/src/types/errors.rs +0 -0
  220. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/src/types/mod.rs +0 -0
  221. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/src/types/outcome.rs +0 -0
  222. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/tests/fixtures/config.yml +0 -0
  223. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/tests/fixtures/in/customer/customers_valid.csv +0 -0
  224. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/tests/fixtures/invalid_config.yml +0 -0
  225. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/tests/fixtures/profile.yml +0 -0
  226. {floe_python-0.4.1 → floe_python-0.4.3}/crates/floe-python/tests/test_floe.py +0 -0
  227. {floe_python-0.4.1 → floe_python-0.4.3}/python/floe/__init__.py +0 -0
  228. {floe_python-0.4.1 → floe_python-0.4.3}/python/floe/_floe.pyi +0 -0
  229. {floe_python-0.4.1 → floe_python-0.4.3}/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.1"
3402
+ version = "0.4.3"
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.1"
3415
+ version = "0.4.3"
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.1"
3458
+ version = "0.4.3"
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.1
3
+ Version: 0.4.3
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -98,6 +98,43 @@ except floe.FloeError as e:
98
98
  | `set_observer(callback)` | Register a live-event callback |
99
99
  | `clear_observer()` | Remove the current callback |
100
100
 
101
+ ## Jupyter
102
+
103
+ `RunOutcome` renders as a color-coded HTML table automatically in Jupyter — no extra code needed. Just end a cell with the variable:
104
+
105
+ ```python
106
+ outcome = floe.run("orders.yml")
107
+ outcome # renders inline HTML table with per-entity status, accepted/rejected counts
108
+ ```
109
+
110
+ Use `outcome.to_dict()` to turn results into a plain dict for pandas:
111
+
112
+ ```python
113
+ import pandas as pd
114
+ df = pd.DataFrame(outcome.entity_reports)
115
+ ```
116
+
117
+ ## Observing progress
118
+
119
+ Register a callback to receive live events as the run proceeds:
120
+
121
+ ```python
122
+ floe.set_observer(lambda e: print(f"[{e['event']}]", e.get("name", e.get("entity", ""))))
123
+ outcome = floe.run("orders.yml")
124
+ floe.clear_observer()
125
+ ```
126
+
127
+ Event types: `run_started`, `entity_started`, `file_started`, `file_finished`, `schema_evolution_applied`, `entity_finished`, `run_finished`, `log`. See the [full guide](../../docs/python-bindings.md#observing-runs-in-real-time) for all event fields.
128
+
129
+ ## Profile overrides
130
+
131
+ Override config variables or cloud credentials without editing the YAML:
132
+
133
+ ```python
134
+ floe.run("orders.yml", profile_vars={"incoming_root": "s3://my-bucket/incoming"})
135
+ floe.run("orders.yml", profile_path="prod.yml")
136
+ ```
137
+
101
138
  ## Building from source
102
139
 
103
140
  ```bash
@@ -111,3 +148,7 @@ maturin develop
111
148
 
112
149
  Apache 2.0
113
150
 
151
+ ---
152
+
153
+ → Full API reference and examples: [docs/python-bindings.md](../../docs/python-bindings.md)
154
+
@@ -70,6 +70,43 @@ except floe.FloeError as e:
70
70
  | `set_observer(callback)` | Register a live-event callback |
71
71
  | `clear_observer()` | Remove the current callback |
72
72
 
73
+ ## Jupyter
74
+
75
+ `RunOutcome` renders as a color-coded HTML table automatically in Jupyter — no extra code needed. Just end a cell with the variable:
76
+
77
+ ```python
78
+ outcome = floe.run("orders.yml")
79
+ outcome # renders inline HTML table with per-entity status, accepted/rejected counts
80
+ ```
81
+
82
+ Use `outcome.to_dict()` to turn results into a plain dict for pandas:
83
+
84
+ ```python
85
+ import pandas as pd
86
+ df = pd.DataFrame(outcome.entity_reports)
87
+ ```
88
+
89
+ ## Observing progress
90
+
91
+ Register a callback to receive live events as the run proceeds:
92
+
93
+ ```python
94
+ floe.set_observer(lambda e: print(f"[{e['event']}]", e.get("name", e.get("entity", ""))))
95
+ outcome = floe.run("orders.yml")
96
+ floe.clear_observer()
97
+ ```
98
+
99
+ Event types: `run_started`, `entity_started`, `file_started`, `file_finished`, `schema_evolution_applied`, `entity_finished`, `run_finished`, `log`. See the [full guide](../../docs/python-bindings.md#observing-runs-in-real-time) for all event fields.
100
+
101
+ ## Profile overrides
102
+
103
+ Override config variables or cloud credentials without editing the YAML:
104
+
105
+ ```python
106
+ floe.run("orders.yml", profile_vars={"incoming_root": "s3://my-bucket/incoming"})
107
+ floe.run("orders.yml", profile_path="prod.yml")
108
+ ```
109
+
73
110
  ## Building from source
74
111
 
75
112
  ```bash
@@ -82,3 +119,7 @@ maturin develop
82
119
  ## License
83
120
 
84
121
  Apache 2.0
122
+
123
+ ---
124
+
125
+ → Full API reference and examples: [docs/python-bindings.md](../../docs/python-bindings.md)
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "floe-core"
3
- version = "0.4.1"
3
+ version = "0.4.3"
4
4
  edition = "2021"
5
5
  description = "Core library for Floe, a YAML-driven technical ingestion tool."
6
6
  license = "MIT"
@@ -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) |
@@ -70,6 +70,6 @@ fn download_remote_config(uri: &str, temp_dir: &Path) -> FloeResult<PathBuf> {
70
70
  Err(format!("unsupported config uri: {}", uri).into())
71
71
  }
72
72
 
73
- fn is_remote_uri(value: &str) -> bool {
73
+ pub(crate) fn is_remote_uri(value: &str) -> bool {
74
74
  value.starts_with("s3://") || value.starts_with("gs://") || value.starts_with("abfs://")
75
75
  }
@@ -8,6 +8,7 @@ mod validate;
8
8
  pub(crate) mod yaml_decode;
9
9
 
10
10
  pub use catalog::{CatalogResolver, ResolvedDeltaCatalogTarget, ResolvedIcebergCatalogTarget};
11
+ pub(crate) use location::is_remote_uri;
11
12
  pub use location::{resolve_config_location, ConfigLocation};
12
13
  pub use storage::{resolve_local_path, ConfigBase, ResolvedPath, StorageResolver};
13
14
  pub use types::*;
@@ -1141,6 +1141,7 @@ pub(crate) fn parse_lineage_config(value: &Yaml) -> FloeResult<LineageConfig> {
1141
1141
  "namespace",
1142
1142
  "producer",
1143
1143
  "max_failures",
1144
+ "job_name",
1144
1145
  ],
1145
1146
  )?;
1146
1147
  Ok(LineageConfig {
@@ -1150,5 +1151,6 @@ pub(crate) fn parse_lineage_config(value: &Yaml) -> FloeResult<LineageConfig> {
1150
1151
  namespace: get_string(hash, "namespace", "lineage")?,
1151
1152
  producer: opt_string(hash, "producer", "lineage")?,
1152
1153
  max_failures: opt_u32(hash, "max_failures", "lineage")?,
1154
+ job_name: opt_string(hash, "job_name", "lineage")?,
1153
1155
  })
1154
1156
  }
@@ -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>,
@@ -29,6 +31,7 @@ pub struct LineageConfig {
29
31
  pub namespace: String,
30
32
  pub producer: Option<String>,
31
33
  pub max_failures: Option<u32>,
34
+ pub job_name: Option<String>,
32
35
  }
33
36
 
34
37
  #[derive(Debug)]
@@ -66,12 +69,12 @@ pub struct EntityConfig {
66
69
  pub pii: Option<PiiConfig>,
67
70
  }
68
71
 
69
- #[derive(Debug)]
72
+ #[derive(Debug, Serialize, Deserialize)]
70
73
  pub struct PiiConfig {
71
74
  pub columns: Vec<PiiColumnConfig>,
72
75
  }
73
76
 
74
- #[derive(Debug)]
77
+ #[derive(Debug, Serialize, Deserialize)]
75
78
  pub struct PiiColumnConfig {
76
79
  pub name: String,
77
80
  pub strategy: PiiStrategy,
@@ -79,7 +82,8 @@ pub struct PiiColumnConfig {
79
82
  pub redact_value: Option<String>,
80
83
  }
81
84
 
82
- #[derive(Debug, Clone, Copy, PartialEq, Eq)]
85
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
86
+ #[serde(rename_all = "lowercase")]
83
87
  pub enum PiiStrategy {
84
88
  Hash,
85
89
  Drop,
@@ -103,7 +107,8 @@ impl EntityConfig {
103
107
  }
104
108
  }
105
109
 
106
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
110
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
111
+ #[serde(rename_all = "lowercase")]
107
112
  pub enum IncrementalMode {
108
113
  #[default]
109
114
  None,
@@ -146,7 +151,7 @@ pub struct SourceConfig {
146
151
  pub cast_mode: Option<String>,
147
152
  }
148
153
 
149
- #[derive(Debug, Clone)]
154
+ #[derive(Debug, Clone, Deserialize)]
150
155
  pub struct SourceOptions {
151
156
  pub header: Option<bool>,
152
157
  pub separator: Option<String>,
@@ -262,7 +267,8 @@ pub struct SinkConfig {
262
267
  pub archive: Option<ArchiveTarget>,
263
268
  }
264
269
 
265
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
270
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
271
+ #[serde(rename_all = "snake_case")]
266
272
  pub enum WriteMode {
267
273
  #[default]
268
274
  Overwrite,
@@ -300,34 +306,34 @@ pub const DEFAULT_SCD2_CURRENT_FLAG_COLUMN: &str = "__floe_is_current";
300
306
  pub const DEFAULT_SCD2_VALID_FROM_COLUMN: &str = "__floe_valid_from";
301
307
  pub const DEFAULT_SCD2_VALID_TO_COLUMN: &str = "__floe_valid_to";
302
308
 
303
- #[derive(Debug, Clone)]
309
+ #[derive(Debug, Clone, Serialize, Deserialize)]
304
310
  pub struct MergeOptionsConfig {
305
311
  pub ignore_columns: Option<Vec<String>>,
306
312
  pub compare_columns: Option<Vec<String>>,
307
313
  pub scd2: Option<MergeScd2OptionsConfig>,
308
314
  }
309
315
 
310
- #[derive(Debug, Clone)]
316
+ #[derive(Debug, Clone, Serialize, Deserialize)]
311
317
  pub struct MergeScd2OptionsConfig {
312
318
  pub current_flag_column: Option<String>,
313
319
  pub valid_from_column: Option<String>,
314
320
  pub valid_to_column: Option<String>,
315
321
  }
316
322
 
317
- #[derive(Debug)]
323
+ #[derive(Debug, Serialize, Deserialize)]
318
324
  pub struct SinkOptions {
319
325
  pub compression: Option<String>,
320
326
  pub row_group_size: Option<u64>,
321
327
  pub max_size_per_file: Option<u64>,
322
328
  }
323
329
 
324
- #[derive(Debug, Clone)]
330
+ #[derive(Debug, Clone, Serialize, Deserialize)]
325
331
  pub struct IcebergPartitionFieldConfig {
326
332
  pub column: String,
327
333
  pub transform: String,
328
334
  }
329
335
 
330
- #[derive(Debug, Clone)]
336
+ #[derive(Debug, Clone, Serialize, Deserialize)]
331
337
  pub struct IcebergSinkTargetConfig {
332
338
  pub catalog: Option<String>,
333
339
  pub namespace: Option<String>,
@@ -335,7 +341,7 @@ pub struct IcebergSinkTargetConfig {
335
341
  pub location: Option<String>,
336
342
  }
337
343
 
338
- #[derive(Debug, Clone)]
344
+ #[derive(Debug, Clone, Serialize, Deserialize)]
339
345
  pub struct DeltaSinkTargetConfig {
340
346
  /// Name of the catalog definition to use (falls back to `catalogs.default`).
341
347
  pub catalog: Option<String>,
@@ -345,13 +351,13 @@ pub struct DeltaSinkTargetConfig {
345
351
  pub table: Option<String>,
346
352
  }
347
353
 
348
- #[derive(Debug, Clone)]
354
+ #[derive(Debug, Clone, Serialize, Deserialize)]
349
355
  pub struct StoragesConfig {
350
356
  pub default: Option<String>,
351
357
  pub definitions: Vec<StorageDefinition>,
352
358
  }
353
359
 
354
- #[derive(Debug, Clone)]
360
+ #[derive(Debug, Clone, Serialize, Deserialize)]
355
361
  pub struct StorageDefinition {
356
362
  pub name: String,
357
363
  pub fs_type: String,
@@ -362,7 +368,7 @@ pub struct StorageDefinition {
362
368
  pub prefix: Option<String>,
363
369
  }
364
370
 
365
- #[derive(Debug, Clone)]
371
+ #[derive(Debug, Clone, Serialize, Deserialize)]
366
372
  pub struct CatalogsConfig {
367
373
  pub default: Option<String>,
368
374
  pub definitions: Vec<CatalogDefinition>,
@@ -371,7 +377,8 @@ pub struct CatalogsConfig {
371
377
  /// Type-specific configuration for a catalog definition.
372
378
  /// Each variant carries only the fields relevant to that catalog type.
373
379
  /// Add a new variant here when supporting a new catalog type.
374
- #[derive(Debug, Clone)]
380
+ #[derive(Debug, Clone, Serialize, Deserialize)]
381
+ #[serde(tag = "type", rename_all = "lowercase")]
375
382
  pub enum CatalogTypeConfig {
376
383
  Glue {
377
384
  region: String,
@@ -419,7 +426,7 @@ impl CatalogTypeConfig {
419
426
  }
420
427
  }
421
428
 
422
- #[derive(Debug, Clone)]
429
+ #[derive(Debug, Clone, Serialize, Deserialize)]
423
430
  pub struct CatalogDefinition {
424
431
  pub name: String,
425
432
  pub type_config: CatalogTypeConfig,
@@ -440,7 +447,8 @@ pub struct ArchiveTarget {
440
447
  pub storage: Option<String>,
441
448
  }
442
449
 
443
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
450
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
451
+ #[serde(rename_all = "lowercase")]
444
452
  pub enum PolicySeverity {
445
453
  #[default]
446
454
  Warn,
@@ -469,7 +477,7 @@ pub struct PolicyConfig {
469
477
  pub severity: PolicySeverity,
470
478
  }
471
479
 
472
- #[derive(Debug)]
480
+ #[derive(Debug, Serialize)]
473
481
  pub struct SchemaConfig {
474
482
  pub normalize_columns: Option<NormalizeColumnsConfig>,
475
483
  pub mismatch: Option<SchemaMismatchConfig>,
@@ -485,19 +493,20 @@ impl SchemaConfig {
485
493
  }
486
494
  }
487
495
 
488
- #[derive(Debug)]
496
+ #[derive(Debug, Serialize, Deserialize)]
489
497
  pub struct NormalizeColumnsConfig {
490
498
  pub enabled: Option<bool>,
491
499
  pub strategy: Option<String>,
492
500
  }
493
501
 
494
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
502
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
495
503
  pub struct SchemaEvolutionConfig {
496
504
  pub mode: SchemaEvolutionMode,
497
505
  pub on_incompatible: SchemaEvolutionIncompatibleAction,
498
506
  }
499
507
 
500
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
508
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
509
+ #[serde(rename_all = "snake_case")]
501
510
  pub enum SchemaEvolutionMode {
502
511
  #[default]
503
512
  Strict,
@@ -513,7 +522,8 @@ impl SchemaEvolutionMode {
513
522
  }
514
523
  }
515
524
 
516
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
525
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
526
+ #[serde(rename_all = "lowercase")]
517
527
  pub enum SchemaEvolutionIncompatibleAction {
518
528
  #[default]
519
529
  Fail,
@@ -527,13 +537,13 @@ impl SchemaEvolutionIncompatibleAction {
527
537
  }
528
538
  }
529
539
 
530
- #[derive(Debug)]
540
+ #[derive(Debug, Serialize, Deserialize)]
531
541
  pub struct SchemaMismatchConfig {
532
542
  pub missing_columns: Option<String>,
533
543
  pub extra_columns: Option<String>,
534
544
  }
535
545
 
536
- #[derive(Debug, Clone)]
546
+ #[derive(Debug, Clone, Serialize)]
537
547
  pub struct ColumnConfig {
538
548
  pub name: String,
539
549
  pub source: Option<String>,
@@ -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};
@@ -79,6 +84,15 @@ pub fn load_config(config_path: &Path) -> FloeResult<config::RootConfig> {
79
84
  config::parse_config(config_path)
80
85
  }
81
86
 
87
+ /// Read manifest JSON from any supported URI (local path, `s3://`, `gs://`, `abfs://`).
88
+ /// For remote URIs the file is downloaded to a temp directory that is cleaned up before
89
+ /// this function returns; the caller receives the raw JSON text as a `String`.
90
+ pub fn read_manifest_text(uri: &str) -> FloeResult<String> {
91
+ let location = config::resolve_config_location(uri)?;
92
+ let text = std::fs::read_to_string(&location.path)?;
93
+ Ok(text)
94
+ }
95
+
82
96
  pub fn load_config_with_profile_vars(
83
97
  config_path: &Path,
84
98
  profile_vars: &std::collections::HashMap<String, String>,