pointblank 0.11.3__tar.gz → 0.11.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.11.3 → pointblank-0.11.4}/CITATION.cff +1 -1
- {pointblank-0.11.3 → pointblank-0.11.4}/PKG-INFO +1 -1
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/_quarto.yml +10 -0
- pointblank-0.11.4/docs/user-guide/yaml-validation-workflows.qmd +664 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/__init__.py +9 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/cli.py +226 -77
- pointblank-0.11.4/pointblank/yaml.py +1386 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank.egg-info/PKG-INFO +1 -1
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank.egg-info/SOURCES.txt +3 -0
- pointblank-0.11.4/tests/test_yaml.py +1688 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.github/CODE_OF_CONDUCT.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.github/ISSUE_TEMPLATE/bug.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.github/SECURITY.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.github/workflows/ci-docs.yaml +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.github/workflows/ci-tests.yaml +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.github/workflows/code-checks.yaml +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.gitignore +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.pre-commit-config.yaml +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/.vscode/settings.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/CONTRIBUTING.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/LICENSE +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/Makefile +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/README.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/data_raw/game_revenue.csv +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/data_raw/global_sales.csv +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/data_raw/global_sales_dataset.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/data_raw/nycflights.csv +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/data_raw/small_table.csv +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/data_raw/worldcities.csv +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/data_raw/x-01-parquet.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/data_raw/x-02-duckdb.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/data_raw/x-03-sqlite.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/.gitignore +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/_extensions/machow/interlinks/.gitignore +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/_extensions/machow/interlinks/_extension.yml +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/_extensions/machow/interlinks/interlinks.lua +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/fav-logo.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-info-worldcities-csv.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-info-worldcities-github-csv.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-make-template.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-missing-worldcities-csv.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-preview-game_revenue-all-columns.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-preview-game_revenue-column-names.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-preview-game_revenue-column-range.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-preview-worldcities-csv-no-row-numbers.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-preview-worldcities-csv.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-run-worldcities_validation-extracts.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-run-worldcities_validation-fail-on-warning.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-run-worldcities_validation-output.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-run-worldcities_validation.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-scan-worldcities-csv.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-validate-exit-code.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-validate-multi-check.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-validate-rows-complete-worldcities-csv.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-validate-rows-distinct-worldcities-csv.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-validate-show-extract.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-validate-worldcities-gt-0-population.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-validate-worldcities-not-null-city_name.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pb-validate-write-extract.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.de.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.es.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.fr.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.it.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.ja.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.ko.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.nl.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.pt-BR.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-sales-data.zh-CN.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-step-report.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank-tabular-report.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/pointblank_logo.svg +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/posit-logo-black.svg +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/validation-table-diagram.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/validation-test-units.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/.gitignore +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-cicd-workflows.gif +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-cicd-workflows.tape +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-complete-workflow.gif +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-complete-workflow.tape +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-data-exploration.gif +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-data-exploration.tape +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-essential-validations.gif +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-essential-validations.tape +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-getting-started.gif +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-getting-started.tape +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-using-polars.gif +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/cli-using-polars.tape +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/assets/vhs/validation.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/all-about-actions/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/intro-pointblank/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/intro-pointblank/pointblank-localized.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/intro-pointblank/step_report.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/intro-pointblank/validation-table-diagram.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/intro-pointblank/validation-test-units.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/lets-workshop-together/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/overhauled-user-guide/advanced-in-sidebar.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/overhauled-user-guide/breadth-and-depth.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/overhauled-user-guide/explanation-of-visual.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/overhauled-user-guide/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/overhauled-user-guide/links-in-guide.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/overhauled-user-guide/segments.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/overhauled-user-guide/step-report.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/overhauled-user-guide/validation-three-things.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/pointblank_blog_logo.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/blog/validation-libs-2025/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/01-starter/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/02-advanced/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/03-data-extracts/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/04-sundered-data/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/05-step-report-column-check/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/06-step-report-schema-check/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/07-validation-with-actions/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/08-validation-with-final-actions/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/apply-checks-to-several-columns/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/check-for-freshness/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/check-row-column-counts/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/checks-for-missing/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/cli-interactive/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/col-vals-custom-expr/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/column-selector-functions/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/comparisons-across-columns/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/custom-validation-specially/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/data/game_revenue.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/expect-no-duplicate-rows/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/expect-no-duplicate-values/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/expect-text-pattern/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/failure-thresholds/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/img/advanced_validation.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/img/data_extracts.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/img/starter_validation.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/img/step_report_column_schema.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/img/step_report_column_values.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/img/sundered_data.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/img/validation_with_actions.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/img/validation_with_final_actions.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/mutate-table-in-step/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/numeric-comparisons/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/schema-check/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/set-membership/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/demos/using-parquet-data/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/scripts/post-render.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/styles.css +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/actions.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/assertions.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/briefs.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/cli-data-inspection.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/cli-data-validation.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/col-summary-tbl.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/column-selection-patterns.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/draft-validation.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/expressions.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/extracts.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/index.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/installation.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/langs.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/missing-vals-tbl.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/preprocessing.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/preview.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/schema-validation.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/segmentation.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/step-reports.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/sundering.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/thresholds.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/validation-methods.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/docs/user-guide/validation-overview.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/images/pointblank-tabular-report.png +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/images/pointblank_logo.svg +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/_constants.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/_constants_docs.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/_constants_translations.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/_datascan_utils.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/_interrogation.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/_typing.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/_utils.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/_utils_check_args.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/_utils_html.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/actions.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/assistant.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/column.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/compare.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/api-docs.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/game_revenue-duckdb.zip +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/game_revenue.zip +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/global_sales-duckdb.zip +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/global_sales.zip +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/nycflights-duckdb.zip +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/nycflights.zip +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/polars-api-docs.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/small_table-duckdb.zip +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/data/small_table.zip +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/datascan.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/draft.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/scan_profile.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/scan_profile_stats.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/schema.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/tf.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/thresholds.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank/validate.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank.egg-info/dependency_links.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank.egg-info/entry_points.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank.egg-info/requires.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pointblank.egg-info/top_level.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/pyproject.toml +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/setup.cfg +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/__init__.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/manual_tests/schema_step_reports.qmd +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_datascan/test_col_summary_tbl_duckdb_snap/col_summary_html_duckdb.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_datascan/test_col_summary_tbl_pandas_snap/col_summary_html_pandas.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_datascan/test_col_summary_tbl_polars_snap/col_summary_html_polars.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_01/schema_step_report_01-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_01_1/schema_step_report_01-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_01_2/schema_step_report_01-2.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_01_3/schema_step_report_01-3.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_02/schema_step_report_02-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_02_1/schema_step_report_02-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_02_2/schema_step_report_02-2.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_02_3/schema_step_report_02-3.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_03/schema_step_report_03-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_03_1/schema_step_report_03-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_03_2/schema_step_report_03-2.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_03_3/schema_step_report_03-3.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_04/schema_step_report_04-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_05/schema_step_report_05-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_06/schema_step_report_06-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_07/schema_step_report_07-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_08/schema_step_report_08-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_09/schema_step_report_09-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_10/schema_step_report_10-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_11/schema_step_report_11-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_12/schema_step_report_12-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_13/schema_step_report_13-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_14/schema_step_report_14-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_14_1/schema_step_report_14-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_15/schema_step_report_15-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_15_1/schema_step_report_15-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_16/schema_step_report_16-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_16_1/schema_step_report_16-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_17/schema_step_report_17-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_17_1/schema_step_report_17-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_18/schema_step_report_18-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_18_1/schema_step_report_18-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_19/schema_step_report_19-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_19_1/schema_step_report_19-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_20/schema_step_report_20-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_20_1/schema_step_report_20-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_21/schema_step_report_21-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_21_1/schema_step_report_21-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_21_2/schema_step_report_21-2.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_21_3/schema_step_report_21-3.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_22/schema_step_report_22-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_22_1/schema_step_report_22-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_23/schema_step_report_23-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_23_1/schema_step_report_23-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_24/schema_step_report_24-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_24_1/schema_step_report_24-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_24_2/schema_step_report_24-2.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_24_3/schema_step_report_24-3.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_25/schema_step_report_25-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_1/schema_step_report_25-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_2/schema_step_report_25-2.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_3/schema_step_report_25-3.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_4/schema_step_report_25-4.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_5/schema_step_report_25-5.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_01-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_02-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_03-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_04-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_05-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_06-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_07-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_08-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_09-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_10-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_11-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_12-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_13-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-2.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-3.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-2.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-3.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-0.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-1.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-2.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-3.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-4.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-5.txt +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_no_interrogation_validation_report_html_snap/no_interrogation_validation_report.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_no_steps_validation_report_html_snap/no_steps_validation_report.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_briefs_global_local_html/validation_report_briefs_global_local.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_briefs_html/validation_report_with_briefs.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_parquet/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pd/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pl/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_parquet/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pd/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pl/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_segments_html/duckdb/validation_report_segments.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_segments_html/pandas/validation_report_segments.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_segments_html/polars/validation_report_segments.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/polars/validation_report_segments_with_pre.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/validation_report_segments_with_pre.html +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_duckdb/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_parquet/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pd/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pl/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_sqlite/validation_report.json +0 -0
- {pointblank-0.11.3 → pointblank-0.11.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.11.3 → pointblank-0.11.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.11.3 → pointblank-0.11.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.11.3 → pointblank-0.11.4}/tests/tbl_files/parquet_data/data_a.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/parquet_data/data_b.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/parquet_data/subdir/nested_data.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/partitioned_sales/status=cancelled/0.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/partitioned_sales/status=delivered/0.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/partitioned_sales/status=pending/0.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/partitioned_sales/status=returned/0.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/partitioned_sales/status=shipped/0.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/partitioned_small_table/f=high/0.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/partitioned_small_table/f=low/0.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/partitioned_small_table/f=mid/0.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/taxi_part_01.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/taxi_part_02.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/taxi_part_03.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/taxi_sample.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_dates_times_text.ddb +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_dates_times_text.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_dates_times_text.sqlite +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_true_dates_times.ddb +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_xyz.ddb +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_xyz.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_xyz.sqlite +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_xyz_missing.ddb +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_xyz_missing.parquet +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/tbl_files/tbl_xyz_missing.sqlite +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test__interrogation.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test__utils.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test__utils_check_args.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_actions.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_assistant.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_cli.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_column.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_compare.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_datascan.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_draft.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_meta.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_schema.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_tf.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_thresholds.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/tests/test_validate.py +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.ar.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.de.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.es.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.fr.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.hi.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.it.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.ja.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.ko.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.nl.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.pt-BR.md +0 -0
- {pointblank-0.11.3 → pointblank-0.11.4}/translations/README.zh-CN.md +0 -0
|
@@ -3,7 +3,7 @@ message: 'If you wish to cite the "Pointblank" package use:'
|
|
|
3
3
|
type: software
|
|
4
4
|
license: MIT
|
|
5
5
|
title: "Pointblank: Find out if your data is what you think it is"
|
|
6
|
-
version: 0.11.
|
|
6
|
+
version: 0.11.3
|
|
7
7
|
abstract: Validate data in Polars and Pandas DataFrames and database tables.
|
|
8
8
|
Validation pipelines can be made using easily-readable, consecutive validation
|
|
9
9
|
steps. Upon execution of the validation plan, several reporting options are available.
|
|
@@ -79,6 +79,7 @@ website:
|
|
|
79
79
|
- user-guide/schema-validation.qmd
|
|
80
80
|
- user-guide/assertions.qmd
|
|
81
81
|
- user-guide/draft-validation.qmd
|
|
82
|
+
- user-guide/yaml-validation-workflows.qmd
|
|
82
83
|
- section: "Post Interrogation"
|
|
83
84
|
contents:
|
|
84
85
|
- user-guide/step-reports.qmd
|
|
@@ -219,6 +220,15 @@ quartodoc:
|
|
|
219
220
|
- name: load_dataset
|
|
220
221
|
- name: get_data_path
|
|
221
222
|
- name: connect_to_table
|
|
223
|
+
- title: YAML
|
|
224
|
+
desc: >
|
|
225
|
+
The *YAML* group contains functions that allow for the use of YAML to orchestrate validation
|
|
226
|
+
workflows. The `yaml_interrogate()` function can be used to run a validation workflow from
|
|
227
|
+
YAML strings or files. The `validate_yaml()` function checks if the YAML configuration
|
|
228
|
+
passes its own validity checks.
|
|
229
|
+
contents:
|
|
230
|
+
- name: yaml_interrogate
|
|
231
|
+
- name: validate_yaml
|
|
222
232
|
- title: Utility Functions
|
|
223
233
|
desc: >
|
|
224
234
|
The *Utility Functions* group contains functions that are useful accessing metadata about
|
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: YAML Validation Workflows
|
|
3
|
+
jupyter: python3
|
|
4
|
+
toc-expand: 2
|
|
5
|
+
html-table-processing: none
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Pointblank supports defining validation workflows using YAML configuration files, providing a
|
|
9
|
+
declarative, readable, and maintainable approach to data validation. YAML workflows are particularly
|
|
10
|
+
useful for teams, version control, automation pipelines, and scenarios where you want to separate
|
|
11
|
+
validation logic from application code.
|
|
12
|
+
|
|
13
|
+
YAML validation workflows offer several advantages: they're easy to read and write, can be version
|
|
14
|
+
controlled alongside your data processing code, enable non-programmers to contribute to data quality
|
|
15
|
+
definitions, and provide a clear separation between validation logic and execution code.
|
|
16
|
+
|
|
17
|
+
The YAML approach complements Pointblank's Python API, giving you flexibility to choose the right
|
|
18
|
+
tool for each situation. Simple, repetitive validations work well in YAML, while complex logic with
|
|
19
|
+
custom functions might be better suited for the Python API.
|
|
20
|
+
|
|
21
|
+
## Basic YAML Validation Structure
|
|
22
|
+
|
|
23
|
+
A YAML validation workflow consists of a few key components:
|
|
24
|
+
|
|
25
|
+
- **`tbl`**: specifies the data source (file path, dataset name, or Python expression)
|
|
26
|
+
- **`steps`**: defines the validation checks to perform
|
|
27
|
+
- **Optional metadata**: table name, label, thresholds, actions, and other configuration
|
|
28
|
+
|
|
29
|
+
Here's a simple example validating the built-in `small_table` dataset:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
tbl: small_table
|
|
33
|
+
tbl_name: "Small Table Validation"
|
|
34
|
+
label: "Basic data quality checks"
|
|
35
|
+
steps:
|
|
36
|
+
- rows_distinct
|
|
37
|
+
- col_exists:
|
|
38
|
+
columns: [a, b, c, d]
|
|
39
|
+
- col_vals_not_null:
|
|
40
|
+
columns: [a, b]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
You can save this configuration to a .yaml file and execute it using the `yaml_interrogate()`
|
|
44
|
+
function:
|
|
45
|
+
|
|
46
|
+
```{python}
|
|
47
|
+
import pointblank as pb
|
|
48
|
+
from pathlib import Path
|
|
49
|
+
|
|
50
|
+
# Save the YAML configuration to a file
|
|
51
|
+
yaml_content = """
|
|
52
|
+
tbl: small_table
|
|
53
|
+
tbl_name: "Small Table Validation"
|
|
54
|
+
label: "Basic data quality checks"
|
|
55
|
+
steps:
|
|
56
|
+
- rows_distinct
|
|
57
|
+
- col_exists:
|
|
58
|
+
columns: [a, b, c, d]
|
|
59
|
+
- col_vals_not_null:
|
|
60
|
+
columns: [a, b]
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
yaml_file = Path("basic_validation.yaml")
|
|
64
|
+
yaml_file.write_text(yaml_content)
|
|
65
|
+
|
|
66
|
+
# Execute the validation from the file
|
|
67
|
+
result = pb.yaml_interrogate(yaml_file)
|
|
68
|
+
result
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The validation table shows the results of each step, just as if you had written the equivalent
|
|
72
|
+
Python code. You can also pass YAML content directly as a string for quick testing, but working
|
|
73
|
+
with files is the recommended approach for production workflows.
|
|
74
|
+
|
|
75
|
+
## Data Sources in YAML
|
|
76
|
+
|
|
77
|
+
The `tbl` field supports various data source types, making it easy to work with different kinds of
|
|
78
|
+
data:
|
|
79
|
+
|
|
80
|
+
### File-based Sources
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
# CSV files
|
|
84
|
+
tbl: "data/customers.csv"
|
|
85
|
+
|
|
86
|
+
# Parquet files
|
|
87
|
+
tbl: "warehouse/sales.parquet"
|
|
88
|
+
|
|
89
|
+
# Multiple files with patterns
|
|
90
|
+
tbl: "logs/*.parquet"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Built-in Datasets
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
# Use Pointblank's built-in datasets
|
|
97
|
+
tbl: small_table
|
|
98
|
+
tbl: game_revenue
|
|
99
|
+
tbl: nycflights
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Python Expressions for Complex Sources
|
|
103
|
+
|
|
104
|
+
For more complex data loading, use the `python:` block syntax. This syntax can be used with several parameters throughout your YAML configuration:
|
|
105
|
+
|
|
106
|
+
- **`tbl`**: For complex data source loading (as shown below)
|
|
107
|
+
- **`expr`**: For custom validation expressions in `col_vals_expr`
|
|
108
|
+
- **`pre`**: For data preprocessing before validation steps
|
|
109
|
+
- **`actions`**: For callable action functions ('warning', 'error', 'critical', and 'default')
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
# Load data with custom Polars operations
|
|
113
|
+
tbl:
|
|
114
|
+
python: |
|
|
115
|
+
pl.scan_csv("sales_data.csv")
|
|
116
|
+
.filter(pl.col("date") >= "2024-01-01")
|
|
117
|
+
.head(1000)
|
|
118
|
+
|
|
119
|
+
# Load from a database connection
|
|
120
|
+
tbl:
|
|
121
|
+
python: |
|
|
122
|
+
pl.read_database(
|
|
123
|
+
query="SELECT * FROM customers WHERE active = true",
|
|
124
|
+
connection="postgresql://user:pass@localhost/db"
|
|
125
|
+
)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Validation Steps
|
|
129
|
+
|
|
130
|
+
YAML supports all of Pointblank's validation methods. Here are some common patterns:
|
|
131
|
+
|
|
132
|
+
### Column-based Validations
|
|
133
|
+
|
|
134
|
+
```yaml
|
|
135
|
+
tbl: worldcities.csv
|
|
136
|
+
steps:
|
|
137
|
+
# Check for missing values
|
|
138
|
+
- col_vals_not_null:
|
|
139
|
+
columns: [city_name, country]
|
|
140
|
+
|
|
141
|
+
# Validate value ranges
|
|
142
|
+
- col_vals_between:
|
|
143
|
+
columns: latitude
|
|
144
|
+
left: -90
|
|
145
|
+
right: 90
|
|
146
|
+
|
|
147
|
+
# Check set membership
|
|
148
|
+
- col_vals_in_set:
|
|
149
|
+
columns: country_code
|
|
150
|
+
set: [US, CA, MX, UK, DE, FR]
|
|
151
|
+
|
|
152
|
+
# Regular expression validation
|
|
153
|
+
- col_vals_regex:
|
|
154
|
+
columns: postal_code
|
|
155
|
+
pattern: "^[0-9]{5}(-[0-9]{4})?$"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Row-based Validations
|
|
159
|
+
|
|
160
|
+
```yaml
|
|
161
|
+
tbl: sales_data.csv
|
|
162
|
+
steps:
|
|
163
|
+
# Check for duplicate rows
|
|
164
|
+
- rows_distinct
|
|
165
|
+
|
|
166
|
+
# Ensure complete rows (no missing values)
|
|
167
|
+
- rows_complete
|
|
168
|
+
|
|
169
|
+
# Check row count
|
|
170
|
+
- row_count_match:
|
|
171
|
+
count: 1000
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Schema Validations
|
|
175
|
+
|
|
176
|
+
Schema validation ensures your data has the expected structure and column types. YAML uses a simple dictionary format to define schemas for the `col_schema_match` validation method.
|
|
177
|
+
|
|
178
|
+
Each column can be specified as:
|
|
179
|
+
|
|
180
|
+
- `column_name`: column name as a scalar string (structure validation, no type checking)
|
|
181
|
+
- `[column_name, "data_type"]`: column name with type validation
|
|
182
|
+
- `[column_name]`: column name in a list (equivalent to scalar, for consistency)
|
|
183
|
+
|
|
184
|
+
```yaml
|
|
185
|
+
tbl: customer_data.csv
|
|
186
|
+
steps:
|
|
187
|
+
# Complete schema validation (structure and types)
|
|
188
|
+
- col_schema_match:
|
|
189
|
+
schema:
|
|
190
|
+
columns:
|
|
191
|
+
- [customer_id, "int64"]
|
|
192
|
+
- [name, "object"]
|
|
193
|
+
- [email, "object"]
|
|
194
|
+
- [signup_date, "datetime64[ns]"]
|
|
195
|
+
|
|
196
|
+
# Structure-only validation (column names without types)
|
|
197
|
+
- col_schema_match:
|
|
198
|
+
schema:
|
|
199
|
+
columns:
|
|
200
|
+
- customer_id
|
|
201
|
+
- name
|
|
202
|
+
- email
|
|
203
|
+
complete: false
|
|
204
|
+
brief: "Check that core columns exist"
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
#### Schema Validation Options
|
|
208
|
+
|
|
209
|
+
Schema validations support the full range of validation options:
|
|
210
|
+
|
|
211
|
+
```yaml
|
|
212
|
+
tbl: data_file.csv
|
|
213
|
+
steps:
|
|
214
|
+
- col_schema_match:
|
|
215
|
+
schema:
|
|
216
|
+
columns:
|
|
217
|
+
- [id, "int64"]
|
|
218
|
+
- name
|
|
219
|
+
complete: false # Allow extra columns
|
|
220
|
+
in_order: false # Column order doesn't matter
|
|
221
|
+
case_sensitive_colnames: false # Case-insensitive column names
|
|
222
|
+
case_sensitive_dtypes: false # Case-insensitive type names
|
|
223
|
+
full_match_dtypes: false # Allow partial type matching
|
|
224
|
+
brief: "Flexible schema validation"
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
#### Other Structure Validations
|
|
228
|
+
|
|
229
|
+
```yaml
|
|
230
|
+
tbl: customer_data.csv
|
|
231
|
+
steps:
|
|
232
|
+
# Check column count
|
|
233
|
+
- col_count_match:
|
|
234
|
+
count: 4
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Thresholds and Severity Levels
|
|
238
|
+
|
|
239
|
+
Thresholds determine when validation failures trigger different severity levels. You can set global
|
|
240
|
+
thresholds for the entire workflow:
|
|
241
|
+
|
|
242
|
+
```yaml
|
|
243
|
+
tbl: sales_data.csv
|
|
244
|
+
tbl_name: "Sales Data Quality Check"
|
|
245
|
+
thresholds:
|
|
246
|
+
warning: 0.05 # 5% failure rate triggers warning
|
|
247
|
+
error: 0.10 # 10% failure rate triggers error
|
|
248
|
+
critical: 0.15 # 15% failure rate triggers critical
|
|
249
|
+
steps:
|
|
250
|
+
- col_vals_not_null:
|
|
251
|
+
columns: [customer_id, amount]
|
|
252
|
+
- col_vals_gt:
|
|
253
|
+
columns: amount
|
|
254
|
+
value: 0
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
You can also set thresholds for individual validation steps:
|
|
258
|
+
|
|
259
|
+
```yaml
|
|
260
|
+
tbl: user_data.csv
|
|
261
|
+
steps:
|
|
262
|
+
- col_vals_not_null:
|
|
263
|
+
columns: email
|
|
264
|
+
thresholds:
|
|
265
|
+
warning: 1 # Any missing email is a warning
|
|
266
|
+
error: 0.01 # 1% missing emails is an error
|
|
267
|
+
|
|
268
|
+
- col_vals_regex:
|
|
269
|
+
columns: email
|
|
270
|
+
pattern: "^[\\w\\.-]+@[\\w\\.-]+\\.[a-zA-Z]{2,}$"
|
|
271
|
+
thresholds:
|
|
272
|
+
error: 1 # Any invalid email format is an error
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Actions: Responding to Validation Failures
|
|
276
|
+
|
|
277
|
+
Actions define what happens when validation thresholds are exceeded. You can use string templates
|
|
278
|
+
with placeholder variables or callable functions.
|
|
279
|
+
|
|
280
|
+
### String Template Actions
|
|
281
|
+
|
|
282
|
+
```yaml
|
|
283
|
+
tbl: orders.csv
|
|
284
|
+
thresholds:
|
|
285
|
+
warning: 0.02
|
|
286
|
+
error: 0.05
|
|
287
|
+
actions:
|
|
288
|
+
warning: "Warning: Step {step} found {n_failed} failures in {col} column"
|
|
289
|
+
error: "Error in {TYPE} validation: {n_failed}/{n} rows failed (Step {step})"
|
|
290
|
+
critical: "Critical failure detected at {time}"
|
|
291
|
+
steps:
|
|
292
|
+
- col_vals_not_null:
|
|
293
|
+
columns: [order_id, customer_id]
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Available template variables include:
|
|
297
|
+
|
|
298
|
+
- `{step}`: validation step number
|
|
299
|
+
- `{col}`: column name being validated
|
|
300
|
+
- `{val}`: specific failing value (when applicable)
|
|
301
|
+
- `{n_failed}`: number of failing rows
|
|
302
|
+
- `{n}`: total number of rows checked
|
|
303
|
+
- `{TYPE}`: validation method name (e.g., "COL_VALS_NOT_NULL")
|
|
304
|
+
- `{LEVEL}`: severity level ("WARNING", "ERROR", "CRITICAL")
|
|
305
|
+
- `{time}`: timestamp of the validation
|
|
306
|
+
|
|
307
|
+
### Callable Actions
|
|
308
|
+
|
|
309
|
+
For more complex responses, use Python callable functions:
|
|
310
|
+
|
|
311
|
+
```yaml
|
|
312
|
+
tbl: critical_data.csv
|
|
313
|
+
thresholds:
|
|
314
|
+
error: 1
|
|
315
|
+
actions:
|
|
316
|
+
error:
|
|
317
|
+
python: |
|
|
318
|
+
lambda: print("ALERT: Critical data validation failed!")
|
|
319
|
+
critical:
|
|
320
|
+
python: |
|
|
321
|
+
lambda: (
|
|
322
|
+
__import__('requests').post(
|
|
323
|
+
'https://alerts.company.com/webhook',
|
|
324
|
+
json={'message': 'Critical validation failure', 'severity': 'high'}
|
|
325
|
+
)
|
|
326
|
+
)
|
|
327
|
+
steps:
|
|
328
|
+
- col_vals_not_null:
|
|
329
|
+
columns: [transaction_id, amount]
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Step-level Actions
|
|
333
|
+
|
|
334
|
+
You can also define actions for individual validation steps:
|
|
335
|
+
|
|
336
|
+
```yaml
|
|
337
|
+
tbl: financial_data.csv
|
|
338
|
+
steps:
|
|
339
|
+
- col_vals_not_null:
|
|
340
|
+
columns: account_balance
|
|
341
|
+
thresholds:
|
|
342
|
+
error: 1
|
|
343
|
+
actions:
|
|
344
|
+
error: "Missing account balance detected in step {step}."
|
|
345
|
+
|
|
346
|
+
- col_vals_gt:
|
|
347
|
+
columns: account_balance
|
|
348
|
+
value: 0
|
|
349
|
+
actions:
|
|
350
|
+
warning:
|
|
351
|
+
python: |
|
|
352
|
+
lambda: print("Negative balance warning triggered.")
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
## Advanced Features
|
|
356
|
+
|
|
357
|
+
### Pre-processing with the `pre` Parameter
|
|
358
|
+
|
|
359
|
+
You can apply data transformations before validation using the `pre` parameter:
|
|
360
|
+
|
|
361
|
+
```yaml
|
|
362
|
+
tbl: transactions.csv
|
|
363
|
+
steps:
|
|
364
|
+
# Validate only recent transactions
|
|
365
|
+
- col_vals_gt:
|
|
366
|
+
columns: amount
|
|
367
|
+
value: 0
|
|
368
|
+
pre:
|
|
369
|
+
python: |
|
|
370
|
+
lambda df: df.filter(
|
|
371
|
+
pl.col("transaction_date") >= "2024-01-01"
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
# Check completeness for active customers only
|
|
375
|
+
- col_vals_not_null:
|
|
376
|
+
columns: [email, phone]
|
|
377
|
+
pre: |
|
|
378
|
+
lambda df: df.filter(pl.col("status") == "active")
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
Note that you can use either the explicit `python:` block syntax or the shortcut syntax (just
|
|
382
|
+
`pre: |`) for the lambda expressions.
|
|
383
|
+
|
|
384
|
+
### Complex Expressions
|
|
385
|
+
|
|
386
|
+
For advanced validation logic, use a `col_vals_expr` step with custom expressions:
|
|
387
|
+
|
|
388
|
+
```yaml
|
|
389
|
+
tbl: sales_data.csv
|
|
390
|
+
steps:
|
|
391
|
+
# Custom business logic validation
|
|
392
|
+
- col_vals_expr:
|
|
393
|
+
expr:
|
|
394
|
+
python: |
|
|
395
|
+
(
|
|
396
|
+
pl.when(pl.col("product_type") == "premium")
|
|
397
|
+
.then(pl.col("price") >= 100)
|
|
398
|
+
.when(pl.col("product_type") == "standard")
|
|
399
|
+
.then(pl.col("price").is_between(20, 99))
|
|
400
|
+
.otherwise(pl.col("price") <= 19)
|
|
401
|
+
)
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Brief Descriptions
|
|
405
|
+
|
|
406
|
+
Add human-readable descriptions to validation steps. The `brief` parameter supports string
|
|
407
|
+
templating and automatic generation:
|
|
408
|
+
|
|
409
|
+
```yaml
|
|
410
|
+
tbl: customer_data.csv
|
|
411
|
+
brief: "Customer data quality validation for {auto}"
|
|
412
|
+
steps:
|
|
413
|
+
- col_vals_not_null:
|
|
414
|
+
columns: customer_id
|
|
415
|
+
brief: "Ensure all customers have valid IDs"
|
|
416
|
+
|
|
417
|
+
- col_vals_regex:
|
|
418
|
+
columns: email
|
|
419
|
+
pattern: "^[\\w\\.-]+@[\\w\\.-]+\\.[a-zA-Z]{2,}$"
|
|
420
|
+
brief: "Validate email format compliance"
|
|
421
|
+
|
|
422
|
+
- col_vals_between:
|
|
423
|
+
columns: age
|
|
424
|
+
left: 13
|
|
425
|
+
right: 120
|
|
426
|
+
brief: "Check reasonable age ranges"
|
|
427
|
+
|
|
428
|
+
# Use automatic brief generation
|
|
429
|
+
- col_vals_not_null:
|
|
430
|
+
columns: phone_number
|
|
431
|
+
brief: true
|
|
432
|
+
|
|
433
|
+
# Template variables in briefs
|
|
434
|
+
- col_vals_in_set:
|
|
435
|
+
columns: status
|
|
436
|
+
set: [active, inactive, pending]
|
|
437
|
+
brief: "Column '{col}' must be one of: {set}"
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
Brief Templating Options:
|
|
441
|
+
|
|
442
|
+
- custom strings: Write your own descriptive text
|
|
443
|
+
- `true`: Automatically generates a brief based on the validation method and parameters
|
|
444
|
+
- `{auto}`: Placeholder for auto-generated text within custom strings
|
|
445
|
+
- template variables: Use the same variables available in actions:
|
|
446
|
+
- `{col}`: column name(s) being validated
|
|
447
|
+
- `{step}`: the step number in the validation plan
|
|
448
|
+
- `{value}`: the comparison value used in the validation (for single-value comparisons)
|
|
449
|
+
- `{pattern}`: for regex validations, the pattern being matched
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
## Working with YAML Files
|
|
453
|
+
|
|
454
|
+
### Loading from Files
|
|
455
|
+
|
|
456
|
+
You can save your YAML configuration to files and load them:
|
|
457
|
+
|
|
458
|
+
```{python}
|
|
459
|
+
# Create a YAML file
|
|
460
|
+
yaml_content = """
|
|
461
|
+
tbl: small_table
|
|
462
|
+
tbl_name: "File-based Validation"
|
|
463
|
+
steps:
|
|
464
|
+
- col_vals_between:
|
|
465
|
+
columns: c
|
|
466
|
+
left: 1
|
|
467
|
+
right: 10
|
|
468
|
+
- col_vals_in_set:
|
|
469
|
+
columns: f
|
|
470
|
+
set: [low, mid, high]
|
|
471
|
+
"""
|
|
472
|
+
|
|
473
|
+
# Save to file
|
|
474
|
+
from pathlib import Path
|
|
475
|
+
yaml_file = Path("validation_config.yaml")
|
|
476
|
+
yaml_file.write_text(yaml_content)
|
|
477
|
+
|
|
478
|
+
# Load and execute
|
|
479
|
+
result = pb.yaml_interrogate(yaml_file)
|
|
480
|
+
result
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### Converting YAML to Python
|
|
484
|
+
|
|
485
|
+
Use `yaml_to_python()` to generate equivalent Python code from your YAML configuration:
|
|
486
|
+
|
|
487
|
+
```{python}
|
|
488
|
+
yaml_config = """
|
|
489
|
+
tbl: small_table
|
|
490
|
+
tbl_name: "Example Validation"
|
|
491
|
+
thresholds:
|
|
492
|
+
warning: 0.1
|
|
493
|
+
error: 0.2
|
|
494
|
+
actions:
|
|
495
|
+
warning: "Warning: {TYPE} validation failed"
|
|
496
|
+
steps:
|
|
497
|
+
- col_vals_gt:
|
|
498
|
+
columns: a
|
|
499
|
+
value: 0
|
|
500
|
+
- col_vals_in_set:
|
|
501
|
+
columns: f
|
|
502
|
+
set: [low, mid, high]
|
|
503
|
+
"""
|
|
504
|
+
|
|
505
|
+
# Generate Python code
|
|
506
|
+
python_code = pb.yaml_to_python(yaml_config)
|
|
507
|
+
print(python_code)
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
This is useful for:
|
|
511
|
+
|
|
512
|
+
- learning how YAML maps to Python API calls
|
|
513
|
+
- transitioning from YAML to code-based workflows
|
|
514
|
+
- generating documentation that shows both approaches
|
|
515
|
+
- debugging YAML configurations
|
|
516
|
+
|
|
517
|
+
## Practical Examples
|
|
518
|
+
|
|
519
|
+
### Data Pipeline Validation
|
|
520
|
+
|
|
521
|
+
Here's a comprehensive example for validating data in a processing pipeline:
|
|
522
|
+
|
|
523
|
+
```yaml
|
|
524
|
+
tbl:
|
|
525
|
+
python: |
|
|
526
|
+
(
|
|
527
|
+
pl.scan_csv("raw_data/customer_events.csv")
|
|
528
|
+
.filter(pl.col("event_date") >= "2024-01-01")
|
|
529
|
+
)
|
|
530
|
+
|
|
531
|
+
tbl_name: "Customer Events Pipeline Validation"
|
|
532
|
+
label: "Daily data quality check for customer events"
|
|
533
|
+
|
|
534
|
+
thresholds:
|
|
535
|
+
warning: 0.01 # 1% failure rate
|
|
536
|
+
error: 0.05 # 5% failure rate
|
|
537
|
+
|
|
538
|
+
actions:
|
|
539
|
+
warning: "Pipeline warning: {TYPE} validation found {n_failed} issues"
|
|
540
|
+
error:
|
|
541
|
+
python: |
|
|
542
|
+
lambda: print("ERROR: Pipeline validation failed - manual review required")
|
|
543
|
+
|
|
544
|
+
steps:
|
|
545
|
+
# Schema validation
|
|
546
|
+
- col_schema_match:
|
|
547
|
+
schema:
|
|
548
|
+
columns:
|
|
549
|
+
- [customer_id, "int64"]
|
|
550
|
+
- [event_type, "object"]
|
|
551
|
+
- [event_date, "object"]
|
|
552
|
+
- [revenue, "float64"]
|
|
553
|
+
brief: "Validate table structure matches expected schema"
|
|
554
|
+
|
|
555
|
+
# Data completeness
|
|
556
|
+
- col_vals_not_null:
|
|
557
|
+
columns: [customer_id, event_type, event_date]
|
|
558
|
+
brief: "Critical fields must be complete"
|
|
559
|
+
|
|
560
|
+
# Business logic validation
|
|
561
|
+
- col_vals_in_set:
|
|
562
|
+
columns: event_type
|
|
563
|
+
set: [signup, purchase, cancellation, upgrade]
|
|
564
|
+
brief: "Event types must be from approved list"
|
|
565
|
+
|
|
566
|
+
# Data quality checks
|
|
567
|
+
- col_vals_gt:
|
|
568
|
+
columns: revenue
|
|
569
|
+
value: 0
|
|
570
|
+
na_pass: true
|
|
571
|
+
brief: "Revenue values must be positive when present"
|
|
572
|
+
|
|
573
|
+
# Temporal validation
|
|
574
|
+
- col_vals_expr:
|
|
575
|
+
expr:
|
|
576
|
+
python: |
|
|
577
|
+
pl.col("event_date").str.strptime(pl.Date, "%Y-%m-%d").is_not_null()
|
|
578
|
+
brief: "Event dates must be valid YYYY-MM-DD format"
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
### Quality Monitoring Dashboard
|
|
582
|
+
|
|
583
|
+
For ongoing data quality monitoring:
|
|
584
|
+
|
|
585
|
+
```yaml
|
|
586
|
+
tbl: warehouse/daily_metrics.parquet
|
|
587
|
+
tbl_name: "Daily Metrics Quality Check"
|
|
588
|
+
|
|
589
|
+
thresholds:
|
|
590
|
+
warning: 5 # 5 failing rows
|
|
591
|
+
error: 50 # 50 failing rows
|
|
592
|
+
critical: 100 # 100 failing rows
|
|
593
|
+
|
|
594
|
+
actions:
|
|
595
|
+
warning: "Quality check warning: {n_failed} rows failed {TYPE} validation"
|
|
596
|
+
error: "Quality degradation detected: Step {step} failed for {n_failed}/{n} rows"
|
|
597
|
+
critical:
|
|
598
|
+
python: |
|
|
599
|
+
lambda: __import__('logging').getLogger().critical(
|
|
600
|
+
"CRITICAL: Data quality failure detected - immediate attention required"
|
|
601
|
+
)
|
|
602
|
+
highest_only: false
|
|
603
|
+
|
|
604
|
+
steps:
|
|
605
|
+
- row_count_match:
|
|
606
|
+
count: 10000
|
|
607
|
+
brief: "Verify expected daily record count"
|
|
608
|
+
|
|
609
|
+
- col_vals_not_null:
|
|
610
|
+
columns: [date, metric_value, source_system]
|
|
611
|
+
brief: "Core fields must be complete"
|
|
612
|
+
|
|
613
|
+
- col_vals_between:
|
|
614
|
+
columns: metric_value
|
|
615
|
+
left: 0
|
|
616
|
+
right: 1000000
|
|
617
|
+
brief: "Metric values within reasonable range"
|
|
618
|
+
|
|
619
|
+
- rows_distinct:
|
|
620
|
+
columns_subset: [date, metric_name, source_system]
|
|
621
|
+
brief: "No duplicate metric records per day"
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
## Best Practices
|
|
625
|
+
|
|
626
|
+
### Organization and Structure
|
|
627
|
+
|
|
628
|
+
1. use descriptive names: give your validations clear `tbl_name` and `label` values
|
|
629
|
+
2. add brief descriptions: document what each validation step checks
|
|
630
|
+
3. group related validations: organize steps logically (schema, completeness, business rules)
|
|
631
|
+
4. version control: store YAML files in git alongside your data processing code
|
|
632
|
+
|
|
633
|
+
### Error Handling and Monitoring
|
|
634
|
+
|
|
635
|
+
1. set appropriate thresholds: start conservative and adjust based on your data patterns
|
|
636
|
+
2. use actions for alerting: set up notifications for critical failures
|
|
637
|
+
3. document expected failures: some data quality issues might be acceptable
|
|
638
|
+
4. monitor validation results: track validation performance over time
|
|
639
|
+
|
|
640
|
+
### Performance Considerations
|
|
641
|
+
|
|
642
|
+
1. use the `pre` parameter efficiently: apply filters early to reduce data volume
|
|
643
|
+
2. order validations strategically: put fast, likely-to-fail checks first
|
|
644
|
+
3. consider data source location: local files are faster than remote sources
|
|
645
|
+
4. use appropriate column selections: only validate the columns you need
|
|
646
|
+
|
|
647
|
+
## Wrapping Up
|
|
648
|
+
|
|
649
|
+
YAML validation workflows provide a powerful, declarative approach to data validation in Pointblank.
|
|
650
|
+
Such workflows are great at expressing common validation patterns in a readable format that can be
|
|
651
|
+
easily shared, version controlled, and maintained by teams.
|
|
652
|
+
|
|
653
|
+
Key advantages of YAML workflows:
|
|
654
|
+
|
|
655
|
+
- readable: non-programmers can understand and contribute to validation logic
|
|
656
|
+
- maintainable: easy to modify validation rules without changing application code
|
|
657
|
+
- portable: YAML files can be shared between projects and teams
|
|
658
|
+
- version controlled: track changes to validation logic over time
|
|
659
|
+
- flexible: support for simple checks and complex custom logic
|
|
660
|
+
|
|
661
|
+
Use YAML workflows when you want declarative, maintainable validation definitions, and fall back to
|
|
662
|
+
the Python API when you need complex programmatic logic or tight integration with application code.
|
|
663
|
+
The two approaches complement each other well and can be used together as your validation needs
|
|
664
|
+
evolve.
|