floe-python 0.6.5__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.5 → floe_python-0.6.6}/Cargo.lock +3 -3
  2. {floe_python-0.6.5 → floe_python-0.6.6}/PKG-INFO +1 -1
  3. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/Cargo.toml +1 -1
  4. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/location.rs +43 -0
  5. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/manifest/builder.rs +4 -9
  6. floe_python-0.6.6/crates/floe-core/tests/unit/config/location.rs +44 -0
  7. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/mod.rs +1 -0
  8. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/manifest/mod.rs +36 -7
  9. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/Cargo.toml +2 -2
  10. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/pyproject.duckdb.toml +2 -2
  11. {floe_python-0.6.5 → floe_python-0.6.6}/pyproject.toml +1 -1
  12. {floe_python-0.6.5 → floe_python-0.6.6}/Cargo.toml +0 -0
  13. {floe_python-0.6.5 → floe_python-0.6.6}/README.md +0 -0
  14. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/README.md +0 -0
  15. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/add_entity.rs +0 -0
  16. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/cast.rs +0 -0
  17. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/mismatch.rs +0 -0
  18. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/mod.rs +0 -0
  19. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/normalize.rs +0 -0
  20. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/not_null.rs +0 -0
  21. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/unique.rs +0 -0
  22. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/catalog.rs +0 -0
  23. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/mod.rs +0 -0
  24. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/parse.rs +0 -0
  25. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/storage.rs +0 -0
  26. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/template.rs +0 -0
  27. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/types.rs +0 -0
  28. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/validate.rs +0 -0
  29. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/yaml_decode.rs +0 -0
  30. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/errors.rs +0 -0
  31. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/format.rs +0 -0
  32. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/mod.rs +0 -0
  33. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/avro.rs +0 -0
  34. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/csv.rs +0 -0
  35. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/fixed_width.rs +0 -0
  36. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/json.rs +0 -0
  37. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/json_selector.rs +0 -0
  38. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/mod.rs +0 -0
  39. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/orc.rs +0 -0
  40. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/parquet.rs +0 -0
  41. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/xlsx.rs +0 -0
  42. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/xml.rs +0 -0
  43. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/xml_selector.rs +0 -0
  44. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/extensions.rs +0 -0
  45. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/mod.rs +0 -0
  46. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/paths.rs +0 -0
  47. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/placement.rs +0 -0
  48. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/planner.rs +0 -0
  49. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/uri.rs +0 -0
  50. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/validation.rs +0 -0
  51. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/mod.rs +0 -0
  52. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/object_store.rs +0 -0
  53. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/archive.rs +0 -0
  54. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/inputs.rs +0 -0
  55. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/mod.rs +0 -0
  56. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/output.rs +0 -0
  57. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/adls.rs +0 -0
  58. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/gcs.rs +0 -0
  59. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/local.rs +0 -0
  60. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/mod.rs +0 -0
  61. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/s3.rs +0 -0
  62. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/target.rs +0 -0
  63. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/unique_seed/mod.rs +0 -0
  64. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/accepted.rs +0 -0
  65. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/arrow_convert.rs +0 -0
  66. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/csv.rs +0 -0
  67. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/commit_metrics.rs +0 -0
  68. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/options.rs +0 -0
  69. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/record_batch.rs +0 -0
  70. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/unity.rs +0 -0
  71. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/unity_tests.rs +0 -0
  72. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta.rs +0 -0
  73. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/duckdb/conn.rs +0 -0
  74. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/duckdb/merge.rs +0 -0
  75. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/duckdb.rs +0 -0
  76. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/context.rs +0 -0
  77. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/data_files.rs +0 -0
  78. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/glue.rs +0 -0
  79. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/metadata.rs +0 -0
  80. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/rest.rs +0 -0
  81. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/schema.rs +0 -0
  82. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg.rs +0 -0
  83. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/metrics.rs +0 -0
  84. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/mod.rs +0 -0
  85. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/parquet.rs +0 -0
  86. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/parts.rs +0 -0
  87. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/sink_format.rs +0 -0
  88. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/append.rs +0 -0
  89. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/keys.rs +0 -0
  90. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/mod.rs +0 -0
  91. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/scd1.rs +0 -0
  92. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/scd2.rs +0 -0
  93. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/shared.rs +0 -0
  94. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/mod.rs +0 -0
  95. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/overwrite.rs +0 -0
  96. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/lib.rs +0 -0
  97. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/lineage/mod.rs +0 -0
  98. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/log.rs +0 -0
  99. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/manifest/mod.rs +0 -0
  100. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/manifest/model.rs +0 -0
  101. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/manifest/reconstruct.rs +0 -0
  102. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/profile/mod.rs +0 -0
  103. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/profile/parse.rs +0 -0
  104. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/profile/types.rs +0 -0
  105. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/profile/validate.rs +0 -0
  106. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/report/build.rs +0 -0
  107. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/report/entity.rs +0 -0
  108. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/report/mod.rs +0 -0
  109. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/report/output.rs +0 -0
  110. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/context.rs +0 -0
  111. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/accepted_buffer.rs +0 -0
  112. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/accepted_write.rs +0 -0
  113. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/incremental.rs +0 -0
  114. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/mod.rs +0 -0
  115. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/pii.rs +0 -0
  116. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/precheck.rs +0 -0
  117. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/process.rs +0 -0
  118. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/resolve.rs +0 -0
  119. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/validate_split.rs +0 -0
  120. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/events.rs +0 -0
  121. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/file.rs +0 -0
  122. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/mod.rs +0 -0
  123. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/output.rs +0 -0
  124. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/perf.rs +0 -0
  125. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/runner/mod.rs +0 -0
  126. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/runner/outcome.rs +0 -0
  127. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/runtime.rs +0 -0
  128. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/secret.rs +0 -0
  129. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/state/mod.rs +0 -0
  130. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/vars/mod.rs +0 -0
  131. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/vars/resolve.rs +0 -0
  132. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/warnings.rs +0 -0
  133. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/archive_run.rs +0 -0
  134. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/composite_unique.rs +0 -0
  135. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/delta_run.rs +0 -0
  136. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/dry_run.rs +0 -0
  137. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/duckdb_run.rs +0 -0
  138. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/fixed_width.rs +0 -0
  139. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_gcs_run.rs +0 -0
  140. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_glue_run.rs +0 -0
  141. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_run.rs +0 -0
  142. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_s3_run.rs +0 -0
  143. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/json_selectors.rs +0 -0
  144. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/local_run.rs +0 -0
  145. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/mod.rs +0 -0
  146. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/path_normalization.rs +0 -0
  147. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/run_entities_filter.rs +0 -0
  148. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration.rs +0 -0
  149. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/common.rs +0 -0
  150. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/add_entity.rs +0 -0
  151. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/adls_storage.rs +0 -0
  152. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/adls_validation.rs +0 -0
  153. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/catalogs.rs +0 -0
  154. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/config_validation.rs +0 -0
  155. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/duckdb_validation.rs +0 -0
  156. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/gcs_storage.rs +0 -0
  157. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/gcs_validation.rs +0 -0
  158. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/lineage_validation.rs +0 -0
  159. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/local_storage.rs +0 -0
  160. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/parse.rs +0 -0
  161. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/pii_validation.rs +0 -0
  162. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/remote_base.rs +0 -0
  163. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/storage_resolver_uri.rs +0 -0
  164. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/templating.rs +0 -0
  165. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/format.rs +0 -0
  166. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/mod.rs +0 -0
  167. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/avro_input.rs +0 -0
  168. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/csv_nulls.rs +0 -0
  169. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/json_array.rs +0 -0
  170. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/json_ndjson.rs +0 -0
  171. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/json_selector.rs +0 -0
  172. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/mod.rs +0 -0
  173. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/orc_input.rs +0 -0
  174. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/parquet_input.rs +0 -0
  175. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/tsv.rs +0 -0
  176. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/xlsx_input.rs +0 -0
  177. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/xml.rs +0 -0
  178. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/xml_selector.rs +0 -0
  179. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/adls.rs +0 -0
  180. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/adls_integration.rs +0 -0
  181. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/gcs.rs +0 -0
  182. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/inputs.rs +0 -0
  183. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/local.rs +0 -0
  184. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/mod.rs +0 -0
  185. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/paths.rs +0 -0
  186. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/planner.rs +0 -0
  187. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/s3.rs +0 -0
  188. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/target.rs +0 -0
  189. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/delta_merge.rs +0 -0
  190. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/delta_write.rs +0 -0
  191. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/iceberg_write.rs +0 -0
  192. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/metrics.rs +0 -0
  193. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/mod.rs +0 -0
  194. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/object_store.rs +0 -0
  195. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/parquet_write.rs +0 -0
  196. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/parts.rs +0 -0
  197. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/rejected_csv.rs +0 -0
  198. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/mod.rs +0 -0
  199. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/profile/mod.rs +0 -0
  200. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/profile/parse.rs +0 -0
  201. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/profile/validate.rs +0 -0
  202. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/report/accepted_output.rs +0 -0
  203. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/report/mod.rs +0 -0
  204. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/report/storage.rs +0 -0
  205. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/check_order.rs +0 -0
  206. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/checks.rs +0 -0
  207. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/entity/accepted_output.rs +0 -0
  208. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/entity/incremental.rs +0 -0
  209. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/entity/mod.rs +0 -0
  210. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/lineage.rs +0 -0
  211. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/mod.rs +0 -0
  212. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/normalize.rs +0 -0
  213. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/pii.rs +0 -0
  214. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/report.rs +0 -0
  215. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/schema_mismatch.rs +0 -0
  216. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/runner/adapter.rs +0 -0
  217. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/runner/mod.rs +0 -0
  218. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/state/mod.rs +0 -0
  219. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/vars/mod.rs +0 -0
  220. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/vars/resolve.rs +0 -0
  221. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit.rs +0 -0
  222. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/.gitignore +0 -0
  223. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/README.md +0 -0
  224. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/functions.rs +0 -0
  225. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/lib.rs +0 -0
  226. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/observer.rs +0 -0
  227. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/types/config.rs +0 -0
  228. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/types/errors.rs +0 -0
  229. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/types/mod.rs +0 -0
  230. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/types/outcome.rs +0 -0
  231. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/config.yml +0 -0
  232. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/in/customer/customers_valid.csv +0 -0
  233. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/invalid_config.yml +0 -0
  234. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/profile.yml +0 -0
  235. {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/test_floe.py +0 -0
  236. {floe_python-0.6.5 → floe_python-0.6.6}/python/floe/__init__.py +0 -0
  237. {floe_python-0.6.5 → floe_python-0.6.6}/python/floe/_floe.pyi +0 -0
  238. {floe_python-0.6.5 → 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.5"
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.5"
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.5"
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.5
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.5"
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();
@@ -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.5"
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.5", 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.5"
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.5"]
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.5"
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