pointblank 0.13.3__tar.gz → 0.13.4__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.
- {pointblank-0.13.3 → pointblank-0.13.4}/PKG-INFO +1 -1
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_constants_translations.py +54 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_interrogation.py +16 -1
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_utils.py +40 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/validate.py +182 -11
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/PKG-INFO +1 -1
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/SOURCES.txt +0 -1
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_validate.py +981 -1
- pointblank-0.13.3/pointblank/_constants_docs.py +0 -40
- {pointblank-0.13.3 → pointblank-0.13.4}/.github/CODE_OF_CONDUCT.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.github/ISSUE_TEMPLATE/bug.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.github/SECURITY.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.github/workflows/ci-docs.yaml +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.github/workflows/ci-tests.yaml +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.github/workflows/code-checks.yaml +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.gitignore +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.pre-commit-config.yaml +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/.vscode/settings.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/CITATION.cff +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/CONTRIBUTING.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/LICENSE +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/Makefile +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/README.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/game_revenue.csv +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/global_sales.csv +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/global_sales_dataset.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/nycflights.csv +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/small_table.csv +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/worldcities.csv +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/x-01-parquet.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/x-02-duckdb.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/x-03-sqlite.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/.gitignore +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/_extensions/machow/interlinks/.gitignore +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/_extensions/machow/interlinks/_extension.yml +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/_extensions/machow/interlinks/interlinks.lua +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/_quarto.yml +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/fav-logo.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-info-worldcities-csv.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-info-worldcities-github-csv.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-make-template.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-missing-worldcities-csv.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-game_revenue-all-columns.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-game_revenue-column-names.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-game_revenue-column-range.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-worldcities-csv-no-row-numbers.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-worldcities-csv.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-run-worldcities_validation-extracts.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-run-worldcities_validation-fail-on-warning.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-run-worldcities_validation-output.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-run-worldcities_validation.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-scan-worldcities-csv.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-exit-code.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-multi-check.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-rows-complete-worldcities-csv.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-rows-distinct-worldcities-csv.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-show-extract.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-worldcities-gt-0-population.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-worldcities-not-null-city_name.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-write-extract.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.de.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.es.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.fr.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.it.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.ja.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.ko.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.nl.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.pt-BR.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.zh-CN.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-step-report.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-tabular-report.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank_logo.svg +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/posit-logo-black.svg +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/validation-table-diagram.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/validation-test-units.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/.gitignore +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-cicd-workflows.gif +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-cicd-workflows.tape +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-complete-workflow.gif +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-complete-workflow.tape +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-data-exploration.gif +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-data-exploration.tape +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-essential-validations.gif +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-essential-validations.tape +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-getting-started.gif +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-getting-started.tape +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-using-polars.gif +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-using-polars.tape +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/validation.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/all-about-actions/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/pointblank-localized.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/step_report.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/validation-table-diagram.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/validation-test-units.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/lets-workshop-together/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/advanced-in-sidebar.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/breadth-and-depth.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/explanation-of-visual.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/links-in-guide.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/segments.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/step-report.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/validation-three-things.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/pointblank_blog_logo.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/validation-libs-2025/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/01-starter/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/02-advanced/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/03-data-extracts/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/04-sundered-data/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/05-step-report-column-check/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/06-step-report-schema-check/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/07-validation-with-actions/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/08-validation-with-final-actions/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/apply-checks-to-several-columns/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/check-for-freshness/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/check-row-column-counts/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/checks-for-missing/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/cli-interactive/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/col-vals-custom-expr/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/column-selector-functions/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/comparisons-across-columns/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/custom-validation-specially/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/data/game_revenue.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/expect-no-duplicate-rows/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/expect-no-duplicate-values/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/expect-text-pattern/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/failure-thresholds/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/advanced_validation.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/data_extracts.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/starter_validation.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/step_report_column_schema.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/step_report_column_values.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/sundered_data.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/validation_with_actions.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/validation_with_final_actions.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/mutate-table-in-step/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/numeric-comparisons/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/schema-check/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/set-membership/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/using-parquet-data/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/scripts/post-render.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/styles.css +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/actions.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/assertions.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/briefs.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/cli-data-inspection.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/cli-data-validation.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/cli-reference.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/col-summary-tbl.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/column-selection-patterns.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/draft-validation.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/expressions.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/extracts.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/index.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/installation.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/langs.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/mcp-quick-start.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/missing-vals-tbl.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/preprocessing.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/preview.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/schema-validation.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/segmentation.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/step-reports.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/sundering.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/thresholds.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/validation-methods.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/validation-overview.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/yaml-reference.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/yaml-validation-workflows.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/images/pointblank-tabular-report.png +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/images/pointblank_logo.svg +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/__init__.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_constants.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_datascan_utils.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_typing.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_utils_check_args.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_utils_html.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/actions.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/assistant.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/cli.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/column.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/compare.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/api-docs.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/game_revenue-duckdb.zip +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/game_revenue.zip +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/global_sales-duckdb.zip +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/global_sales.zip +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/nycflights-duckdb.zip +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/nycflights.zip +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/polars-api-docs.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/small_table-duckdb.zip +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/small_table.zip +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/datascan.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/draft.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/scan_profile.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/scan_profile_stats.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/schema.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/segments.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/thresholds.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/yaml.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/dependency_links.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/entry_points.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/requires.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/top_level.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank_mcp_server/pointblank_server.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pointblank_mcp_server/readme.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/pyproject.toml +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/setup.cfg +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/__init__.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/manual_tests/schema_step_reports.qmd +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_datascan/test_col_summary_tbl_duckdb_snap/col_summary_html_duckdb.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_datascan/test_col_summary_tbl_pandas_snap/col_summary_html_pandas.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_datascan/test_col_summary_tbl_polars_snap/col_summary_html_polars.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_01/schema_step_report_01-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_01_1/schema_step_report_01-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_01_2/schema_step_report_01-2.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_01_3/schema_step_report_01-3.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_02/schema_step_report_02-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_02_1/schema_step_report_02-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_02_2/schema_step_report_02-2.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_02_3/schema_step_report_02-3.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_03/schema_step_report_03-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_03_1/schema_step_report_03-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_03_2/schema_step_report_03-2.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_03_3/schema_step_report_03-3.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_04/schema_step_report_04-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_05/schema_step_report_05-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_06/schema_step_report_06-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_07/schema_step_report_07-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_08/schema_step_report_08-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_09/schema_step_report_09-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_10/schema_step_report_10-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_11/schema_step_report_11-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_12/schema_step_report_12-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_13/schema_step_report_13-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_14/schema_step_report_14-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_14_1/schema_step_report_14-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_15/schema_step_report_15-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_15_1/schema_step_report_15-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_16/schema_step_report_16-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_16_1/schema_step_report_16-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_17/schema_step_report_17-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_17_1/schema_step_report_17-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_18/schema_step_report_18-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_18_1/schema_step_report_18-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_19/schema_step_report_19-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_19_1/schema_step_report_19-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_20/schema_step_report_20-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_20_1/schema_step_report_20-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_21/schema_step_report_21-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_21_1/schema_step_report_21-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_21_2/schema_step_report_21-2.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_21_3/schema_step_report_21-3.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_22/schema_step_report_22-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_22_1/schema_step_report_22-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_23/schema_step_report_23-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_23_1/schema_step_report_23-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_24/schema_step_report_24-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_24_1/schema_step_report_24-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_24_2/schema_step_report_24-2.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_24_3/schema_step_report_24-3.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25/schema_step_report_25-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_1/schema_step_report_25-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_2/schema_step_report_25-2.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_3/schema_step_report_25-3.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_4/schema_step_report_25-4.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_5/schema_step_report_25-5.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_01-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_02-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_03-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_04-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_05-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_06-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_07-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_08-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_09-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_10-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_11-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_12-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_13-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-2.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-3.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-2.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-3.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-0.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-1.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-2.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-3.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-4.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-5.txt +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_no_interrogation_validation_report_html_snap/no_interrogation_validation_report.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_no_steps_validation_report_html_snap/no_steps_validation_report.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_briefs_global_local_html/validation_report_briefs_global_local.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_briefs_html/validation_report_with_briefs.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_parquet/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pd/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pl/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_parquet/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pd/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pl/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_html/duckdb/validation_report_segments.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_html/pandas/validation_report_segments.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_html/polars/validation_report_segments.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/polars/validation_report_segments_with_pre.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/validation_report_segments_with_pre.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_duckdb/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_parquet/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pd/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pl/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pyspark/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_sqlite/validation_report.json +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_with_selector_helper_functions_no_match_snap/tbl_memtable_variable_names/selector_helper_functions_no_match.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_with_selector_helper_functions_no_match_snap/tbl_pd_variable_names/selector_helper_functions_no_match.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_with_selector_helper_functions_no_match_snap/tbl_pl_variable_names/selector_helper_functions_no_match.html +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/parquet_data/data_a.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/parquet_data/data_b.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/parquet_data/subdir/nested_data.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=cancelled/0.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=delivered/0.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=pending/0.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=returned/0.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=shipped/0.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_small_table/f=high/0.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_small_table/f=low/0.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_small_table/f=mid/0.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/taxi_part_01.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/taxi_part_02.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/taxi_part_03.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/taxi_sample.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_dates_times_text.ddb +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_dates_times_text.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_dates_times_text.sqlite +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_true_dates_times.ddb +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz.ddb +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz.sqlite +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz_missing.ddb +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz_missing.parquet +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz_missing.sqlite +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test__interrogation.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test__utils.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test__utils_check_args.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_actions.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_assistant.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_cli.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_column.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_compare.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_datascan.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_draft.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_mcp_integration.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_mcp_server.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_meta.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_schema.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_segments.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_thresholds.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_yaml.py +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.ar.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.de.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.es.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.fr.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.hi.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.it.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.ja.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.ko.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.nl.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.pt-BR.md +0 -0
- {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.zh-CN.md +0 -0
|
@@ -512,6 +512,60 @@ EXPECT_FAIL_TEXT = {
|
|
|
512
512
|
"hi": "{column_text} में मान नियमित अभिव्यक्ति से मेल खाने चाहिए थे: {values_text}, ऐसे असफल परीक्षण इकाइयों की अधिकता।",
|
|
513
513
|
"el": "Υπέρβαση αποτυχημένων μονάδων δοκιμής όπου οι τιμές στη στήλη {column_text} θα έπρεπε να ταιριάζουν με την κανονική έκφραση: {values_text}.",
|
|
514
514
|
},
|
|
515
|
+
"regex_inverse_expectation_text": {
|
|
516
|
+
"en": "Expect that values in {column_text} should not match the regular expression: {values_text}.",
|
|
517
|
+
"fr": "On s'attend à ce que les valeurs de {column_text} ne correspondent pas à l'expression régulière : {values_text}.",
|
|
518
|
+
"de": "Erwarten Sie, dass die Werte in {column_text} nicht mit dem regulären Ausdruck {values_text} übereinstimmen.",
|
|
519
|
+
"it": "Aspettati che i valori in {column_text} non debbano corrispondere all'espressione regolare: {values_text}.",
|
|
520
|
+
"es": "Se espera que los valores en {column_text} no coincidan con la expresión regular: {values_text}.",
|
|
521
|
+
"pt": "Espera-se que os valores em {column_text} não concorde com a expressão regular: {values_text}.",
|
|
522
|
+
"ro": "Se așteaptă ca valorile din {column_text} să nu corespundă expresiei regulate: {values_text}.",
|
|
523
|
+
"tr": "Beklenti, {column_text} 'deki değerlerin şu normal ifadeyle eşleşmemesi gerektiğidir: {values_text}.",
|
|
524
|
+
"zh-Hans": "预期在{column_text} 的值不应当匹配正则表达式。",
|
|
525
|
+
"zh-Hant": "{column_text}之值不應該匹配正則表達式。",
|
|
526
|
+
"ja": "{column_text}の値が正規表現: {values_text}に一致しないことを期待します。",
|
|
527
|
+
"ko": "{column_text}의 값이 정규식 {values_text}와 일치하지 않아야 합니다.",
|
|
528
|
+
"vi": "Kỳ vọng các giá trị trong {column_text} không được khớp với biểu thức chính quy: {values_text}.",
|
|
529
|
+
"ru": "Ожидайте, что значения в {column_text} не должны соответствовать регулярному выражению: {values_text}.",
|
|
530
|
+
"cs": "Očekává se, že hodnoty ve sloupci {column_text} nebudou odpovídat regulárnímu výrazu: {values_text}.",
|
|
531
|
+
"pl": "Spodziewaj się, że wartości w {column_text} nie powinny byc zgodne z wyrażeniem regularnym: {values_text}.",
|
|
532
|
+
"da": "Forvent at værdierne i {column_text} ikke stemmer overens med følgende regular expression: {values_text}.",
|
|
533
|
+
"sv": "Förvänta dig att värdena i {column_text} inte ska matcha följande reguljära uttryck: {values_text}.",
|
|
534
|
+
"nb": "Forvent at verdier i {column_text} ikke skal samsvare med regulæruttrykket: {values_text}.",
|
|
535
|
+
"nl": "Verwacht dat de waarden in {column_text} niet overeenkomen met de reguliere expressie {values_text}.",
|
|
536
|
+
"fi": "Odota, että arvot sarakkeessa {column_text} eivät vastaa säännöllistä lauseketta: {values_text}.",
|
|
537
|
+
"is": "Væntir þess að gildi í {column_text} passi ekki við reglulega segðina: {values_text}.",
|
|
538
|
+
"ar": "توقع ألا تتطابق القيم في {column_text} مع التعبير المنتظم: {values_text}.",
|
|
539
|
+
"hi": "अपेक्षा है कि {column_text} में मान नियमित अभिव्यक्ति से मेल नहीं खाने चाहिए: {values_text}।",
|
|
540
|
+
"el": "Αναμένεται οι τιμές στη στήλη {column_text} να μην ταιριάζουν με την κανονική έκφραση: {values_text}.",
|
|
541
|
+
},
|
|
542
|
+
"regex_inverse_failure_text": {
|
|
543
|
+
"en": "Exceedance of failed test units where values in {column_text} should not have matched the regular expression: {values_text}.",
|
|
544
|
+
"fr": "Dépassement des unités de test ayant échoué où les valeurs dans {column_text} n'auraient pas dû correspondre à l'expression régulière : {values_text}.",
|
|
545
|
+
"de": "Überschreitung fehlgeschlagener Testeinheiten, bei denen die Werte in {column_text} nicht mit dem regulären Ausdruck {values_text} übereinstimmen sollten.",
|
|
546
|
+
"it": "Superamento delle unità di test non riuscite in cui i valori in {column_text} non avrebbero dovuto corrispondere all'espressione regolare: {values_text}.",
|
|
547
|
+
"es": "Se superó el número de unidades de prueba fallidas en que los valores en {column_text} no deberían coincidir con la expresión regular: {values_text}.",
|
|
548
|
+
"pt": "Excedeu o número de unidades de teste com falha onde os valores em {column_text} não deve concordar com a expressão regular: {values_text}.",
|
|
549
|
+
"ro": "Depășirea unităților de test eșuate unde valorile din {column_text} nu ar fi trebuit să corespundă expresiei regulate: {values_text}.",
|
|
550
|
+
"tr": "{column_text} daki değerlerin normal ifade {values_text} ile eşleşmemesi gereken başarısız test birimlerinin aşılması.",
|
|
551
|
+
"zh-Hans": "错误过多,其中{column_text}中的值不应当匹配正则表达式。",
|
|
552
|
+
"zh-Hant": "錯誤過多,{column_text}之值不應該匹配正則表達式。",
|
|
553
|
+
"ja": "{column_text}の値が正規表現: {values_text}に一致すべきでないテスト単位の失敗の超過。",
|
|
554
|
+
"ko": "{column_text}의 값이 정규식 {values_text}와 일치하지 않았어야 했던 실패한 테스트 단위 초과.",
|
|
555
|
+
"vi": "Vượt quá số đơn vị kiểm tra thất bại trong đó các giá trị trong {column_text} đáng lẽ không được khớp với biểu thức chính quy: {values_text}.",
|
|
556
|
+
"ru": "Превышение неудачных тестовых единиц, где значения в {column_text} не должны были соответствовать регулярному выражению: {values_text}.",
|
|
557
|
+
"cs": "Překročení počtu neúspěšných testů, kde hodnoty ve sloupci {column_text} neměly odpovídat regulárnímu výrazu: {values_text}.",
|
|
558
|
+
"pl": "Wystapiło przekroczenie liczby jednostek testowych zakończonych niepowodzeniem, w przypadku których wartości w {column_text} nie powinny odpowiadac wyrażeniu regularnemu: {values_text}.",
|
|
559
|
+
"da": "Overskridelse af antallet af fejlslagne testenheder, hvor værdier {column_text} ikke skulle have været i overensstemmelse med følgende regular expression: {values_text}.",
|
|
560
|
+
"sv": "Överskrider antalet misslyckade testenheter där värden {column_text} inte borde ha matchat följande reguljära uttryck: {values_text}.",
|
|
561
|
+
"nb": "Overskridelse av mislykkede testenheter hvor verdier i {column_text} ikke skulle ha samsvart med regulæruttrykket: {values_text}.",
|
|
562
|
+
"nl": "Overschrijding van mislukte testeenheden waarbij waarden in {column_text} niet overeen mogen komen met de reguliere expressie: {values_text}.",
|
|
563
|
+
"fi": "Epäonnistuneiden testiyksikköjen ylitys, joissa sarakkeen {column_text} arvojen ei olisi pitänyt vastata säännöllistä lauseketta: {values_text}.",
|
|
564
|
+
"is": "Of mörg misheppnuð próf þar sem gildi í {column_text} hefðu ekki átt að passa við reglulega segðina: {values_text}.",
|
|
565
|
+
"ar": "تجاوز وحدات الاختبار الفاشلة حيث كان يجب ألا تتطابق القيم في {column_text} مع التعبير المنتظم: {values_text}.",
|
|
566
|
+
"hi": "{column_text} में मान नियमित अभिव्यक्ति से मेल नहीं खाने चाहिए थे: {values_text}, ऐसे असफल परीक्षण इकाइयों की अधिकता।",
|
|
567
|
+
"el": "Υπέρβαση αποτυχημένων μονάδων δοκιμής όπου οι τιμές στη στήλη {column_text} δεν θα έπρεπε να ταιριάζουν με την κανονική έκφραση: {values_text}.",
|
|
568
|
+
},
|
|
515
569
|
"col_vals_expr_expectation_text": {
|
|
516
570
|
"en": "Expect that values should agree with the given Python expression.",
|
|
517
571
|
"fr": "On s'attend à ce que les valeurs soient en accord avec l'expression Python donnée.",
|
|
@@ -1688,15 +1688,30 @@ def interrogate_notin(tbl: FrameT, column: str, set_values: any) -> FrameT:
|
|
|
1688
1688
|
return result_tbl.to_native()
|
|
1689
1689
|
|
|
1690
1690
|
|
|
1691
|
-
def interrogate_regex(tbl: FrameT, column: str,
|
|
1691
|
+
def interrogate_regex(tbl: FrameT, column: str, values: dict | str, na_pass: bool) -> FrameT:
|
|
1692
1692
|
"""Regex interrogation."""
|
|
1693
1693
|
|
|
1694
|
+
# Handle both old and new formats for backward compatibility
|
|
1695
|
+
if isinstance(values, str):
|
|
1696
|
+
pattern = values
|
|
1697
|
+
inverse = False
|
|
1698
|
+
else:
|
|
1699
|
+
pattern = values["pattern"]
|
|
1700
|
+
inverse = values["inverse"]
|
|
1701
|
+
|
|
1694
1702
|
nw_tbl = nw.from_native(tbl)
|
|
1695
1703
|
result_tbl = nw_tbl.with_columns(
|
|
1696
1704
|
pb_is_good_1=nw.col(column).is_null() & na_pass,
|
|
1697
1705
|
pb_is_good_2=nw.col(column).str.contains(pattern, literal=False).fill_null(False),
|
|
1698
1706
|
)
|
|
1699
1707
|
|
|
1708
|
+
# Apply inverse logic if needed
|
|
1709
|
+
if inverse:
|
|
1710
|
+
# Use explicit boolean logic instead of bitwise NOT for pandas compatibility
|
|
1711
|
+
result_tbl = result_tbl.with_columns(
|
|
1712
|
+
pb_is_good_2=nw.when(nw.col("pb_is_good_2")).then(False).otherwise(True)
|
|
1713
|
+
)
|
|
1714
|
+
|
|
1700
1715
|
result_tbl = result_tbl.with_columns(
|
|
1701
1716
|
pb_is_good_=nw.col("pb_is_good_1") | nw.col("pb_is_good_2")
|
|
1702
1717
|
).drop("pb_is_good_1", "pb_is_good_2")
|
|
@@ -240,6 +240,46 @@ def _select_df_lib(preference: str = "polars") -> Any:
|
|
|
240
240
|
return pl if pl is not None else pd
|
|
241
241
|
|
|
242
242
|
|
|
243
|
+
def _copy_dataframe(df):
|
|
244
|
+
"""
|
|
245
|
+
Create a copy of a DataFrame, handling different DataFrame types.
|
|
246
|
+
|
|
247
|
+
This function attempts to create a proper copy of the DataFrame using
|
|
248
|
+
the most appropriate method for each DataFrame type.
|
|
249
|
+
"""
|
|
250
|
+
# Try standard copy methods first
|
|
251
|
+
if hasattr(df, "copy") and callable(getattr(df, "copy")):
|
|
252
|
+
try:
|
|
253
|
+
return df.copy()
|
|
254
|
+
except Exception:
|
|
255
|
+
pass
|
|
256
|
+
|
|
257
|
+
if hasattr(df, "clone") and callable(getattr(df, "clone")):
|
|
258
|
+
try:
|
|
259
|
+
return df.clone()
|
|
260
|
+
except Exception:
|
|
261
|
+
pass
|
|
262
|
+
|
|
263
|
+
# Try the select('*') approach for DataFrames that support it
|
|
264
|
+
# This works well for PySpark and other SQL-like DataFrames
|
|
265
|
+
if hasattr(df, "select") and callable(getattr(df, "select")):
|
|
266
|
+
try:
|
|
267
|
+
return df.select("*")
|
|
268
|
+
except Exception:
|
|
269
|
+
pass
|
|
270
|
+
|
|
271
|
+
# For DataFrames that can't be copied, return original
|
|
272
|
+
# This provides some protection while avoiding crashes
|
|
273
|
+
try:
|
|
274
|
+
import copy
|
|
275
|
+
|
|
276
|
+
return copy.deepcopy(df)
|
|
277
|
+
except Exception:
|
|
278
|
+
# If all else fails, return the original DataFrame
|
|
279
|
+
# This is better than crashing the validation
|
|
280
|
+
return df
|
|
281
|
+
|
|
282
|
+
|
|
243
283
|
def _convert_to_narwhals(df: FrameT) -> nw.DataFrame:
|
|
244
284
|
# Convert the DataFrame to a format that narwhals can work with
|
|
245
285
|
return nw.from_native(df)
|
|
@@ -10,6 +10,7 @@ import re
|
|
|
10
10
|
import tempfile
|
|
11
11
|
import threading
|
|
12
12
|
from dataclasses import dataclass
|
|
13
|
+
from enum import Enum
|
|
13
14
|
from importlib.metadata import version
|
|
14
15
|
from typing import TYPE_CHECKING, Any, Callable, Literal
|
|
15
16
|
from zipfile import ZipFile
|
|
@@ -74,6 +75,7 @@ from pointblank._utils import (
|
|
|
74
75
|
_check_any_df_lib,
|
|
75
76
|
_check_invalid_fields,
|
|
76
77
|
_column_test_prep,
|
|
78
|
+
_copy_dataframe,
|
|
77
79
|
_count_null_values_in_column,
|
|
78
80
|
_count_true_values_in_column,
|
|
79
81
|
_derive_bounds,
|
|
@@ -2650,6 +2652,48 @@ def get_column_count(data: FrameT | Any) -> int:
|
|
|
2650
2652
|
raise ValueError("The input table type supplied in `data=` is not supported.")
|
|
2651
2653
|
|
|
2652
2654
|
|
|
2655
|
+
def _extract_enum_values(set_values: Any) -> list[Any]:
|
|
2656
|
+
"""
|
|
2657
|
+
Extract values from Enum classes or collections containing Enum instances.
|
|
2658
|
+
|
|
2659
|
+
This helper function handles:
|
|
2660
|
+
1. Enum classes: extracts all enum values
|
|
2661
|
+
2. Collections containing Enum instances: extracts their values
|
|
2662
|
+
3. Regular collections: returns as-is
|
|
2663
|
+
|
|
2664
|
+
Parameters
|
|
2665
|
+
----------
|
|
2666
|
+
set_values
|
|
2667
|
+
The input collection that may contain Enum class or Enum instances.
|
|
2668
|
+
|
|
2669
|
+
Returns
|
|
2670
|
+
-------
|
|
2671
|
+
list[Any]
|
|
2672
|
+
A list of extracted values
|
|
2673
|
+
"""
|
|
2674
|
+
from collections.abc import Collection
|
|
2675
|
+
|
|
2676
|
+
# Check if set_values is an Enum class (not an instance)
|
|
2677
|
+
if inspect.isclass(set_values) and issubclass(set_values, Enum):
|
|
2678
|
+
# Extract all values from the Enum class
|
|
2679
|
+
return [enum_member.value for enum_member in set_values]
|
|
2680
|
+
|
|
2681
|
+
# Check if set_values is a collection
|
|
2682
|
+
if isinstance(set_values, Collection) and not isinstance(set_values, (str, bytes)):
|
|
2683
|
+
extracted_values = []
|
|
2684
|
+
for item in set_values:
|
|
2685
|
+
if isinstance(item, Enum):
|
|
2686
|
+
# If item is an Enum instance, extract its value
|
|
2687
|
+
extracted_values.append(item.value)
|
|
2688
|
+
else:
|
|
2689
|
+
# If item is not an Enum instance, keep as-is
|
|
2690
|
+
extracted_values.append(item)
|
|
2691
|
+
return extracted_values
|
|
2692
|
+
|
|
2693
|
+
# If set_values is neither an Enum class nor a collection, return as list
|
|
2694
|
+
return [set_values]
|
|
2695
|
+
|
|
2696
|
+
|
|
2653
2697
|
def get_row_count(data: FrameT | Any) -> int:
|
|
2654
2698
|
"""
|
|
2655
2699
|
Get the number of rows in a table.
|
|
@@ -6332,7 +6376,10 @@ class Validate:
|
|
|
6332
6376
|
multiple columns are supplied or resolved, there will be a separate validation step
|
|
6333
6377
|
generated for each column.
|
|
6334
6378
|
set
|
|
6335
|
-
A
|
|
6379
|
+
A collection of values to compare against. Can be a list of values, a Python Enum class,
|
|
6380
|
+
or a collection containing Enum instances. When an Enum class is provided, all enum
|
|
6381
|
+
values will be used. When a collection contains Enum instances, their values will be
|
|
6382
|
+
extracted automatically.
|
|
6336
6383
|
pre
|
|
6337
6384
|
An optional preprocessing function or lambda to apply to the data table during
|
|
6338
6385
|
interrogation. This function should take a table as input and return a modified table.
|
|
@@ -6509,12 +6556,69 @@ class Validate:
|
|
|
6509
6556
|
|
|
6510
6557
|
The validation table reports two failing test units. The specific failing cases are for the
|
|
6511
6558
|
column `b` values of `8` and `1`, which are not in the set of `[2, 3, 4, 5, 6]`.
|
|
6559
|
+
|
|
6560
|
+
**Using Python Enums**
|
|
6561
|
+
|
|
6562
|
+
The `col_vals_in_set()` method also supports Python Enum classes and instances, which can
|
|
6563
|
+
make validations more readable and maintainable:
|
|
6564
|
+
|
|
6565
|
+
```{python}
|
|
6566
|
+
from enum import Enum
|
|
6567
|
+
|
|
6568
|
+
class Color(Enum):
|
|
6569
|
+
RED = "red"
|
|
6570
|
+
GREEN = "green"
|
|
6571
|
+
BLUE = "blue"
|
|
6572
|
+
|
|
6573
|
+
# Create a table with color data
|
|
6574
|
+
tbl_colors = pl.DataFrame({
|
|
6575
|
+
"product": ["shirt", "pants", "hat", "shoes"],
|
|
6576
|
+
"color": ["red", "blue", "green", "yellow"]
|
|
6577
|
+
})
|
|
6578
|
+
|
|
6579
|
+
# Validate using an Enum class (all enum values are allowed)
|
|
6580
|
+
validation = (
|
|
6581
|
+
pb.Validate(data=tbl_colors)
|
|
6582
|
+
.col_vals_in_set(columns="color", set=Color)
|
|
6583
|
+
.interrogate()
|
|
6584
|
+
)
|
|
6585
|
+
|
|
6586
|
+
validation
|
|
6587
|
+
```
|
|
6588
|
+
|
|
6589
|
+
This validation will fail for the `"yellow"` value since it's not in the `Color` enum.
|
|
6590
|
+
|
|
6591
|
+
You can also use specific Enum instances or mix them with regular values:
|
|
6592
|
+
|
|
6593
|
+
```{python}
|
|
6594
|
+
# Validate using specific Enum instances
|
|
6595
|
+
validation = (
|
|
6596
|
+
pb.Validate(data=tbl_colors)
|
|
6597
|
+
.col_vals_in_set(columns="color", set=[Color.RED, Color.BLUE])
|
|
6598
|
+
.interrogate()
|
|
6599
|
+
)
|
|
6600
|
+
|
|
6601
|
+
# Mix Enum instances with regular values
|
|
6602
|
+
validation = (
|
|
6603
|
+
pb.Validate(data=tbl_colors)
|
|
6604
|
+
.col_vals_in_set(columns="color", set=[Color.RED, Color.BLUE, "yellow"])
|
|
6605
|
+
.interrogate()
|
|
6606
|
+
)
|
|
6607
|
+
|
|
6608
|
+
validation
|
|
6609
|
+
```
|
|
6610
|
+
|
|
6611
|
+
In this case, the `"green"` value will cause a failing test unit since it's not part of the
|
|
6612
|
+
specified set.
|
|
6512
6613
|
"""
|
|
6513
6614
|
|
|
6514
6615
|
assertion_type = _get_fn_name()
|
|
6515
6616
|
|
|
6516
6617
|
_check_column(column=columns)
|
|
6517
6618
|
|
|
6619
|
+
# Extract values from Enum classes or Enum instances if present
|
|
6620
|
+
set = _extract_enum_values(set)
|
|
6621
|
+
|
|
6518
6622
|
for val in set:
|
|
6519
6623
|
if val is None:
|
|
6520
6624
|
continue
|
|
@@ -6565,7 +6669,7 @@ class Validate:
|
|
|
6565
6669
|
def col_vals_not_in_set(
|
|
6566
6670
|
self,
|
|
6567
6671
|
columns: str | list[str] | Column | ColumnSelector | ColumnSelectorNarwhals,
|
|
6568
|
-
set:
|
|
6672
|
+
set: Collection[Any],
|
|
6569
6673
|
pre: Callable | None = None,
|
|
6570
6674
|
segments: SegmentSpec | None = None,
|
|
6571
6675
|
thresholds: int | float | bool | tuple | dict | Thresholds = None,
|
|
@@ -6589,7 +6693,10 @@ class Validate:
|
|
|
6589
6693
|
multiple columns are supplied or resolved, there will be a separate validation step
|
|
6590
6694
|
generated for each column.
|
|
6591
6695
|
set
|
|
6592
|
-
A
|
|
6696
|
+
A collection of values to compare against. Can be a list of values, a Python Enum class,
|
|
6697
|
+
or a collection containing Enum instances. When an Enum class is provided, all enum
|
|
6698
|
+
values will be used. When a collection contains Enum instances, their values will be
|
|
6699
|
+
extracted automatically.
|
|
6593
6700
|
pre
|
|
6594
6701
|
An optional preprocessing function or lambda to apply to the data table during
|
|
6595
6702
|
interrogation. This function should take a table as input and return a modified table.
|
|
@@ -6767,11 +6874,45 @@ class Validate:
|
|
|
6767
6874
|
|
|
6768
6875
|
The validation table reports two failing test units. The specific failing cases are for the
|
|
6769
6876
|
column `b` values of `2` and `6`, both of which are in the set of `[2, 3, 4, 5, 6]`.
|
|
6877
|
+
|
|
6878
|
+
**Using Python Enums**
|
|
6879
|
+
|
|
6880
|
+
Like `col_vals_in_set()`, this method also supports Python Enum classes and instances:
|
|
6881
|
+
|
|
6882
|
+
```{python}
|
|
6883
|
+
from enum import Enum
|
|
6884
|
+
|
|
6885
|
+
class InvalidStatus(Enum):
|
|
6886
|
+
DELETED = "deleted"
|
|
6887
|
+
ARCHIVED = "archived"
|
|
6888
|
+
|
|
6889
|
+
# Create a table with status data
|
|
6890
|
+
status_table = pl.DataFrame({
|
|
6891
|
+
"product": ["widget", "gadget", "tool", "device"],
|
|
6892
|
+
"status": ["active", "pending", "deleted", "active"]
|
|
6893
|
+
})
|
|
6894
|
+
|
|
6895
|
+
# Validate that no values are in the invalid status set
|
|
6896
|
+
validation = (
|
|
6897
|
+
pb.Validate(data=status_table)
|
|
6898
|
+
.col_vals_not_in_set(columns="status", set=InvalidStatus)
|
|
6899
|
+
.interrogate()
|
|
6900
|
+
)
|
|
6901
|
+
|
|
6902
|
+
validation
|
|
6903
|
+
```
|
|
6904
|
+
|
|
6905
|
+
This `"deleted"` value in the `status` column will fail since it matches one of the invalid
|
|
6906
|
+
statuses in the `InvalidStatus` enum.
|
|
6770
6907
|
"""
|
|
6771
6908
|
|
|
6772
6909
|
assertion_type = _get_fn_name()
|
|
6773
6910
|
|
|
6774
6911
|
_check_column(column=columns)
|
|
6912
|
+
|
|
6913
|
+
# Extract values from Enum classes or Enum instances if present
|
|
6914
|
+
set = _extract_enum_values(set)
|
|
6915
|
+
|
|
6775
6916
|
_check_set_types(set=set)
|
|
6776
6917
|
_check_pre(pre=pre)
|
|
6777
6918
|
# TODO: add check for segments
|
|
@@ -7305,6 +7446,7 @@ class Validate:
|
|
|
7305
7446
|
columns: str | list[str] | Column | ColumnSelector | ColumnSelectorNarwhals,
|
|
7306
7447
|
pattern: str,
|
|
7307
7448
|
na_pass: bool = False,
|
|
7449
|
+
inverse: bool = False,
|
|
7308
7450
|
pre: Callable | None = None,
|
|
7309
7451
|
segments: SegmentSpec | None = None,
|
|
7310
7452
|
thresholds: int | float | bool | tuple | dict | Thresholds = None,
|
|
@@ -7332,6 +7474,9 @@ class Validate:
|
|
|
7332
7474
|
na_pass
|
|
7333
7475
|
Should any encountered None, NA, or Null values be considered as passing test units? By
|
|
7334
7476
|
default, this is `False`. Set to `True` to pass test units with missing values.
|
|
7477
|
+
inverse
|
|
7478
|
+
Should the validation step be inverted? If `True`, then the expectation is that column
|
|
7479
|
+
values should *not* match the specified `pattern=` regex.
|
|
7335
7480
|
pre
|
|
7336
7481
|
An optional preprocessing function or lambda to apply to the data table during
|
|
7337
7482
|
interrogation. This function should take a table as input and return a modified table.
|
|
@@ -7518,6 +7663,7 @@ class Validate:
|
|
|
7518
7663
|
# _check_segments(segments=segments)
|
|
7519
7664
|
_check_thresholds(thresholds=thresholds)
|
|
7520
7665
|
_check_boolean_input(param=na_pass, param_name="na_pass")
|
|
7666
|
+
_check_boolean_input(param=inverse, param_name="inverse")
|
|
7521
7667
|
_check_boolean_input(param=active, param_name="active")
|
|
7522
7668
|
|
|
7523
7669
|
# Determine threshold to use (global or local) and normalize a local `thresholds=` value
|
|
@@ -7537,12 +7683,15 @@ class Validate:
|
|
|
7537
7683
|
# Determine brief to use (global or local) and transform any shorthands of `brief=`
|
|
7538
7684
|
brief = self.brief if brief is None else _transform_auto_brief(brief=brief)
|
|
7539
7685
|
|
|
7686
|
+
# Package up the `pattern=` and boolean params into a dictionary for later interrogation
|
|
7687
|
+
values = {"pattern": pattern, "inverse": inverse}
|
|
7688
|
+
|
|
7540
7689
|
# Iterate over the columns and create a validation step for each
|
|
7541
7690
|
for column in columns:
|
|
7542
7691
|
val_info = _ValidationInfo(
|
|
7543
7692
|
assertion_type=assertion_type,
|
|
7544
7693
|
column=column,
|
|
7545
|
-
values=
|
|
7694
|
+
values=values,
|
|
7546
7695
|
na_pass=na_pass,
|
|
7547
7696
|
pre=pre,
|
|
7548
7697
|
segments=segments,
|
|
@@ -9838,8 +9987,9 @@ class Validate:
|
|
|
9838
9987
|
validation.active = False
|
|
9839
9988
|
continue
|
|
9840
9989
|
|
|
9841
|
-
# Make a copy of the table for this step
|
|
9842
|
-
|
|
9990
|
+
# Make a deep copy of the table for this step to ensure proper isolation
|
|
9991
|
+
# This prevents modifications from one validation step affecting others
|
|
9992
|
+
data_tbl_step = _copy_dataframe(data_tbl)
|
|
9843
9993
|
|
|
9844
9994
|
# ------------------------------------------------
|
|
9845
9995
|
# Preprocessing stage
|
|
@@ -10006,7 +10156,7 @@ class Validate:
|
|
|
10006
10156
|
|
|
10007
10157
|
elif assertion_type == "col_vals_regex":
|
|
10008
10158
|
results_tbl = interrogate_regex(
|
|
10009
|
-
tbl=tbl, column=column,
|
|
10159
|
+
tbl=tbl, column=column, values=value, na_pass=na_pass
|
|
10010
10160
|
)
|
|
10011
10161
|
|
|
10012
10162
|
elif assertion_type == "col_vals_expr":
|
|
@@ -12569,6 +12719,11 @@ class Validate:
|
|
|
12569
12719
|
elif assertion_type[i] in ["specially"]:
|
|
12570
12720
|
values_upd.append("EXPR")
|
|
12571
12721
|
|
|
12722
|
+
elif assertion_type[i] in ["col_vals_regex"]:
|
|
12723
|
+
pattern = value["pattern"]
|
|
12724
|
+
|
|
12725
|
+
values_upd.append(str(pattern))
|
|
12726
|
+
|
|
12572
12727
|
# If the assertion type is not recognized, add the value as a string
|
|
12573
12728
|
else:
|
|
12574
12729
|
values_upd.append(str(value))
|
|
@@ -14218,15 +14373,30 @@ def _create_text_null(
|
|
|
14218
14373
|
|
|
14219
14374
|
|
|
14220
14375
|
def _create_text_regex(
|
|
14221
|
-
lang: str, column: str | None, pattern: str, for_failure: bool = False
|
|
14376
|
+
lang: str, column: str | None, pattern: str | dict, for_failure: bool = False
|
|
14222
14377
|
) -> str:
|
|
14223
14378
|
type_ = _expect_failure_type(for_failure=for_failure)
|
|
14224
14379
|
|
|
14225
14380
|
column_text = _prep_column_text(column=column)
|
|
14226
14381
|
|
|
14227
|
-
|
|
14382
|
+
# Handle case where pattern is a dictionary containing `pattern` and `inverse`
|
|
14383
|
+
if isinstance(pattern, dict):
|
|
14384
|
+
pattern_str = pattern["pattern"]
|
|
14385
|
+
inverse = pattern.get("inverse", False)
|
|
14386
|
+
else:
|
|
14387
|
+
# For backward compatibility, assume it's just the pattern string
|
|
14388
|
+
pattern_str = pattern
|
|
14389
|
+
inverse = False
|
|
14390
|
+
|
|
14391
|
+
# Use inverse-specific translations if inverse=True
|
|
14392
|
+
if inverse:
|
|
14393
|
+
text_key = f"regex_inverse_{type_}_text"
|
|
14394
|
+
else:
|
|
14395
|
+
text_key = f"regex_{type_}_text"
|
|
14396
|
+
|
|
14397
|
+
return EXPECT_FAIL_TEXT[text_key][lang].format(
|
|
14228
14398
|
column_text=column_text,
|
|
14229
|
-
values_text=
|
|
14399
|
+
values_text=pattern_str,
|
|
14230
14400
|
)
|
|
14231
14401
|
|
|
14232
14402
|
|
|
@@ -15379,7 +15549,8 @@ def _step_report_row_based(
|
|
|
15379
15549
|
elements = ", ".join(values)
|
|
15380
15550
|
text = f"{column} ∉ {{{elements}}}"
|
|
15381
15551
|
elif assertion_type == "col_vals_regex":
|
|
15382
|
-
|
|
15552
|
+
pattern = values["pattern"]
|
|
15553
|
+
text = STEP_REPORT_TEXT["column_matches_regex"][lang].format(column=column, values=pattern)
|
|
15383
15554
|
elif assertion_type == "col_vals_null":
|
|
15384
15555
|
text = STEP_REPORT_TEXT["column_is_null"][lang].format(column=column)
|
|
15385
15556
|
elif assertion_type == "col_vals_not_null":
|
|
@@ -171,7 +171,6 @@ images/pointblank-tabular-report.png
|
|
|
171
171
|
images/pointblank_logo.svg
|
|
172
172
|
pointblank/__init__.py
|
|
173
173
|
pointblank/_constants.py
|
|
174
|
-
pointblank/_constants_docs.py
|
|
175
174
|
pointblank/_constants_translations.py
|
|
176
175
|
pointblank/_datascan_utils.py
|
|
177
176
|
pointblank/_interrogation.py
|