dataframely 2.10.1__tar.gz → 2.11.0__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.
- {dataframely-2.10.1 → dataframely-2.11.0}/.copier-answers.yml +1 -1
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/build.yml +4 -4
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/chore.yml +1 -1
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/ci.yml +5 -5
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/copilot-setup-steps.yml +2 -2
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/nightly.yml +2 -2
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/release-drafter.yml +1 -1
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/workflows/scorecard.yml +2 -2
- {dataframely-2.10.1 → dataframely-2.11.0}/PKG-INFO +1 -1
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/enum.py +33 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/experimental/infer_schema.py +9 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/sql-generation.md +35 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/pixi.lock +7835 -7909
- {dataframely-2.10.1 → dataframely-2.11.0}/pyproject.toml +1 -1
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_enum.py +66 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_sqlalchemy_columns.py +63 -1
- {dataframely-2.10.1 → dataframely-2.11.0}/.claude/CLAUDE.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.envrc +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.gitattributes +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/CODEOWNERS +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/copilot-instructions.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/dependabot.yml +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/instructions/tests.instructions.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.github/release-drafter.yml +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.gitignore +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.lefthook.yaml +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.prettierignore +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.prettierrc +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/.readthedocs.yml +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/AGENTS.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/Cargo.lock +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/Cargo.toml +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/LICENSE +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/README.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/SECURITY.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/__init__.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_base_schema.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_compat.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_deprecation.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_filter.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_match_to_schema.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_native.pyi +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_plugin.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_polars.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_pydantic.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_rule.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_serialization.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/__init__.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/_base.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/_exc.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/_fsspec.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/constants.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/delta.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_storage/parquet.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/_typing.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/collection/__init__.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/collection/_base.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/collection/collection.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/collection/filter_result.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/__init__.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/_base.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/_mixins.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/_registry.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/_utils.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/any.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/array.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/binary.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/bool.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/categorical.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/datetime.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/decimal.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/float.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/integer.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/list.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/object.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/string.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/columns/struct.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/config.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/exc.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/experimental/__init__.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/filter_result.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/functional.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/py.typed +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/random.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/schema.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/__init__.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/const.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/factory.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/mask.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/rules.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/dataframely/testing/storage.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docker-compose.yml +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/_static/custom.css +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/_static/favicon.ico +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/autosummary/class.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/autosummary/method.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/classes/column.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/classes/error.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/_templates/classes/filter_result.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/generation.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/index.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/io.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/metadata.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/operations.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/collection/validation.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/columns/index.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/errors/index.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/experimental/index.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/filter_result/failure_info.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/filter_result/index.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/index.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/misc/index.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/conversion.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/generation.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/index.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/io.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/metadata.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/api/schema/validation.rst +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/conf.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/css/custom.css +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/coding-agents.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/development.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/examples/index.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/examples/real-world.ipynb +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/faq.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/column-metadata.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/data-generation.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/index.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/lazy-validation.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/primary-keys.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/features/serialization.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/index.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/migration/index.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/migration/v1-v2.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/guides/quickstart.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/docs/index.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/pixi.toml +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/rust-toolchain.toml +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/skills/SKILL.md +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/src/lib.rs +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/src/polars_plugin/mod.rs +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/src/polars_plugin/rule_failure.rs +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/src/polars_plugin/utils.rs +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/src/polars_plugin/validation_error.rs +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/src/regex/errdefs.rs +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/src/regex/mod.rs +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/src/regex/repr.rs +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/benches/conftest.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/benches/test_collection.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/benches/test_failure.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/benches/test_schema.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_base.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_cast.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_collection_future_annotations.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_create_empty.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_dataframe_members.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_filter_one_to_n.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_filter_validate.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_ignore_in_filter.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_implementation.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_join.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_matches.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_optional_members.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_propagate_row_failures.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_repr.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_sample.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_serialization.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_storage.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/collection/test_validate_input.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/__init__.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_any.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_array.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_binary.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_datetime.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_decimal.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_float.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_integer.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_list.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_object.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_string.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/column_types/test_struct.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/__init__.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_alias.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_base.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_check.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_default_dtypes.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_description.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_matches.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_metadata.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_polars_schema.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_pyarrow.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_pydantic.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_rules.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_sample.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_str.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/columns/test_utils.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/conftest.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/core_validation/__init__.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/core_validation/test_match_to_schema.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/core_validation/test_rule_evaluation.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/experimental/test_infer_schema.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/failure_info/test_storage.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/functional/test_concat.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/functional/test_relationships.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_base.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_cast.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_create_empty.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_create_empty_if_none.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_filter.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_inheritance.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_matches.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_pydantic_model.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_read_write_parquet.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_repr.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_rule_implementation.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_sample.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_serialization.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_storage.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/schema/test_validate.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/storage/test_delta.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/storage/test_fsspec.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_compat.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_config.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_deprecation.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_factory.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_native_regex.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_pydantic.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_random.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_serialization.py +0 -0
- {dataframely-2.10.1 → dataframely-2.11.0}/tests/test_typing.py +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
#
|
|
9
9
|
# If you want to run this as a one-off command, prefix with:
|
|
10
10
|
# `pixi exec --spec copier --spec ruamel.yaml -- {command}`
|
|
11
|
-
_commit: v0.5.
|
|
11
|
+
_commit: v0.5.3
|
|
12
12
|
_src_path: https://github.com/quantco/copier-template-python-open-source
|
|
13
13
|
add_autobump_workflow: false
|
|
14
14
|
author_email: oliver.borchert@quantco.com
|
|
@@ -13,11 +13,11 @@ jobs:
|
|
|
13
13
|
permissions:
|
|
14
14
|
contents: read
|
|
15
15
|
steps:
|
|
16
|
-
- uses: actions/checkout@
|
|
16
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
17
17
|
with:
|
|
18
18
|
fetch-depth: 0
|
|
19
19
|
- name: Set up pixi
|
|
20
|
-
uses: prefix-dev/setup-pixi@
|
|
20
|
+
uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
|
|
21
21
|
with:
|
|
22
22
|
environments: build
|
|
23
23
|
- name: Set version
|
|
@@ -48,11 +48,11 @@ jobs:
|
|
|
48
48
|
- target-platform: win-64
|
|
49
49
|
os: windows-latest
|
|
50
50
|
steps:
|
|
51
|
-
- uses: actions/checkout@
|
|
51
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
52
52
|
with:
|
|
53
53
|
fetch-depth: 0
|
|
54
54
|
- name: Set up pixi
|
|
55
|
-
uses: prefix-dev/setup-pixi@
|
|
55
|
+
uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
|
|
56
56
|
with:
|
|
57
57
|
environments: build
|
|
58
58
|
- name: Set version
|
|
@@ -54,6 +54,6 @@ jobs:
|
|
|
54
54
|
pull-requests: write
|
|
55
55
|
steps:
|
|
56
56
|
- name: Assign labels
|
|
57
|
-
uses: release-drafter/release-drafter/autolabeler@
|
|
57
|
+
uses: release-drafter/release-drafter/autolabeler@ed4bc48ec97379be2258e7b7ac2624a3e26ab809 # v7.4.0
|
|
58
58
|
with:
|
|
59
59
|
token: ${{ github.token }}
|
|
@@ -19,12 +19,12 @@ jobs:
|
|
|
19
19
|
runs-on: ubuntu-latest
|
|
20
20
|
steps:
|
|
21
21
|
- name: Checkout branch
|
|
22
|
-
uses: actions/checkout@
|
|
22
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
23
23
|
with:
|
|
24
24
|
# needed for 'pre-commit-mirrors-insert-license'
|
|
25
25
|
fetch-depth: 0
|
|
26
26
|
- name: Set up pixi
|
|
27
|
-
uses: prefix-dev/setup-pixi@
|
|
27
|
+
uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
|
|
28
28
|
with:
|
|
29
29
|
environments: default lint polars-minimal
|
|
30
30
|
- name: Install Rust
|
|
@@ -63,9 +63,9 @@ jobs:
|
|
|
63
63
|
with_optionals: false
|
|
64
64
|
steps:
|
|
65
65
|
- name: Checkout branch
|
|
66
|
-
uses: actions/checkout@
|
|
66
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
67
67
|
- name: Set up pixi
|
|
68
|
-
uses: prefix-dev/setup-pixi@
|
|
68
|
+
uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
|
|
69
69
|
with:
|
|
70
70
|
environments: ${{ matrix.environment }}
|
|
71
71
|
# FIXME: Remove when `s3_server` fixture does not start a process anymore
|
|
@@ -79,7 +79,7 @@ jobs:
|
|
|
79
79
|
- name: Run pytest
|
|
80
80
|
run: pixi run -e ${{ matrix.environment }} test-coverage --color=yes ${{ matrix.with_optionals && '-m with_optionals' || '-m "not with_optionals"'}} --cov=dataframely --cov-report=xml
|
|
81
81
|
- name: Upload codecov
|
|
82
|
-
uses: codecov/codecov-action@
|
|
82
|
+
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
|
83
83
|
with:
|
|
84
84
|
files: ./coverage.xml
|
|
85
85
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -13,9 +13,9 @@ jobs:
|
|
|
13
13
|
id-token: write
|
|
14
14
|
steps:
|
|
15
15
|
- name: Checkout branch
|
|
16
|
-
uses: actions/checkout@
|
|
16
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
17
17
|
- name: Set up pixi
|
|
18
|
-
uses: prefix-dev/setup-pixi@
|
|
18
|
+
uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
|
|
19
19
|
with:
|
|
20
20
|
environments: default
|
|
21
21
|
- name: Install Rust
|
|
@@ -23,9 +23,9 @@ jobs:
|
|
|
23
23
|
os: [ubuntu-latest, windows-latest]
|
|
24
24
|
steps:
|
|
25
25
|
- name: Checkout branch
|
|
26
|
-
uses: actions/checkout@
|
|
26
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
27
27
|
- name: Set up pixi
|
|
28
|
-
uses: prefix-dev/setup-pixi@
|
|
28
|
+
uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
|
|
29
29
|
with:
|
|
30
30
|
environments: nightly
|
|
31
31
|
- name: Install polars nightly
|
|
@@ -16,6 +16,6 @@ jobs:
|
|
|
16
16
|
pull-requests: read
|
|
17
17
|
steps:
|
|
18
18
|
- name: Update release draft
|
|
19
|
-
uses: release-drafter/release-drafter@
|
|
19
|
+
uses: release-drafter/release-drafter@ed4bc48ec97379be2258e7b7ac2624a3e26ab809 # v7.4.0
|
|
20
20
|
with:
|
|
21
21
|
token: ${{ github.token }}
|
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
|
|
36
36
|
steps:
|
|
37
37
|
- name: "Checkout code"
|
|
38
|
-
uses: actions/checkout@
|
|
38
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
39
39
|
with:
|
|
40
40
|
persist-credentials: false
|
|
41
41
|
|
|
@@ -74,6 +74,6 @@ jobs:
|
|
|
74
74
|
# Upload the results to GitHub's code scanning dashboard (optional).
|
|
75
75
|
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
|
|
76
76
|
- name: "Upload to code-scanning"
|
|
77
|
-
uses: github/codeql-action/upload-sarif@
|
|
77
|
+
uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
|
|
78
78
|
with:
|
|
79
79
|
sarif_file: results.sarif
|
|
@@ -33,6 +33,8 @@ class Enum(Column):
|
|
|
33
33
|
alias: str | None = None,
|
|
34
34
|
metadata: dict[str, Any] | None = None,
|
|
35
35
|
description: str | None = None,
|
|
36
|
+
sqlalchemy_use_enum: bool = False,
|
|
37
|
+
sqlalchemy_enum_name: str | None = None,
|
|
36
38
|
):
|
|
37
39
|
"""
|
|
38
40
|
Args:
|
|
@@ -68,6 +70,15 @@ class Enum(Column):
|
|
|
68
70
|
names, the specified alias is the only valid name.
|
|
69
71
|
metadata: A dictionary of metadata to attach to the column.
|
|
70
72
|
description: A human-readable description of the column.
|
|
73
|
+
sqlalchemy_use_enum: When ``True``, map this column to :class:`sqlalchemy.Enum`
|
|
74
|
+
in :meth:`~dataframely.Schema.to_sqlalchemy_columns` instead of
|
|
75
|
+
``CHAR`` / ``VARCHAR``.
|
|
76
|
+
sqlalchemy_enum_name: Optional name for the SQLAlchemy / database enum type
|
|
77
|
+
when ``sqlalchemy_use_enum=True``. If omitted and ``categories`` is a
|
|
78
|
+
Python :class:`enum.Enum` subclass, the lowercased enum class is used.
|
|
79
|
+
Otherwise, the name of the column is used.
|
|
80
|
+
The persisted values are the enum members' ``.value`` strings (not
|
|
81
|
+
member names), matching :attr:`categories`.
|
|
71
82
|
"""
|
|
72
83
|
super().__init__(
|
|
73
84
|
nullable=nullable,
|
|
@@ -78,8 +89,26 @@ class Enum(Column):
|
|
|
78
89
|
metadata=metadata,
|
|
79
90
|
description=description,
|
|
80
91
|
)
|
|
92
|
+
if sqlalchemy_enum_name and not sqlalchemy_use_enum:
|
|
93
|
+
raise ValueError(
|
|
94
|
+
"`sqlalchemy_enum_name` has no effect when `sqlalchemy_use_enum=False`."
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
self.sqlalchemy_use_enum = sqlalchemy_use_enum
|
|
98
|
+
self.sqlalchemy_enum_name = sqlalchemy_enum_name
|
|
81
99
|
if isclass(categories) and issubclass(categories, enum.Enum):
|
|
100
|
+
# If the user passed an Enum type, we want to determine a default name
|
|
101
|
+
# based on the Enum class name, which is also what sqlalchemy does.
|
|
102
|
+
# One could instead keep a reference to the Enum class around and pass it
|
|
103
|
+
# to sqlalchemy later on, but that will interfere with the base-class implementations
|
|
104
|
+
# of `matches` and `to_dict` / `from_dict`.
|
|
105
|
+
if self.sqlalchemy_use_enum:
|
|
106
|
+
self.sqlalchemy_enum_name = (
|
|
107
|
+
self.sqlalchemy_enum_name or categories.__name__.lower()
|
|
108
|
+
)
|
|
109
|
+
|
|
82
110
|
categories = (item.value for item in categories)
|
|
111
|
+
|
|
83
112
|
self.categories = list(categories)
|
|
84
113
|
|
|
85
114
|
@property
|
|
@@ -92,6 +121,10 @@ class Enum(Column):
|
|
|
92
121
|
return self.categories == dtype.categories.to_list()
|
|
93
122
|
|
|
94
123
|
def sqlalchemy_dtype(self, dialect: sa.Dialect) -> sa_TypeEngine:
|
|
124
|
+
if self.sqlalchemy_use_enum:
|
|
125
|
+
return sa.Enum(
|
|
126
|
+
*self.categories, name=self.sqlalchemy_enum_name or self._name
|
|
127
|
+
)
|
|
95
128
|
category_lengths = [len(c) for c in self.categories]
|
|
96
129
|
if all(length == category_lengths[0] for length in category_lengths):
|
|
97
130
|
return sa.CHAR(category_lengths[0])
|
|
@@ -9,6 +9,8 @@ import re
|
|
|
9
9
|
|
|
10
10
|
import polars as pl
|
|
11
11
|
|
|
12
|
+
from dataframely._compat import _polars_version_tuple
|
|
13
|
+
|
|
12
14
|
_POLARS_DTYPE_MAP: dict[type[pl.DataType], str] = {
|
|
13
15
|
pl.Boolean: "Bool",
|
|
14
16
|
pl.Int8: "Int8",
|
|
@@ -147,9 +149,16 @@ def _get_dtype_args(dtype: pl.DataType, series: pl.Series) -> list[str]:
|
|
|
147
149
|
return [repr(dtype.categories.to_list())]
|
|
148
150
|
|
|
149
151
|
if isinstance(dtype, pl.List):
|
|
152
|
+
if _polars_version_tuple >= (1, 36, 0):
|
|
153
|
+
return [_dtype_to_column_code(series.explode(empty_as_null=False))]
|
|
150
154
|
return [_dtype_to_column_code(series.explode())]
|
|
151
155
|
|
|
152
156
|
if isinstance(dtype, pl.Array):
|
|
157
|
+
if _polars_version_tuple >= (1, 36, 0):
|
|
158
|
+
return [
|
|
159
|
+
_dtype_to_column_code(series.explode(empty_as_null=False)),
|
|
160
|
+
f"shape={dtype.size}",
|
|
161
|
+
]
|
|
153
162
|
return [_dtype_to_column_code(series.explode()), f"shape={dtype.size}"]
|
|
154
163
|
|
|
155
164
|
if isinstance(dtype, pl.Struct):
|
|
@@ -81,6 +81,41 @@ the maximal length of the string is inferred from the regular expression if poss
|
|
|
81
81
|
maximal lengths can be particularly important for primary key columns. Some database systems, such as Microsoft SQL Server, do not allow `VARCHAR(max)` columns (unbounded strings) to be used as primary keys.
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
+
## Native SQL enums
|
|
85
|
+
|
|
86
|
+
By default, {class}`~dataframely.Enum` maps to `sa.CHAR` or `sa.String` columns so stored values remain plain strings. You may set `sqlalchemy_use_enum=True` to instead generate native enums:
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
from enum import Enum, auto
|
|
90
|
+
|
|
91
|
+
import sqlalchemy as sa
|
|
92
|
+
import dataframely as dy
|
|
93
|
+
from sqlalchemy.dialects.postgresql import dialect as pg_dialect
|
|
94
|
+
from sqlalchemy.dialects.mssql import dialect as mssql_dialect
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class Status(str, Enum):
|
|
98
|
+
PENDING = auto()
|
|
99
|
+
APPROVED = auto()
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class Staged(dy.Schema):
|
|
103
|
+
status = dy.Enum(Status, sqlalchemy_use_enum=True)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
This will translate the `~dataframely.Enum` to a `~sqlalchemy.Enum`:
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
>>> Staged.to_sqlalchemy_columns(pg_dialect())
|
|
110
|
+
[Column('status', Enum('1', '2', name='status'), table=None, nullable=False)]
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Depending on the database dialect you use, `sqlalchemy` will render this accordingly.
|
|
114
|
+
For example, `postgresql` supports native enums, and `sqlalchemy` will create a native enum column, while in MSSQL, where this is not supported, it will fall back to `VARCHAR`.
|
|
115
|
+
|
|
116
|
+
When `categories` is a Python `enum.Enum` subclass, `sqlalchemy` uses the enum class name (lowercased) as the database enum type name.
|
|
117
|
+
For string category lists, the SQL column name is used by default; override it with `sqlalchemy_enum_name` if needed.
|
|
118
|
+
|
|
84
119
|
## Collections of multiple tables
|
|
85
120
|
|
|
86
121
|
If you have an entire `dy.Collection`, it's also easy to generate one table for each member table of the collection.
|