pointblank 0.13.4__tar.gz → 0.14.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. {pointblank-0.13.4 → pointblank-0.14.0}/CITATION.cff +1 -1
  2. {pointblank-0.13.4 → pointblank-0.14.0}/PKG-INFO +66 -8
  3. {pointblank-0.13.4 → pointblank-0.14.0}/README.md +64 -6
  4. {pointblank-0.13.4 → pointblank-0.14.0}/docs/_quarto.yml +9 -1
  5. pointblank-0.14.0/docs/assets/pointblank-draft-validation-report.png +0 -0
  6. pointblank-0.14.0/docs/demos/check-for-freshness/index.qmd +125 -0
  7. pointblank-0.14.0/docs/demos/datetime-validations/index.qmd +155 -0
  8. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/index.qmd +5 -2
  9. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/mutate-table-in-step/index.qmd +28 -8
  10. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/preprocessing.qmd +19 -7
  11. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/segmentation.qmd +7 -3
  12. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/validation-overview.qmd +9 -6
  13. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/__init__.py +4 -0
  14. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/_constants.py +54 -0
  15. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/_constants_translations.py +487 -2
  16. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/_interrogation.py +182 -11
  17. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/_utils.py +3 -3
  18. pointblank-0.14.0/pointblank/_utils_ai.py +850 -0
  19. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/cli.py +128 -115
  20. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/column.py +1 -1
  21. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/api-docs.txt +198 -13
  22. pointblank-0.14.0/pointblank/data/validations/README.md +108 -0
  23. pointblank-0.14.0/pointblank/data/validations/complex_preprocessing.json +54 -0
  24. pointblank-0.14.0/pointblank/data/validations/complex_preprocessing.pkl +0 -0
  25. pointblank-0.14.0/pointblank/data/validations/generate_test_files.py +127 -0
  26. pointblank-0.14.0/pointblank/data/validations/multiple_steps.json +83 -0
  27. pointblank-0.14.0/pointblank/data/validations/multiple_steps.pkl +0 -0
  28. pointblank-0.14.0/pointblank/data/validations/narwhals_function.json +28 -0
  29. pointblank-0.14.0/pointblank/data/validations/narwhals_function.pkl +0 -0
  30. pointblank-0.14.0/pointblank/data/validations/no_preprocessing.json +83 -0
  31. pointblank-0.14.0/pointblank/data/validations/no_preprocessing.pkl +0 -0
  32. pointblank-0.14.0/pointblank/data/validations/pandas_compatible.json +28 -0
  33. pointblank-0.14.0/pointblank/data/validations/pandas_compatible.pkl +0 -0
  34. pointblank-0.14.0/pointblank/data/validations/preprocessing_functions.py +46 -0
  35. pointblank-0.14.0/pointblank/data/validations/simple_preprocessing.json +57 -0
  36. pointblank-0.14.0/pointblank/data/validations/simple_preprocessing.pkl +0 -0
  37. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/datascan.py +4 -4
  38. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/scan_profile.py +6 -6
  39. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/schema.py +8 -82
  40. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/thresholds.py +1 -1
  41. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/validate.py +1233 -12
  42. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank.egg-info/PKG-INFO +66 -8
  43. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank.egg-info/SOURCES.txt +23 -0
  44. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank.egg-info/requires.txt +1 -1
  45. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank_mcp_server/pointblank_server.py +2 -0
  46. {pointblank-0.13.4 → pointblank-0.14.0}/pyproject.toml +3 -1
  47. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html +1 -1
  48. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_no_interrogation_validation_report_html_snap/no_interrogation_validation_report.html +1 -1
  49. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_no_steps_validation_report_html_snap/no_steps_validation_report.html +1 -1
  50. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_briefs_global_local_html/validation_report_briefs_global_local.html +1 -1
  51. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_briefs_html/validation_report_with_briefs.html +1 -1
  52. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_segments_html/duckdb/validation_report_segments.html +1 -1
  53. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_segments_html/pandas/validation_report_segments.html +1 -1
  54. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_segments_html/polars/validation_report_segments.html +1 -1
  55. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/validation_report_segments_with_pre.html +1 -1
  56. {pointblank-0.13.4 → pointblank-0.14.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
  57. {pointblank-0.13.4 → pointblank-0.14.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
  58. {pointblank-0.13.4 → pointblank-0.14.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
  59. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test__interrogation.py +96 -5
  60. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test__utils.py +139 -17
  61. pointblank-0.14.0/tests/test__utils_ai.py +823 -0
  62. pointblank-0.14.0/tests/test_cli.py +2875 -0
  63. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_datascan.py +98 -2
  64. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_meta.py +0 -4
  65. pointblank-0.14.0/tests/test_prompt_method.py +577 -0
  66. pointblank-0.14.0/tests/test_scan_profile_stats.py +157 -0
  67. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_schema.py +116 -3
  68. pointblank-0.14.0/tests/test_serialization_compat.py +164 -0
  69. pointblank-0.14.0/tests/test_serialization_edge_cases.py +199 -0
  70. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_validate.py +1431 -73
  71. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.ar.md +58 -4
  72. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.de.md +58 -4
  73. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.es.md +58 -4
  74. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.fr.md +59 -5
  75. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.hi.md +58 -4
  76. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.it.md +58 -4
  77. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.ja.md +58 -4
  78. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.ko.md +58 -4
  79. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.nl.md +58 -4
  80. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.pt-BR.md +58 -4
  81. {pointblank-0.13.4 → pointblank-0.14.0}/translations/README.zh-CN.md +62 -5
  82. pointblank-0.13.4/docs/demos/check-for-freshness/index.qmd +0 -87
  83. pointblank-0.13.4/tests/test_cli.py +0 -1383
  84. {pointblank-0.13.4 → pointblank-0.14.0}/.github/CODE_OF_CONDUCT.md +0 -0
  85. {pointblank-0.13.4 → pointblank-0.14.0}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  86. {pointblank-0.13.4 → pointblank-0.14.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  87. {pointblank-0.13.4 → pointblank-0.14.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  88. {pointblank-0.13.4 → pointblank-0.14.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  89. {pointblank-0.13.4 → pointblank-0.14.0}/.github/SECURITY.md +0 -0
  90. {pointblank-0.13.4 → pointblank-0.14.0}/.github/workflows/ci-docs.yaml +0 -0
  91. {pointblank-0.13.4 → pointblank-0.14.0}/.github/workflows/ci-tests.yaml +0 -0
  92. {pointblank-0.13.4 → pointblank-0.14.0}/.github/workflows/code-checks.yaml +0 -0
  93. {pointblank-0.13.4 → pointblank-0.14.0}/.gitignore +0 -0
  94. {pointblank-0.13.4 → pointblank-0.14.0}/.pre-commit-config.yaml +0 -0
  95. {pointblank-0.13.4 → pointblank-0.14.0}/.vscode/settings.json +0 -0
  96. {pointblank-0.13.4 → pointblank-0.14.0}/CONTRIBUTING.md +0 -0
  97. {pointblank-0.13.4 → pointblank-0.14.0}/LICENSE +0 -0
  98. {pointblank-0.13.4 → pointblank-0.14.0}/Makefile +0 -0
  99. {pointblank-0.13.4 → pointblank-0.14.0}/data_raw/game_revenue.csv +0 -0
  100. {pointblank-0.13.4 → pointblank-0.14.0}/data_raw/global_sales.csv +0 -0
  101. {pointblank-0.13.4 → pointblank-0.14.0}/data_raw/global_sales_dataset.qmd +0 -0
  102. {pointblank-0.13.4 → pointblank-0.14.0}/data_raw/nycflights.csv +0 -0
  103. {pointblank-0.13.4 → pointblank-0.14.0}/data_raw/small_table.csv +0 -0
  104. {pointblank-0.13.4 → pointblank-0.14.0}/data_raw/worldcities.csv +0 -0
  105. {pointblank-0.13.4 → pointblank-0.14.0}/data_raw/x-01-parquet.qmd +0 -0
  106. {pointblank-0.13.4 → pointblank-0.14.0}/data_raw/x-02-duckdb.qmd +0 -0
  107. {pointblank-0.13.4 → pointblank-0.14.0}/data_raw/x-03-sqlite.qmd +0 -0
  108. {pointblank-0.13.4 → pointblank-0.14.0}/docs/.gitignore +0 -0
  109. {pointblank-0.13.4 → pointblank-0.14.0}/docs/_extensions/machow/interlinks/.gitignore +0 -0
  110. {pointblank-0.13.4 → pointblank-0.14.0}/docs/_extensions/machow/interlinks/_extension.yml +0 -0
  111. {pointblank-0.13.4 → pointblank-0.14.0}/docs/_extensions/machow/interlinks/interlinks.lua +0 -0
  112. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/fav-logo.png +0 -0
  113. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-info-worldcities-csv.png +0 -0
  114. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-info-worldcities-github-csv.png +0 -0
  115. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-make-template.png +0 -0
  116. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-missing-worldcities-csv.png +0 -0
  117. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-preview-game_revenue-all-columns.png +0 -0
  118. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-preview-game_revenue-column-names.png +0 -0
  119. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-preview-game_revenue-column-range.png +0 -0
  120. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-preview-worldcities-csv-no-row-numbers.png +0 -0
  121. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-preview-worldcities-csv.png +0 -0
  122. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-run-worldcities_validation-extracts.png +0 -0
  123. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-run-worldcities_validation-fail-on-warning.png +0 -0
  124. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-run-worldcities_validation-output.png +0 -0
  125. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-run-worldcities_validation.png +0 -0
  126. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-scan-worldcities-csv.png +0 -0
  127. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-validate-exit-code.png +0 -0
  128. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-validate-multi-check.png +0 -0
  129. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-validate-rows-complete-worldcities-csv.png +0 -0
  130. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-validate-rows-distinct-worldcities-csv.png +0 -0
  131. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-validate-show-extract.png +0 -0
  132. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-validate-worldcities-gt-0-population.png +0 -0
  133. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-validate-worldcities-not-null-city_name.png +0 -0
  134. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pb-validate-write-extract.png +0 -0
  135. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.de.png +0 -0
  136. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.es.png +0 -0
  137. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.fr.png +0 -0
  138. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.it.png +0 -0
  139. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.ja.png +0 -0
  140. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.ko.png +0 -0
  141. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.nl.png +0 -0
  142. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.png +0 -0
  143. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.pt-BR.png +0 -0
  144. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-sales-data.zh-CN.png +0 -0
  145. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-step-report.png +0 -0
  146. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank-tabular-report.png +0 -0
  147. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/pointblank_logo.svg +0 -0
  148. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/posit-logo-black.svg +0 -0
  149. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/validation-table-diagram.png +0 -0
  150. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/validation-test-units.png +0 -0
  151. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/.gitignore +0 -0
  152. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-cicd-workflows.gif +0 -0
  153. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-cicd-workflows.tape +0 -0
  154. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-complete-workflow.gif +0 -0
  155. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-complete-workflow.tape +0 -0
  156. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-data-exploration.gif +0 -0
  157. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-data-exploration.tape +0 -0
  158. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-essential-validations.gif +0 -0
  159. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-essential-validations.tape +0 -0
  160. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-getting-started.gif +0 -0
  161. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-getting-started.tape +0 -0
  162. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-using-polars.gif +0 -0
  163. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/cli-using-polars.tape +0 -0
  164. {pointblank-0.13.4 → pointblank-0.14.0}/docs/assets/vhs/validation.py +0 -0
  165. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/all-about-actions/index.qmd +0 -0
  166. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/index.qmd +0 -0
  167. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/intro-pointblank/index.qmd +0 -0
  168. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/intro-pointblank/pointblank-localized.png +0 -0
  169. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/intro-pointblank/step_report.png +0 -0
  170. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/intro-pointblank/validation-table-diagram.png +0 -0
  171. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/intro-pointblank/validation-test-units.png +0 -0
  172. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/lets-workshop-together/index.qmd +0 -0
  173. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/overhauled-user-guide/advanced-in-sidebar.png +0 -0
  174. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/overhauled-user-guide/breadth-and-depth.png +0 -0
  175. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/overhauled-user-guide/explanation-of-visual.png +0 -0
  176. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/overhauled-user-guide/index.qmd +0 -0
  177. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/overhauled-user-guide/links-in-guide.png +0 -0
  178. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/overhauled-user-guide/segments.png +0 -0
  179. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/overhauled-user-guide/step-report.png +0 -0
  180. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/overhauled-user-guide/validation-three-things.png +0 -0
  181. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/pointblank_blog_logo.png +0 -0
  182. {pointblank-0.13.4 → pointblank-0.14.0}/docs/blog/validation-libs-2025/index.qmd +0 -0
  183. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/01-starter/index.qmd +0 -0
  184. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/02-advanced/index.qmd +0 -0
  185. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/03-data-extracts/index.qmd +0 -0
  186. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/04-sundered-data/index.qmd +0 -0
  187. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/05-step-report-column-check/index.qmd +0 -0
  188. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/06-step-report-schema-check/index.qmd +0 -0
  189. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/07-validation-with-actions/index.qmd +0 -0
  190. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/08-validation-with-final-actions/index.qmd +0 -0
  191. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/apply-checks-to-several-columns/index.qmd +0 -0
  192. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/check-row-column-counts/index.qmd +0 -0
  193. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/checks-for-missing/index.qmd +0 -0
  194. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/cli-interactive/index.qmd +0 -0
  195. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/col-vals-custom-expr/index.qmd +0 -0
  196. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/column-selector-functions/index.qmd +0 -0
  197. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/comparisons-across-columns/index.qmd +0 -0
  198. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/custom-validation-specially/index.qmd +0 -0
  199. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/data/game_revenue.parquet +0 -0
  200. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/expect-no-duplicate-rows/index.qmd +0 -0
  201. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/expect-no-duplicate-values/index.qmd +0 -0
  202. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/expect-text-pattern/index.qmd +0 -0
  203. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/failure-thresholds/index.qmd +0 -0
  204. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/img/advanced_validation.png +0 -0
  205. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/img/data_extracts.png +0 -0
  206. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/img/starter_validation.png +0 -0
  207. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/img/step_report_column_schema.png +0 -0
  208. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/img/step_report_column_values.png +0 -0
  209. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/img/sundered_data.png +0 -0
  210. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/img/validation_with_actions.png +0 -0
  211. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/img/validation_with_final_actions.png +0 -0
  212. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/numeric-comparisons/index.qmd +0 -0
  213. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/schema-check/index.qmd +0 -0
  214. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/set-membership/index.qmd +0 -0
  215. {pointblank-0.13.4 → pointblank-0.14.0}/docs/demos/using-parquet-data/index.qmd +0 -0
  216. {pointblank-0.13.4 → pointblank-0.14.0}/docs/index.qmd +0 -0
  217. {pointblank-0.13.4 → pointblank-0.14.0}/docs/scripts/post-render.py +0 -0
  218. {pointblank-0.13.4 → pointblank-0.14.0}/docs/styles.css +0 -0
  219. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/actions.qmd +0 -0
  220. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/assertions.qmd +0 -0
  221. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/briefs.qmd +0 -0
  222. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/cli-data-inspection.qmd +0 -0
  223. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/cli-data-validation.qmd +0 -0
  224. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/cli-reference.qmd +0 -0
  225. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/col-summary-tbl.qmd +0 -0
  226. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/column-selection-patterns.qmd +0 -0
  227. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/draft-validation.qmd +0 -0
  228. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/expressions.qmd +0 -0
  229. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/extracts.qmd +0 -0
  230. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/index.qmd +0 -0
  231. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/installation.qmd +0 -0
  232. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/langs.qmd +0 -0
  233. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/mcp-quick-start.qmd +0 -0
  234. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/missing-vals-tbl.qmd +0 -0
  235. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/preview.qmd +0 -0
  236. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/schema-validation.qmd +0 -0
  237. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/step-reports.qmd +0 -0
  238. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/sundering.qmd +0 -0
  239. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/thresholds.qmd +0 -0
  240. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/validation-methods.qmd +0 -0
  241. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/yaml-reference.qmd +0 -0
  242. {pointblank-0.13.4 → pointblank-0.14.0}/docs/user-guide/yaml-validation-workflows.qmd +0 -0
  243. {pointblank-0.13.4 → pointblank-0.14.0}/images/pointblank-tabular-report.png +0 -0
  244. {pointblank-0.13.4 → pointblank-0.14.0}/images/pointblank_logo.svg +0 -0
  245. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/_datascan_utils.py +0 -0
  246. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/_typing.py +0 -0
  247. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/_utils_check_args.py +0 -0
  248. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/_utils_html.py +0 -0
  249. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/actions.py +0 -0
  250. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/assistant.py +0 -0
  251. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/compare.py +0 -0
  252. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/game_revenue-duckdb.zip +0 -0
  253. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/game_revenue.zip +0 -0
  254. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/global_sales-duckdb.zip +0 -0
  255. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/global_sales.zip +0 -0
  256. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/nycflights-duckdb.zip +0 -0
  257. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/nycflights.zip +0 -0
  258. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/polars-api-docs.txt +0 -0
  259. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/small_table-duckdb.zip +0 -0
  260. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/data/small_table.zip +0 -0
  261. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/draft.py +0 -0
  262. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/scan_profile_stats.py +0 -0
  263. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/segments.py +0 -0
  264. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank/yaml.py +0 -0
  265. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank.egg-info/dependency_links.txt +0 -0
  266. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank.egg-info/entry_points.txt +0 -0
  267. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank.egg-info/top_level.txt +0 -0
  268. {pointblank-0.13.4 → pointblank-0.14.0}/pointblank_mcp_server/readme.md +0 -0
  269. {pointblank-0.13.4 → pointblank-0.14.0}/setup.cfg +0 -0
  270. {pointblank-0.13.4 → pointblank-0.14.0}/tests/__init__.py +0 -0
  271. {pointblank-0.13.4 → pointblank-0.14.0}/tests/manual_tests/schema_step_reports.qmd +0 -0
  272. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_datascan/test_col_summary_tbl_duckdb_snap/col_summary_html_duckdb.html +0 -0
  273. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_datascan/test_col_summary_tbl_pandas_snap/col_summary_html_pandas.html +0 -0
  274. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_datascan/test_col_summary_tbl_polars_snap/col_summary_html_polars.html +0 -0
  275. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_01/schema_step_report_01-0.txt +0 -0
  276. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_01_1/schema_step_report_01-1.txt +0 -0
  277. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_01_2/schema_step_report_01-2.txt +0 -0
  278. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_01_3/schema_step_report_01-3.txt +0 -0
  279. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_02/schema_step_report_02-0.txt +0 -0
  280. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_02_1/schema_step_report_02-1.txt +0 -0
  281. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_02_2/schema_step_report_02-2.txt +0 -0
  282. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_02_3/schema_step_report_02-3.txt +0 -0
  283. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_03/schema_step_report_03-0.txt +0 -0
  284. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_03_1/schema_step_report_03-1.txt +0 -0
  285. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_03_2/schema_step_report_03-2.txt +0 -0
  286. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_03_3/schema_step_report_03-3.txt +0 -0
  287. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_04/schema_step_report_04-0.txt +0 -0
  288. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_05/schema_step_report_05-0.txt +0 -0
  289. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_06/schema_step_report_06-0.txt +0 -0
  290. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_07/schema_step_report_07-0.txt +0 -0
  291. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_08/schema_step_report_08-0.txt +0 -0
  292. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_09/schema_step_report_09-0.txt +0 -0
  293. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_10/schema_step_report_10-0.txt +0 -0
  294. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_11/schema_step_report_11-0.txt +0 -0
  295. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_12/schema_step_report_12-0.txt +0 -0
  296. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_13/schema_step_report_13-0.txt +0 -0
  297. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_14/schema_step_report_14-0.txt +0 -0
  298. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_14_1/schema_step_report_14-1.txt +0 -0
  299. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_15/schema_step_report_15-0.txt +0 -0
  300. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_15_1/schema_step_report_15-1.txt +0 -0
  301. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_16/schema_step_report_16-0.txt +0 -0
  302. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_16_1/schema_step_report_16-1.txt +0 -0
  303. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_17/schema_step_report_17-0.txt +0 -0
  304. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_17_1/schema_step_report_17-1.txt +0 -0
  305. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_18/schema_step_report_18-0.txt +0 -0
  306. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_18_1/schema_step_report_18-1.txt +0 -0
  307. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_19/schema_step_report_19-0.txt +0 -0
  308. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_19_1/schema_step_report_19-1.txt +0 -0
  309. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_20/schema_step_report_20-0.txt +0 -0
  310. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_20_1/schema_step_report_20-1.txt +0 -0
  311. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_21/schema_step_report_21-0.txt +0 -0
  312. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_21_1/schema_step_report_21-1.txt +0 -0
  313. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_21_2/schema_step_report_21-2.txt +0 -0
  314. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_21_3/schema_step_report_21-3.txt +0 -0
  315. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_22/schema_step_report_22-0.txt +0 -0
  316. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_22_1/schema_step_report_22-1.txt +0 -0
  317. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_23/schema_step_report_23-0.txt +0 -0
  318. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_23_1/schema_step_report_23-1.txt +0 -0
  319. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_24/schema_step_report_24-0.txt +0 -0
  320. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_24_1/schema_step_report_24-1.txt +0 -0
  321. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_24_2/schema_step_report_24-2.txt +0 -0
  322. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_24_3/schema_step_report_24-3.txt +0 -0
  323. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_25/schema_step_report_25-0.txt +0 -0
  324. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_1/schema_step_report_25-1.txt +0 -0
  325. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_2/schema_step_report_25-2.txt +0 -0
  326. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_3/schema_step_report_25-3.txt +0 -0
  327. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_4/schema_step_report_25-4.txt +0 -0
  328. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_5/schema_step_report_25-5.txt +0 -0
  329. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_01-0.txt +0 -0
  330. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_02-0.txt +0 -0
  331. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_03-0.txt +0 -0
  332. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_04-0.txt +0 -0
  333. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_05-0.txt +0 -0
  334. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_06-0.txt +0 -0
  335. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_07-0.txt +0 -0
  336. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_08-0.txt +0 -0
  337. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_09-0.txt +0 -0
  338. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_10-0.txt +0 -0
  339. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_11-0.txt +0 -0
  340. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_12-0.txt +0 -0
  341. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_13-0.txt +0 -0
  342. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-0.txt +0 -0
  343. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-1.txt +0 -0
  344. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-0.txt +0 -0
  345. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-1.txt +0 -0
  346. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-0.txt +0 -0
  347. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-1.txt +0 -0
  348. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-0.txt +0 -0
  349. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-1.txt +0 -0
  350. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-0.txt +0 -0
  351. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-1.txt +0 -0
  352. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-0.txt +0 -0
  353. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-1.txt +0 -0
  354. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-0.txt +0 -0
  355. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-1.txt +0 -0
  356. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-0.txt +0 -0
  357. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-1.txt +0 -0
  358. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-2.txt +0 -0
  359. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-3.txt +0 -0
  360. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-0.txt +0 -0
  361. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-1.txt +0 -0
  362. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-0.txt +0 -0
  363. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-1.txt +0 -0
  364. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-0.txt +0 -0
  365. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-1.txt +0 -0
  366. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-2.txt +0 -0
  367. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-3.txt +0 -0
  368. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-0.txt +0 -0
  369. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-1.txt +0 -0
  370. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-2.txt +0 -0
  371. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-3.txt +0 -0
  372. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-4.txt +0 -0
  373. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-5.txt +0 -0
  374. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
  375. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_parquet/validation_report.json +0 -0
  376. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pd/validation_report.json +0 -0
  377. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pl/validation_report.json +0 -0
  378. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
  379. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
  380. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
  381. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_parquet/validation_report.json +0 -0
  382. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pd/validation_report.json +0 -0
  383. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pl/validation_report.json +0 -0
  384. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
  385. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
  386. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/polars/validation_report_segments_with_pre.html +0 -0
  387. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_duckdb/validation_report.json +0 -0
  388. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_parquet/validation_report.json +0 -0
  389. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pd/validation_report.json +0 -0
  390. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pl/validation_report.json +0 -0
  391. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pyspark/validation_report.json +0 -0
  392. {pointblank-0.13.4 → pointblank-0.14.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_sqlite/validation_report.json +0 -0
  393. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/parquet_data/data_a.parquet +0 -0
  394. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/parquet_data/data_b.parquet +0 -0
  395. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/parquet_data/subdir/nested_data.parquet +0 -0
  396. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/partitioned_sales/status=cancelled/0.parquet +0 -0
  397. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/partitioned_sales/status=delivered/0.parquet +0 -0
  398. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/partitioned_sales/status=pending/0.parquet +0 -0
  399. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/partitioned_sales/status=returned/0.parquet +0 -0
  400. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/partitioned_sales/status=shipped/0.parquet +0 -0
  401. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/partitioned_small_table/f=high/0.parquet +0 -0
  402. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/partitioned_small_table/f=low/0.parquet +0 -0
  403. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/partitioned_small_table/f=mid/0.parquet +0 -0
  404. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/taxi_part_01.parquet +0 -0
  405. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/taxi_part_02.parquet +0 -0
  406. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/taxi_part_03.parquet +0 -0
  407. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/taxi_sample.parquet +0 -0
  408. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_dates_times_text.ddb +0 -0
  409. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_dates_times_text.parquet +0 -0
  410. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_dates_times_text.sqlite +0 -0
  411. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_true_dates_times.ddb +0 -0
  412. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_xyz.ddb +0 -0
  413. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_xyz.parquet +0 -0
  414. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_xyz.sqlite +0 -0
  415. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_xyz_missing.ddb +0 -0
  416. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_xyz_missing.parquet +0 -0
  417. {pointblank-0.13.4 → pointblank-0.14.0}/tests/tbl_files/tbl_xyz_missing.sqlite +0 -0
  418. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test__utils_check_args.py +0 -0
  419. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_actions.py +0 -0
  420. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_assistant.py +0 -0
  421. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_column.py +0 -0
  422. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_compare.py +0 -0
  423. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_draft.py +0 -0
  424. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_mcp_integration.py +0 -0
  425. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_mcp_server.py +0 -0
  426. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_segments.py +0 -0
  427. {pointblank-0.13.4 → pointblank-0.14.0}/tests/test_thresholds.py +0 -0
  428. {pointblank-0.13.4 → pointblank-0.14.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.13.1
6
+ version: 0.13.4
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.13.4
3
+ Version: 0.14.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.17.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
@@ -132,13 +132,63 @@ _Data validation made beautiful and powerful_
132
132
  <a href="translations/README.ar.md">العربية</a>
133
133
  </div>
134
134
 
135
- ## What is Pointblank?
135
+ <br>
136
+
137
+ 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.
138
+
139
+ **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.
140
+
141
+ 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.
142
+
143
+ ## Getting Started with AI-Powered Validation Drafting
144
+
145
+ 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.
146
+
147
+ ```python
148
+ import pointblank as pb
136
149
 
137
- Pointblank is a powerful, yet elegant data validation framework for Python that transforms how you ensure data quality. With its intuitive, chainable API, you can quickly validate your data against comprehensive quality checks and visualize results through stunning, interactive reports that make data issues immediately actionable.
150
+ # Load your data
151
+ data = pb.load_dataset("game_revenue") # A sample dataset
138
152
 
139
- Whether you're a data scientist, data engineer, or analyst, Pointblank helps you catch data quality issues before they impact your analyses or downstream systems.
153
+ # Use DraftValidation to generate a validation plan
154
+ pb.DraftValidation(data=data, model="anthropic:claude-sonnet-4-5")
155
+ ```
140
156
 
141
- ## Getting Started in 30 Seconds
157
+ The output is a complete validation plan with intelligent suggestions based on your data:
158
+
159
+ ```python
160
+ import pointblank as pb
161
+
162
+ # The validation plan
163
+ validation = (
164
+ pb.Validate(
165
+ data=data,
166
+ label="Draft Validation",
167
+ thresholds=pb.Thresholds(warning=0.10, error=0.25, critical=0.35)
168
+ )
169
+ .col_vals_in_set(columns="item_type", set=["iap", "ad"])
170
+ .col_vals_gt(columns="item_revenue", value=0)
171
+ .col_vals_between(columns="session_duration", left=3.2, right=41.0)
172
+ .col_count_match(count=11)
173
+ .row_count_match(count=2000)
174
+ .rows_distinct()
175
+ .interrogate()
176
+ )
177
+
178
+ validation
179
+ ```
180
+
181
+ <div align="center">
182
+ <img src="https://posit-dev.github.io/pointblank/assets/pointblank-draft-validation-report.png" width="800px">
183
+ </div>
184
+
185
+ <br>
186
+
187
+ Copy, paste, and customize the generated validation plan for your needs.
188
+
189
+ ## Chainable Validation API
190
+
191
+ 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
192
 
143
193
  ```python
144
194
  import pointblank as pb
@@ -164,6 +214,12 @@ validation
164
214
 
165
215
  <br>
166
216
 
217
+ Once you have an interrogated `validation` object, you can leverage a variety of methods to extract insights like:
218
+
219
+ - getting detailed reports for single steps to see what went wrong
220
+ - filtering tables based on validation results
221
+ - extracting problematic data for debugging
222
+
167
223
  ## Why Choose Pointblank?
168
224
 
169
225
  - **Works with your existing stack**: Seamlessly integrates with Polars, Pandas, DuckDB, MySQL, PostgreSQL, SQLite, Parquet, PySpark, Snowflake, and more!
@@ -172,7 +228,9 @@ validation
172
228
  - **Threshold-based alerts**: Set 'warning', 'error', and 'critical' thresholds with custom actions
173
229
  - **Practical outputs**: Use validation results to filter tables, extract problematic data, or trigger downstream processes
174
230
 
175
- ## Real-World Example
231
+ ## Production-Ready Validation Pipeline
232
+
233
+ Here's how Pointblank handles complex, real-world scenarios with advanced features like threshold management, automated alerts, and comprehensive business rule validation:
176
234
 
177
235
  ```python
178
236
  import pointblank as pb
@@ -280,7 +338,7 @@ validation = pb.yaml_interrogate("validation.yaml")
280
338
  validation.get_tabular_report().show()
281
339
  ```
282
340
 
283
- This approach is perfect for:
341
+ This approach is suitable for:
284
342
 
285
343
  - **CI/CD pipelines**: Store validation rules alongside your code
286
344
  - **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
- ## What is Pointblank?
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
- Pointblank is a powerful, yet elegant data validation framework for Python that transforms how you ensure data quality. With its intuitive, chainable API, you can quickly validate your data against comprehensive quality checks and visualize results through stunning, interactive reports that make data issues immediately actionable.
54
+ # Load your data
55
+ data = pb.load_dataset("game_revenue") # A sample dataset
42
56
 
43
- Whether you're a data scientist, data engineer, or analyst, Pointblank helps you catch data quality issues before they impact your analyses or downstream systems.
57
+ # Use DraftValidation to generate a validation plan
58
+ pb.DraftValidation(data=data, model="anthropic:claude-sonnet-4-5")
59
+ ```
44
60
 
45
- ## Getting Started in 30 Seconds
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
- ## Real-World Example
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 perfect for:
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
@@ -165,6 +168,7 @@ quartodoc:
165
168
  - name: Validate.col_count_match
166
169
  - name: Validate.conjointly
167
170
  - name: Validate.specially
171
+ - name: Validate.prompt
168
172
  - title: Column Selection
169
173
  desc: >
170
174
  A flexible way to select columns for validation is to use the `col()` function along with
@@ -238,10 +242,12 @@ quartodoc:
238
242
  The *YAML* group contains functions that allow for the use of YAML to orchestrate validation
239
243
  workflows. The `yaml_interrogate()` function can be used to run a validation workflow from
240
244
  YAML strings or files. The `validate_yaml()` function checks if the YAML configuration
241
- passes its own validity checks.
245
+ passes its own validity checks. The `yaml_to_python()` function converts YAML configuration
246
+ to equivalent Python code.
242
247
  contents:
243
248
  - name: yaml_interrogate
244
249
  - name: validate_yaml
250
+ - name: yaml_to_python
245
251
  - title: Utility Functions
246
252
  desc: >
247
253
  The *Utility Functions* group contains functions that are useful accessing metadata about
@@ -254,6 +260,8 @@ quartodoc:
254
260
  - name: get_row_count
255
261
  - name: get_action_metadata
256
262
  - name: get_validation_summary
263
+ - name: write_file
264
+ - name: read_file
257
265
  - name: config
258
266
  - title: Prebuilt Actions
259
267
  desc: >
@@ -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 Datetime Values and Data Freshness](./check-for-freshness/index.qmd)<br>
157
- Use date-based validations to ensure your data is current and within expected time ranges.
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=lambda df: df.select(pl.median("a")) # Use a Polars expression to aggregate
39
+ pre=get_median_a
28
40
  )
29
41
  .col_vals_eq(
30
42
  columns="b_len",
31
43
  value=9,
32
- pre=lambda dfn: dfn.with_columns( # Use a Narwhals expression, identified
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=lambda df: df.select(pl.median("a")) # Use a Polars expression to aggregate
76
+ pre=get_median_a
55
77
  )
56
78
  .col_vals_eq(
57
79
  columns="b_len",
58
80
  value=9,
59
- pre=lambda dfn: dfn.with_columns( # Use a Narwhals expression, identified
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
  )