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