floe-python 0.6.5__tar.gz → 0.6.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {floe_python-0.6.5 → floe_python-0.6.6}/Cargo.lock +3 -3
- {floe_python-0.6.5 → floe_python-0.6.6}/PKG-INFO +1 -1
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/Cargo.toml +1 -1
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/location.rs +43 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/manifest/builder.rs +4 -9
- floe_python-0.6.6/crates/floe-core/tests/unit/config/location.rs +44 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/mod.rs +1 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/manifest/mod.rs +36 -7
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/Cargo.toml +2 -2
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/pyproject.duckdb.toml +2 -2
- {floe_python-0.6.5 → floe_python-0.6.6}/pyproject.toml +1 -1
- {floe_python-0.6.5 → floe_python-0.6.6}/Cargo.toml +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/README.md +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/README.md +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/add_entity.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/cast.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/mismatch.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/normalize.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/not_null.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/checks/unique.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/catalog.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/parse.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/storage.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/template.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/types.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/validate.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/config/yaml_decode.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/errors.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/format.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/avro.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/csv.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/fixed_width.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/json.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/json_selector.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/orc.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/parquet.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/xlsx.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/xml.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/read/xml_selector.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/extensions.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/paths.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/placement.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/planner.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/uri.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/core/validation.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/object_store.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/archive.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/inputs.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/ops/output.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/adls.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/gcs.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/local.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/providers/s3.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/storage/target.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/unique_seed/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/accepted.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/arrow_convert.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/csv.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/commit_metrics.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/options.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/record_batch.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/unity.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/unity_tests.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/duckdb/conn.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/duckdb/merge.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/duckdb.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/context.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/data_files.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/glue.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/metadata.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/rest.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg/schema.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/iceberg.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/metrics.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/parquet.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/parts.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/sink_format.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/append.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/keys.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/scd1.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/scd2.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/shared.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/overwrite.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/lib.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/lineage/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/log.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/manifest/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/manifest/model.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/manifest/reconstruct.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/profile/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/profile/parse.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/profile/types.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/profile/validate.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/report/build.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/report/entity.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/report/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/report/output.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/context.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/accepted_buffer.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/accepted_write.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/incremental.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/pii.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/precheck.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/process.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/resolve.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/entity/validate_split.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/events.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/file.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/output.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/run/perf.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/runner/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/runner/outcome.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/runtime.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/secret.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/state/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/vars/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/vars/resolve.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/warnings.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/archive_run.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/composite_unique.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/delta_run.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/dry_run.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/duckdb_run.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/fixed_width.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_gcs_run.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_glue_run.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_run.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/iceberg_s3_run.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/json_selectors.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/local_run.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/path_normalization.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration/run_entities_filter.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/integration.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/common.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/add_entity.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/adls_storage.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/adls_validation.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/catalogs.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/config_validation.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/duckdb_validation.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/gcs_storage.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/gcs_validation.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/lineage_validation.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/local_storage.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/parse.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/pii_validation.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/remote_base.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/storage_resolver_uri.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/config/templating.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/format.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/avro_input.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/csv_nulls.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/json_array.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/json_ndjson.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/json_selector.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/orc_input.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/parquet_input.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/tsv.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/xlsx_input.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/xml.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/read/xml_selector.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/adls.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/adls_integration.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/gcs.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/inputs.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/local.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/paths.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/planner.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/s3.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/storage/target.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/delta_merge.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/delta_write.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/iceberg_write.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/metrics.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/object_store.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/parquet_write.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/parts.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/io/write/rejected_csv.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/profile/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/profile/parse.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/profile/validate.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/report/accepted_output.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/report/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/report/storage.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/check_order.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/checks.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/entity/accepted_output.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/entity/incremental.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/entity/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/lineage.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/normalize.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/pii.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/report.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/run/schema_mismatch.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/runner/adapter.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/runner/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/state/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/vars/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit/vars/resolve.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/tests/unit.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/.gitignore +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/README.md +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/functions.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/lib.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/observer.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/types/config.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/types/errors.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/types/mod.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/src/types/outcome.rs +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/config.yml +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/in/customer/customers_valid.csv +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/invalid_config.yml +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/fixtures/profile.yml +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-python/tests/test_floe.py +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/python/floe/__init__.py +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/python/floe/_floe.pyi +0 -0
- {floe_python-0.6.5 → floe_python-0.6.6}/python/floe/py.typed +0 -0
|
@@ -3340,7 +3340,7 @@ dependencies = [
|
|
|
3340
3340
|
|
|
3341
3341
|
[[package]]
|
|
3342
3342
|
name = "floe-cli"
|
|
3343
|
-
version = "0.6.
|
|
3343
|
+
version = "0.6.6"
|
|
3344
3344
|
dependencies = [
|
|
3345
3345
|
"assert_cmd",
|
|
3346
3346
|
"clap",
|
|
@@ -3353,7 +3353,7 @@ dependencies = [
|
|
|
3353
3353
|
|
|
3354
3354
|
[[package]]
|
|
3355
3355
|
name = "floe-core"
|
|
3356
|
-
version = "0.6.
|
|
3356
|
+
version = "0.6.6"
|
|
3357
3357
|
dependencies = [
|
|
3358
3358
|
"apache-avro",
|
|
3359
3359
|
"arrow",
|
|
@@ -3399,7 +3399,7 @@ dependencies = [
|
|
|
3399
3399
|
|
|
3400
3400
|
[[package]]
|
|
3401
3401
|
name = "floe-python"
|
|
3402
|
-
version = "0.6.
|
|
3402
|
+
version = "0.6.6"
|
|
3403
3403
|
dependencies = [
|
|
3404
3404
|
"floe-core",
|
|
3405
3405
|
"pyo3",
|
|
@@ -10,6 +10,11 @@ pub struct ConfigLocation {
|
|
|
10
10
|
pub path: PathBuf,
|
|
11
11
|
pub base: ConfigBase,
|
|
12
12
|
pub display: String,
|
|
13
|
+
/// URI recorded as `config_uri` / `profile_uri` in the manifest:
|
|
14
|
+
/// `local://<path-as-typed>` for local configs (normalized, not canonicalized,
|
|
15
|
+
/// so a relative `-c` stays relative and the manifest does not depend on where
|
|
16
|
+
/// the file physically lives), or the scheme-normalized remote URI otherwise.
|
|
17
|
+
pub uri: String,
|
|
13
18
|
_temp_dir: Option<TempDir>,
|
|
14
19
|
}
|
|
15
20
|
|
|
@@ -18,10 +23,13 @@ pub fn resolve_config_location(input: &str) -> FloeResult<ConfigLocation> {
|
|
|
18
23
|
let temp_dir = TempDir::new()?;
|
|
19
24
|
let local_path = download_remote_config(input, temp_dir.path())?;
|
|
20
25
|
let base = ConfigBase::remote_from_uri(temp_dir.path().to_path_buf(), input)?;
|
|
26
|
+
// Remote URIs are already environment-independent; keep them absolute.
|
|
27
|
+
let uri = storage::uri::normalize_remote_uri(input).into_owned();
|
|
21
28
|
Ok(ConfigLocation {
|
|
22
29
|
path: local_path,
|
|
23
30
|
base,
|
|
24
31
|
display: input.to_string(),
|
|
32
|
+
uri,
|
|
25
33
|
_temp_dir: Some(temp_dir),
|
|
26
34
|
})
|
|
27
35
|
} else {
|
|
@@ -37,11 +45,46 @@ pub fn resolve_config_location(input: &str) -> FloeResult<ConfigLocation> {
|
|
|
37
45
|
path: canonical.clone(),
|
|
38
46
|
base,
|
|
39
47
|
display: canonical.display().to_string(),
|
|
48
|
+
uri: format!("local://{}", normalize_input_path(input)),
|
|
40
49
|
_temp_dir: None,
|
|
41
50
|
})
|
|
42
51
|
}
|
|
43
52
|
}
|
|
44
53
|
|
|
54
|
+
/// Lexically normalize a local path for `config_uri` / `profile_uri` without
|
|
55
|
+
/// touching the filesystem, so a relative `-c` stays relative and the same path is
|
|
56
|
+
/// produced on any machine. Uses `/` as the separator.
|
|
57
|
+
fn normalize_input_path(input: &str) -> String {
|
|
58
|
+
use std::path::Component;
|
|
59
|
+
|
|
60
|
+
let mut parts: Vec<String> = Vec::new();
|
|
61
|
+
let mut has_prefix = false;
|
|
62
|
+
for comp in Path::new(input).components() {
|
|
63
|
+
match comp {
|
|
64
|
+
Component::CurDir => {}
|
|
65
|
+
Component::Prefix(prefix) => {
|
|
66
|
+
has_prefix = true;
|
|
67
|
+
parts.push(prefix.as_os_str().to_string_lossy().into_owned());
|
|
68
|
+
}
|
|
69
|
+
// A Windows drive/UNC prefix already carries the root; skip the trailing
|
|
70
|
+
// RootDir so we emit `C:/...`, not `C://...` (which looks like a scheme).
|
|
71
|
+
Component::RootDir => {
|
|
72
|
+
if !has_prefix {
|
|
73
|
+
parts.push(String::new());
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
other => parts.push(other.as_os_str().to_string_lossy().into_owned()),
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let joined = parts.join("/");
|
|
81
|
+
if joined.is_empty() {
|
|
82
|
+
".".to_string()
|
|
83
|
+
} else {
|
|
84
|
+
joined
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
45
88
|
fn download_remote_config(uri: &str, temp_dir: &Path) -> FloeResult<PathBuf> {
|
|
46
89
|
let normalized = storage::uri::normalize_remote_uri(uri);
|
|
47
90
|
let uri = normalized.as_ref();
|
|
@@ -378,7 +378,10 @@ fn build_common_manifest(
|
|
|
378
378
|
});
|
|
379
379
|
}
|
|
380
380
|
|
|
381
|
-
|
|
381
|
+
// Use `uri` (the path as typed / resolved remote URI), not the host-absolute
|
|
382
|
+
// `display`, so config_uri and the manifest_id derived from it do not depend on
|
|
383
|
+
// where the config file physically lives.
|
|
384
|
+
let config_uri = config_location.uri.clone();
|
|
382
385
|
let config_checksum = std::fs::read(&config_location.path)
|
|
383
386
|
.ok()
|
|
384
387
|
.map(|b| sha256_hex(&b));
|
|
@@ -536,14 +539,6 @@ fn resolved_uri_to_path(uri: &str) -> String {
|
|
|
536
539
|
}
|
|
537
540
|
}
|
|
538
541
|
|
|
539
|
-
fn canonical_config_uri(display: &str) -> String {
|
|
540
|
-
if display.contains("://") {
|
|
541
|
-
display.to_string()
|
|
542
|
-
} else {
|
|
543
|
-
format!("local://{}", display)
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
|
|
547
542
|
fn build_manifest_id(config_uri: &str, config_checksum: Option<&str>) -> String {
|
|
548
543
|
const FNV_OFFSET_BASIS: u64 = 0xcbf29ce484222325;
|
|
549
544
|
const FNV_PRIME: u64 = 0x100000001b3;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
use floe_core::resolve_config_location;
|
|
2
|
+
|
|
3
|
+
fn write_config(dir: &std::path::Path) -> std::path::PathBuf {
|
|
4
|
+
let path = dir.join("config.yml");
|
|
5
|
+
std::fs::write(&path, "version: \"0.1\"\nentities: []\n").expect("write config");
|
|
6
|
+
path
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
#[test]
|
|
10
|
+
fn local_config_uri_uses_local_scheme() {
|
|
11
|
+
let tmp = tempfile::TempDir::new().expect("temp dir");
|
|
12
|
+
let cfg = write_config(tmp.path());
|
|
13
|
+
let loc = resolve_config_location(cfg.to_str().expect("utf8")).expect("resolve");
|
|
14
|
+
assert!(loc.uri.starts_with("local://"), "uri: {}", loc.uri);
|
|
15
|
+
assert!(loc.uri.ends_with("/config.yml"), "uri: {}", loc.uri);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// The path is preserved lexically, not canonicalized: a `.` is dropped and a `..`
|
|
19
|
+
// bounce survives (canonicalize would collapse it), and separators become `/`.
|
|
20
|
+
#[test]
|
|
21
|
+
fn local_config_uri_is_lexically_normalized() {
|
|
22
|
+
let tmp = tempfile::TempDir::new().expect("temp dir");
|
|
23
|
+
let cfg_dir = tmp.path().join("cfg");
|
|
24
|
+
std::fs::create_dir_all(&cfg_dir).expect("cfg dir");
|
|
25
|
+
write_config(&cfg_dir);
|
|
26
|
+
|
|
27
|
+
let bouncy = format!("{}/./../cfg/config.yml", cfg_dir.display());
|
|
28
|
+
let loc = resolve_config_location(&bouncy).expect("resolve");
|
|
29
|
+
assert!(loc.uri.contains("/../cfg/config.yml"), "uri: {}", loc.uri);
|
|
30
|
+
assert!(!loc.uri.contains("/./"), "uri: {}", loc.uri);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// A Windows drive path must yield `local://C:/...`, not `local://C://...` (which the
|
|
34
|
+
// `local://` prefix would turn into a scheme-colliding, invalid URI). Windows-only
|
|
35
|
+
// because drive prefixes are only parsed on Windows targets.
|
|
36
|
+
#[cfg(windows)]
|
|
37
|
+
#[test]
|
|
38
|
+
fn windows_drive_config_uri_has_single_slash_after_drive() {
|
|
39
|
+
let tmp = tempfile::TempDir::new().expect("temp dir");
|
|
40
|
+
let cfg = write_config(tmp.path());
|
|
41
|
+
let loc = resolve_config_location(cfg.to_str().expect("utf8")).expect("resolve");
|
|
42
|
+
assert!(loc.uri.starts_with("local://"), "uri: {}", loc.uri);
|
|
43
|
+
assert!(!loc.uri.contains("C://"), "uri: {}", loc.uri);
|
|
44
|
+
}
|
|
@@ -16,13 +16,10 @@ fn repo_root() -> PathBuf {
|
|
|
16
16
|
|
|
17
17
|
#[test]
|
|
18
18
|
fn manifest_uses_local_uri_for_local_config() {
|
|
19
|
-
|
|
20
|
-
let
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
.expect("canonicalize config path")
|
|
24
|
-
.display()
|
|
25
|
-
);
|
|
19
|
+
// Pass a canonical path so the expected value is independent of the test's cwd.
|
|
20
|
+
let config_path = std::fs::canonicalize(repo_root().join("example/config.yml"))
|
|
21
|
+
.expect("canonicalize config path");
|
|
22
|
+
let expected_config_uri = format!("local://{}", config_path.display());
|
|
26
23
|
|
|
27
24
|
let config_location = resolve_config_location(
|
|
28
25
|
config_path
|
|
@@ -46,6 +43,38 @@ fn manifest_uses_local_uri_for_local_config() {
|
|
|
46
43
|
assert_eq!(value["config_uri"], expected_config_uri);
|
|
47
44
|
}
|
|
48
45
|
|
|
46
|
+
#[test]
|
|
47
|
+
fn manifest_config_uri_is_not_canonicalized() {
|
|
48
|
+
// config_uri reflects the path as typed, not the canonical path: a lexical `..`
|
|
49
|
+
// bounce (which canonicalize() would collapse) surviving in the output proves
|
|
50
|
+
// the path was preserved as-typed.
|
|
51
|
+
let temp_dir = tempfile::TempDir::new().expect("temp dir");
|
|
52
|
+
let cfg_dir = temp_dir.path().join("cfg");
|
|
53
|
+
std::fs::create_dir_all(&cfg_dir).expect("cfg dir");
|
|
54
|
+
let config_path = cfg_dir.join("config.yml");
|
|
55
|
+
std::fs::write(
|
|
56
|
+
&config_path,
|
|
57
|
+
"version: \"0.1\"\nentities:\n - name: orders\n source:\n format: csv\n path: ./in/orders\n sink:\n write_mode: overwrite\n accepted:\n format: parquet\n path: ./out/orders\n policy:\n severity: warn\n schema:\n columns:\n - name: id\n type: string\n",
|
|
58
|
+
)
|
|
59
|
+
.expect("write config");
|
|
60
|
+
|
|
61
|
+
// <cfg_dir>/../cfg/config.yml — canonicalize() would resolve this to
|
|
62
|
+
// <cfg_dir>/config.yml, dropping the "/../".
|
|
63
|
+
let bouncy = format!("{}/../cfg/config.yml", cfg_dir.display());
|
|
64
|
+
let loc = resolve_config_location(&bouncy).expect("resolve config location");
|
|
65
|
+
let config = load_config(&loc.path).expect("load config");
|
|
66
|
+
let payload = build_common_manifest_json(&loc, &config, &[], None, &ManifestOptions::default())
|
|
67
|
+
.expect("manifest");
|
|
68
|
+
let value: Value = serde_json::from_str(&payload).expect("valid json");
|
|
69
|
+
|
|
70
|
+
let uri = value["config_uri"].as_str().expect("config_uri string");
|
|
71
|
+
assert!(
|
|
72
|
+
uri.contains("/../cfg/config.yml"),
|
|
73
|
+
"config_uri was canonicalized (lost the as-typed form): {uri}"
|
|
74
|
+
);
|
|
75
|
+
assert!(value["manifest_id"].as_str().unwrap().starts_with("mfv1-"));
|
|
76
|
+
}
|
|
77
|
+
|
|
49
78
|
#[test]
|
|
50
79
|
fn manifest_id_is_stable_for_same_config() {
|
|
51
80
|
let config_path = repo_root().join("example/config.yml");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "floe-python"
|
|
3
|
-
version = "0.6.
|
|
3
|
+
version = "0.6.6"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
description = "Python bindings for floe-core (PyO3-based)"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -14,7 +14,7 @@ name = "_floe"
|
|
|
14
14
|
crate-type = ["cdylib"]
|
|
15
15
|
|
|
16
16
|
[dependencies]
|
|
17
|
-
floe-core = { path = "../floe-core", version = "0.6.
|
|
17
|
+
floe-core = { path = "../floe-core", version = "0.6.6", default-features = false }
|
|
18
18
|
pyo3 = { version = "0.29", features = ["extension-module", "abi3-py310"] }
|
|
19
19
|
serde_json = "1"
|
|
20
20
|
|
|
@@ -22,7 +22,7 @@ build-backend = "maturin"
|
|
|
22
22
|
|
|
23
23
|
[project]
|
|
24
24
|
name = "floe-duckdb"
|
|
25
|
-
version = "0.6.
|
|
25
|
+
version = "0.6.6"
|
|
26
26
|
description = "DuckDB companion extension for floe — adds the native DuckDB sink to the floe Python package"
|
|
27
27
|
readme = "README.md"
|
|
28
28
|
requires-python = ">=3.10"
|
|
@@ -46,7 +46,7 @@ classifiers = [
|
|
|
46
46
|
# only contributes the compiled DuckDB extension module into that package. Pin to
|
|
47
47
|
# the exact lean version so the companion's `_floe_duckdb` ABI always matches the
|
|
48
48
|
# `floe` package it plugs into.
|
|
49
|
-
dependencies = ["floe-python==0.6.
|
|
49
|
+
dependencies = ["floe-python==0.6.6"]
|
|
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
|
{floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/delta/commit_metrics.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
|
{floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/keys.rs
RENAMED
|
File without changes
|
|
File without changes
|
{floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/scd1.rs
RENAMED
|
File without changes
|
{floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/scd2.rs
RENAMED
|
File without changes
|
{floe_python-0.6.5 → floe_python-0.6.6}/crates/floe-core/src/io/write/strategy/merge/shared.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
|