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