floe-python 0.6.9__tar.gz → 0.6.10__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.6.9 → floe_python-0.6.10}/Cargo.lock +3 -3
- {floe_python-0.6.9 → floe_python-0.6.10}/PKG-INFO +1 -1
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/Cargo.toml +1 -1
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/lineage/mod.rs +83 -2
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/lineage.rs +65 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/Cargo.toml +2 -2
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/pyproject.duckdb.toml +2 -2
- {floe_python-0.6.9 → floe_python-0.6.10}/pyproject.toml +1 -1
- {floe_python-0.6.9 → floe_python-0.6.10}/Cargo.toml +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/README.md +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/README.md +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/add_entity.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/checks/cast.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/checks/mismatch.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/checks/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/checks/normalize.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/checks/not_null.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/checks/unique.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/config/catalog.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/config/location.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/config/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/config/parse.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/config/storage.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/config/template.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/config/types.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/config/validate.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/config/yaml_decode.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/errors.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/format.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/avro.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/csv.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/fixed_width.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/json.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/json_selector.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/orc.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/parquet.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/xlsx.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/xml.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/read/xml_selector.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/core/extensions.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/core/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/core/paths.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/core/placement.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/core/planner.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/core/uri.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/core/validation.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/object_store.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/ops/archive.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/ops/inputs.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/ops/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/ops/output.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/providers/adls.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/providers/gcs.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/providers/local.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/providers/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/providers/s3.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/storage/target.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/unique_seed/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/accepted.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/arrow_convert.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/csv.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/delta/commit_metrics.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/delta/options.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/delta/record_batch.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/delta/unity.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/delta/unity_tests.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/delta.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/duckdb/conn.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/duckdb/merge.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/duckdb.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/iceberg/context.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/iceberg/data_files.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/iceberg/glue.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/iceberg/metadata.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/iceberg/rest.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/iceberg/schema.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/iceberg.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/metrics.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/parquet.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/parts.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/sink_format.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/append.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/keys.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/scd1.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/scd2.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/shared.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/overwrite.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/lib.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/log.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/manifest/builder.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/manifest/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/manifest/model.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/manifest/reconstruct.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/manifest/runtime.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/profile/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/profile/parse.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/profile/types.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/profile/validate.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/report/build.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/report/entity.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/report/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/report/output.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/context.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/entity/accepted_buffer.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/entity/accepted_write.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/entity/incremental.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/entity/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/entity/pii.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/entity/precheck.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/entity/process.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/entity/resolve.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/entity/validate_split.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/events.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/file.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/output.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/run/perf.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/runner/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/runner/outcome.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/runtime.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/secret.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/state/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/vars/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/vars/resolve.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/warnings.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/archive_run.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/composite_unique.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/delta_run.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/dry_run.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/duckdb_run.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/fixed_width.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/iceberg_gcs_run.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/iceberg_glue_run.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/iceberg_run.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/iceberg_s3_run.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/json_selectors.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/local_run.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/path_normalization.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/run_entities_filter.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/common.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/add_entity.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/adls_storage.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/adls_validation.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/catalogs.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/config_validation.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/duckdb_validation.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/gcs_storage.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/gcs_validation.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/lineage_validation.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/local_storage.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/location.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/parse.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/pii_validation.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/remote_base.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/storage_resolver_uri.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/config/templating.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/format.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/avro_input.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/csv_nulls.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/json_array.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/json_ndjson.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/json_selector.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/orc_input.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/parquet_input.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/tsv.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/xlsx_input.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/xml.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/read/xml_selector.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/adls.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/adls_integration.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/gcs.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/inputs.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/local.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/paths.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/planner.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/s3.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/storage/target.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/write/delta_merge.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/write/delta_write.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/write/iceberg_write.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/write/metrics.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/write/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/write/object_store.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/write/parquet_write.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/write/parts.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/io/write/rejected_csv.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/manifest/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/manifest/runtime.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/profile/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/profile/parse.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/profile/validate.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/report/accepted_output.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/report/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/report/storage.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/check_order.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/checks.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/entity/accepted_output.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/entity/incremental.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/entity/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/normalize.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/pii.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/replay_base.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/report.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/run/schema_mismatch.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/runner/adapter.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/runner/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/state/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/vars/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit/vars/resolve.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/unit.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/.gitignore +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/README.md +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/src/functions.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/src/lib.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/src/observer.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/src/types/config.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/src/types/errors.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/src/types/mod.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/src/types/outcome.rs +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/tests/fixtures/config.yml +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/tests/fixtures/in/customer/customers_valid.csv +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/tests/fixtures/invalid_config.yml +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/tests/fixtures/profile.yml +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-python/tests/test_floe.py +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/python/floe/__init__.py +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/python/floe/_floe.pyi +0 -0
- {floe_python-0.6.9 → floe_python-0.6.10}/python/floe/py.typed +0 -0
|
@@ -3340,7 +3340,7 @@ dependencies = [
|
|
|
3340
3340
|
|
|
3341
3341
|
[[package]]
|
|
3342
3342
|
name = "floe-cli"
|
|
3343
|
-
version = "0.6.
|
|
3343
|
+
version = "0.6.10"
|
|
3344
3344
|
dependencies = [
|
|
3345
3345
|
"assert_cmd",
|
|
3346
3346
|
"clap",
|
|
@@ -3353,7 +3353,7 @@ dependencies = [
|
|
|
3353
3353
|
|
|
3354
3354
|
[[package]]
|
|
3355
3355
|
name = "floe-core"
|
|
3356
|
-
version = "0.6.
|
|
3356
|
+
version = "0.6.10"
|
|
3357
3357
|
dependencies = [
|
|
3358
3358
|
"apache-avro",
|
|
3359
3359
|
"arrow",
|
|
@@ -3399,7 +3399,7 @@ dependencies = [
|
|
|
3399
3399
|
|
|
3400
3400
|
[[package]]
|
|
3401
3401
|
name = "floe-python"
|
|
3402
|
-
version = "0.6.
|
|
3402
|
+
version = "0.6.10"
|
|
3403
3403
|
dependencies = [
|
|
3404
3404
|
"floe-core",
|
|
3405
3405
|
"pyo3",
|
|
@@ -8,12 +8,15 @@ use uuid::Uuid;
|
|
|
8
8
|
|
|
9
9
|
use crate::config::{EntityConfig, LineageConfig};
|
|
10
10
|
use crate::run::events::{RunEvent, RunObserver};
|
|
11
|
+
use crate::secret::Secret;
|
|
11
12
|
|
|
12
13
|
const DEFAULT_PRODUCER: &str = concat!(
|
|
13
14
|
"https://github.com/malon64/floe/releases/tag/v",
|
|
14
15
|
env!("CARGO_PKG_VERSION")
|
|
15
16
|
);
|
|
16
17
|
|
|
18
|
+
const OPENLINEAGE_API_KEY_ENV: &str = "OPENLINEAGE_API_KEY";
|
|
19
|
+
|
|
17
20
|
#[derive(Clone)]
|
|
18
21
|
struct ColumnMapping {
|
|
19
22
|
output_name: String,
|
|
@@ -44,9 +47,36 @@ fn resolve_lineage_url(base: &str, endpoint: Option<&str>) -> String {
|
|
|
44
47
|
)
|
|
45
48
|
}
|
|
46
49
|
|
|
50
|
+
fn is_unresolved_placeholder(value: &str) -> bool {
|
|
51
|
+
let value = value.trim();
|
|
52
|
+
value.starts_with("{{") && value.ends_with("}}")
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/// Effective Bearer token for lineage POSTs.
|
|
56
|
+
///
|
|
57
|
+
/// An explicit `lineage.api_key` wins for backward compatibility. Otherwise Floe falls back
|
|
58
|
+
/// to the ambient `OPENLINEAGE_API_KEY`, mirroring the OpenLineage Python client so a replayed
|
|
59
|
+
/// manifest authenticates from a runner-mounted Secret without the credential ever being
|
|
60
|
+
/// persisted in the manifest. An unexpanded `{{...}}` placeholder is treated as absent:
|
|
61
|
+
/// profile-supplied lineage is merged after config templating (see `apply_profile_lineage`),
|
|
62
|
+
/// so the raw placeholder would otherwise be sent verbatim as the token.
|
|
63
|
+
fn resolve_api_key(configured: Option<&str>, ambient: Option<String>) -> Option<Secret> {
|
|
64
|
+
let explicit = configured
|
|
65
|
+
.map(str::trim)
|
|
66
|
+
.filter(|key| !key.is_empty() && !is_unresolved_placeholder(key));
|
|
67
|
+
match explicit {
|
|
68
|
+
Some(key) => Some(Secret::from(key)),
|
|
69
|
+
None => ambient
|
|
70
|
+
.map(|value| value.trim().to_string())
|
|
71
|
+
.filter(|value| !value.is_empty())
|
|
72
|
+
.map(Secret::from),
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
47
76
|
pub struct OpenLineageObserver {
|
|
48
77
|
client: reqwest::blocking::Client,
|
|
49
78
|
config: LineageConfig,
|
|
79
|
+
api_key: Option<Secret>,
|
|
50
80
|
entity_start_ms: Mutex<HashMap<String, u128>>,
|
|
51
81
|
entity_run_ids: Mutex<HashMap<String, String>>,
|
|
52
82
|
run_start_ms: Mutex<Option<u128>>,
|
|
@@ -155,9 +185,15 @@ impl OpenLineageObserver {
|
|
|
155
185
|
})
|
|
156
186
|
.collect();
|
|
157
187
|
|
|
188
|
+
let api_key = resolve_api_key(
|
|
189
|
+
config.api_key.as_deref(),
|
|
190
|
+
std::env::var(OPENLINEAGE_API_KEY_ENV).ok(),
|
|
191
|
+
);
|
|
192
|
+
|
|
158
193
|
Ok(Self {
|
|
159
194
|
client,
|
|
160
195
|
config: config.clone(),
|
|
196
|
+
api_key,
|
|
161
197
|
entity_start_ms: Mutex::new(HashMap::new()),
|
|
162
198
|
entity_run_ids: Mutex::new(HashMap::new()),
|
|
163
199
|
run_start_ms: Mutex::new(None),
|
|
@@ -172,8 +208,8 @@ impl OpenLineageObserver {
|
|
|
172
208
|
|
|
173
209
|
fn attempt_post(&self, url: &str, body: &Value) -> Result<(), bool> {
|
|
174
210
|
let mut req = self.client.post(url).json(body);
|
|
175
|
-
if let Some(api_key) = self.
|
|
176
|
-
req = req.bearer_auth(api_key);
|
|
211
|
+
if let Some(api_key) = self.api_key.as_ref() {
|
|
212
|
+
req = req.bearer_auth(api_key.expose());
|
|
177
213
|
}
|
|
178
214
|
match req.send() {
|
|
179
215
|
Err(_) => Err(true),
|
|
@@ -608,3 +644,48 @@ impl OpenLineageObserver {
|
|
|
608
644
|
self.consecutive_failures.load(Ordering::Relaxed)
|
|
609
645
|
}
|
|
610
646
|
}
|
|
647
|
+
|
|
648
|
+
#[cfg(test)]
|
|
649
|
+
mod tests {
|
|
650
|
+
use super::*;
|
|
651
|
+
|
|
652
|
+
fn expose(key: Option<Secret>) -> Option<String> {
|
|
653
|
+
key.map(|s| s.expose().to_string())
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
#[test]
|
|
657
|
+
fn explicit_config_key_wins_over_env() {
|
|
658
|
+
let key = resolve_api_key(Some("cfg-token"), Some("env-token".to_string()));
|
|
659
|
+
assert_eq!(expose(key), Some("cfg-token".to_string()));
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
#[test]
|
|
663
|
+
fn falls_back_to_env_when_config_absent() {
|
|
664
|
+
let key = resolve_api_key(None, Some("env-token".to_string()));
|
|
665
|
+
assert_eq!(expose(key), Some("env-token".to_string()));
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
#[test]
|
|
669
|
+
fn unresolved_placeholder_falls_back_to_env() {
|
|
670
|
+
let key = resolve_api_key(
|
|
671
|
+
Some("{{OPENLINEAGE_API_KEY}}"),
|
|
672
|
+
Some("env-token".to_string()),
|
|
673
|
+
);
|
|
674
|
+
assert_eq!(expose(key), Some("env-token".to_string()));
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
#[test]
|
|
678
|
+
fn unresolved_placeholder_without_env_is_none() {
|
|
679
|
+
assert!(resolve_api_key(Some("{{OPENLINEAGE_API_KEY}}"), None).is_none());
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
#[test]
|
|
683
|
+
fn none_when_neither_source_present() {
|
|
684
|
+
assert!(resolve_api_key(None, None).is_none());
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
#[test]
|
|
688
|
+
fn blank_values_are_ignored() {
|
|
689
|
+
assert!(resolve_api_key(Some(" "), Some(" ".to_string())).is_none());
|
|
690
|
+
}
|
|
691
|
+
}
|
|
@@ -1092,3 +1092,68 @@ fn iceberg_accepted_dataset_namespace_defaults_to_job_namespace() {
|
|
|
1092
1092
|
_start_mock.assert();
|
|
1093
1093
|
_complete_mock.assert();
|
|
1094
1094
|
}
|
|
1095
|
+
|
|
1096
|
+
// Sole owner of the process-wide OPENLINEAGE_API_KEY variable. The crate has no
|
|
1097
|
+
// serial-test harness, so all three auth paths are asserted inside one test that
|
|
1098
|
+
// controls the variable's lifecycle; no other test reads it, and every other lineage
|
|
1099
|
+
// test either sets an explicit api_key (which wins over the env regardless) or does not
|
|
1100
|
+
// match on request headers, so this cannot race them.
|
|
1101
|
+
#[test]
|
|
1102
|
+
fn api_key_resolution_over_the_wire() {
|
|
1103
|
+
std::env::remove_var("OPENLINEAGE_API_KEY");
|
|
1104
|
+
|
|
1105
|
+
// No config api_key and no env var => request carries no Authorization header.
|
|
1106
|
+
{
|
|
1107
|
+
let mut server = mockito::Server::new();
|
|
1108
|
+
let mock = server
|
|
1109
|
+
.mock("POST", "/api/v1/lineage")
|
|
1110
|
+
.match_header("authorization", mockito::Matcher::Missing)
|
|
1111
|
+
.with_status(200)
|
|
1112
|
+
.expect(1)
|
|
1113
|
+
.create();
|
|
1114
|
+
let config = make_config(&server.url(), None);
|
|
1115
|
+
let obs = OpenLineageObserver::new(&config, &[], "config.yml").unwrap();
|
|
1116
|
+
obs.on_event(run_started_event());
|
|
1117
|
+
mock.assert();
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
// Manifest replay with api_key omitted + env var set => Bearer token from the env.
|
|
1121
|
+
{
|
|
1122
|
+
let mut server = mockito::Server::new();
|
|
1123
|
+
let mock = server
|
|
1124
|
+
.mock("POST", "/api/v1/lineage")
|
|
1125
|
+
.match_header("authorization", "Bearer env-replay-token")
|
|
1126
|
+
.with_status(200)
|
|
1127
|
+
.expect(1)
|
|
1128
|
+
.create();
|
|
1129
|
+
let manifest = format!(
|
|
1130
|
+
r#"{{"spec_version":"0.3","report_base_uri":"file:///tmp","entities":[],"lineage":{{"url":"{}","namespace":"test-ns"}}}}"#,
|
|
1131
|
+
server.url()
|
|
1132
|
+
);
|
|
1133
|
+
std::env::set_var("OPENLINEAGE_API_KEY", "env-replay-token");
|
|
1134
|
+
let (config, _) =
|
|
1135
|
+
floe_core::config_from_manifest_json(&manifest).expect("reconstruct manifest config");
|
|
1136
|
+
let lineage = config.lineage.expect("manifest lineage block");
|
|
1137
|
+
let obs = OpenLineageObserver::new(&lineage, &[], "").unwrap();
|
|
1138
|
+
obs.on_event(run_started_event());
|
|
1139
|
+
mock.assert();
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
// Explicit config api_key wins even when the env var is present (backward compatible).
|
|
1143
|
+
{
|
|
1144
|
+
let mut server = mockito::Server::new();
|
|
1145
|
+
let mock = server
|
|
1146
|
+
.mock("POST", "/api/v1/lineage")
|
|
1147
|
+
.match_header("authorization", "Bearer cfg-token")
|
|
1148
|
+
.with_status(200)
|
|
1149
|
+
.expect(1)
|
|
1150
|
+
.create();
|
|
1151
|
+
let mut config = make_config(&server.url(), None);
|
|
1152
|
+
config.api_key = Some("cfg-token".to_string());
|
|
1153
|
+
let obs = OpenLineageObserver::new(&config, &[], "config.yml").unwrap();
|
|
1154
|
+
obs.on_event(run_started_event());
|
|
1155
|
+
mock.assert();
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
std::env::remove_var("OPENLINEAGE_API_KEY");
|
|
1159
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "floe-python"
|
|
3
|
-
version = "0.6.
|
|
3
|
+
version = "0.6.10"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
description = "Python bindings for floe-core (PyO3-based)"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -14,7 +14,7 @@ name = "_floe"
|
|
|
14
14
|
crate-type = ["cdylib"]
|
|
15
15
|
|
|
16
16
|
[dependencies]
|
|
17
|
-
floe-core = { path = "../floe-core", version = "0.6.
|
|
17
|
+
floe-core = { path = "../floe-core", version = "0.6.10", default-features = false }
|
|
18
18
|
pyo3 = { version = "0.29", features = ["extension-module", "abi3-py310"] }
|
|
19
19
|
serde_json = "1"
|
|
20
20
|
|
|
@@ -22,7 +22,7 @@ build-backend = "maturin"
|
|
|
22
22
|
|
|
23
23
|
[project]
|
|
24
24
|
name = "floe-duckdb"
|
|
25
|
-
version = "0.6.
|
|
25
|
+
version = "0.6.10"
|
|
26
26
|
description = "DuckDB companion extension for floe — adds the native DuckDB sink to the floe Python package"
|
|
27
27
|
readme = "README.md"
|
|
28
28
|
requires-python = ">=3.10"
|
|
@@ -46,7 +46,7 @@ classifiers = [
|
|
|
46
46
|
# only contributes the compiled DuckDB extension module into that package. Pin to
|
|
47
47
|
# the exact lean version so the companion's `_floe_duckdb` ABI always matches the
|
|
48
48
|
# `floe` package it plugs into.
|
|
49
|
-
dependencies = ["floe-python==0.6.
|
|
49
|
+
dependencies = ["floe-python==0.6.10"]
|
|
50
50
|
|
|
51
51
|
[project.urls]
|
|
52
52
|
Homepage = "https://github.com/malon64/floe"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/delta/commit_metrics.rs
RENAMED
|
File without changes
|
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/delta/record_batch.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/iceberg/data_files.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/keys.rs
RENAMED
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/mod.rs
RENAMED
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/scd1.rs
RENAMED
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/scd2.rs
RENAMED
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/merge/shared.rs
RENAMED
|
File without changes
|
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/src/io/write/strategy/overwrite.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{floe_python-0.6.9 → floe_python-0.6.10}/crates/floe-core/tests/integration/composite_unique.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|