dataframely 2.5.0__tar.gz → 2.5.1__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.5.0 → dataframely-2.5.1}/PKG-INFO +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/__init__.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_base_schema.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_deprecation.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_filter.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_match_to_schema.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_plugin.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_polars.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_pydantic.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_rule.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_serialization.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_storage/__init__.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_storage/_base.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_storage/_exc.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_storage/constants.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_storage/delta.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_storage/parquet.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_typing.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/collection/__init__.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/collection/_base.py +6 -2
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/collection/collection.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/collection/filter_result.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/__init__.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/_base.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/_mixins.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/_registry.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/_utils.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/any.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/bool.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/categorical.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/datetime.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/decimal.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/enum.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/float.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/integer.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/object.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/string.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/config.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/exc.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/filter_result.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/functional.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/random.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/schema.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/testing/__init__.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/testing/const.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/testing/factory.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/testing/mask.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/testing/rules.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/testing/storage.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/conf.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/pyproject.toml +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/benches/conftest.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/benches/test_collection.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/benches/test_failure.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/benches/test_schema.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_base.py +37 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_cast.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_collection_future_annotations.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_create_empty.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_filter_one_to_n.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_filter_validate.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_ignore_in_filter.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_implementation.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_join.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_matches.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_optional_members.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_propagate_row_failures.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_repr.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_sample.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_serialization.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_storage.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/collection/test_validate_input.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/__init__.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_any.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_array.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_binary.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_datetime.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_decimal.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_enum.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_float.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_integer.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_list.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_object.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_string.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/column_types/test_struct.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/__init__.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_alias.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_base.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_check.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_default_dtypes.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_matches.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_metadata.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_polars_schema.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_pyarrow.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_rules.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_sample.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_str.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_utils.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/conftest.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/core_validation/__init__.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/core_validation/test_match_to_schema.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/core_validation/test_rule_evaluation.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/failure_info/test_storage.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/functional/test_concat.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/functional/test_relationships.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_base.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_cast.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_create_empty.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_create_empty_if_none.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_filter.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_inheritance.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_matches.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_read_write_parquet.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_repr.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_rule_implementation.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_sample.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_serialization.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_storage.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/schema/test_validate.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/storage/test_delta.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/test_compat.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/test_config.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/test_deprecation.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/test_factory.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/test_native_regex.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/test_pydantic.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/test_random.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/test_serialization.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/test_typing.py +1 -1
- {dataframely-2.5.0 → dataframely-2.5.1}/.copier-answers.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.envrc +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.gitattributes +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/CODEOWNERS +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/copilot-instructions.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/dependabot.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/instructions/tests.instructions.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/release-drafter.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/workflows/build.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/workflows/chore.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/workflows/ci.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/workflows/copilot-setup-steps.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/workflows/nightly.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.github/workflows/scorecard.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.gitignore +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.pre-commit-config.yaml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.prettierignore +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.prettierrc +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/.readthedocs.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/Cargo.lock +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/Cargo.toml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/LICENSE +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/README.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/SECURITY.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_compat.py +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/_native.pyi +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/array.py +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/binary.py +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/list.py +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/columns/struct.py +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/dataframely/py.typed +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docker-compose.yml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/_static/custom.css +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/_static/favicon.ico +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/_templates/autosummary/class.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/_templates/autosummary/method.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/_templates/classes/column.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/_templates/classes/error.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/_templates/classes/filter_result.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/collection/generation.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/collection/index.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/collection/io.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/collection/metadata.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/collection/operations.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/collection/validation.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/columns/index.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/errors/index.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/filter_result/failure_info.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/filter_result/index.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/index.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/misc/index.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/schema/conversion.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/schema/generation.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/schema/index.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/schema/io.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/schema/metadata.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/api/schema/validation.rst +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/css/custom.css +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/development.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/examples/index.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/examples/real-world.ipynb +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/faq.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/features/column-metadata.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/features/data-generation.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/features/index.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/features/lazy-validation.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/features/primary-keys.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/features/serialization.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/features/sql-generation.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/index.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/migration/index.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/migration/v1-v2.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/guides/quickstart.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/docs/index.md +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/pixi.lock +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/pixi.toml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/rust-toolchain.toml +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/src/lib.rs +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/src/polars_plugin/mod.rs +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/src/polars_plugin/rule_failure.rs +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/src/polars_plugin/utils.rs +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/src/polars_plugin/validation_error.rs +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/src/regex/errdefs.rs +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/src/regex/mod.rs +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/src/regex/repr.rs +0 -0
- {dataframely-2.5.0 → dataframely-2.5.1}/tests/columns/test_sqlalchemy_columns.py +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) QuantCo 2025-
|
|
1
|
+
# Copyright (c) QuantCo 2025-2026
|
|
2
2
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
3
3
|
|
|
4
4
|
from __future__ import annotations
|
|
@@ -202,7 +202,11 @@ class CollectionMeta(ABCMeta):
|
|
|
202
202
|
annotations = source["__annotations__"]
|
|
203
203
|
elif sys.version_info >= (3, 14):
|
|
204
204
|
if "__annotate_func__" in source:
|
|
205
|
-
|
|
205
|
+
annotate_func = source["__annotate_func__"]
|
|
206
|
+
# __annotate_func__ can be None in Python 3.14 when a class
|
|
207
|
+
# has no annotations or in certain metaclass scenarios
|
|
208
|
+
if annotate_func is not None and callable(annotate_func):
|
|
209
|
+
annotations = annotate_func(Format.VALUE)
|
|
206
210
|
for attr, kls in annotations.items():
|
|
207
211
|
result.members[attr] = CollectionMeta._derive_member_info(
|
|
208
212
|
attr, kls, CollectionMember()
|
|
@@ -27,7 +27,7 @@ description = "A declarative, polars-native data frame validation library"
|
|
|
27
27
|
name = "dataframely"
|
|
28
28
|
readme = "README.md"
|
|
29
29
|
requires-python = ">=3.10"
|
|
30
|
-
version = "2.5.
|
|
30
|
+
version = "2.5.1"
|
|
31
31
|
|
|
32
32
|
[project.optional-dependencies]
|
|
33
33
|
deltalake = ["deltalake"]
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
# Copyright (c) QuantCo 2025-
|
|
1
|
+
# Copyright (c) QuantCo 2025-2026
|
|
2
2
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
3
3
|
|
|
4
|
+
import sys
|
|
5
|
+
|
|
4
6
|
import polars as pl
|
|
5
7
|
import pytest
|
|
6
8
|
from polars.testing import assert_frame_equal
|
|
@@ -110,3 +112,37 @@ def test_collect_all_optional() -> None:
|
|
|
110
112
|
assert isinstance(out, MyCollection)
|
|
111
113
|
assert len(out.first.collect()) == 3
|
|
112
114
|
assert out.second is None
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@pytest.mark.skipif(sys.version_info < (3, 14), reason="Python 3.14+ only")
|
|
118
|
+
def test_annotate_func_none_py314() -> None:
|
|
119
|
+
"""Test that __annotate_func__ = None doesn't cause TypeError in Python 3.14.
|
|
120
|
+
|
|
121
|
+
In Python 3.14 with PEP 649, __annotate_func__ can be None when:
|
|
122
|
+
- A class has no annotations
|
|
123
|
+
- Annotations are being processed during certain import contexts
|
|
124
|
+
- Classes are created dynamically with __annotate_func__ set to None
|
|
125
|
+
|
|
126
|
+
This test ensures the metaclass handles this gracefully.
|
|
127
|
+
"""
|
|
128
|
+
from typing import cast
|
|
129
|
+
|
|
130
|
+
from dataframely.collection._base import BaseCollection, CollectionMeta
|
|
131
|
+
|
|
132
|
+
# Create a namespace with __annotate_func__ = None
|
|
133
|
+
namespace = {
|
|
134
|
+
"__module__": "__main__",
|
|
135
|
+
"__qualname__": "TestCollection",
|
|
136
|
+
"__annotate_func__": None,
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
# This should not raise TypeError
|
|
140
|
+
TestCollection = CollectionMeta(
|
|
141
|
+
"TestCollection",
|
|
142
|
+
(dy.Collection,),
|
|
143
|
+
namespace,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Verify it has no members (since there are no annotations)
|
|
147
|
+
# Cast to BaseCollection to satisfy mypy since CollectionMeta creates Collection classes
|
|
148
|
+
assert cast(type[BaseCollection], TestCollection).members() == {}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
# Copyright (c) QuantCo 2025-
|
|
1
|
+
# Copyright (c) QuantCo 2025-2026
|
|
2
2
|
# SPDX-License-Identifier: BSD-3-Clause
|