dataframely 1.13.0__tar.gz → 1.14.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-1.13.0 → dataframely-1.14.0}/.github/workflows/build.yml +7 -7
- {dataframely-1.13.0 → dataframely-1.14.0}/.github/workflows/chore.yml +1 -1
- {dataframely-1.13.0 → dataframely-1.14.0}/.github/workflows/ci.yml +5 -5
- {dataframely-1.13.0 → dataframely-1.14.0}/.github/workflows/nightly.yml +2 -2
- {dataframely-1.13.0 → dataframely-1.14.0}/.github/workflows/scorecard.yml +3 -3
- {dataframely-1.13.0 → dataframely-1.14.0}/PKG-INFO +1 -1
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_base_schema.py +23 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/_mixins.py +1 -1
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.rst +16 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.testing.rst +8 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/index.rst +2 -1
- dataframely-1.14.0/docs/sites/faq.rst +30 -0
- dataframely-1.14.0/docs/sites/features/index.rst +7 -0
- dataframely-1.14.0/docs/sites/features/primary-keys.rst +47 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/pixi.lock +6199 -7182
- {dataframely-1.13.0 → dataframely-1.14.0}/pyproject.toml +1 -1
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_integer.py +28 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_base.py +31 -0
- dataframely-1.13.0/docs/sites/faq.rst +0 -5
- {dataframely-1.13.0 → dataframely-1.14.0}/.copier-answers.yml +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.envrc +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.gitattributes +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.github/CODEOWNERS +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.github/dependabot.yml +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.github/release-drafter.yml +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.gitignore +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.pre-commit-config.yaml +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.prettierignore +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.prettierrc +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/.readthedocs.yml +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/Cargo.lock +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/Cargo.toml +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/LICENSE +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/README.md +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/SECURITY.md +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/__init__.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_base_collection.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_compat.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_deprecation.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_extre.pyi +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_filter.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_polars.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_pydantic.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_rule.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_serialization.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_storage/__init__.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_storage/_base.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_storage/_exc.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_storage/constants.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_storage/delta.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_storage/parquet.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_typing.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/_validation.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/collection.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/__init__.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/_base.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/_registry.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/_utils.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/any.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/array.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/binary.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/bool.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/categorical.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/datetime.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/decimal.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/enum.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/float.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/integer.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/list.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/object.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/string.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/columns/struct.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/config.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/exc.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/failure.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/functional.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/mypy.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/py.typed +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/random.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/schema.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/testing/__init__.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/testing/const.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/testing/factory.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/testing/mask.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/testing/rules.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/testing/storage.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/dataframely/testing/typing.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docker-compose.yml +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/Makefile +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.collection.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.any.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.bool.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.datetime.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.decimal.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.enum.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.float.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.integer.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.list.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.string.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.columns.struct.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.config.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.exc.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.failure.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.functional.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.mypy.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.random.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.schema.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.testing.const.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.testing.factory.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.testing.mask.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.testing.rules.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/dataframely.testing.typing.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_api/modules.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_static/custom.css +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/_static/favicon.ico +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/conf.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/make.bat +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/sites/development.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/sites/examples/real-world.ipynb +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/sites/installation.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/sites/quickstart.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/docs/sites/versioning.rst +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/pixi.toml +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/src/errdefs.rs +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/src/lib.rs +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/src/regex_repr.rs +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/benches/conftest.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/benches/test_collection.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/benches/test_failure.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/benches/test_schema.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_base.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_cast.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_collection_future_annotations.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_create_empty.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_filter_one_to_n.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_filter_validate.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_ignore_in_filter.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_implementation.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_join.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_matches.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_optional_members.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_repr.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_sample.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_serialization.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_storage.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/collection/test_validate_input.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/__init__.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_any.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_array.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_binary.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_datetime.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_decimal.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_enum.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_float.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_list.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_object.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_string.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/column_types/test_struct.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/__init__.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_alias.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_check.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_default_dtypes.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_matches.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_metadata.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_polars_schema.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_pyarrow.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_rules.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_sample.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_sql_schema.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_str.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/columns/test_utils.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/core_validation/__init__.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/core_validation/test_column_validation.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/core_validation/test_dtype_validation.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/core_validation/test_rule_evaluation.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/failure_info/test_storage.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/functional/test_concat.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/functional/test_relationships.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_cast.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_create_empty.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_create_empty_if_none.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_filter.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_inheritance.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_matches.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_read_write_parquet.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_repr.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_rule_implementation.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_sample.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_serialization.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_storage.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/schema/test_validate.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/storage/test_delta.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_compat.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_config.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_deprecation.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_exc.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_extre.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_factory.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_pydantic.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_random.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_serialization.py +0 -0
- {dataframely-1.13.0 → dataframely-1.14.0}/tests/test_typing.py +0 -0
|
@@ -13,11 +13,11 @@ jobs:
|
|
|
13
13
|
permissions:
|
|
14
14
|
contents: read
|
|
15
15
|
steps:
|
|
16
|
-
- uses: actions/checkout@
|
|
16
|
+
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.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@194d461b21b6c5717c722ffc597fa91ed2ff29fa # v0.9.1
|
|
21
21
|
with:
|
|
22
22
|
environments: build
|
|
23
23
|
- name: Set version
|
|
@@ -48,17 +48,17 @@ jobs:
|
|
|
48
48
|
- target-platform: win-64
|
|
49
49
|
os: windows-latest
|
|
50
50
|
steps:
|
|
51
|
-
- uses: actions/checkout@
|
|
51
|
+
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.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@194d461b21b6c5717c722ffc597fa91ed2ff29fa # v0.9.1
|
|
56
56
|
with:
|
|
57
57
|
environments: build
|
|
58
58
|
- name: Set version
|
|
59
59
|
run: pixi run -e build set-version
|
|
60
60
|
- name: Build wheel
|
|
61
|
-
uses: PyO3/maturin-action@
|
|
61
|
+
uses: PyO3/maturin-action@86b9d133d34bc1b40018696f782949dac11bd380 # v1.49.4
|
|
62
62
|
with:
|
|
63
63
|
command: build
|
|
64
64
|
args: --out dist -i python3.10
|
|
@@ -80,9 +80,9 @@ jobs:
|
|
|
80
80
|
id-token: write
|
|
81
81
|
environment: pypi
|
|
82
82
|
steps:
|
|
83
|
-
- uses: actions/download-artifact@
|
|
83
|
+
- uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
|
|
84
84
|
with:
|
|
85
85
|
path: dist
|
|
86
86
|
merge-multiple: true
|
|
87
87
|
- name: Publish package on PyPi
|
|
88
|
-
uses: pypa/gh-action-pypi-publish@
|
|
88
|
+
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
|
|
@@ -21,7 +21,7 @@ jobs:
|
|
|
21
21
|
steps:
|
|
22
22
|
- name: Check valid conventional commit message
|
|
23
23
|
id: lint
|
|
24
|
-
uses: amannn/action-semantic-pull-request@
|
|
24
|
+
uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1
|
|
25
25
|
with:
|
|
26
26
|
subjectPattern: ^[A-Z].+[^. ]$ # subject must start with uppercase letter and may not end with a dot/space
|
|
27
27
|
env:
|
|
@@ -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@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.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@194d461b21b6c5717c722ffc597fa91ed2ff29fa # v0.9.1
|
|
28
28
|
with:
|
|
29
29
|
environments: default lint
|
|
30
30
|
- name: Install repository
|
|
@@ -51,9 +51,9 @@ jobs:
|
|
|
51
51
|
with_optionals: true
|
|
52
52
|
steps:
|
|
53
53
|
- name: Checkout branch
|
|
54
|
-
uses: actions/checkout@
|
|
54
|
+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
|
55
55
|
- name: Set up pixi
|
|
56
|
-
uses: prefix-dev/setup-pixi@
|
|
56
|
+
uses: prefix-dev/setup-pixi@194d461b21b6c5717c722ffc597fa91ed2ff29fa # v0.9.1
|
|
57
57
|
with:
|
|
58
58
|
environments: ${{ matrix.environment }}
|
|
59
59
|
- name: Install repository
|
|
@@ -61,7 +61,7 @@ jobs:
|
|
|
61
61
|
- name: Run pytest
|
|
62
62
|
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
|
|
63
63
|
- name: Upload codecov
|
|
64
|
-
uses: codecov/codecov-action@
|
|
64
|
+
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
|
|
65
65
|
with:
|
|
66
66
|
files: ./coverage.xml
|
|
67
67
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -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@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
|
27
27
|
- name: Set up pixi
|
|
28
|
-
uses: prefix-dev/setup-pixi@
|
|
28
|
+
uses: prefix-dev/setup-pixi@194d461b21b6c5717c722ffc597fa91ed2ff29fa # v0.9.1
|
|
29
29
|
with:
|
|
30
30
|
environments: nightly
|
|
31
31
|
- name: Install polars nightly
|
|
@@ -35,12 +35,12 @@ jobs:
|
|
|
35
35
|
|
|
36
36
|
steps:
|
|
37
37
|
- name: "Checkout code"
|
|
38
|
-
uses: actions/checkout@
|
|
38
|
+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
|
39
39
|
with:
|
|
40
40
|
persist-credentials: false
|
|
41
41
|
|
|
42
42
|
- name: "Run analysis"
|
|
43
|
-
uses: ossf/scorecard-action@
|
|
43
|
+
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
|
|
44
44
|
with:
|
|
45
45
|
results_file: results.sarif
|
|
46
46
|
results_format: sarif
|
|
@@ -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@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.29.5
|
|
78
78
|
with:
|
|
79
79
|
sarif_file: results.sarif
|
|
@@ -137,6 +137,29 @@ class SchemaMeta(ABCMeta):
|
|
|
137
137
|
f"which are not in the schema: {missing_list}."
|
|
138
138
|
)
|
|
139
139
|
|
|
140
|
+
# 3) Check that all members are non-pathological (i.e., user errors).
|
|
141
|
+
for attr, value in namespace.items():
|
|
142
|
+
if attr.startswith("__"):
|
|
143
|
+
continue
|
|
144
|
+
# Check for tuple of column (commonly caused by trailing comma)
|
|
145
|
+
if (
|
|
146
|
+
isinstance(value, tuple)
|
|
147
|
+
and len(value) > 0
|
|
148
|
+
and isinstance(value[0], Column)
|
|
149
|
+
):
|
|
150
|
+
raise TypeError(
|
|
151
|
+
f"Column '{attr}' is defined as a tuple of dy.Column. "
|
|
152
|
+
f"Did you accidentally add a trailing comma?"
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
# Check for column type instead of instance (e.g., dy.Float64 instead of dy.Float64())
|
|
156
|
+
if isinstance(value, type) and issubclass(value, Column):
|
|
157
|
+
raise TypeError(
|
|
158
|
+
f"Column '{attr}' is a type, not an instance. "
|
|
159
|
+
f"Schema members must be of type Column not type[Column]. "
|
|
160
|
+
f"Did you forget to add parentheses?"
|
|
161
|
+
)
|
|
162
|
+
|
|
140
163
|
return super().__new__(mcs, name, bases, namespace, *args, **kwargs)
|
|
141
164
|
|
|
142
165
|
def __getattribute__(cls, name: str) -> Any:
|
|
@@ -76,7 +76,7 @@ class OrdinalMixin(Generic[T], Base):
|
|
|
76
76
|
result["min_exclusive"] = expr > self.min_exclusive # type: ignore
|
|
77
77
|
if self.max is not None:
|
|
78
78
|
result["max"] = expr <= self.max # type: ignore
|
|
79
|
-
if self.max_exclusive:
|
|
79
|
+
if self.max_exclusive is not None:
|
|
80
80
|
result["max_exclusive"] = expr < self.max_exclusive # type: ignore
|
|
81
81
|
return result
|
|
82
82
|
|
|
@@ -25,6 +25,14 @@ dataframely.columns.array module
|
|
|
25
25
|
:show-inheritance:
|
|
26
26
|
:undoc-members:
|
|
27
27
|
|
|
28
|
+
dataframely.columns.binary module
|
|
29
|
+
---------------------------------
|
|
30
|
+
|
|
31
|
+
.. automodule:: dataframely.columns.binary
|
|
32
|
+
:members:
|
|
33
|
+
:show-inheritance:
|
|
34
|
+
:undoc-members:
|
|
35
|
+
|
|
28
36
|
dataframely.columns.bool module
|
|
29
37
|
-------------------------------
|
|
30
38
|
|
|
@@ -33,6 +41,14 @@ dataframely.columns.bool module
|
|
|
33
41
|
:show-inheritance:
|
|
34
42
|
:undoc-members:
|
|
35
43
|
|
|
44
|
+
dataframely.columns.categorical module
|
|
45
|
+
--------------------------------------
|
|
46
|
+
|
|
47
|
+
.. automodule:: dataframely.columns.categorical
|
|
48
|
+
:members:
|
|
49
|
+
:show-inheritance:
|
|
50
|
+
:undoc-members:
|
|
51
|
+
|
|
36
52
|
dataframely.columns.datetime module
|
|
37
53
|
-----------------------------------
|
|
38
54
|
|
|
@@ -41,6 +41,14 @@ dataframely.testing.rules module
|
|
|
41
41
|
:show-inheritance:
|
|
42
42
|
:undoc-members:
|
|
43
43
|
|
|
44
|
+
dataframely.testing.storage module
|
|
45
|
+
----------------------------------
|
|
46
|
+
|
|
47
|
+
.. automodule:: dataframely.testing.storage
|
|
48
|
+
:members:
|
|
49
|
+
:show-inheritance:
|
|
50
|
+
:undoc-members:
|
|
51
|
+
|
|
44
52
|
dataframely.testing.typing module
|
|
45
53
|
---------------------------------
|
|
46
54
|
|
|
@@ -22,11 +22,12 @@ Contents
|
|
|
22
22
|
|
|
23
23
|
.. toctree::
|
|
24
24
|
:caption: Contents
|
|
25
|
-
:maxdepth:
|
|
25
|
+
:maxdepth: 2
|
|
26
26
|
|
|
27
27
|
Installation <sites/installation.rst>
|
|
28
28
|
Quickstart <sites/quickstart.rst>
|
|
29
29
|
Real-world Example <sites/examples/real-world.ipynb>
|
|
30
|
+
Features <sites/features/index.rst>
|
|
30
31
|
FAQ <sites/faq.rst>
|
|
31
32
|
Development Guide <sites/development.rst>
|
|
32
33
|
Versioning <sites/versioning.rst>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
FAQ
|
|
2
|
+
===
|
|
3
|
+
|
|
4
|
+
Whenever you find out something that you were surprised by or needed some non-trivial
|
|
5
|
+
thinking, please add it here.
|
|
6
|
+
|
|
7
|
+
How do I define additional unique keys in a ``dy.Schema``?
|
|
8
|
+
----------------------------------------------------------
|
|
9
|
+
|
|
10
|
+
By default, ``dataframely`` only supports defining a single non-nullable (composite) primary key in ``dy.Schema``.
|
|
11
|
+
However, in some scenarios it may be useful to define additional unique keys (which support nullable fields and/or which are additionally unique).
|
|
12
|
+
|
|
13
|
+
Consider the following example, which demonstrates two rules: one for validating that a field is entirely unique, and another for validating that a field, when provided, is unique.
|
|
14
|
+
|
|
15
|
+
::
|
|
16
|
+
|
|
17
|
+
class UserSchema(dy.Schema):
|
|
18
|
+
user_id = dy.UInt64(primary_key=True, nullable=False)
|
|
19
|
+
username = dy.String(nullable=False)
|
|
20
|
+
email = dy.String(nullable=True) # Must be unique, or null.
|
|
21
|
+
|
|
22
|
+
@dy.rule(group_by=["username"])
|
|
23
|
+
def unique_username() -> pl.Expr:
|
|
24
|
+
"""Username, a non-nullable field, must be total unique."""
|
|
25
|
+
return pl.len() == 1
|
|
26
|
+
|
|
27
|
+
@dy.rule()
|
|
28
|
+
def unique_email_or_null() -> pl.Expr:
|
|
29
|
+
"""Email must be unique, if provided."""
|
|
30
|
+
return pl.col("email").is_null() | pl.col("email").is_unique()
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
Primary keys
|
|
2
|
+
============
|
|
3
|
+
|
|
4
|
+
Defining primary keys in ``dy.Schema``
|
|
5
|
+
--------------------------------------
|
|
6
|
+
|
|
7
|
+
When working with tabular data, it is often useful to define a `primary key <https://en.wikipedia.org/wiki/Primary_key>`_. A primary key is a set of one or multiple column, the combined values of which form a unique identifier for every record in a table.
|
|
8
|
+
|
|
9
|
+
Dataframely supports marking columns as part of the primary key when defining a ``dy.Schema`` by setting ``primary_key=True`` on the respective column(s).
|
|
10
|
+
|
|
11
|
+
.. note::
|
|
12
|
+
|
|
13
|
+
Primary key columns must not be nullable.
|
|
14
|
+
|
|
15
|
+
Single primary keys
|
|
16
|
+
^^^^^^^^^^^^^^^^^^^
|
|
17
|
+
|
|
18
|
+
For example, when managing data about users, we might use an ``id`` column to uniquely identify users:
|
|
19
|
+
|
|
20
|
+
::
|
|
21
|
+
|
|
22
|
+
class UserSchema(dy.Schema):
|
|
23
|
+
name = dy.String(primary_key=True)
|
|
24
|
+
name = dy.String()
|
|
25
|
+
|
|
26
|
+
When we later validate data with this schema, ``dataframely`` checks that the values of the primary key are unique, i.e. there are no two users with the same value of ``id``. Having multiple users with the same ``name`` but different ``id`` but be allowed in this case.
|
|
27
|
+
|
|
28
|
+
Composite primary keys
|
|
29
|
+
^^^^^^^^^^^^^^^^^^^^^^
|
|
30
|
+
|
|
31
|
+
In another scenario, we might be tracking line items on invoices. We have many invoices, and each invoice may contain any number of line items. To uniquely identify a line item, we need to specify the invoice, as well as the line items position within the invoice. To encode this, we set ``primary_key=True`` on both the ``invoice_id`` and ``item_id`` columns:
|
|
32
|
+
|
|
33
|
+
::
|
|
34
|
+
|
|
35
|
+
class LineItemSchema(dy.Schema):
|
|
36
|
+
invoice_id = dy.Int64(primary_key=True)
|
|
37
|
+
item_id = dy.Int64(primary_key=True)
|
|
38
|
+
price = dy.Decimal()
|
|
39
|
+
|
|
40
|
+
Validation will now ensure that all pairs of (``invoice_id``, ``item_id``) are unique.
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
Primary keys in ``dy.Collection``
|
|
44
|
+
---------------------------------
|
|
45
|
+
|
|
46
|
+
The central idea behind ``dy.Collection`` is to unify multiple tables relating to the same set of underlying entities.
|
|
47
|
+
This is useful because it allows us to write ``dy.filter``s that use information from multiple tables to identify whether the underlying entity is valid or not. If any ``dy.filter``s are defined, ``dataframely`` requires the tables in a ``dy.Collection`` to have an overlapping primary key (i.e., there must be at least one column that is a primary key in all tables).
|