floe-python 0.4.4__tar.gz → 0.4.5__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.
- {floe_python-0.4.4 → floe_python-0.4.5}/Cargo.lock +3 -3
- {floe_python-0.4.4 → floe_python-0.4.5}/PKG-INFO +1 -1
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/Cargo.toml +1 -1
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/config/location.rs +41 -1
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/config/mod.rs +3 -1
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/config/parse.rs +4 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/config/storage.rs +47 -2
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/config/types.rs +2 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/mod.rs +6 -1
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/object_store.rs +9 -2
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/providers/s3.rs +18 -6
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/iceberg/context.rs +2 -1
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/lib.rs +6 -2
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/manifest/builder.rs +189 -37
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/manifest/mod.rs +1 -1
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/manifest/model.rs +18 -9
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/context.rs +84 -5
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/events.rs +5 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/mod.rs +21 -8
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/iceberg_glue_run.rs +1 -1
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/iceberg_s3_run.rs +1 -1
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/adls_storage.rs +4 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/adls_validation.rs +4 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/catalogs.rs +8 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/local_storage.rs +2 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/mod.rs +1 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/remote_base.rs +8 -0
- floe_python-0.4.5/crates/floe-core/tests/unit/config/storage_resolver_uri.rs +136 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/adls_integration.rs +2 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/write/object_store.rs +10 -0
- floe_python-0.4.5/crates/floe-core/tests/unit/manifest/mod.rs +631 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/report/storage.rs +8 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/Cargo.toml +2 -2
- {floe_python-0.4.4 → floe_python-0.4.5}/pyproject.toml +1 -1
- floe_python-0.4.4/crates/floe-core/tests/unit/manifest/mod.rs +0 -306
- {floe_python-0.4.4 → floe_python-0.4.5}/Cargo.toml +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/README.md +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/README.md +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/add_entity.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/checks/cast.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/checks/mismatch.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/checks/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/checks/normalize.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/checks/not_null.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/checks/unique.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/config/catalog.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/config/template.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/config/validate.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/config/yaml_decode.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/errors.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/format.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/avro.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/csv.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/fixed_width.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/json.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/json_selector.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/orc.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/parquet.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/xlsx.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/xml.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/read/xml_selector.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/core/extensions.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/core/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/core/paths.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/core/placement.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/core/planner.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/core/uri.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/core/validation.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/ops/archive.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/ops/inputs.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/ops/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/ops/output.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/providers/adls.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/providers/gcs.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/providers/local.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/providers/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/storage/target.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/unique_seed/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/accepted.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/arrow_convert.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/csv.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/delta/commit_metrics.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/delta/options.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/delta/record_batch.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/delta/unity.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/delta/unity_tests.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/delta.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/iceberg/data_files.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/iceberg/glue.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/iceberg/metadata.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/iceberg/rest.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/iceberg/schema.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/iceberg.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/metrics.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/parquet.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/parts.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/sink_format.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/strategy/append.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/strategy/merge/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/strategy/merge/scd1.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/strategy/merge/scd2.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/strategy/merge/shared.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/strategy/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/io/write/strategy/overwrite.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/lineage/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/log.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/manifest/reconstruct.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/profile/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/profile/parse.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/profile/types.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/profile/validate.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/report/build.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/report/entity.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/report/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/report/output.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/entity/accepted_write.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/entity/incremental.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/entity/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/entity/pii.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/entity/precheck.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/entity/process.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/entity/resolve.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/entity/validate_split.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/file.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/output.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/run/perf.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/runner/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/runner/outcome.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/runtime.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/state/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/vars/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/vars/resolve.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/src/warnings.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/archive_run.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/composite_unique.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/delta_run.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/dry_run.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/fixed_width.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/iceberg_gcs_run.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/iceberg_run.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/json_selectors.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/local_run.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/path_normalization.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration/run_entities_filter.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/integration.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/common.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/add_entity.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/config_validation.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/gcs_storage.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/gcs_validation.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/lineage_validation.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/parse.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/pii_validation.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/config/templating.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/format.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/avro_input.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/csv_nulls.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/json_array.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/json_ndjson.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/json_selector.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/orc_input.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/parquet_input.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/tsv.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/xlsx_input.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/xml.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/read/xml_selector.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/adls.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/gcs.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/inputs.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/local.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/paths.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/planner.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/s3.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/storage/target.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/write/delta_merge.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/write/delta_write.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/write/iceberg_write.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/write/metrics.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/write/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/write/parquet_write.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/write/parts.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/io/write/rejected_csv.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/profile/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/profile/parse.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/profile/validate.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/report/accepted_output.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/report/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/check_order.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/checks.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/entity/accepted_output.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/entity/incremental.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/entity/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/lineage.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/normalize.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/pii.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/report.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/run/schema_mismatch.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/runner/adapter.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/runner/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/state/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/vars/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit/vars/resolve.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-core/tests/unit.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/.gitignore +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/README.md +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/src/functions.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/src/lib.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/src/observer.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/src/types/config.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/src/types/errors.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/src/types/mod.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/src/types/outcome.rs +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/tests/fixtures/config.yml +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/tests/fixtures/in/customer/customers_valid.csv +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/tests/fixtures/invalid_config.yml +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/tests/fixtures/profile.yml +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/crates/floe-python/tests/test_floe.py +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/python/floe/__init__.py +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/python/floe/_floe.pyi +0 -0
- {floe_python-0.4.4 → floe_python-0.4.5}/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.
|
|
3402
|
+
version = "0.4.5"
|
|
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.
|
|
3415
|
+
version = "0.4.5"
|
|
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.
|
|
3458
|
+
version = "0.4.5"
|
|
3459
3459
|
dependencies = [
|
|
3460
3460
|
"floe-core",
|
|
3461
3461
|
"pyo3",
|
|
@@ -45,7 +45,7 @@ pub fn resolve_config_location(input: &str) -> FloeResult<ConfigLocation> {
|
|
|
45
45
|
fn download_remote_config(uri: &str, temp_dir: &Path) -> FloeResult<PathBuf> {
|
|
46
46
|
if uri.starts_with("s3://") {
|
|
47
47
|
let location = storage::s3::parse_s3_uri(uri)?;
|
|
48
|
-
let client = storage::s3::S3Client::new(location.bucket, None)?;
|
|
48
|
+
let client = storage::s3::S3Client::new(location.bucket, None, None, None)?;
|
|
49
49
|
return client.download_to_temp(uri, temp_dir);
|
|
50
50
|
}
|
|
51
51
|
if uri.starts_with("gs://") {
|
|
@@ -63,6 +63,8 @@ fn download_remote_config(uri: &str, temp_dir: &Path) -> FloeResult<PathBuf> {
|
|
|
63
63
|
account: Some(location.account),
|
|
64
64
|
container: Some(location.container),
|
|
65
65
|
prefix: None,
|
|
66
|
+
endpoint: None,
|
|
67
|
+
path_style_access: None,
|
|
66
68
|
};
|
|
67
69
|
let client = storage::adls::AdlsClient::new(&definition)?;
|
|
68
70
|
return client.download_to_temp(uri, temp_dir);
|
|
@@ -70,6 +72,44 @@ fn download_remote_config(uri: &str, temp_dir: &Path) -> FloeResult<PathBuf> {
|
|
|
70
72
|
Err(format!("unsupported config uri: {}", uri).into())
|
|
71
73
|
}
|
|
72
74
|
|
|
75
|
+
/// Write `bytes` to a remote URI by staging them in a temp file then uploading.
|
|
76
|
+
pub fn write_bytes_to_remote_uri(bytes: &[u8], uri: &str) -> FloeResult<()> {
|
|
77
|
+
let temp_dir = TempDir::new()?;
|
|
78
|
+
let local_path = temp_dir.path().join("upload");
|
|
79
|
+
std::fs::write(&local_path, bytes)?;
|
|
80
|
+
upload_to_remote_uri(&local_path, uri)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
pub fn upload_to_remote_uri(local_path: &Path, uri: &str) -> FloeResult<()> {
|
|
84
|
+
if uri.starts_with("s3://") {
|
|
85
|
+
let location = storage::s3::parse_s3_uri(uri)?;
|
|
86
|
+
let client = storage::s3::S3Client::new(location.bucket, None, None, None)?;
|
|
87
|
+
return client.upload_from_path(local_path, uri);
|
|
88
|
+
}
|
|
89
|
+
if uri.starts_with("gs://") {
|
|
90
|
+
let location = storage::gcs::parse_gcs_uri(uri)?;
|
|
91
|
+
let client = storage::gcs::GcsClient::new(location.bucket)?;
|
|
92
|
+
return client.upload_from_path(local_path, uri);
|
|
93
|
+
}
|
|
94
|
+
if uri.starts_with("abfs://") {
|
|
95
|
+
let location = storage::adls::parse_adls_uri(uri)?;
|
|
96
|
+
let definition = StorageDefinition {
|
|
97
|
+
name: "manifest".to_string(),
|
|
98
|
+
fs_type: "adls".to_string(),
|
|
99
|
+
bucket: None,
|
|
100
|
+
region: None,
|
|
101
|
+
account: Some(location.account),
|
|
102
|
+
container: Some(location.container),
|
|
103
|
+
prefix: None,
|
|
104
|
+
endpoint: None,
|
|
105
|
+
path_style_access: None,
|
|
106
|
+
};
|
|
107
|
+
let client = storage::adls::AdlsClient::new(&definition)?;
|
|
108
|
+
return client.upload_from_path(local_path, uri);
|
|
109
|
+
}
|
|
110
|
+
Err(format!("unsupported manifest output uri: {uri}").into())
|
|
111
|
+
}
|
|
112
|
+
|
|
73
113
|
pub(crate) fn is_remote_uri(value: &str) -> bool {
|
|
74
114
|
value.starts_with("s3://") || value.starts_with("gs://") || value.starts_with("abfs://")
|
|
75
115
|
}
|
|
@@ -9,7 +9,9 @@ pub(crate) mod yaml_decode;
|
|
|
9
9
|
|
|
10
10
|
pub use catalog::{CatalogResolver, ResolvedDeltaCatalogTarget, ResolvedIcebergCatalogTarget};
|
|
11
11
|
pub(crate) use location::is_remote_uri;
|
|
12
|
-
pub use location::{
|
|
12
|
+
pub use location::{
|
|
13
|
+
resolve_config_location, upload_to_remote_uri, write_bytes_to_remote_uri, ConfigLocation,
|
|
14
|
+
};
|
|
13
15
|
pub use storage::{resolve_local_path, ConfigBase, ResolvedPath, StorageResolver};
|
|
14
16
|
pub use types::*;
|
|
15
17
|
|
|
@@ -695,6 +695,8 @@ fn parse_storage_definition(value: &Yaml) -> FloeResult<StorageDefinition> {
|
|
|
695
695
|
"account",
|
|
696
696
|
"container",
|
|
697
697
|
"prefix",
|
|
698
|
+
"endpoint",
|
|
699
|
+
"path_style_access",
|
|
698
700
|
],
|
|
699
701
|
)?;
|
|
700
702
|
Ok(StorageDefinition {
|
|
@@ -705,6 +707,8 @@ fn parse_storage_definition(value: &Yaml) -> FloeResult<StorageDefinition> {
|
|
|
705
707
|
account: opt_string(hash, "account", "storages.definitions")?,
|
|
706
708
|
container: opt_string(hash, "container", "storages.definitions")?,
|
|
707
709
|
prefix: opt_string(hash, "prefix", "storages.definitions")?,
|
|
710
|
+
endpoint: opt_string(hash, "endpoint", "storages.definitions")?,
|
|
711
|
+
path_style_access: opt_bool(hash, "path_style_access", "storages.definitions")?,
|
|
708
712
|
})
|
|
709
713
|
}
|
|
710
714
|
|
|
@@ -215,7 +215,7 @@ impl StorageResolver {
|
|
|
215
215
|
raw_path: &str,
|
|
216
216
|
) -> FloeResult<ResolvedPath> {
|
|
217
217
|
let name = storage_name.unwrap_or(self.default_name.as_str());
|
|
218
|
-
if !self.has_config && name != "local" {
|
|
218
|
+
if !self.has_config && name != "local" && !self.definitions.contains_key(name) {
|
|
219
219
|
return Err(Box::new(ConfigError(format!(
|
|
220
220
|
"entity.name={} {field} references unknown storage {} (no storages block)",
|
|
221
221
|
entity_name, name
|
|
@@ -238,6 +238,8 @@ impl StorageResolver {
|
|
|
238
238
|
account: None,
|
|
239
239
|
container: None,
|
|
240
240
|
prefix: None,
|
|
241
|
+
endpoint: None,
|
|
242
|
+
path_style_access: None,
|
|
241
243
|
}
|
|
242
244
|
};
|
|
243
245
|
|
|
@@ -304,7 +306,7 @@ impl StorageResolver {
|
|
|
304
306
|
raw_path: &str,
|
|
305
307
|
) -> FloeResult<ResolvedPath> {
|
|
306
308
|
let name = storage_name.unwrap_or(self.default_name.as_str());
|
|
307
|
-
if !self.has_config && name != "local" {
|
|
309
|
+
if !self.has_config && name != "local" && !self.definitions.contains_key(name) {
|
|
308
310
|
return Err(Box::new(ConfigError(format!(
|
|
309
311
|
"report.storage references unknown storage {} (no storages block)",
|
|
310
312
|
name
|
|
@@ -327,6 +329,8 @@ impl StorageResolver {
|
|
|
327
329
|
account: None,
|
|
328
330
|
container: None,
|
|
329
331
|
prefix: None,
|
|
332
|
+
endpoint: None,
|
|
333
|
+
path_style_access: None,
|
|
330
334
|
}
|
|
331
335
|
};
|
|
332
336
|
|
|
@@ -386,9 +390,48 @@ impl StorageResolver {
|
|
|
386
390
|
}
|
|
387
391
|
}
|
|
388
392
|
|
|
393
|
+
/// Scan definitions for the first one whose scheme and bucket/account match `uri`.
|
|
394
|
+
/// Used in manifest mode to resolve a bare report URI back to a named definition.
|
|
395
|
+
pub fn find_definition_name_for_uri(&self, uri: &str) -> Option<String> {
|
|
396
|
+
for (name, def) in &self.definitions {
|
|
397
|
+
if uri.starts_with("s3://") && def.fs_type == "s3" {
|
|
398
|
+
if let Some(b) = &def.bucket {
|
|
399
|
+
if uri.starts_with(&format!("s3://{b}/")) || uri == format!("s3://{b}") {
|
|
400
|
+
return Some(name.clone());
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if uri.starts_with("gs://") && def.fs_type == "gcs" {
|
|
405
|
+
if let Some(b) = &def.bucket {
|
|
406
|
+
if uri.starts_with(&format!("gs://{b}/")) || uri == format!("gs://{b}") {
|
|
407
|
+
return Some(name.clone());
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
if uri.starts_with("abfs://") && def.fs_type == "adls" {
|
|
412
|
+
if let (Some(c), Some(a)) = (&def.container, &def.account) {
|
|
413
|
+
if uri.starts_with(&format!("abfs://{c}@{a}.dfs.core.windows.net")) {
|
|
414
|
+
return Some(name.clone());
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
None
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/// Register a synthetic `StorageDefinition` into this resolver.
|
|
423
|
+
/// Used in manifest mode when the report URI has no matching definition in the config.
|
|
424
|
+
/// Does NOT flip `has_config`; entity resolution keeps its implicit-local fallback.
|
|
425
|
+
pub fn register_definition(&mut self, definition: StorageDefinition) {
|
|
426
|
+
self.definitions.insert(definition.name.clone(), definition);
|
|
427
|
+
}
|
|
428
|
+
|
|
389
429
|
pub fn definition(&self, name: &str) -> Option<StorageDefinition> {
|
|
390
430
|
if self.has_config {
|
|
391
431
|
self.definitions.get(name).cloned()
|
|
432
|
+
} else if let Some(def) = self.definitions.get(name) {
|
|
433
|
+
// Synthetic definition registered by register_definition (e.g. report target).
|
|
434
|
+
Some(def.clone())
|
|
392
435
|
} else if name == "local" {
|
|
393
436
|
Some(StorageDefinition {
|
|
394
437
|
name: "local".to_string(),
|
|
@@ -398,6 +441,8 @@ impl StorageResolver {
|
|
|
398
441
|
account: None,
|
|
399
442
|
container: None,
|
|
400
443
|
prefix: None,
|
|
444
|
+
endpoint: None,
|
|
445
|
+
path_style_access: None,
|
|
401
446
|
})
|
|
402
447
|
} else {
|
|
403
448
|
None
|
|
@@ -366,6 +366,8 @@ pub struct StorageDefinition {
|
|
|
366
366
|
pub account: Option<String>,
|
|
367
367
|
pub container: Option<String>,
|
|
368
368
|
pub prefix: Option<String>,
|
|
369
|
+
pub endpoint: Option<String>,
|
|
370
|
+
pub path_style_access: Option<bool>,
|
|
369
371
|
}
|
|
370
372
|
|
|
371
373
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
@@ -129,7 +129,12 @@ fn build_client(definition: &config::StorageDefinition) -> FloeResult<Box<dyn St
|
|
|
129
129
|
"s3" => {
|
|
130
130
|
let bucket =
|
|
131
131
|
validation::require_field(definition, definition.bucket.as_ref(), "bucket", "s3")?;
|
|
132
|
-
Box::new(s3::S3Client::new(
|
|
132
|
+
Box::new(s3::S3Client::new(
|
|
133
|
+
bucket,
|
|
134
|
+
definition.region.as_deref(),
|
|
135
|
+
definition.endpoint.as_deref(),
|
|
136
|
+
definition.path_style_access,
|
|
137
|
+
)?)
|
|
133
138
|
}
|
|
134
139
|
"adls" => Box::new(adls::AdlsClient::new(definition)?),
|
|
135
140
|
"gcs" => {
|
|
@@ -111,9 +111,16 @@ pub fn iceberg_store_config(
|
|
|
111
111
|
Target::S3 { storage, uri, .. } => {
|
|
112
112
|
let mut file_io_props = HashMap::new();
|
|
113
113
|
if let Some(definition) = resolver.definition(storage) {
|
|
114
|
-
if let Some(region) = definition.region {
|
|
114
|
+
if let Some(region) = &definition.region {
|
|
115
115
|
file_io_props.insert(S3_REGION.to_string(), region.clone());
|
|
116
|
-
file_io_props.insert(CLIENT_REGION.to_string(), region);
|
|
116
|
+
file_io_props.insert(CLIENT_REGION.to_string(), region.clone());
|
|
117
|
+
}
|
|
118
|
+
if let Some(endpoint) = &definition.endpoint {
|
|
119
|
+
file_io_props.insert("s3.endpoint".to_string(), endpoint.clone());
|
|
120
|
+
}
|
|
121
|
+
if let Some(path_style) = definition.path_style_access {
|
|
122
|
+
file_io_props
|
|
123
|
+
.insert("s3.path-style-access".to_string(), path_style.to_string());
|
|
117
124
|
}
|
|
118
125
|
}
|
|
119
126
|
Ok(IcebergStoreConfig {
|
|
@@ -19,23 +19,35 @@ pub struct S3Client {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
impl S3Client {
|
|
22
|
-
pub fn new(
|
|
22
|
+
pub fn new(
|
|
23
|
+
bucket: String,
|
|
24
|
+
region: Option<&str>,
|
|
25
|
+
endpoint: Option<&str>,
|
|
26
|
+
path_style_access: Option<bool>,
|
|
27
|
+
) -> FloeResult<Self> {
|
|
23
28
|
let runtime = tokio::runtime::Builder::new_current_thread()
|
|
24
29
|
.enable_all()
|
|
25
30
|
.build()
|
|
26
31
|
.map_err(|err| Box::new(StorageError(format!("failed to build aws runtime: {err}"))))?;
|
|
32
|
+
let endpoint = endpoint.map(ToOwned::to_owned);
|
|
27
33
|
let config = runtime.block_on(async {
|
|
28
34
|
let region_provider = match region {
|
|
29
35
|
Some(region) => RegionProviderChain::first_try(Region::new(region.to_string()))
|
|
30
36
|
.or_default_provider(),
|
|
31
37
|
None => RegionProviderChain::default_provider(),
|
|
32
38
|
};
|
|
33
|
-
|
|
34
|
-
.region(region_provider)
|
|
35
|
-
|
|
36
|
-
.
|
|
39
|
+
let mut builder =
|
|
40
|
+
aws_config::defaults(aws_config::BehaviorVersion::latest()).region(region_provider);
|
|
41
|
+
if let Some(ep) = endpoint {
|
|
42
|
+
builder = builder.endpoint_url(ep);
|
|
43
|
+
}
|
|
44
|
+
builder.load().await
|
|
37
45
|
});
|
|
38
|
-
let
|
|
46
|
+
let mut s3_builder = aws_sdk_s3::config::Builder::from(&config);
|
|
47
|
+
if path_style_access.unwrap_or(false) {
|
|
48
|
+
s3_builder = s3_builder.force_path_style(true);
|
|
49
|
+
}
|
|
50
|
+
let client = Client::from_conf(s3_builder.build());
|
|
39
51
|
Ok(Self {
|
|
40
52
|
bucket,
|
|
41
53
|
client,
|
|
@@ -76,7 +76,8 @@ pub(super) fn build_iceberg_write_context(
|
|
|
76
76
|
latest_s3_metadata_location(client, base_key)?
|
|
77
77
|
}
|
|
78
78
|
None => {
|
|
79
|
-
let mut client =
|
|
79
|
+
let mut client =
|
|
80
|
+
io::storage::s3::S3Client::new(bucket.clone(), None, None, None)?;
|
|
80
81
|
latest_s3_metadata_location(&mut client, base_key)?
|
|
81
82
|
}
|
|
82
83
|
}
|
|
@@ -23,9 +23,13 @@ pub use crate::state::{
|
|
|
23
23
|
};
|
|
24
24
|
pub use add_entity::{add_entity_to_config, AddEntityOptions, AddEntityOutcome};
|
|
25
25
|
pub use checks as check;
|
|
26
|
-
pub use config::{
|
|
26
|
+
pub use config::{
|
|
27
|
+
resolve_config_location, upload_to_remote_uri, write_bytes_to_remote_uri, ConfigLocation,
|
|
28
|
+
};
|
|
27
29
|
pub use errors::ConfigError;
|
|
28
|
-
pub use manifest::{
|
|
30
|
+
pub use manifest::{
|
|
31
|
+
build_common_manifest_json, config_from_manifest_json, ManifestOptions, PathMode,
|
|
32
|
+
};
|
|
29
33
|
pub use profile::{
|
|
30
34
|
detect_malformed_placeholder, detect_unresolved_placeholders, parse_profile,
|
|
31
35
|
parse_profile_from_str, validate_merged_vars, validate_profile, ProfileConfig,
|