floe-python 0.6.4__tar.gz → 0.6.6__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 (238) hide show
  1. {floe_python-0.6.4 → floe_python-0.6.6}/Cargo.lock +3 -3
  2. {floe_python-0.6.4 → floe_python-0.6.6}/PKG-INFO +1 -1
  3. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/Cargo.toml +1 -1
  4. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/config/location.rs +43 -0
  5. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/glue.rs +46 -3
  6. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg.rs +1 -0
  7. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/manifest/builder.rs +4 -9
  8. floe_python-0.6.6/crates/floe-core/tests/unit/config/location.rs +44 -0
  9. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/mod.rs +1 -0
  10. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/manifest/mod.rs +36 -7
  11. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/Cargo.toml +2 -2
  12. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/pyproject.duckdb.toml +2 -2
  13. {floe_python-0.6.4 → floe_python-0.6.6}/pyproject.toml +1 -1
  14. {floe_python-0.6.4 → floe_python-0.6.6}/Cargo.toml +0 -0
  15. {floe_python-0.6.4 → floe_python-0.6.6}/README.md +0 -0
  16. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/README.md +0 -0
  17. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/add_entity.rs +0 -0
  18. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/checks/cast.rs +0 -0
  19. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/checks/mismatch.rs +0 -0
  20. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/checks/mod.rs +0 -0
  21. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/checks/normalize.rs +0 -0
  22. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/checks/not_null.rs +0 -0
  23. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/checks/unique.rs +0 -0
  24. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/config/catalog.rs +0 -0
  25. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/config/mod.rs +0 -0
  26. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/config/parse.rs +0 -0
  27. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/config/storage.rs +0 -0
  28. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/config/template.rs +0 -0
  29. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/config/types.rs +0 -0
  30. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/config/validate.rs +0 -0
  31. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/config/yaml_decode.rs +0 -0
  32. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/errors.rs +0 -0
  33. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/format.rs +0 -0
  34. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/mod.rs +0 -0
  35. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/avro.rs +0 -0
  36. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/csv.rs +0 -0
  37. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/fixed_width.rs +0 -0
  38. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/json.rs +0 -0
  39. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/json_selector.rs +0 -0
  40. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/mod.rs +0 -0
  41. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/orc.rs +0 -0
  42. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/parquet.rs +0 -0
  43. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/xlsx.rs +0 -0
  44. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/xml.rs +0 -0
  45. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/read/xml_selector.rs +0 -0
  46. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/extensions.rs +0 -0
  47. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/mod.rs +0 -0
  48. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/paths.rs +0 -0
  49. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/placement.rs +0 -0
  50. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/planner.rs +0 -0
  51. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/uri.rs +0 -0
  52. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/validation.rs +0 -0
  53. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/mod.rs +0 -0
  54. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/object_store.rs +0 -0
  55. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/archive.rs +0 -0
  56. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/inputs.rs +0 -0
  57. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/mod.rs +0 -0
  58. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/output.rs +0 -0
  59. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/adls.rs +0 -0
  60. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/gcs.rs +0 -0
  61. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/local.rs +0 -0
  62. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/mod.rs +0 -0
  63. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/s3.rs +0 -0
  64. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/storage/target.rs +0 -0
  65. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/unique_seed/mod.rs +0 -0
  66. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/accepted.rs +0 -0
  67. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/arrow_convert.rs +0 -0
  68. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/csv.rs +0 -0
  69. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/commit_metrics.rs +0 -0
  70. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/options.rs +0 -0
  71. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/record_batch.rs +0 -0
  72. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/unity.rs +0 -0
  73. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/unity_tests.rs +0 -0
  74. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta.rs +0 -0
  75. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/duckdb/conn.rs +0 -0
  76. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/duckdb/merge.rs +0 -0
  77. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/duckdb.rs +0 -0
  78. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/context.rs +0 -0
  79. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/data_files.rs +0 -0
  80. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/metadata.rs +0 -0
  81. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/rest.rs +0 -0
  82. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/schema.rs +0 -0
  83. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/metrics.rs +0 -0
  84. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/mod.rs +0 -0
  85. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/parquet.rs +0 -0
  86. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/parts.rs +0 -0
  87. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/sink_format.rs +0 -0
  88. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/append.rs +0 -0
  89. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/keys.rs +0 -0
  90. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/mod.rs +0 -0
  91. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/scd1.rs +0 -0
  92. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/scd2.rs +0 -0
  93. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/shared.rs +0 -0
  94. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/mod.rs +0 -0
  95. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/overwrite.rs +0 -0
  96. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/lib.rs +0 -0
  97. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/lineage/mod.rs +0 -0
  98. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/log.rs +0 -0
  99. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/manifest/mod.rs +0 -0
  100. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/manifest/model.rs +0 -0
  101. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/manifest/reconstruct.rs +0 -0
  102. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/profile/mod.rs +0 -0
  103. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/profile/parse.rs +0 -0
  104. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/profile/types.rs +0 -0
  105. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/profile/validate.rs +0 -0
  106. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/report/build.rs +0 -0
  107. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/report/entity.rs +0 -0
  108. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/report/mod.rs +0 -0
  109. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/report/output.rs +0 -0
  110. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/context.rs +0 -0
  111. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/entity/accepted_buffer.rs +0 -0
  112. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/entity/accepted_write.rs +0 -0
  113. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/entity/incremental.rs +0 -0
  114. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/entity/mod.rs +0 -0
  115. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/entity/pii.rs +0 -0
  116. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/entity/precheck.rs +0 -0
  117. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/entity/process.rs +0 -0
  118. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/entity/resolve.rs +0 -0
  119. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/entity/validate_split.rs +0 -0
  120. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/events.rs +0 -0
  121. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/file.rs +0 -0
  122. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/mod.rs +0 -0
  123. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/output.rs +0 -0
  124. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/run/perf.rs +0 -0
  125. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/runner/mod.rs +0 -0
  126. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/runner/outcome.rs +0 -0
  127. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/runtime.rs +0 -0
  128. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/secret.rs +0 -0
  129. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/state/mod.rs +0 -0
  130. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/vars/mod.rs +0 -0
  131. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/vars/resolve.rs +0 -0
  132. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/src/warnings.rs +0 -0
  133. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/archive_run.rs +0 -0
  134. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/composite_unique.rs +0 -0
  135. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/delta_run.rs +0 -0
  136. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/dry_run.rs +0 -0
  137. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/duckdb_run.rs +0 -0
  138. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/fixed_width.rs +0 -0
  139. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_gcs_run.rs +0 -0
  140. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_glue_run.rs +0 -0
  141. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_run.rs +0 -0
  142. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_s3_run.rs +0 -0
  143. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/json_selectors.rs +0 -0
  144. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/local_run.rs +0 -0
  145. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/mod.rs +0 -0
  146. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/path_normalization.rs +0 -0
  147. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration/run_entities_filter.rs +0 -0
  148. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/integration.rs +0 -0
  149. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/common.rs +0 -0
  150. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/add_entity.rs +0 -0
  151. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/adls_storage.rs +0 -0
  152. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/adls_validation.rs +0 -0
  153. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/catalogs.rs +0 -0
  154. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/config_validation.rs +0 -0
  155. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/duckdb_validation.rs +0 -0
  156. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/gcs_storage.rs +0 -0
  157. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/gcs_validation.rs +0 -0
  158. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/lineage_validation.rs +0 -0
  159. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/local_storage.rs +0 -0
  160. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/parse.rs +0 -0
  161. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/pii_validation.rs +0 -0
  162. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/remote_base.rs +0 -0
  163. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/storage_resolver_uri.rs +0 -0
  164. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/templating.rs +0 -0
  165. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/format.rs +0 -0
  166. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/mod.rs +0 -0
  167. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/avro_input.rs +0 -0
  168. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/csv_nulls.rs +0 -0
  169. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/json_array.rs +0 -0
  170. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/json_ndjson.rs +0 -0
  171. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/json_selector.rs +0 -0
  172. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/mod.rs +0 -0
  173. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/orc_input.rs +0 -0
  174. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/parquet_input.rs +0 -0
  175. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/tsv.rs +0 -0
  176. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/xlsx_input.rs +0 -0
  177. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/xml.rs +0 -0
  178. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/xml_selector.rs +0 -0
  179. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/adls.rs +0 -0
  180. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/adls_integration.rs +0 -0
  181. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/gcs.rs +0 -0
  182. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/inputs.rs +0 -0
  183. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/local.rs +0 -0
  184. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/mod.rs +0 -0
  185. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/paths.rs +0 -0
  186. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/planner.rs +0 -0
  187. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/s3.rs +0 -0
  188. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/target.rs +0 -0
  189. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/delta_merge.rs +0 -0
  190. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/delta_write.rs +0 -0
  191. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/iceberg_write.rs +0 -0
  192. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/metrics.rs +0 -0
  193. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/mod.rs +0 -0
  194. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/object_store.rs +0 -0
  195. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/parquet_write.rs +0 -0
  196. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/parts.rs +0 -0
  197. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/rejected_csv.rs +0 -0
  198. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/mod.rs +0 -0
  199. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/profile/mod.rs +0 -0
  200. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/profile/parse.rs +0 -0
  201. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/profile/validate.rs +0 -0
  202. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/report/accepted_output.rs +0 -0
  203. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/report/mod.rs +0 -0
  204. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/report/storage.rs +0 -0
  205. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/check_order.rs +0 -0
  206. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/checks.rs +0 -0
  207. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/entity/accepted_output.rs +0 -0
  208. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/entity/incremental.rs +0 -0
  209. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/entity/mod.rs +0 -0
  210. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/lineage.rs +0 -0
  211. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/mod.rs +0 -0
  212. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/normalize.rs +0 -0
  213. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/pii.rs +0 -0
  214. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/report.rs +0 -0
  215. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/schema_mismatch.rs +0 -0
  216. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/runner/adapter.rs +0 -0
  217. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/runner/mod.rs +0 -0
  218. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/state/mod.rs +0 -0
  219. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/vars/mod.rs +0 -0
  220. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit/vars/resolve.rs +0 -0
  221. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-core/tests/unit.rs +0 -0
  222. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/.gitignore +0 -0
  223. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/README.md +0 -0
  224. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/src/functions.rs +0 -0
  225. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/src/lib.rs +0 -0
  226. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/src/observer.rs +0 -0
  227. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/src/types/config.rs +0 -0
  228. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/src/types/errors.rs +0 -0
  229. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/src/types/mod.rs +0 -0
  230. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/src/types/outcome.rs +0 -0
  231. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/config.yml +0 -0
  232. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/in/customer/customers_valid.csv +0 -0
  233. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/invalid_config.yml +0 -0
  234. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/profile.yml +0 -0
  235. {floe_python-0.6.4 → floe_python-0.6.6}/crates/floe-python/tests/test_floe.py +0 -0
  236. {floe_python-0.6.4 → floe_python-0.6.6}/python/floe/__init__.py +0 -0
  237. {floe_python-0.6.4 → floe_python-0.6.6}/python/floe/_floe.pyi +0 -0
  238. {floe_python-0.6.4 → floe_python-0.6.6}/python/floe/py.typed +0 -0
