pointblank 0.13.4__tar.gz → 0.15.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pointblank-0.13.4 → pointblank-0.15.0}/CITATION.cff +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/PKG-INFO +67 -8
- {pointblank-0.13.4 → pointblank-0.15.0}/README.md +64 -6
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/_quarto.yml +14 -1
- pointblank-0.15.0/docs/assets/pointblank-draft-validation-report.png +0 -0
- pointblank-0.15.0/docs/demos/check-for-freshness/index.qmd +125 -0
- pointblank-0.15.0/docs/demos/datetime-validations/index.qmd +155 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/index.qmd +5 -2
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/mutate-table-in-step/index.qmd +28 -8
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/draft-validation.qmd +6 -6
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/index.qmd +1 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/preprocessing.qmd +19 -7
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/segmentation.qmd +7 -3
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/validation-overview.qmd +9 -6
- pointblank-0.15.0/docs/user-guide/validation-reports.qmd +559 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/__init__.py +4 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/_constants.py +117 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/_constants_translations.py +487 -2
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/_interrogation.py +1065 -12
- pointblank-0.15.0/pointblank/_spec_utils.py +1015 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/_utils.py +17 -7
- pointblank-0.15.0/pointblank/_utils_ai.py +875 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/assistant.py +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/cli.py +128 -115
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/column.py +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/api-docs.txt +1838 -130
- pointblank-0.15.0/pointblank/data/validations/README.md +108 -0
- pointblank-0.15.0/pointblank/data/validations/complex_preprocessing.json +54 -0
- pointblank-0.15.0/pointblank/data/validations/complex_preprocessing.pkl +0 -0
- pointblank-0.15.0/pointblank/data/validations/generate_test_files.py +127 -0
- pointblank-0.15.0/pointblank/data/validations/multiple_steps.json +83 -0
- pointblank-0.15.0/pointblank/data/validations/multiple_steps.pkl +0 -0
- pointblank-0.15.0/pointblank/data/validations/narwhals_function.json +28 -0
- pointblank-0.15.0/pointblank/data/validations/narwhals_function.pkl +0 -0
- pointblank-0.15.0/pointblank/data/validations/no_preprocessing.json +83 -0
- pointblank-0.15.0/pointblank/data/validations/no_preprocessing.pkl +0 -0
- pointblank-0.15.0/pointblank/data/validations/pandas_compatible.json +28 -0
- pointblank-0.15.0/pointblank/data/validations/pandas_compatible.pkl +0 -0
- pointblank-0.15.0/pointblank/data/validations/preprocessing_functions.py +46 -0
- pointblank-0.15.0/pointblank/data/validations/simple_preprocessing.json +57 -0
- pointblank-0.15.0/pointblank/data/validations/simple_preprocessing.pkl +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/datascan.py +4 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/draft.py +52 -3
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/scan_profile.py +6 -6
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/schema.py +8 -82
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/thresholds.py +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/validate.py +3069 -437
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank.egg-info/PKG-INFO +67 -8
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank.egg-info/SOURCES.txt +28 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank.egg-info/requires.txt +2 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank_mcp_server/pointblank_server.py +4 -2
- {pointblank-0.13.4 → pointblank-0.15.0}/pyproject.toml +4 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_no_interrogation_validation_report_html_snap/no_interrogation_validation_report.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_no_steps_validation_report_html_snap/no_steps_validation_report.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_briefs_global_local_html/validation_report_briefs_global_local.html +5 -5
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_briefs_html/validation_report_with_briefs.html +4 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_segments_html/duckdb/validation_report_segments.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_segments_html/pandas/validation_report_segments.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_segments_html/polars/validation_report_segments.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/validation_report_segments_with_pre.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_with_selector_helper_functions_no_match_snap/tbl_memtable_variable_names/selector_helper_functions_no_match.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_with_selector_helper_functions_no_match_snap/tbl_pd_variable_names/selector_helper_functions_no_match.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_with_selector_helper_functions_no_match_snap/tbl_pl_variable_names/selector_helper_functions_no_match.html +1 -1
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test__interrogation.py +96 -5
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test__utils.py +139 -17
- pointblank-0.15.0/tests/test__utils_ai.py +829 -0
- pointblank-0.15.0/tests/test_cli.py +2875 -0
- pointblank-0.15.0/tests/test_col_vals_increasing_decreasing.py +260 -0
- pointblank-0.15.0/tests/test_col_vals_within_spec.py +925 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_datascan.py +98 -2
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_meta.py +0 -4
- pointblank-0.15.0/tests/test_prompt_method.py +577 -0
- pointblank-0.15.0/tests/test_scan_profile_stats.py +157 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_schema.py +116 -3
- pointblank-0.15.0/tests/test_serialization_compat.py +164 -0
- pointblank-0.15.0/tests/test_serialization_edge_cases.py +199 -0
- pointblank-0.15.0/tests/test_tbl_match.py +1716 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_validate.py +7550 -5594
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.ar.md +58 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.de.md +58 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.es.md +58 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.fr.md +59 -5
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.hi.md +58 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.it.md +58 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.ja.md +58 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.ko.md +58 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.nl.md +58 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.pt-BR.md +58 -4
- {pointblank-0.13.4 → pointblank-0.15.0}/translations/README.zh-CN.md +62 -5
- pointblank-0.13.4/docs/demos/check-for-freshness/index.qmd +0 -87
- pointblank-0.13.4/tests/test_cli.py +0 -1383
- {pointblank-0.13.4 → pointblank-0.15.0}/.github/CODE_OF_CONDUCT.md +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.github/ISSUE_TEMPLATE/bug.md +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.github/SECURITY.md +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.github/workflows/ci-docs.yaml +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.github/workflows/ci-tests.yaml +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.github/workflows/code-checks.yaml +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.gitignore +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.pre-commit-config.yaml +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/.vscode/settings.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/CONTRIBUTING.md +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/LICENSE +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/Makefile +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/data_raw/game_revenue.csv +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/data_raw/global_sales.csv +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/data_raw/global_sales_dataset.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/data_raw/nycflights.csv +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/data_raw/small_table.csv +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/data_raw/worldcities.csv +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/data_raw/x-01-parquet.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/data_raw/x-02-duckdb.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/data_raw/x-03-sqlite.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/.gitignore +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/_extensions/machow/interlinks/.gitignore +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/_extensions/machow/interlinks/_extension.yml +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/_extensions/machow/interlinks/interlinks.lua +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/fav-logo.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-info-worldcities-csv.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-info-worldcities-github-csv.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-make-template.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-missing-worldcities-csv.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-preview-game_revenue-all-columns.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-preview-game_revenue-column-names.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-preview-game_revenue-column-range.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-preview-worldcities-csv-no-row-numbers.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-preview-worldcities-csv.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-run-worldcities_validation-extracts.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-run-worldcities_validation-fail-on-warning.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-run-worldcities_validation-output.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-run-worldcities_validation.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-scan-worldcities-csv.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-validate-exit-code.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-validate-multi-check.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-validate-rows-complete-worldcities-csv.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-validate-rows-distinct-worldcities-csv.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-validate-show-extract.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-validate-worldcities-gt-0-population.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-validate-worldcities-not-null-city_name.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pb-validate-write-extract.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.de.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.es.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.fr.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.it.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.ja.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.ko.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.nl.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.pt-BR.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-sales-data.zh-CN.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-step-report.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank-tabular-report.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/pointblank_logo.svg +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/posit-logo-black.svg +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/validation-table-diagram.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/validation-test-units.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/.gitignore +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-cicd-workflows.gif +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-cicd-workflows.tape +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-complete-workflow.gif +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-complete-workflow.tape +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-data-exploration.gif +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-data-exploration.tape +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-essential-validations.gif +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-essential-validations.tape +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-getting-started.gif +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-getting-started.tape +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-using-polars.gif +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/cli-using-polars.tape +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/assets/vhs/validation.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/all-about-actions/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/intro-pointblank/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/intro-pointblank/pointblank-localized.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/intro-pointblank/step_report.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/intro-pointblank/validation-table-diagram.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/intro-pointblank/validation-test-units.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/lets-workshop-together/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/overhauled-user-guide/advanced-in-sidebar.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/overhauled-user-guide/breadth-and-depth.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/overhauled-user-guide/explanation-of-visual.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/overhauled-user-guide/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/overhauled-user-guide/links-in-guide.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/overhauled-user-guide/segments.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/overhauled-user-guide/step-report.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/overhauled-user-guide/validation-three-things.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/pointblank_blog_logo.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/blog/validation-libs-2025/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/01-starter/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/02-advanced/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/03-data-extracts/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/04-sundered-data/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/05-step-report-column-check/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/06-step-report-schema-check/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/07-validation-with-actions/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/08-validation-with-final-actions/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/apply-checks-to-several-columns/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/check-row-column-counts/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/checks-for-missing/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/cli-interactive/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/col-vals-custom-expr/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/column-selector-functions/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/comparisons-across-columns/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/custom-validation-specially/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/data/game_revenue.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/expect-no-duplicate-rows/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/expect-no-duplicate-values/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/expect-text-pattern/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/failure-thresholds/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/img/advanced_validation.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/img/data_extracts.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/img/starter_validation.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/img/step_report_column_schema.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/img/step_report_column_values.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/img/sundered_data.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/img/validation_with_actions.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/img/validation_with_final_actions.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/numeric-comparisons/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/schema-check/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/set-membership/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/demos/using-parquet-data/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/index.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/scripts/post-render.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/styles.css +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/actions.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/assertions.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/briefs.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/cli-data-inspection.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/cli-data-validation.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/cli-reference.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/col-summary-tbl.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/column-selection-patterns.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/expressions.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/extracts.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/installation.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/langs.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/mcp-quick-start.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/missing-vals-tbl.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/preview.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/schema-validation.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/step-reports.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/sundering.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/thresholds.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/validation-methods.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/yaml-reference.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/docs/user-guide/yaml-validation-workflows.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/images/pointblank-tabular-report.png +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/images/pointblank_logo.svg +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/_datascan_utils.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/_typing.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/_utils_check_args.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/_utils_html.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/actions.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/compare.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/game_revenue-duckdb.zip +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/game_revenue.zip +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/global_sales-duckdb.zip +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/global_sales.zip +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/nycflights-duckdb.zip +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/nycflights.zip +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/polars-api-docs.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/small_table-duckdb.zip +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/data/small_table.zip +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/scan_profile_stats.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/segments.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank/yaml.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank.egg-info/dependency_links.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank.egg-info/entry_points.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank.egg-info/top_level.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/pointblank_mcp_server/readme.md +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/setup.cfg +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/__init__.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/manual_tests/schema_step_reports.qmd +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_datascan/test_col_summary_tbl_duckdb_snap/col_summary_html_duckdb.html +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_datascan/test_col_summary_tbl_pandas_snap/col_summary_html_pandas.html +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_datascan/test_col_summary_tbl_polars_snap/col_summary_html_polars.html +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_01/schema_step_report_01-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_01_1/schema_step_report_01-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_01_2/schema_step_report_01-2.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_01_3/schema_step_report_01-3.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_02/schema_step_report_02-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_02_1/schema_step_report_02-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_02_2/schema_step_report_02-2.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_02_3/schema_step_report_02-3.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_03/schema_step_report_03-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_03_1/schema_step_report_03-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_03_2/schema_step_report_03-2.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_03_3/schema_step_report_03-3.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_04/schema_step_report_04-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_05/schema_step_report_05-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_06/schema_step_report_06-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_07/schema_step_report_07-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_08/schema_step_report_08-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_09/schema_step_report_09-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_10/schema_step_report_10-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_11/schema_step_report_11-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_12/schema_step_report_12-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_13/schema_step_report_13-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_14/schema_step_report_14-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_14_1/schema_step_report_14-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_15/schema_step_report_15-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_15_1/schema_step_report_15-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_16/schema_step_report_16-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_16_1/schema_step_report_16-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_17/schema_step_report_17-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_17_1/schema_step_report_17-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_18/schema_step_report_18-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_18_1/schema_step_report_18-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_19/schema_step_report_19-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_19_1/schema_step_report_19-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_20/schema_step_report_20-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_20_1/schema_step_report_20-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_21/schema_step_report_21-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_21_1/schema_step_report_21-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_21_2/schema_step_report_21-2.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_21_3/schema_step_report_21-3.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_22/schema_step_report_22-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_22_1/schema_step_report_22-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_23/schema_step_report_23-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_23_1/schema_step_report_23-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_24/schema_step_report_24-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_24_1/schema_step_report_24-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_24_2/schema_step_report_24-2.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_24_3/schema_step_report_24-3.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_25/schema_step_report_25-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_1/schema_step_report_25-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_2/schema_step_report_25-2.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_3/schema_step_report_25-3.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_4/schema_step_report_25-4.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_5/schema_step_report_25-5.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_01-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_02-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_03-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_04-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_05-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_06-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_07-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_08-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_09-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_10-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_11-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_12-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_13-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-2.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-3.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-2.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-3.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-0.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-1.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-2.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-3.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-4.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-5.txt +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_parquet/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pd/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pl/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_parquet/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pd/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pl/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/polars/validation_report_segments_with_pre.html +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_duckdb/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_parquet/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pd/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pl/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pyspark/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_sqlite/validation_report.json +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/parquet_data/data_a.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/parquet_data/data_b.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/parquet_data/subdir/nested_data.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/partitioned_sales/status=cancelled/0.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/partitioned_sales/status=delivered/0.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/partitioned_sales/status=pending/0.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/partitioned_sales/status=returned/0.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/partitioned_sales/status=shipped/0.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/partitioned_small_table/f=high/0.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/partitioned_small_table/f=low/0.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/partitioned_small_table/f=mid/0.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/taxi_part_01.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/taxi_part_02.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/taxi_part_03.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/taxi_sample.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_dates_times_text.ddb +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_dates_times_text.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_dates_times_text.sqlite +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_true_dates_times.ddb +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_xyz.ddb +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_xyz.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_xyz.sqlite +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_xyz_missing.ddb +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_xyz_missing.parquet +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/tbl_files/tbl_xyz_missing.sqlite +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test__utils_check_args.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_actions.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_assistant.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_column.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_compare.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_draft.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_mcp_integration.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_mcp_server.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_segments.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_thresholds.py +0 -0
- {pointblank-0.13.4 → pointblank-0.15.0}/tests/test_yaml.py +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.
|
|
6
|
+
version: 0.14.0
|
|
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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pointblank
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.15.0
|
|
4
4
|
Summary: Find out if your data is what you think it is.
|
|
5
5
|
Author-email: Richard Iannone <riannone@me.com>
|
|
6
6
|
License: MIT License
|
|
@@ -42,7 +42,7 @@ Description-Content-Type: text/markdown
|
|
|
42
42
|
License-File: LICENSE
|
|
43
43
|
Requires-Dist: commonmark>=0.9.1
|
|
44
44
|
Requires-Dist: importlib-metadata
|
|
45
|
-
Requires-Dist: great_tables>=0.
|
|
45
|
+
Requires-Dist: great_tables>=0.19.0
|
|
46
46
|
Requires-Dist: narwhals>=2.0.1
|
|
47
47
|
Requires-Dist: typing_extensions>=3.10.0.0
|
|
48
48
|
Requires-Dist: requests>=2.31.0
|
|
@@ -59,6 +59,7 @@ Provides-Extra: generate
|
|
|
59
59
|
Requires-Dist: chatlas>=0.3.0; extra == "generate"
|
|
60
60
|
Requires-Dist: anthropic[bedrock]>=0.45.2; extra == "generate"
|
|
61
61
|
Requires-Dist: openai>=1.63.0; extra == "generate"
|
|
62
|
+
Requires-Dist: httpx>=0.28.0; extra == "generate"
|
|
62
63
|
Requires-Dist: shiny>=1.3.0; extra == "generate"
|
|
63
64
|
Provides-Extra: mcp
|
|
64
65
|
Requires-Dist: mcp[cli]>=1.10.1; extra == "mcp"
|
|
@@ -132,13 +133,63 @@ _Data validation made beautiful and powerful_
|
|
|
132
133
|
<a href="translations/README.ar.md">العربية</a>
|
|
133
134
|
</div>
|
|
134
135
|
|
|
135
|
-
|
|
136
|
+
<br>
|
|
137
|
+
|
|
138
|
+
Pointblank takes a different approach to data quality. It doesn't have to be a tedious technical task. Rather, it can become a process focused on clear communication between team members. While other validation libraries focus solely on catching errors, Pointblank is great at both **finding issues and sharing insights**. Our beautiful, customizable reports turn validation results into conversations with stakeholders, making data quality issues immediately understandable and actionable for everyone on your team.
|
|
139
|
+
|
|
140
|
+
**Get started in minutes, not hours.** Pointblank's AI-powered [`DraftValidation`](https://posit-dev.github.io/pointblank/user-guide/draft-validation.html) feature analyzes your data and suggests intelligent validation rules automatically. So there's no need to stare at an empty validation script wondering where to begin. Pointblank can kickstart your data quality journey so you can focus on what matters most.
|
|
141
|
+
|
|
142
|
+
Whether you're a data scientist who needs to quickly communicate data quality findings, a data engineer building robust pipelines, or an analyst presenting data quality results to business stakeholders, Pointblank helps you to turn data quality from an afterthought into a competitive advantage.
|
|
143
|
+
|
|
144
|
+
## Getting Started with AI-Powered Validation Drafting
|
|
145
|
+
|
|
146
|
+
The `DraftValidation` class uses LLMs to analyze your data and generate a complete validation plan with intelligent suggestions. This helps you quickly get started with data validation or jumpstart a new project.
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
import pointblank as pb
|
|
136
150
|
|
|
137
|
-
|
|
151
|
+
# Load your data
|
|
152
|
+
data = pb.load_dataset("game_revenue") # A sample dataset
|
|
138
153
|
|
|
139
|
-
|
|
154
|
+
# Use DraftValidation to generate a validation plan
|
|
155
|
+
pb.DraftValidation(data=data, model="anthropic:claude-sonnet-4-5")
|
|
156
|
+
```
|
|
140
157
|
|
|
141
|
-
|
|
158
|
+
The output is a complete validation plan with intelligent suggestions based on your data:
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
import pointblank as pb
|
|
162
|
+
|
|
163
|
+
# The validation plan
|
|
164
|
+
validation = (
|
|
165
|
+
pb.Validate(
|
|
166
|
+
data=data,
|
|
167
|
+
label="Draft Validation",
|
|
168
|
+
thresholds=pb.Thresholds(warning=0.10, error=0.25, critical=0.35)
|
|
169
|
+
)
|
|
170
|
+
.col_vals_in_set(columns="item_type", set=["iap", "ad"])
|
|
171
|
+
.col_vals_gt(columns="item_revenue", value=0)
|
|
172
|
+
.col_vals_between(columns="session_duration", left=3.2, right=41.0)
|
|
173
|
+
.col_count_match(count=11)
|
|
174
|
+
.row_count_match(count=2000)
|
|
175
|
+
.rows_distinct()
|
|
176
|
+
.interrogate()
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
validation
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
<div align="center">
|
|
183
|
+
<img src="https://posit-dev.github.io/pointblank/assets/pointblank-draft-validation-report.png" width="800px">
|
|
184
|
+
</div>
|
|
185
|
+
|
|
186
|
+
<br>
|
|
187
|
+
|
|
188
|
+
Copy, paste, and customize the generated validation plan for your needs.
|
|
189
|
+
|
|
190
|
+
## Chainable Validation API
|
|
191
|
+
|
|
192
|
+
Pointblank's chainable API makes validation simple and readable. The same pattern always applies: (1) start with `Validate`, (2) add validation steps, and (3) finish with `interrogate()`.
|
|
142
193
|
|
|
143
194
|
```python
|
|
144
195
|
import pointblank as pb
|
|
@@ -164,6 +215,12 @@ validation
|
|
|
164
215
|
|
|
165
216
|
<br>
|
|
166
217
|
|
|
218
|
+
Once you have an interrogated `validation` object, you can leverage a variety of methods to extract insights like:
|
|
219
|
+
|
|
220
|
+
- getting detailed reports for single steps to see what went wrong
|
|
221
|
+
- filtering tables based on validation results
|
|
222
|
+
- extracting problematic data for debugging
|
|
223
|
+
|
|
167
224
|
## Why Choose Pointblank?
|
|
168
225
|
|
|
169
226
|
- **Works with your existing stack**: Seamlessly integrates with Polars, Pandas, DuckDB, MySQL, PostgreSQL, SQLite, Parquet, PySpark, Snowflake, and more!
|
|
@@ -172,7 +229,9 @@ validation
|
|
|
172
229
|
- **Threshold-based alerts**: Set 'warning', 'error', and 'critical' thresholds with custom actions
|
|
173
230
|
- **Practical outputs**: Use validation results to filter tables, extract problematic data, or trigger downstream processes
|
|
174
231
|
|
|
175
|
-
##
|
|
232
|
+
## Production-Ready Validation Pipeline
|
|
233
|
+
|
|
234
|
+
Here's how Pointblank handles complex, real-world scenarios with advanced features like threshold management, automated alerts, and comprehensive business rule validation:
|
|
176
235
|
|
|
177
236
|
```python
|
|
178
237
|
import pointblank as pb
|
|
@@ -280,7 +339,7 @@ validation = pb.yaml_interrogate("validation.yaml")
|
|
|
280
339
|
validation.get_tabular_report().show()
|
|
281
340
|
```
|
|
282
341
|
|
|
283
|
-
This approach is
|
|
342
|
+
This approach is suitable for:
|
|
284
343
|
|
|
285
344
|
- **CI/CD pipelines**: Store validation rules alongside your code
|
|
286
345
|
- **Team collaboration**: Share validation logic in a readable format
|
|
@@ -36,13 +36,63 @@ _Data validation made beautiful and powerful_
|
|
|
36
36
|
<a href="translations/README.ar.md">العربية</a>
|
|
37
37
|
</div>
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
<br>
|
|
40
|
+
|
|
41
|
+
Pointblank takes a different approach to data quality. It doesn't have to be a tedious technical task. Rather, it can become a process focused on clear communication between team members. While other validation libraries focus solely on catching errors, Pointblank is great at both **finding issues and sharing insights**. Our beautiful, customizable reports turn validation results into conversations with stakeholders, making data quality issues immediately understandable and actionable for everyone on your team.
|
|
42
|
+
|
|
43
|
+
**Get started in minutes, not hours.** Pointblank's AI-powered [`DraftValidation`](https://posit-dev.github.io/pointblank/user-guide/draft-validation.html) feature analyzes your data and suggests intelligent validation rules automatically. So there's no need to stare at an empty validation script wondering where to begin. Pointblank can kickstart your data quality journey so you can focus on what matters most.
|
|
44
|
+
|
|
45
|
+
Whether you're a data scientist who needs to quickly communicate data quality findings, a data engineer building robust pipelines, or an analyst presenting data quality results to business stakeholders, Pointblank helps you to turn data quality from an afterthought into a competitive advantage.
|
|
46
|
+
|
|
47
|
+
## Getting Started with AI-Powered Validation Drafting
|
|
48
|
+
|
|
49
|
+
The `DraftValidation` class uses LLMs to analyze your data and generate a complete validation plan with intelligent suggestions. This helps you quickly get started with data validation or jumpstart a new project.
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
import pointblank as pb
|
|
40
53
|
|
|
41
|
-
|
|
54
|
+
# Load your data
|
|
55
|
+
data = pb.load_dataset("game_revenue") # A sample dataset
|
|
42
56
|
|
|
43
|
-
|
|
57
|
+
# Use DraftValidation to generate a validation plan
|
|
58
|
+
pb.DraftValidation(data=data, model="anthropic:claude-sonnet-4-5")
|
|
59
|
+
```
|
|
44
60
|
|
|
45
|
-
|
|
61
|
+
The output is a complete validation plan with intelligent suggestions based on your data:
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
import pointblank as pb
|
|
65
|
+
|
|
66
|
+
# The validation plan
|
|
67
|
+
validation = (
|
|
68
|
+
pb.Validate(
|
|
69
|
+
data=data,
|
|
70
|
+
label="Draft Validation",
|
|
71
|
+
thresholds=pb.Thresholds(warning=0.10, error=0.25, critical=0.35)
|
|
72
|
+
)
|
|
73
|
+
.col_vals_in_set(columns="item_type", set=["iap", "ad"])
|
|
74
|
+
.col_vals_gt(columns="item_revenue", value=0)
|
|
75
|
+
.col_vals_between(columns="session_duration", left=3.2, right=41.0)
|
|
76
|
+
.col_count_match(count=11)
|
|
77
|
+
.row_count_match(count=2000)
|
|
78
|
+
.rows_distinct()
|
|
79
|
+
.interrogate()
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
validation
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
<div align="center">
|
|
86
|
+
<img src="https://posit-dev.github.io/pointblank/assets/pointblank-draft-validation-report.png" width="800px">
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<br>
|
|
90
|
+
|
|
91
|
+
Copy, paste, and customize the generated validation plan for your needs.
|
|
92
|
+
|
|
93
|
+
## Chainable Validation API
|
|
94
|
+
|
|
95
|
+
Pointblank's chainable API makes validation simple and readable. The same pattern always applies: (1) start with `Validate`, (2) add validation steps, and (3) finish with `interrogate()`.
|
|
46
96
|
|
|
47
97
|
```python
|
|
48
98
|
import pointblank as pb
|
|
@@ -68,6 +118,12 @@ validation
|
|
|
68
118
|
|
|
69
119
|
<br>
|
|
70
120
|
|
|
121
|
+
Once you have an interrogated `validation` object, you can leverage a variety of methods to extract insights like:
|
|
122
|
+
|
|
123
|
+
- getting detailed reports for single steps to see what went wrong
|
|
124
|
+
- filtering tables based on validation results
|
|
125
|
+
- extracting problematic data for debugging
|
|
126
|
+
|
|
71
127
|
## Why Choose Pointblank?
|
|
72
128
|
|
|
73
129
|
- **Works with your existing stack**: Seamlessly integrates with Polars, Pandas, DuckDB, MySQL, PostgreSQL, SQLite, Parquet, PySpark, Snowflake, and more!
|
|
@@ -76,7 +132,9 @@ validation
|
|
|
76
132
|
- **Threshold-based alerts**: Set 'warning', 'error', and 'critical' thresholds with custom actions
|
|
77
133
|
- **Practical outputs**: Use validation results to filter tables, extract problematic data, or trigger downstream processes
|
|
78
134
|
|
|
79
|
-
##
|
|
135
|
+
## Production-Ready Validation Pipeline
|
|
136
|
+
|
|
137
|
+
Here's how Pointblank handles complex, real-world scenarios with advanced features like threshold management, automated alerts, and comprehensive business rule validation:
|
|
80
138
|
|
|
81
139
|
```python
|
|
82
140
|
import pointblank as pb
|
|
@@ -184,7 +242,7 @@ validation = pb.yaml_interrogate("validation.yaml")
|
|
|
184
242
|
validation.get_tabular_report().show()
|
|
185
243
|
```
|
|
186
244
|
|
|
187
|
-
This approach is
|
|
245
|
+
This approach is suitable for:
|
|
188
246
|
|
|
189
247
|
- **CI/CD pipelines**: Store validation rules alongside your code
|
|
190
248
|
- **Team collaboration**: Share validation logic in a readable format
|
|
@@ -6,6 +6,9 @@ project:
|
|
|
6
6
|
|
|
7
7
|
format:
|
|
8
8
|
html:
|
|
9
|
+
include-in-header:
|
|
10
|
+
- text: |
|
|
11
|
+
<script src="https://cdn.jsdelivr.net/gh/posit-dev/supported-by-posit/js/badge.min.js"></script>
|
|
9
12
|
theme: flatly
|
|
10
13
|
css:
|
|
11
14
|
- styles.css
|
|
@@ -85,6 +88,7 @@ website:
|
|
|
85
88
|
- user-guide/yaml-reference.qmd
|
|
86
89
|
- section: "Post Interrogation"
|
|
87
90
|
contents:
|
|
91
|
+
- user-guide/validation-reports.qmd
|
|
88
92
|
- user-guide/step-reports.qmd
|
|
89
93
|
- user-guide/extracts.qmd
|
|
90
94
|
- user-guide/sundering.qmd
|
|
@@ -153,9 +157,12 @@ quartodoc:
|
|
|
153
157
|
- name: Validate.col_vals_outside
|
|
154
158
|
- name: Validate.col_vals_in_set
|
|
155
159
|
- name: Validate.col_vals_not_in_set
|
|
160
|
+
- name: Validate.col_vals_increasing
|
|
161
|
+
- name: Validate.col_vals_decreasing
|
|
156
162
|
- name: Validate.col_vals_null
|
|
157
163
|
- name: Validate.col_vals_not_null
|
|
158
164
|
- name: Validate.col_vals_regex
|
|
165
|
+
- name: Validate.col_vals_within_spec
|
|
159
166
|
- name: Validate.col_vals_expr
|
|
160
167
|
- name: Validate.rows_distinct
|
|
161
168
|
- name: Validate.rows_complete
|
|
@@ -163,8 +170,10 @@ quartodoc:
|
|
|
163
170
|
- name: Validate.col_schema_match
|
|
164
171
|
- name: Validate.row_count_match
|
|
165
172
|
- name: Validate.col_count_match
|
|
173
|
+
- name: Validate.tbl_match
|
|
166
174
|
- name: Validate.conjointly
|
|
167
175
|
- name: Validate.specially
|
|
176
|
+
- name: Validate.prompt
|
|
168
177
|
- title: Column Selection
|
|
169
178
|
desc: >
|
|
170
179
|
A flexible way to select columns for validation is to use the `col()` function along with
|
|
@@ -238,10 +247,12 @@ quartodoc:
|
|
|
238
247
|
The *YAML* group contains functions that allow for the use of YAML to orchestrate validation
|
|
239
248
|
workflows. The `yaml_interrogate()` function can be used to run a validation workflow from
|
|
240
249
|
YAML strings or files. The `validate_yaml()` function checks if the YAML configuration
|
|
241
|
-
passes its own validity checks.
|
|
250
|
+
passes its own validity checks. The `yaml_to_python()` function converts YAML configuration
|
|
251
|
+
to equivalent Python code.
|
|
242
252
|
contents:
|
|
243
253
|
- name: yaml_interrogate
|
|
244
254
|
- name: validate_yaml
|
|
255
|
+
- name: yaml_to_python
|
|
245
256
|
- title: Utility Functions
|
|
246
257
|
desc: >
|
|
247
258
|
The *Utility Functions* group contains functions that are useful accessing metadata about
|
|
@@ -254,6 +265,8 @@ quartodoc:
|
|
|
254
265
|
- name: get_row_count
|
|
255
266
|
- name: get_action_metadata
|
|
256
267
|
- name: get_validation_summary
|
|
268
|
+
- name: write_file
|
|
269
|
+
- name: read_file
|
|
257
270
|
- name: config
|
|
258
271
|
- title: Prebuilt Actions
|
|
259
272
|
desc: >
|
|
Binary file
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
pagetitle: "Examples: Validating Data Freshness"
|
|
3
|
+
notebook-links: false
|
|
4
|
+
page-navigation: false
|
|
5
|
+
toc: false
|
|
6
|
+
html-table-processing: none
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
### Validating Data Freshness
|
|
10
|
+
|
|
11
|
+
Use date/datetime-based validations to ensure your data is current and recent. This is critical for applications that depend on timely data updates.
|
|
12
|
+
|
|
13
|
+
```{python}
|
|
14
|
+
#| echo: false
|
|
15
|
+
|
|
16
|
+
import pointblank as pb
|
|
17
|
+
import polars as pl
|
|
18
|
+
from datetime import date, datetime, timedelta
|
|
19
|
+
|
|
20
|
+
# Create sample data with mixed freshness levels
|
|
21
|
+
freshness_data = pl.DataFrame({
|
|
22
|
+
"data_timestamp": [
|
|
23
|
+
datetime(2023, 12, 28, 10, 30), # 3 days ago from Dec 31
|
|
24
|
+
datetime(2023, 12, 29, 14, 15), # 2 days ago
|
|
25
|
+
datetime(2023, 12, 30, 9, 45), # 1 day ago
|
|
26
|
+
datetime(2023, 12, 31, 16, 20), # Today
|
|
27
|
+
],
|
|
28
|
+
"sensor_id": ["TEMP_01", "TEMP_02", "TEMP_01", "TEMP_03"],
|
|
29
|
+
"reading": [22.5, 21.8, 23.1, 22.9],
|
|
30
|
+
"quality_score": [0.95, 0.88, 0.92, 0.97]
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
# Assuming today is 2023-12-31, check for data freshness
|
|
34
|
+
current_date = date(2023, 12, 31)
|
|
35
|
+
freshness_cutoff = current_date - timedelta(days=2) # Data should be within 2 days
|
|
36
|
+
|
|
37
|
+
validation = (
|
|
38
|
+
pb.Validate(freshness_data)
|
|
39
|
+
.specially(
|
|
40
|
+
expr=lambda df: df.filter(
|
|
41
|
+
pl.col("data_timestamp").dt.date() >= freshness_cutoff
|
|
42
|
+
).height > 0,
|
|
43
|
+
brief=f"Recent data available (within 2 days of {current_date})"
|
|
44
|
+
)
|
|
45
|
+
.col_vals_ge(
|
|
46
|
+
columns="data_timestamp",
|
|
47
|
+
value=current_date - timedelta(days=7), # Within last week
|
|
48
|
+
brief="All data points are from the last week"
|
|
49
|
+
)
|
|
50
|
+
.specially(
|
|
51
|
+
expr=lambda df: (
|
|
52
|
+
df.select(pl.col("data_timestamp").max()).item().date() >= current_date
|
|
53
|
+
),
|
|
54
|
+
brief="Most recent data is from today"
|
|
55
|
+
)
|
|
56
|
+
.col_vals_not_null(
|
|
57
|
+
columns="data_timestamp",
|
|
58
|
+
brief="No missing timestamps"
|
|
59
|
+
)
|
|
60
|
+
.interrogate()
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
validation
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
import pointblank as pb
|
|
68
|
+
import polars as pl
|
|
69
|
+
from datetime import date, datetime, timedelta
|
|
70
|
+
|
|
71
|
+
# Create sample data with mixed freshness levels
|
|
72
|
+
freshness_data = pl.DataFrame({
|
|
73
|
+
"data_timestamp": [
|
|
74
|
+
datetime(2023, 12, 28, 10, 30), # 3 days ago from Dec 31
|
|
75
|
+
datetime(2023, 12, 29, 14, 15), # 2 days ago
|
|
76
|
+
datetime(2023, 12, 30, 9, 45), # 1 day ago
|
|
77
|
+
datetime(2023, 12, 31, 16, 20), # Today
|
|
78
|
+
],
|
|
79
|
+
"sensor_id": ["TEMP_01", "TEMP_02", "TEMP_01", "TEMP_03"],
|
|
80
|
+
"reading": [22.5, 21.8, 23.1, 22.9],
|
|
81
|
+
"quality_score": [0.95, 0.88, 0.92, 0.97]
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
# Assuming today is 2023-12-31, check for data freshness
|
|
85
|
+
current_date = date(2023, 12, 31)
|
|
86
|
+
freshness_cutoff = current_date - timedelta(days=2) # Data should be within 2 days
|
|
87
|
+
|
|
88
|
+
validation = (
|
|
89
|
+
pb.Validate(freshness_data)
|
|
90
|
+
.specially(
|
|
91
|
+
expr=lambda df: df.filter(
|
|
92
|
+
pl.col("data_timestamp").dt.date() >= freshness_cutoff
|
|
93
|
+
).height > 0,
|
|
94
|
+
brief=f"Recent data available (within 2 days of {current_date})"
|
|
95
|
+
)
|
|
96
|
+
.col_vals_ge(
|
|
97
|
+
columns="data_timestamp",
|
|
98
|
+
value=current_date - timedelta(days=7), # Within last week
|
|
99
|
+
brief="All data points are from the last week"
|
|
100
|
+
)
|
|
101
|
+
.specially(
|
|
102
|
+
expr=lambda df: (
|
|
103
|
+
df.select(pl.col("data_timestamp").max()).item().date() >= current_date
|
|
104
|
+
),
|
|
105
|
+
brief="Most recent data is from today"
|
|
106
|
+
)
|
|
107
|
+
.col_vals_not_null(
|
|
108
|
+
columns="data_timestamp",
|
|
109
|
+
brief="No missing timestamps"
|
|
110
|
+
)
|
|
111
|
+
.interrogate()
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
validation
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
<details>
|
|
118
|
+
<summary>Preview of Input Table</summary>
|
|
119
|
+
|
|
120
|
+
```{python}
|
|
121
|
+
# | echo: false
|
|
122
|
+
pb.preview(freshness_data)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
</details>
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
pagetitle: "Examples: Date and Datetime Validations"
|
|
3
|
+
notebook-links: false
|
|
4
|
+
page-navigation: false
|
|
5
|
+
toc: false
|
|
6
|
+
html-table-processing: none
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
### Date and Datetime Validations
|
|
10
|
+
|
|
11
|
+
**pointblank** provides comprehensive support for validating date and datetime values, including timezone-aware comparisons. This ensures temporal data quality in applications that handle time-sensitive information.
|
|
12
|
+
|
|
13
|
+
```{python}
|
|
14
|
+
#| echo: false
|
|
15
|
+
|
|
16
|
+
import pointblank as pb
|
|
17
|
+
import polars as pl
|
|
18
|
+
from datetime import date, datetime
|
|
19
|
+
import pytz
|
|
20
|
+
|
|
21
|
+
# Create sample data with various temporal data types
|
|
22
|
+
temporal_data = pl.DataFrame({
|
|
23
|
+
"order_date": [
|
|
24
|
+
date(2023, 1, 15),
|
|
25
|
+
date(2023, 6, 10),
|
|
26
|
+
date(2023, 12, 5),
|
|
27
|
+
date(2024, 3, 20)
|
|
28
|
+
],
|
|
29
|
+
"created_at": [
|
|
30
|
+
datetime(2023, 1, 15, 9, 30, 0),
|
|
31
|
+
datetime(2023, 6, 10, 14, 45, 30),
|
|
32
|
+
datetime(2023, 12, 5, 8, 15, 0),
|
|
33
|
+
datetime(2024, 3, 20, 17, 22, 45)
|
|
34
|
+
],
|
|
35
|
+
"event_time_tz": [
|
|
36
|
+
datetime(2023, 1, 15, 9, 0, tzinfo=pytz.timezone("America/New_York")),
|
|
37
|
+
datetime(2023, 6, 10, 12, 30, tzinfo=pytz.timezone("America/New_York")),
|
|
38
|
+
datetime(2023, 12, 5, 15, 45, tzinfo=pytz.timezone("America/New_York")),
|
|
39
|
+
datetime(2024, 3, 20, 18, 15, tzinfo=pytz.timezone("America/New_York"))
|
|
40
|
+
],
|
|
41
|
+
"order_id": [1001, 1002, 1003, 1004],
|
|
42
|
+
"amount": [150.0, 275.5, 89.99, 420.00]
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
validation = (
|
|
46
|
+
pb.Validate(temporal_data)
|
|
47
|
+
.col_vals_ge(
|
|
48
|
+
columns="order_date",
|
|
49
|
+
value=date(2023, 1, 1),
|
|
50
|
+
brief="Orders are from 2023 or later"
|
|
51
|
+
)
|
|
52
|
+
.col_vals_between(
|
|
53
|
+
columns="created_at",
|
|
54
|
+
left=datetime(2023, 1, 1, 0, 0, 0),
|
|
55
|
+
right=datetime(2024, 12, 31, 23, 59, 59),
|
|
56
|
+
brief="Creation timestamps within expected range"
|
|
57
|
+
)
|
|
58
|
+
.col_vals_ge(
|
|
59
|
+
columns="event_time_tz",
|
|
60
|
+
value=datetime(2023, 1, 1, 8, 0, tzinfo=pytz.timezone("America/New_York")),
|
|
61
|
+
brief="Timezone-aware events after 8 AM Eastern"
|
|
62
|
+
)
|
|
63
|
+
.col_schema_match(
|
|
64
|
+
pb.Schema(
|
|
65
|
+
columns=[
|
|
66
|
+
("order_date", "Date"),
|
|
67
|
+
("created_at", "Datetime(time_unit='us', time_zone=None)"),
|
|
68
|
+
("event_time_tz", "Datetime(time_unit='us', time_zone='America/New_York')"),
|
|
69
|
+
("order_id", "Int64"),
|
|
70
|
+
("amount", "Float64")
|
|
71
|
+
]
|
|
72
|
+
),
|
|
73
|
+
brief="Schema includes proper date/datetime types"
|
|
74
|
+
)
|
|
75
|
+
.interrogate()
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
validation
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
import pointblank as pb
|
|
83
|
+
import polars as pl
|
|
84
|
+
from datetime import date, datetime
|
|
85
|
+
import pytz
|
|
86
|
+
|
|
87
|
+
# Create sample data with various temporal data types
|
|
88
|
+
temporal_data = pl.DataFrame({
|
|
89
|
+
"order_date": [
|
|
90
|
+
date(2023, 1, 15),
|
|
91
|
+
date(2023, 6, 10),
|
|
92
|
+
date(2023, 12, 5),
|
|
93
|
+
date(2024, 3, 20)
|
|
94
|
+
],
|
|
95
|
+
"created_at": [
|
|
96
|
+
datetime(2023, 1, 15, 9, 30, 0),
|
|
97
|
+
datetime(2023, 6, 10, 14, 45, 30),
|
|
98
|
+
datetime(2023, 12, 5, 8, 15, 0),
|
|
99
|
+
datetime(2024, 3, 20, 17, 22, 45)
|
|
100
|
+
],
|
|
101
|
+
"event_time_tz": [
|
|
102
|
+
datetime(2023, 1, 15, 9, 0, tzinfo=pytz.timezone("America/New_York")),
|
|
103
|
+
datetime(2023, 6, 10, 12, 30, tzinfo=pytz.timezone("America/New_York")),
|
|
104
|
+
datetime(2023, 12, 5, 15, 45, tzinfo=pytz.timezone("America/New_York")),
|
|
105
|
+
datetime(2024, 3, 20, 18, 15, tzinfo=pytz.timezone("America/New_York"))
|
|
106
|
+
],
|
|
107
|
+
"order_id": [1001, 1002, 1003, 1004],
|
|
108
|
+
"amount": [150.0, 275.5, 89.99, 420.00]
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
validation = (
|
|
112
|
+
pb.Validate(temporal_data)
|
|
113
|
+
.col_vals_ge(
|
|
114
|
+
columns="order_date",
|
|
115
|
+
value=date(2023, 1, 1),
|
|
116
|
+
brief="Orders are from 2023 or later"
|
|
117
|
+
)
|
|
118
|
+
.col_vals_between(
|
|
119
|
+
columns="created_at",
|
|
120
|
+
left=datetime(2023, 1, 1, 0, 0, 0),
|
|
121
|
+
right=datetime(2024, 12, 31, 23, 59, 59),
|
|
122
|
+
brief="Creation timestamps within expected range"
|
|
123
|
+
)
|
|
124
|
+
.col_vals_ge(
|
|
125
|
+
columns="event_time_tz",
|
|
126
|
+
value=datetime(2023, 1, 1, 8, 0, tzinfo=pytz.timezone("America/New_York")),
|
|
127
|
+
brief="Timezone-aware events after 8 AM Eastern"
|
|
128
|
+
)
|
|
129
|
+
.col_schema_match(
|
|
130
|
+
pb.Schema(
|
|
131
|
+
columns=[
|
|
132
|
+
("order_date", "Date"),
|
|
133
|
+
("created_at", "Datetime(time_unit='us', time_zone=None)"),
|
|
134
|
+
("event_time_tz", "Datetime(time_unit='us', time_zone='America/New_York')"),
|
|
135
|
+
("order_id", "Int64"),
|
|
136
|
+
("amount", "Float64")
|
|
137
|
+
]
|
|
138
|
+
),
|
|
139
|
+
brief="Schema includes proper date/datetime types"
|
|
140
|
+
)
|
|
141
|
+
.interrogate()
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
validation
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
<details>
|
|
148
|
+
<summary>Preview of Input Table</summary>
|
|
149
|
+
|
|
150
|
+
```{python}
|
|
151
|
+
# | echo: false
|
|
152
|
+
pb.preview(temporal_data)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
</details>
|
|
@@ -153,8 +153,11 @@ For far more specialized validations, modify the table with the `pre=` argument
|
|
|
153
153
|
[Verifying Row and Column Counts](./check-row-column-counts/index.qmd)<br>
|
|
154
154
|
Check the dimensions of the table with the `*_count_match()` validation methods.
|
|
155
155
|
|
|
156
|
-
[Validating
|
|
157
|
-
Use date-based validations to ensure your data is current and
|
|
156
|
+
[Validating Data Freshness](./check-for-freshness/index.qmd)<br>
|
|
157
|
+
Use date-based validations to ensure your data is current and recent.
|
|
158
|
+
|
|
159
|
+
[Date and Datetime Validations](./datetime-validations/index.qmd)<br>
|
|
160
|
+
Comprehensive examples of date, datetime, and timezone-aware datetime comparisons.
|
|
158
161
|
|
|
159
162
|
[Custom Validation with `specially()`](./custom-validation-specially/index.qmd)<br>
|
|
160
163
|
Create bespoke validations using `specially()` to implement domain-specific business rules.
|
|
@@ -17,6 +17,18 @@ import pointblank as pb
|
|
|
17
17
|
import polars as pl
|
|
18
18
|
import narwhals as nw
|
|
19
19
|
|
|
20
|
+
# Define preprocessing functions
|
|
21
|
+
def get_median_a(df):
|
|
22
|
+
"""Use a Polars expression to aggregate column `a`."""
|
|
23
|
+
return df.select(pl.median("a"))
|
|
24
|
+
|
|
25
|
+
def add_b_length_column(df):
|
|
26
|
+
"""Use Narwhals to add a string length column `b_len`."""
|
|
27
|
+
return (
|
|
28
|
+
nw.from_native(df)
|
|
29
|
+
.with_columns(b_len=nw.col("b").str.len_chars())
|
|
30
|
+
)
|
|
31
|
+
|
|
20
32
|
validation = (
|
|
21
33
|
pb.Validate(
|
|
22
34
|
data=pb.load_dataset(dataset="small_table", tbl_type="polars")
|
|
@@ -24,14 +36,12 @@ validation = (
|
|
|
24
36
|
.col_vals_between(
|
|
25
37
|
columns="a",
|
|
26
38
|
left=3, right=6,
|
|
27
|
-
pre=
|
|
39
|
+
pre=get_median_a
|
|
28
40
|
)
|
|
29
41
|
.col_vals_eq(
|
|
30
42
|
columns="b_len",
|
|
31
43
|
value=9,
|
|
32
|
-
pre=
|
|
33
|
-
b_len=nw.col("b").str.len_chars() # by the 'dfn' here
|
|
34
|
-
)
|
|
44
|
+
pre=add_b_length_column
|
|
35
45
|
)
|
|
36
46
|
.interrogate()
|
|
37
47
|
)
|
|
@@ -44,6 +54,18 @@ import pointblank as pb
|
|
|
44
54
|
import polars as pl
|
|
45
55
|
import narwhals as nw
|
|
46
56
|
|
|
57
|
+
# Define preprocessing functions
|
|
58
|
+
def get_median_a(df):
|
|
59
|
+
"""Use a Polars expression to aggregate column `a`."""
|
|
60
|
+
return df.select(pl.median("a"))
|
|
61
|
+
|
|
62
|
+
def add_b_length_column(df):
|
|
63
|
+
"""Use Narwhals to add a string length column `b_len`."""
|
|
64
|
+
return (
|
|
65
|
+
nw.from_native(df)
|
|
66
|
+
.with_columns(b_len=nw.col("b").str.len_chars())
|
|
67
|
+
)
|
|
68
|
+
|
|
47
69
|
validation = (
|
|
48
70
|
pb.Validate(
|
|
49
71
|
data=pb.load_dataset(dataset="small_table", tbl_type="polars")
|
|
@@ -51,14 +73,12 @@ validation = (
|
|
|
51
73
|
.col_vals_between(
|
|
52
74
|
columns="a",
|
|
53
75
|
left=3, right=6,
|
|
54
|
-
pre=
|
|
76
|
+
pre=get_median_a
|
|
55
77
|
)
|
|
56
78
|
.col_vals_eq(
|
|
57
79
|
columns="b_len",
|
|
58
80
|
value=9,
|
|
59
|
-
pre=
|
|
60
|
-
b_len=nw.col("b").str.len_chars() # by the 'dfn' here
|
|
61
|
-
)
|
|
81
|
+
pre=add_b_length_column
|
|
62
82
|
)
|
|
63
83
|
.interrogate()
|
|
64
84
|
)
|