@@ -3340,7 +3340,7 @@ dependencies = [
3340
3340
 
3341
3341
  [[package]]
3342
3342
  name = "floe-cli"
3343
- version = "0.6.4"
3343
+ version = "0.6.6"
3344
3344
  dependencies = [
3345
3345
  "assert_cmd",
3346
3346
  "clap",
@@ -3353,7 +3353,7 @@ dependencies = [
3353
3353
 
3354
3354
  [[package]]
3355
3355
  name = "floe-core"
3356
- version = "0.6.4"
3356
+ version = "0.6.6"
3357
3357
  dependencies = [
3358
3358
  "apache-avro",
3359
3359
  "arrow",
@@ -3399,7 +3399,7 @@ dependencies = [
3399
3399
 
3400
3400
  [[package]]
3401
3401
  name = "floe-python"
3402
- version = "0.6.4"
3402
+ version = "0.6.6"
3403
3403
  dependencies = [
3404
3404
  "floe-core",
3405
3405
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: floe-python
3
- Version: 0.6.4
3
+ Version: 0.6.6
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.6.4"
3
+ version = "0.6.6"
4
4
  edition = "2021"
5
5
  description = "Core library for Floe, a YAML-driven technical ingestion tool."
6
6
  license = "MIT"
@@ -10,6 +10,11 @@ pub struct ConfigLocation {
10
10
  pub path: PathBuf,
11
11
  pub base: ConfigBase,
12
12
  pub display: String,
13
+ /// URI recorded as `config_uri` / `profile_uri` in the manifest:
14
+ /// `local://<path-as-typed>` for local configs (normalized, not canonicalized,
15
+ /// so a relative `-c` stays relative and the manifest does not depend on where
16
+ /// the file physically lives), or the scheme-normalized remote URI otherwise.
17
+ pub uri: String,
13
18
  _temp_dir: Option<TempDir>,
14
19
  }
15
20
 
@@ -18,10 +23,13 @@ pub fn resolve_config_location(input: &str) -> FloeResult<ConfigLocation> {
18
23
  let temp_dir = TempDir::new()?;
19
24
  let local_path = download_remote_config(input, temp_dir.path())?;
20
25
  let base = ConfigBase::remote_from_uri(temp_dir.path().to_path_buf(), input)?;
26
+ // Remote URIs are already environment-independent; keep them absolute.
27
+ let uri = storage::uri::normalize_remote_uri(input).into_owned();
21
28
  Ok(ConfigLocation {
22
29
  path: local_path,
23
30
  base,
24
31
  display: input.to_string(),
32
+ uri,
25
33
  _temp_dir: Some(temp_dir),
26
34
  })
27
35
  } else {
@@ -37,11 +45,46 @@ pub fn resolve_config_location(input: &str) -> FloeResult<ConfigLocation> {
37
45
  path: canonical.clone(),
38
46
  base,
39
47
  display: canonical.display().to_string(),
48
+ uri: format!("local://{}", normalize_input_path(input)),
40
49
  _temp_dir: None,
41
50
  })
42
51
  }
43
52
  }
44
53
 
54
+ /// Lexically normalize a local path for `config_uri` / `profile_uri` without
55
+ /// touching the filesystem, so a relative `-c` stays relative and the same path is
56
+ /// produced on any machine. Uses `/` as the separator.
57
+ fn normalize_input_path(input: &str) -> String {
58
+ use std::path::Component;
59
+
60
+ let mut parts: Vec<String> = Vec::new();
61
+ let mut has_prefix = false;
62
+ for comp in Path::new(input).components() {
63
+ match comp {
64
+ Component::CurDir => {}
65
+ Component::Prefix(prefix) => {
66
+ has_prefix = true;
67
+ parts.push(prefix.as_os_str().to_string_lossy().into_owned());
68
+ }
69
+ // A Windows drive/UNC prefix already carries the root; skip the trailing
70
+ // RootDir so we emit `C:/...`, not `C://...` (which looks like a scheme).
71
+ Component::RootDir => {
72
+ if !has_prefix {
73
+ parts.push(String::new());
74
+ }
75
+ }
76
+ other => parts.push(other.as_os_str().to_string_lossy().into_owned()),
77
+ }
78
+ }
79
+
80
+ let joined = parts.join("/");
81
+ if joined.is_empty() {
82
+ ".".to_string()
83
+ } else {
84
+ joined
85
+ }
86
+ }
87
+
45
88
  fn download_remote_config(uri: &str, temp_dir: &Path) -> FloeResult<PathBuf> {
46
89
  let normalized = storage::uri::normalize_remote_uri(uri);
47
90
  let uri = normalized.as_ref();
@@ -2,10 +2,11 @@ use crate::errors::FloeError;
2
2
  use aws_config::meta::region::RegionProviderChain;
3
3
  use aws_sdk_glue::config::Region as GlueRegion;
4
4
  use aws_sdk_glue::types::{
5
- DatabaseInput as GlueDatabaseInput, StorageDescriptor as GlueStorageDescriptor,
6
- TableInput as GlueTableInput,
5
+ Column as GlueColumn, DatabaseInput as GlueDatabaseInput,
6
+ StorageDescriptor as GlueStorageDescriptor, TableInput as GlueTableInput,
7
7
  };
8
8
  use aws_sdk_glue::Client as GlueClient;
9
+ use iceberg::spec::{PrimitiveType, Schema, Type};
9
10
 
10
11
  use crate::{warnings, FloeResult};
11
12
 
@@ -127,6 +128,7 @@ pub(super) async fn upsert_glue_table(
127
128
  table_root_uri: &str,
128
129
  metadata_location: &str,
129
130
  version_id: Option<&str>,
131
+ schema: &Schema,
130
132
  ) -> FloeResult<()> {
131
133
  let client = build_glue_client(&glue_cfg.region).await?;
132
134
  ensure_glue_database(
@@ -136,7 +138,7 @@ pub(super) async fn upsert_glue_table(
136
138
  )
137
139
  .await?;
138
140
 
139
- let table_input = build_glue_table_input(glue_cfg, table_root_uri, metadata_location);
141
+ let table_input = build_glue_table_input(glue_cfg, table_root_uri, metadata_location, schema);
140
142
 
141
143
  let create_result = client
142
144
  .create_table()
@@ -259,13 +261,54 @@ async fn ensure_glue_database(
259
261
  }
260
262
  }
261
263
 
264
+ fn iceberg_type_to_glue_type(t: &Type) -> String {
265
+ match t {
266
+ Type::Primitive(p) => match p {
267
+ PrimitiveType::Boolean => "boolean".into(),
268
+ PrimitiveType::Int => "int".into(),
269
+ PrimitiveType::Long => "bigint".into(),
270
+ PrimitiveType::Float => "float".into(),
271
+ PrimitiveType::Double => "double".into(),
272
+ PrimitiveType::Decimal { precision, scale } => {
273
+ format!("decimal({precision},{scale})")
274
+ }
275
+ PrimitiveType::Date => "date".into(),
276
+ PrimitiveType::Time => "string".into(),
277
+ PrimitiveType::Timestamp
278
+ | PrimitiveType::Timestamptz
279
+ | PrimitiveType::TimestampNs
280
+ | PrimitiveType::TimestamptzNs => "timestamp".into(),
281
+ PrimitiveType::String | PrimitiveType::Uuid => "string".into(),
282
+ PrimitiveType::Fixed(_) | PrimitiveType::Binary => "binary".into(),
283
+ },
284
+ Type::Struct(_) => "struct<>".into(),
285
+ Type::List(_) => "array<string>".into(),
286
+ Type::Map(_) => "map<string,string>".into(),
287
+ }
288
+ }
289
+
262
290
  fn build_glue_table_input(
263
291
  glue_cfg: &GlueIcebergCatalogConfig,
264
292
  table_root_uri: &str,
265
293
  metadata_location: &str,
294
+ schema: &Schema,
266
295
  ) -> GlueTableInput {
296
+ let columns: Vec<GlueColumn> = schema
297
+ .as_struct()
298
+ .fields()
299
+ .iter()
300
+ .map(|f| {
301
+ GlueColumn::builder()
302
+ .name(f.name.as_str())
303
+ .r#type(iceberg_type_to_glue_type(&f.field_type))
304
+ .build()
305
+ .expect("glue column builder validated")
306
+ })
307
+ .collect();
308
+
267
309
  let storage_descriptor = GlueStorageDescriptor::builder()
268
310
  .location(table_root_uri)
311
+ .set_columns(Some(columns))
269
312
  .build();
270
313
 
271
314
  GlueTableInput::builder()
@@ -572,6 +572,7 @@ async fn write_iceberg_table_async(
572
572
  glue_state
573
573
  .as_ref()
574
574
  .and_then(|state| state.version_id.as_deref()),
575
+ &prepared.iceberg_schema,
575
576
  )
576
577
  .await?;
577
578
  }
@@ -378,7 +378,10 @@ fn build_common_manifest(
378
378
  });
379
379
  }
380
380
 
381
- let config_uri = canonical_config_uri(&config_location.display);
381
+ // Use `uri` (the path as typed / resolved remote URI), not the host-absolute
382
+ // `display`, so config_uri and the manifest_id derived from it do not depend on
383
+ // where the config file physically lives.
384
+ let config_uri = config_location.uri.clone();
382
385
  let config_checksum = std::fs::read(&config_location.path)
383
386
  .ok()
384
387
  .map(|b| sha256_hex(&b));
@@ -536,14 +539,6 @@ fn resolved_uri_to_path(uri: &str) -> String {
536
539
  }
537
540
  }
538
541
 
539
- fn canonical_config_uri(display: &str) -> String {
540
- if display.contains("://") {
541
- display.to_string()
542
- } else {
543
- format!("local://{}", display)
544
- }
545
- }
546
-
547
542
  fn build_manifest_id(config_uri: &str, config_checksum: Option<&str>) -> String {
548
543
  const FNV_OFFSET_BASIS: u64 = 0xcbf29ce484222325;
549
544
  const FNV_PRIME: u64 = 0x100000001b3;
@@ -0,0 +1,44 @@
1
+ use floe_core::resolve_config_location;
2
+
3
+ fn write_config(dir: &std::path::Path) -> std::path::PathBuf {
4
+ let path = dir.join("config.yml");
5
+ std::fs::write(&path, "version: \"0.1\"\nentities: []\n").expect("write config");
6
+ path
7
+ }
8
+
9
+ #[test]
10
+ fn local_config_uri_uses_local_scheme() {
11
+ let tmp = tempfile::TempDir::new().expect("temp dir");
12
+ let cfg = write_config(tmp.path());
13
+ let loc = resolve_config_location(cfg.to_str().expect("utf8")).expect("resolve");
14
+ assert!(loc.uri.starts_with("local://"), "uri: {}", loc.uri);
15
+ assert!(loc.uri.ends_with("/config.yml"), "uri: {}", loc.uri);
16
+ }
17
+
18
+ // The path is preserved lexically, not canonicalized: a `.` is dropped and a `..`
19
+ // bounce survives (canonicalize would collapse it), and separators become `/`.
20
+ #[test]
21
+ fn local_config_uri_is_lexically_normalized() {
22
+ let tmp = tempfile::TempDir::new().expect("temp dir");
23
+ let cfg_dir = tmp.path().join("cfg");
24
+ std::fs::create_dir_all(&cfg_dir).expect("cfg dir");
25
+ write_config(&cfg_dir);
26
+
27
+ let bouncy = format!("{}/./../cfg/config.yml", cfg_dir.display());
28
+ let loc = resolve_config_location(&bouncy).expect("resolve");
29
+ assert!(loc.uri.contains("/../cfg/config.yml"), "uri: {}", loc.uri);
30
+ assert!(!loc.uri.contains("/./"), "uri: {}", loc.uri);
31
+ }
32
+
33
+ // A Windows drive path must yield `local://C:/...`, not `local://C://...` (which the
34
+ // `local://` prefix would turn into a scheme-colliding, invalid URI). Windows-only
35
+ // because drive prefixes are only parsed on Windows targets.
36
+ #[cfg(windows)]
37
+ #[test]
38
+ fn windows_drive_config_uri_has_single_slash_after_drive() {
39
+ let tmp = tempfile::TempDir::new().expect("temp dir");
40
+ let cfg = write_config(tmp.path());
41
+ let loc = resolve_config_location(cfg.to_str().expect("utf8")).expect("resolve");
42
+ assert!(loc.uri.starts_with("local://"), "uri: {}", loc.uri);
43
+ assert!(!loc.uri.contains("C://"), "uri: {}", loc.uri);
44
+ }
@@ -12,6 +12,7 @@ pub mod gcs_storage;
12
12
  pub mod gcs_validation;
13
13
  pub mod lineage_validation;
14
14
  pub mod local_storage;
15
+ pub mod location;
15
16
  pub mod parse;
16
17
  pub mod pii_validation;
17
18
  pub mod remote_base;
@@ -16,13 +16,10 @@ fn repo_root() -> PathBuf {
16
16
 
17
17
  #[test]
18
18
  fn manifest_uses_local_uri_for_local_config() {
19
- let config_path = repo_root().join("example/config.yml");
20
- let expected_config_uri = format!(
21
- "local://{}",
22
- std::fs::canonicalize(&config_path)
23
- .expect("canonicalize config path")
24
- .display()
25
- );
19
+ // Pass a canonical path so the expected value is independent of the test's cwd.
20
+ let config_path = std::fs::canonicalize(repo_root().join("example/config.yml"))
21
+ .expect("canonicalize config path");
22
+ let expected_config_uri = format!("local://{}", config_path.display());
26
23
 
27
24
  let config_location = resolve_config_location(
28
25
  config_path
@@ -46,6 +43,38 @@ fn manifest_uses_local_uri_for_local_config() {
46
43
  assert_eq!(value["config_uri"], expected_config_uri);
47
44
  }
48
45
 
46
+ #[test]
47
+ fn manifest_config_uri_is_not_canonicalized() {
48
+ // config_uri reflects the path as typed, not the canonical path: a lexical `..`
49
+ // bounce (which canonicalize() would collapse) surviving in the output proves
50
+ // the path was preserved as-typed.
51
+ let temp_dir = tempfile::TempDir::new().expect("temp dir");
52
+ let cfg_dir = temp_dir.path().join("cfg");
53
+ std::fs::create_dir_all(&cfg_dir).expect("cfg dir");
54
+ let config_path = cfg_dir.join("config.yml");
55
+ std::fs::write(
56
+ &config_path,
57
+ "version: \"0.1\"\nentities:\n - name: orders\n source:\n format: csv\n path: ./in/orders\n sink:\n write_mode: overwrite\n accepted:\n format: parquet\n path: ./out/orders\n policy:\n severity: warn\n schema:\n columns:\n - name: id\n type: string\n",
58
+ )
59
+ .expect("write config");
60
+
61
+ // <cfg_dir>/../cfg/config.yml — canonicalize() would resolve this to
62
+ // <cfg_dir>/config.yml, dropping the "/../".
63
+ let bouncy = format!("{}/../cfg/config.yml", cfg_dir.display());
64
+ let loc = resolve_config_location(&bouncy).expect("resolve config location");
65
+ let config = load_config(&loc.path).expect("load config");
66
+ let payload = build_common_manifest_json(&loc, &config, &[], None, &ManifestOptions::default())
67
+ .expect("manifest");
68
+ let value: Value = serde_json::from_str(&payload).expect("valid json");
69
+
70
+ let uri = value["config_uri"].as_str().expect("config_uri string");
71
+ assert!(
72
+ uri.contains("/../cfg/config.yml"),
73
+ "config_uri was canonicalized (lost the as-typed form): {uri}"
74
+ );
75
+ assert!(value["manifest_id"].as_str().unwrap().starts_with("mfv1-"));
76
+ }
77
+
49
78
  #[test]
50
79
  fn manifest_id_is_stable_for_same_config() {
51
80
  let config_path = repo_root().join("example/config.yml");
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "floe-python"
3
- version = "0.6.4"
3
+ version = "0.6.6"
4
4
  edition = "2021"
5
5
  description = "Python bindings for floe-core (PyO3-based)"
6
6
  license = "Apache-2.0"
@@ -14,7 +14,7 @@ name = "_floe"
14
14
  crate-type = ["cdylib"]
15
15
 
16
16
  [dependencies]
17
- floe-core = { path = "../floe-core", version = "0.6.4", default-features = false }
17
+ floe-core = { path = "../floe-core", version = "0.6.6", default-features = false }
18
18
  pyo3 = { version = "0.29", features = ["extension-module", "abi3-py310"] }
19
19
  serde_json = "1"
20
20
 
@@ -22,7 +22,7 @@ build-backend = "maturin"
22
22
 
23
23
  [project]
24
24
  name = "floe-duckdb"
25
- version = "0.6.4"
25
+ version = "0.6.6"
26
26
  description = "DuckDB companion extension for floe — adds the native DuckDB sink to the floe Python package"
27
27
  readme = "README.md"
28
28
  requires-python = ">=3.10"
@@ -46,7 +46,7 @@ classifiers = [
46
46
  # only contributes the compiled DuckDB extension module into that package. Pin to
47
47
  # the exact lean version so the companion's `_floe_duckdb` ABI always matches the
48
48
  # `floe` package it plugs into.
49
- dependencies = ["floe-python==0.6.4"]
49
+ dependencies = ["floe-python==0.6.6"]
50
50
 
51
51
  [project.urls]
52
52
  Homepage = "https://github.com/malon64/floe"
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "floe-python"
7
- version = "0.6.4"
7
+ version = "0.6.6"
8
8
  description = "Python bindings for floe-core — run floe pipelines at Rust speed from Python and notebooks"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
File without changes
File without changes