pointblank 0.12.1__tar.gz → 0.13.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 (407) hide show
  1. {pointblank-0.12.1 → pointblank-0.13.0}/.gitignore +1 -0
  2. {pointblank-0.12.1 → pointblank-0.13.0}/CITATION.cff +1 -1
  3. {pointblank-0.12.1 → pointblank-0.13.0}/Makefile +9 -1
  4. {pointblank-0.12.1 → pointblank-0.13.0}/PKG-INFO +8 -1
  5. {pointblank-0.12.1 → pointblank-0.13.0}/docs/_quarto.yml +4 -0
  6. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/installation.qmd +26 -0
  7. pointblank-0.13.0/docs/user-guide/mcp-quick-start.qmd +248 -0
  8. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/thresholds.qmd +14 -0
  9. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/yaml-reference.qmd +36 -1
  10. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/yaml-validation-workflows.qmd +130 -0
  11. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/_interrogation.py +11 -17
  12. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/api-docs.txt +49 -4
  13. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/validate.py +245 -139
  14. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/yaml.py +62 -25
  15. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank.egg-info/PKG-INFO +8 -1
  16. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank.egg-info/SOURCES.txt +5 -0
  17. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank.egg-info/requires.txt +9 -0
  18. pointblank-0.13.0/pointblank_mcp_server/pointblank_server.py +2077 -0
  19. pointblank-0.13.0/pointblank_mcp_server/readme.md +218 -0
  20. {pointblank-0.12.1 → pointblank-0.13.0}/pyproject.toml +18 -1
  21. pointblank-0.13.0/tests/test__interrogation.py +540 -0
  22. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test__utils.py +248 -0
  23. pointblank-0.13.0/tests/test_mcp_integration.py +251 -0
  24. pointblank-0.13.0/tests/test_mcp_server.py +162 -0
  25. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_segments.py +10 -5
  26. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_validate.py +930 -276
  27. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_yaml.py +1589 -20
  28. pointblank-0.12.1/tests/test__interrogation.py +0 -272
  29. {pointblank-0.12.1 → pointblank-0.13.0}/.github/CODE_OF_CONDUCT.md +0 -0
  30. {pointblank-0.12.1 → pointblank-0.13.0}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  31. {pointblank-0.12.1 → pointblank-0.13.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  32. {pointblank-0.12.1 → pointblank-0.13.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  33. {pointblank-0.12.1 → pointblank-0.13.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  34. {pointblank-0.12.1 → pointblank-0.13.0}/.github/SECURITY.md +0 -0
  35. {pointblank-0.12.1 → pointblank-0.13.0}/.github/workflows/ci-docs.yaml +0 -0
  36. {pointblank-0.12.1 → pointblank-0.13.0}/.github/workflows/ci-tests.yaml +0 -0
  37. {pointblank-0.12.1 → pointblank-0.13.0}/.github/workflows/code-checks.yaml +0 -0
  38. {pointblank-0.12.1 → pointblank-0.13.0}/.pre-commit-config.yaml +0 -0
  39. {pointblank-0.12.1 → pointblank-0.13.0}/.vscode/settings.json +0 -0
  40. {pointblank-0.12.1 → pointblank-0.13.0}/CONTRIBUTING.md +0 -0
  41. {pointblank-0.12.1 → pointblank-0.13.0}/LICENSE +0 -0
  42. {pointblank-0.12.1 → pointblank-0.13.0}/README.md +0 -0
  43. {pointblank-0.12.1 → pointblank-0.13.0}/data_raw/game_revenue.csv +0 -0
  44. {pointblank-0.12.1 → pointblank-0.13.0}/data_raw/global_sales.csv +0 -0
  45. {pointblank-0.12.1 → pointblank-0.13.0}/data_raw/global_sales_dataset.qmd +0 -0
  46. {pointblank-0.12.1 → pointblank-0.13.0}/data_raw/nycflights.csv +0 -0
  47. {pointblank-0.12.1 → pointblank-0.13.0}/data_raw/small_table.csv +0 -0
  48. {pointblank-0.12.1 → pointblank-0.13.0}/data_raw/worldcities.csv +0 -0
  49. {pointblank-0.12.1 → pointblank-0.13.0}/data_raw/x-01-parquet.qmd +0 -0
  50. {pointblank-0.12.1 → pointblank-0.13.0}/data_raw/x-02-duckdb.qmd +0 -0
  51. {pointblank-0.12.1 → pointblank-0.13.0}/data_raw/x-03-sqlite.qmd +0 -0
  52. {pointblank-0.12.1 → pointblank-0.13.0}/docs/.gitignore +0 -0
  53. {pointblank-0.12.1 → pointblank-0.13.0}/docs/_extensions/machow/interlinks/.gitignore +0 -0
  54. {pointblank-0.12.1 → pointblank-0.13.0}/docs/_extensions/machow/interlinks/_extension.yml +0 -0
  55. {pointblank-0.12.1 → pointblank-0.13.0}/docs/_extensions/machow/interlinks/interlinks.lua +0 -0
  56. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/fav-logo.png +0 -0
  57. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-info-worldcities-csv.png +0 -0
  58. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-info-worldcities-github-csv.png +0 -0
  59. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-make-template.png +0 -0
  60. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-missing-worldcities-csv.png +0 -0
  61. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-preview-game_revenue-all-columns.png +0 -0
  62. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-preview-game_revenue-column-names.png +0 -0
  63. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-preview-game_revenue-column-range.png +0 -0
  64. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-preview-worldcities-csv-no-row-numbers.png +0 -0
  65. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-preview-worldcities-csv.png +0 -0
  66. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-run-worldcities_validation-extracts.png +0 -0
  67. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-run-worldcities_validation-fail-on-warning.png +0 -0
  68. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-run-worldcities_validation-output.png +0 -0
  69. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-run-worldcities_validation.png +0 -0
  70. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-scan-worldcities-csv.png +0 -0
  71. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-validate-exit-code.png +0 -0
  72. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-validate-multi-check.png +0 -0
  73. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-validate-rows-complete-worldcities-csv.png +0 -0
  74. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-validate-rows-distinct-worldcities-csv.png +0 -0
  75. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-validate-show-extract.png +0 -0
  76. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-validate-worldcities-gt-0-population.png +0 -0
  77. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-validate-worldcities-not-null-city_name.png +0 -0
  78. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pb-validate-write-extract.png +0 -0
  79. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.de.png +0 -0
  80. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.es.png +0 -0
  81. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.fr.png +0 -0
  82. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.it.png +0 -0
  83. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.ja.png +0 -0
  84. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.ko.png +0 -0
  85. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.nl.png +0 -0
  86. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.png +0 -0
  87. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.pt-BR.png +0 -0
  88. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-sales-data.zh-CN.png +0 -0
  89. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-step-report.png +0 -0
  90. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank-tabular-report.png +0 -0
  91. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/pointblank_logo.svg +0 -0
  92. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/posit-logo-black.svg +0 -0
  93. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/validation-table-diagram.png +0 -0
  94. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/validation-test-units.png +0 -0
  95. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/.gitignore +0 -0
  96. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-cicd-workflows.gif +0 -0
  97. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-cicd-workflows.tape +0 -0
  98. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-complete-workflow.gif +0 -0
  99. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-complete-workflow.tape +0 -0
  100. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-data-exploration.gif +0 -0
  101. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-data-exploration.tape +0 -0
  102. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-essential-validations.gif +0 -0
  103. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-essential-validations.tape +0 -0
  104. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-getting-started.gif +0 -0
  105. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-getting-started.tape +0 -0
  106. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-using-polars.gif +0 -0
  107. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/cli-using-polars.tape +0 -0
  108. {pointblank-0.12.1 → pointblank-0.13.0}/docs/assets/vhs/validation.py +0 -0
  109. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/all-about-actions/index.qmd +0 -0
  110. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/index.qmd +0 -0
  111. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/intro-pointblank/index.qmd +0 -0
  112. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/intro-pointblank/pointblank-localized.png +0 -0
  113. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/intro-pointblank/step_report.png +0 -0
  114. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/intro-pointblank/validation-table-diagram.png +0 -0
  115. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/intro-pointblank/validation-test-units.png +0 -0
  116. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/lets-workshop-together/index.qmd +0 -0
  117. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/overhauled-user-guide/advanced-in-sidebar.png +0 -0
  118. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/overhauled-user-guide/breadth-and-depth.png +0 -0
  119. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/overhauled-user-guide/explanation-of-visual.png +0 -0
  120. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/overhauled-user-guide/index.qmd +0 -0
  121. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/overhauled-user-guide/links-in-guide.png +0 -0
  122. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/overhauled-user-guide/segments.png +0 -0
  123. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/overhauled-user-guide/step-report.png +0 -0
  124. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/overhauled-user-guide/validation-three-things.png +0 -0
  125. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/pointblank_blog_logo.png +0 -0
  126. {pointblank-0.12.1 → pointblank-0.13.0}/docs/blog/validation-libs-2025/index.qmd +0 -0
  127. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/01-starter/index.qmd +0 -0
  128. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/02-advanced/index.qmd +0 -0
  129. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/03-data-extracts/index.qmd +0 -0
  130. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/04-sundered-data/index.qmd +0 -0
  131. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/05-step-report-column-check/index.qmd +0 -0
  132. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/06-step-report-schema-check/index.qmd +0 -0
  133. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/07-validation-with-actions/index.qmd +0 -0
  134. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/08-validation-with-final-actions/index.qmd +0 -0
  135. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/apply-checks-to-several-columns/index.qmd +0 -0
  136. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/check-for-freshness/index.qmd +0 -0
  137. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/check-row-column-counts/index.qmd +0 -0
  138. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/checks-for-missing/index.qmd +0 -0
  139. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/cli-interactive/index.qmd +0 -0
  140. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/col-vals-custom-expr/index.qmd +0 -0
  141. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/column-selector-functions/index.qmd +0 -0
  142. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/comparisons-across-columns/index.qmd +0 -0
  143. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/custom-validation-specially/index.qmd +0 -0
  144. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/data/game_revenue.parquet +0 -0
  145. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/expect-no-duplicate-rows/index.qmd +0 -0
  146. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/expect-no-duplicate-values/index.qmd +0 -0
  147. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/expect-text-pattern/index.qmd +0 -0
  148. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/failure-thresholds/index.qmd +0 -0
  149. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/img/advanced_validation.png +0 -0
  150. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/img/data_extracts.png +0 -0
  151. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/img/starter_validation.png +0 -0
  152. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/img/step_report_column_schema.png +0 -0
  153. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/img/step_report_column_values.png +0 -0
  154. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/img/sundered_data.png +0 -0
  155. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/img/validation_with_actions.png +0 -0
  156. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/img/validation_with_final_actions.png +0 -0
  157. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/index.qmd +0 -0
  158. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/mutate-table-in-step/index.qmd +0 -0
  159. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/numeric-comparisons/index.qmd +0 -0
  160. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/schema-check/index.qmd +0 -0
  161. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/set-membership/index.qmd +0 -0
  162. {pointblank-0.12.1 → pointblank-0.13.0}/docs/demos/using-parquet-data/index.qmd +0 -0
  163. {pointblank-0.12.1 → pointblank-0.13.0}/docs/index.qmd +0 -0
  164. {pointblank-0.12.1 → pointblank-0.13.0}/docs/scripts/post-render.py +0 -0
  165. {pointblank-0.12.1 → pointblank-0.13.0}/docs/styles.css +0 -0
  166. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/actions.qmd +0 -0
  167. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/assertions.qmd +0 -0
  168. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/briefs.qmd +0 -0
  169. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/cli-data-inspection.qmd +0 -0
  170. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/cli-data-validation.qmd +0 -0
  171. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/cli-reference.qmd +0 -0
  172. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/col-summary-tbl.qmd +0 -0
  173. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/column-selection-patterns.qmd +0 -0
  174. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/draft-validation.qmd +0 -0
  175. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/expressions.qmd +0 -0
  176. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/extracts.qmd +0 -0
  177. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/index.qmd +0 -0
  178. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/langs.qmd +0 -0
  179. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/missing-vals-tbl.qmd +0 -0
  180. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/preprocessing.qmd +0 -0
  181. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/preview.qmd +0 -0
  182. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/schema-validation.qmd +0 -0
  183. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/segmentation.qmd +0 -0
  184. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/step-reports.qmd +0 -0
  185. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/sundering.qmd +0 -0
  186. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/validation-methods.qmd +0 -0
  187. {pointblank-0.12.1 → pointblank-0.13.0}/docs/user-guide/validation-overview.qmd +0 -0
  188. {pointblank-0.12.1 → pointblank-0.13.0}/images/pointblank-tabular-report.png +0 -0
  189. {pointblank-0.12.1 → pointblank-0.13.0}/images/pointblank_logo.svg +0 -0
  190. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/__init__.py +0 -0
  191. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/_constants.py +0 -0
  192. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/_constants_docs.py +0 -0
  193. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/_constants_translations.py +0 -0
  194. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/_datascan_utils.py +0 -0
  195. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/_typing.py +0 -0
  196. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/_utils.py +0 -0
  197. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/_utils_check_args.py +0 -0
  198. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/_utils_html.py +0 -0
  199. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/actions.py +0 -0
  200. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/assistant.py +0 -0
  201. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/cli.py +0 -0
  202. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/column.py +0 -0
  203. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/compare.py +0 -0
  204. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/game_revenue-duckdb.zip +0 -0
  205. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/game_revenue.zip +0 -0
  206. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/global_sales-duckdb.zip +0 -0
  207. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/global_sales.zip +0 -0
  208. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/nycflights-duckdb.zip +0 -0
  209. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/nycflights.zip +0 -0
  210. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/polars-api-docs.txt +0 -0
  211. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/small_table-duckdb.zip +0 -0
  212. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/data/small_table.zip +0 -0
  213. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/datascan.py +0 -0
  214. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/draft.py +0 -0
  215. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/scan_profile.py +0 -0
  216. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/scan_profile_stats.py +0 -0
  217. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/schema.py +0 -0
  218. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/segments.py +0 -0
  219. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/tf.py +0 -0
  220. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank/thresholds.py +0 -0
  221. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank.egg-info/dependency_links.txt +0 -0
  222. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank.egg-info/entry_points.txt +0 -0
  223. {pointblank-0.12.1 → pointblank-0.13.0}/pointblank.egg-info/top_level.txt +0 -0
  224. {pointblank-0.12.1 → pointblank-0.13.0}/setup.cfg +0 -0
  225. {pointblank-0.12.1 → pointblank-0.13.0}/tests/__init__.py +0 -0
  226. {pointblank-0.12.1 → pointblank-0.13.0}/tests/manual_tests/schema_step_reports.qmd +0 -0
  227. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_datascan/test_col_summary_tbl_duckdb_snap/col_summary_html_duckdb.html +0 -0
  228. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_datascan/test_col_summary_tbl_pandas_snap/col_summary_html_pandas.html +0 -0
  229. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_datascan/test_col_summary_tbl_polars_snap/col_summary_html_polars.html +0 -0
  230. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html +0 -0
  231. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_01/schema_step_report_01-0.txt +0 -0
  232. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_01_1/schema_step_report_01-1.txt +0 -0
  233. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_01_2/schema_step_report_01-2.txt +0 -0
  234. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_01_3/schema_step_report_01-3.txt +0 -0
  235. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_02/schema_step_report_02-0.txt +0 -0
  236. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_02_1/schema_step_report_02-1.txt +0 -0
  237. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_02_2/schema_step_report_02-2.txt +0 -0
  238. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_02_3/schema_step_report_02-3.txt +0 -0
  239. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_03/schema_step_report_03-0.txt +0 -0
  240. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_03_1/schema_step_report_03-1.txt +0 -0
  241. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_03_2/schema_step_report_03-2.txt +0 -0
  242. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_03_3/schema_step_report_03-3.txt +0 -0
  243. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_04/schema_step_report_04-0.txt +0 -0
  244. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_05/schema_step_report_05-0.txt +0 -0
  245. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_06/schema_step_report_06-0.txt +0 -0
  246. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_07/schema_step_report_07-0.txt +0 -0
  247. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_08/schema_step_report_08-0.txt +0 -0
  248. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_09/schema_step_report_09-0.txt +0 -0
  249. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_10/schema_step_report_10-0.txt +0 -0
  250. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_11/schema_step_report_11-0.txt +0 -0
  251. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_12/schema_step_report_12-0.txt +0 -0
  252. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_13/schema_step_report_13-0.txt +0 -0
  253. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_14/schema_step_report_14-0.txt +0 -0
  254. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_14_1/schema_step_report_14-1.txt +0 -0
  255. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_15/schema_step_report_15-0.txt +0 -0
  256. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_15_1/schema_step_report_15-1.txt +0 -0
  257. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_16/schema_step_report_16-0.txt +0 -0
  258. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_16_1/schema_step_report_16-1.txt +0 -0
  259. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_17/schema_step_report_17-0.txt +0 -0
  260. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_17_1/schema_step_report_17-1.txt +0 -0
  261. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_18/schema_step_report_18-0.txt +0 -0
  262. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_18_1/schema_step_report_18-1.txt +0 -0
  263. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_19/schema_step_report_19-0.txt +0 -0
  264. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_19_1/schema_step_report_19-1.txt +0 -0
  265. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_20/schema_step_report_20-0.txt +0 -0
  266. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_20_1/schema_step_report_20-1.txt +0 -0
  267. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_21/schema_step_report_21-0.txt +0 -0
  268. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_21_1/schema_step_report_21-1.txt +0 -0
  269. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_21_2/schema_step_report_21-2.txt +0 -0
  270. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_21_3/schema_step_report_21-3.txt +0 -0
  271. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_22/schema_step_report_22-0.txt +0 -0
  272. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_22_1/schema_step_report_22-1.txt +0 -0
  273. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_23/schema_step_report_23-0.txt +0 -0
  274. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_23_1/schema_step_report_23-1.txt +0 -0
  275. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_24/schema_step_report_24-0.txt +0 -0
  276. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_24_1/schema_step_report_24-1.txt +0 -0
  277. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_24_2/schema_step_report_24-2.txt +0 -0
  278. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_24_3/schema_step_report_24-3.txt +0 -0
  279. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_25/schema_step_report_25-0.txt +0 -0
  280. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_1/schema_step_report_25-1.txt +0 -0
  281. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_2/schema_step_report_25-2.txt +0 -0
  282. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_3/schema_step_report_25-3.txt +0 -0
  283. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_4/schema_step_report_25-4.txt +0 -0
  284. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_step_report_25_5/schema_step_report_25-5.txt +0 -0
  285. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_01-0.txt +0 -0
  286. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_02-0.txt +0 -0
  287. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_03-0.txt +0 -0
  288. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_04-0.txt +0 -0
  289. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_05-0.txt +0 -0
  290. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_06-0.txt +0 -0
  291. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_07-0.txt +0 -0
  292. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_08-0.txt +0 -0
  293. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_09-0.txt +0 -0
  294. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_10-0.txt +0 -0
  295. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_11-0.txt +0 -0
  296. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_12-0.txt +0 -0
  297. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_13-0.txt +0 -0
  298. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-0.txt +0 -0
  299. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-1.txt +0 -0
  300. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-0.txt +0 -0
  301. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-1.txt +0 -0
  302. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-0.txt +0 -0
  303. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-1.txt +0 -0
  304. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-0.txt +0 -0
  305. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-1.txt +0 -0
  306. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-0.txt +0 -0
  307. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-1.txt +0 -0
  308. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-0.txt +0 -0
  309. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-1.txt +0 -0
  310. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-0.txt +0 -0
  311. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-1.txt +0 -0
  312. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-0.txt +0 -0
  313. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-1.txt +0 -0
  314. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-2.txt +0 -0
  315. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-3.txt +0 -0
  316. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-0.txt +0 -0
  317. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-1.txt +0 -0
  318. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-0.txt +0 -0
  319. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-1.txt +0 -0
  320. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-0.txt +0 -0
  321. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-1.txt +0 -0
  322. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-2.txt +0 -0
  323. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-3.txt +0 -0
  324. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-0.txt +0 -0
  325. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-1.txt +0 -0
  326. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-2.txt +0 -0
  327. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-3.txt +0 -0
  328. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-4.txt +0 -0
  329. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-5.txt +0 -0
  330. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_no_interrogation_validation_report_html_snap/no_interrogation_validation_report.html +0 -0
  331. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_no_steps_validation_report_html_snap/no_steps_validation_report.html +0 -0
  332. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_briefs_global_local_html/validation_report_briefs_global_local.html +0 -0
  333. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_briefs_html/validation_report_with_briefs.html +0 -0
  334. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
  335. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_parquet/validation_report.json +0 -0
  336. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pd/validation_report.json +0 -0
  337. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pl/validation_report.json +0 -0
  338. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
  339. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
  340. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
  341. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_parquet/validation_report.json +0 -0
  342. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pd/validation_report.json +0 -0
  343. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pl/validation_report.json +0 -0
  344. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
  345. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
  346. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_segments_html/duckdb/validation_report_segments.html +0 -0
  347. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_segments_html/pandas/validation_report_segments.html +0 -0
  348. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_segments_html/polars/validation_report_segments.html +0 -0
  349. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/polars/validation_report_segments_with_pre.html +0 -0
  350. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/validation_report_segments_with_pre.html +0 -0
  351. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_duckdb/validation_report.json +0 -0
  352. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_parquet/validation_report.json +0 -0
  353. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pd/validation_report.json +0 -0
  354. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pl/validation_report.json +0 -0
  355. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pyspark/validation_report.json +0 -0
  356. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_sqlite/validation_report.json +0 -0
  357. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_with_selector_helper_functions_no_match_snap/tbl_memtable_variable_names/selector_helper_functions_no_match.html +0 -0
  358. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_with_selector_helper_functions_no_match_snap/tbl_pd_variable_names/selector_helper_functions_no_match.html +0 -0
  359. {pointblank-0.12.1 → pointblank-0.13.0}/tests/snapshots/test_validate/test_validation_with_selector_helper_functions_no_match_snap/tbl_pl_variable_names/selector_helper_functions_no_match.html +0 -0
  360. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/parquet_data/data_a.parquet +0 -0
  361. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/parquet_data/data_b.parquet +0 -0
  362. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/parquet_data/subdir/nested_data.parquet +0 -0
  363. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/partitioned_sales/status=cancelled/0.parquet +0 -0
  364. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/partitioned_sales/status=delivered/0.parquet +0 -0
  365. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/partitioned_sales/status=pending/0.parquet +0 -0
  366. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/partitioned_sales/status=returned/0.parquet +0 -0
  367. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/partitioned_sales/status=shipped/0.parquet +0 -0
  368. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/partitioned_small_table/f=high/0.parquet +0 -0
  369. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/partitioned_small_table/f=low/0.parquet +0 -0
  370. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/partitioned_small_table/f=mid/0.parquet +0 -0
  371. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/taxi_part_01.parquet +0 -0
  372. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/taxi_part_02.parquet +0 -0
  373. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/taxi_part_03.parquet +0 -0
  374. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/taxi_sample.parquet +0 -0
  375. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_dates_times_text.ddb +0 -0
  376. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_dates_times_text.parquet +0 -0
  377. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_dates_times_text.sqlite +0 -0
  378. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_true_dates_times.ddb +0 -0
  379. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_xyz.ddb +0 -0
  380. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_xyz.parquet +0 -0
  381. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_xyz.sqlite +0 -0
  382. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_xyz_missing.ddb +0 -0
  383. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_xyz_missing.parquet +0 -0
  384. {pointblank-0.12.1 → pointblank-0.13.0}/tests/tbl_files/tbl_xyz_missing.sqlite +0 -0
  385. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test__utils_check_args.py +0 -0
  386. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_actions.py +0 -0
  387. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_assistant.py +0 -0
  388. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_cli.py +0 -0
  389. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_column.py +0 -0
  390. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_compare.py +0 -0
  391. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_datascan.py +0 -0
  392. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_draft.py +0 -0
  393. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_meta.py +0 -0
  394. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_schema.py +0 -0
  395. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_tf.py +0 -0
  396. {pointblank-0.12.1 → pointblank-0.13.0}/tests/test_thresholds.py +0 -0
  397. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.ar.md +0 -0
  398. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.de.md +0 -0
  399. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.es.md +0 -0
  400. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.fr.md +0 -0
  401. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.hi.md +0 -0
  402. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.it.md +0 -0
  403. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.ja.md +0 -0
  404. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.ko.md +0 -0
  405. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.nl.md +0 -0
  406. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.pt-BR.md +0 -0
  407. {pointblank-0.12.1 → pointblank-0.13.0}/translations/README.zh-CN.md +0 -0
@@ -133,3 +133,4 @@ benchmark/data/*.json
133
133
  .swp
134
134
 
135
135
  uv.lock
136
+ memory
@@ -3,7 +3,7 @@ message: 'If you wish to cite the "Pointblank" package use:'
3
3
  type: software
4
4
  license: MIT
5
5
  title: "Pointblank: Find out if your data is what you think it is"
6
- version: 0.11.3
6
+ version: 0.12.2
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.
@@ -13,11 +13,19 @@ test:
13
13
  test-update:
14
14
  pytest --snapshot-update
15
15
 
16
-
16
+ .PHONY: lint
17
17
  lint: ## Run ruff formatter and linter
18
18
  @uv run ruff format
19
19
  @uv run ruff check --fix
20
20
 
21
+ .PHONY: install-pre-commit
22
+ install-pre-commit: # Install pre-commit hooks
23
+ @uvx pre-commit install
24
+
25
+ .PHONY: run-pre-commit
26
+ run-pre-commit: # Run pre-commit hooks
27
+ @uvx pre-commit run --all-files
28
+
21
29
  check:
22
30
  pyright --pythonversion 3.8 pointblank
23
31
  pyright --pythonversion 3.9 pointblank
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pointblank
3
- Version: 0.12.1
3
+ Version: 0.13.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
@@ -60,6 +60,12 @@ 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
62
  Requires-Dist: shiny>=1.3.0; extra == "generate"
63
+ Provides-Extra: mcp
64
+ Requires-Dist: mcp[cli]>=1.10.1; extra == "mcp"
65
+ Requires-Dist: fastmcp>=2.11.3; extra == "mcp"
66
+ Requires-Dist: pytest-asyncio>=1.0.0; extra == "mcp"
67
+ Provides-Extra: excel
68
+ Requires-Dist: openpyxl>=3.0.0; extra == "excel"
63
69
  Provides-Extra: bigquery
64
70
  Requires-Dist: ibis-framework[bigquery]>=9.5.0; extra == "bigquery"
65
71
  Provides-Extra: databricks
@@ -84,6 +90,7 @@ Requires-Dist: quartodoc>=0.8.1; python_version >= "3.9" and extra == "docs"
84
90
  Requires-Dist: pandas>=2.2.3; extra == "docs"
85
91
  Requires-Dist: polars>=1.17.1; extra == "docs"
86
92
  Requires-Dist: pyspark==3.5.6; extra == "docs"
93
+ Requires-Dist: openpyxl>=3.0.0; extra == "docs"
87
94
  Dynamic: license-file
88
95
 
89
96
  <div align="center">
@@ -98,6 +98,9 @@ website:
98
98
  - user-guide/cli-data-inspection.qmd
99
99
  - user-guide/cli-data-validation.qmd
100
100
  - user-guide/cli-reference.qmd
101
+ - section: "MCP Server"
102
+ contents:
103
+ - user-guide/mcp-quick-start.qmd
101
104
 
102
105
  page-footer:
103
106
  left: 'Proudly supported by <a href="https://www.posit.co/" class="no-icon"><img src="/assets/posit-logo-black.svg" alt="Posit" width="80" style="padding-left: 3px;vertical-align:text-top;"></a>'
@@ -194,6 +197,7 @@ quartodoc:
194
197
  can split the data based on the validation results (with `get_sundered_data()`).
195
198
  contents:
196
199
  - name: Validate.interrogate
200
+ - name: Validate.set_tbl
197
201
  - name: Validate.get_tabular_report
198
202
  - name: Validate.get_step_report
199
203
  - name: Validate.get_json_report
@@ -32,6 +32,15 @@ uv pip install pointblank
32
32
  ```bash
33
33
  conda install -c conda-forge pointblank
34
34
  ```
35
+
36
+ ## pixi
37
+
38
+ ```bash
39
+ # add pointblank to project
40
+ pixi init name-of-project
41
+ cd name-of-project
42
+ pixi add pointblank
43
+ ```
35
44
  :::
36
45
 
37
46
  ## DataFrame Libraries
@@ -122,6 +131,23 @@ conda install -c conda-forge pointblank-snowflake # Snowflake
122
131
  # Example of installing multiple backends
123
132
  conda install -c conda-forge pointblank-duckdb pointblank-postgres pointblank-sqlite
124
133
  ```
134
+
135
+ ## pixi
136
+
137
+ ```bash
138
+ pixi add pointblank-sqlite # SQLite
139
+ pixi add pointblank-duckdb # DuckDB
140
+ pixi add pointblank-postgres # PostgreSQL
141
+ pixi add pointblank-mysql # MySQL
142
+ pixi add pointblank-mssql # Microsoft SQL Server
143
+ pixi add pointblank-bigquery # BigQuery
144
+ pixi add pointblank-pyspark # Apache Spark
145
+ pixi add pointblank-databricks # Databricks
146
+ pixi add pointblank-snowflake # Snowflake
147
+
148
+ # Example of installing multiple backends
149
+ pixi add pointblank-duckdb pointblank-postgres pointblank-sqlite
150
+ ```
125
151
  :::
126
152
 
127
153
  ::: {.callout-note}
@@ -0,0 +1,248 @@
1
+ ---
2
+ title: "MCP Quick Start"
3
+ jupyter: python3
4
+ toc-expand: 2
5
+ html-table-processing: none
6
+ ---
7
+
8
+ ## Getting Started in 5 Minutes
9
+
10
+ Transform your data validation workflow with conversational AI in VS Code or Positron IDE. Here are three simple steps to start validating data through conversation (and no complex configuration required).
11
+
12
+ ### 1. Install
13
+
14
+ ```bash
15
+ pip install pointblank[mcp,pd,excel]
16
+ ```
17
+
18
+ **What this installs:**
19
+
20
+ - `mcp` - Model Context Protocol server dependencies
21
+ - `pd` - pandas backend for data processing
22
+ - `excel` - Excel file support (`openpyxl`)
23
+
24
+ **Alternative installs based on your needs:**
25
+
26
+ ```bash
27
+ # Minimal MCP server only
28
+ pip install pointblank[mcp]
29
+
30
+ # Add Polars for faster data processing
31
+ pip install pointblank[mcp,pd,pl]
32
+
33
+ # Full installation with all backends
34
+ pip install pointblank[mcp,pd,pl,excel]
35
+ ```
36
+
37
+ ### 2. Configure Your IDE
38
+
39
+ **For VS Code**:
40
+
41
+ **Option 1: Workspace Configuration (Recommended for teams)**
42
+
43
+ 1. Create a `.vscode/mcp.json` file in your project folder
44
+ 2. Add this configuration:
45
+
46
+ ```json
47
+ {
48
+ "servers": {
49
+ "pointblank": {
50
+ "command": "python",
51
+ "args": ["-m", "pointblank_mcp_server.pointblank_server"]
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ **Option 2: User Configuration (Personal use)**
58
+
59
+ 1. Run command: `MCP: Open User Configuration` (Cmd/Ctrl + Shift + P)
60
+ 2. Add the same JSON configuration above
61
+
62
+ > ⚠️ **Security Note**: Only add MCP servers from trusted sources. VS Code will ask you to confirm trust when starting the server for the first time.
63
+
64
+ **For Positron**:
65
+
66
+ 1. Open Positron Settings
67
+ 2. Navigate to MCP Server configuration
68
+ 3. Add the configuration (format may vary)
69
+
70
+ > **Note**: If you don't see MCP settings, you may need to install an MCP extension first. Search for "MCP" in the Extensions marketplace.
71
+
72
+ ### 3. Start Chatting
73
+
74
+ ```
75
+ "Load my sales data and check its quality"
76
+ ```
77
+
78
+ That's basically how you get started.
79
+
80
+ ## Essential Commands
81
+
82
+ Master these four command patterns and you'll be able to handle most data validation scenarios. Think of these as your fundamental vocabulary for talking to Pointblank.
83
+
84
+ ### Load Data
85
+
86
+ ```
87
+ "Load the file /path/to/data.csv"
88
+ "Open my customer data from Downloads"
89
+ "Load the Excel file with sales metrics"
90
+ ```
91
+
92
+ ### Check Quality
93
+
94
+ ```
95
+ "Analyze the data quality"
96
+ "What issues should I worry about?"
97
+ "Check for missing values and duplicates"
98
+ ```
99
+
100
+ ### Create Data Validations
101
+
102
+ ```
103
+ "Set up validation rules for this data"
104
+ "Check that all emails are valid"
105
+ "Make sure amounts are positive"
106
+ ```
107
+
108
+ ### Run and Export
109
+
110
+ ```
111
+ "Run the validation"
112
+ "Show me what failed"
113
+ "Export problem rows to CSV"
114
+ ```
115
+
116
+ ---
117
+
118
+ ## Top Three Use Cases
119
+
120
+ Once you have Pointblank set up, these scenarios show the most common and powerful ways to use natural language data validation. Each example demonstrates the conversational flow and immediate value you'll experience.
121
+
122
+ ### 1. 📊 Quick Data Check
123
+
124
+ **When**: You get a new dataset
125
+
126
+ ```
127
+ 👤 "I just got customer_data.csv. Is it clean?"
128
+ 🤖 "Loading... Found 15K customers. Issues:
129
+ - ✅ No duplicate IDs
130
+ - ⚠️ 2% missing phones
131
+ - ❌ 234 invalid emails
132
+ Want me to fix the emails?"
133
+ ```
134
+
135
+ ### 2. 🔄 Daily Validation
136
+
137
+ **When**: Regular data quality checks
138
+
139
+ ```
140
+ 👤 "Run our standard sales validation"
141
+ 🤖 "Running daily_sales template...
142
+ ✅ All checks passed!
143
+ 3,247 transactions validated
144
+ Ready for dashboard update"
145
+ ```
146
+
147
+ ### 3. 🚨 Issue Investigation
148
+
149
+ **When**: Something looks wrong
150
+
151
+ ```
152
+ 👤 "Conversion rates jumped to 95%. That's impossible"
153
+ 🤖 "Found the problem! Test data contamination:
154
+ - 1,247 test emails with 100% conversion
155
+ - Real rate is 4.2% (normal)
156
+ Should I clean the data?"
157
+ ```
158
+
159
+ These examples show how natural conversation can quickly identify and resolve data quality issues that might take hours to diagnose manually.
160
+
161
+ ## Common Validation Rules
162
+
163
+ Understanding what validation rules to ask for will help you quickly build comprehensive data quality checks. These examples cover the most frequent validation scenarios across different industries and data types.
164
+
165
+ ### Data Integrity
166
+
167
+ - "Check for duplicate IDs"
168
+ - "Ensure no missing required fields"
169
+ - "Validate that dates are reasonable"
170
+
171
+ ### Business Logic
172
+
173
+ - "Amounts must be positive"
174
+ - "Email addresses must be valid format"
175
+ - "Status must be active, inactive, or pending"
176
+
177
+ ### Cross-Field Validation
178
+
179
+ - "End date must be after start date"
180
+ - "Discount percentage between 0 and 100"
181
+ - "Age must match birth date"
182
+
183
+ These rule patterns can be combined and customized for your specific data and business requirements. The natural language interface makes it easy to express complex validation logic without learning technical syntax.
184
+
185
+ ## Some Tips and Tricks
186
+
187
+ These recommendations will help you get more value from your Pointblank MCP server and avoid some common pitfalls.
188
+
189
+ ### Talk Naturally
190
+
191
+ ✅ **Good:** "Check if customer emails look valid"
192
+
193
+ ❌ **Avoid:** "Execute col_vals_regex on email column"
194
+
195
+ ### Provide Context
196
+
197
+ ✅ **Good:** "This is for the board presentation"
198
+
199
+ ❌ **Avoid:** Just asking for validation without explanation
200
+
201
+ ### Build Incrementally
202
+
203
+ 1. Start with data profiling
204
+ 2. Add basic validation rules
205
+ 3. Create templates for reuse
206
+ 4. Set up automated checks
207
+
208
+ ### Save Templates
209
+
210
+ ```
211
+ "Save these rules as 'customer_validation'"
212
+ "Apply the financial_data template"
213
+ "Use our standard survey validation"
214
+ ```
215
+
216
+ These practices help you build data quality workflows that scale with your needs while remaining accessible to those with varying technical backgrounds.
217
+
218
+ ## File Support
219
+
220
+ Pointblank works with many major data file formats, making it easy to validate data regardless of how it's stored. This support means you can maintain consistent validation practices across your entire data ecosystem.
221
+
222
+ | Type | Extensions | Example |
223
+ |------|------------|---------|
224
+ | **CSV** | `.csv` | `sales_data.csv` |
225
+ | **Excel** | `.xlsx`, `.xls` | `monthly_report.xlsx` |
226
+ | **Parquet** | `.parquet` | `big_data.parquet` |
227
+ | **JSON** | `.json`, `.jsonl` | `api_response.json` |
228
+
229
+ The consistent natural language interface works the same regardless of file format, so you can focus on validation logic rather than technical details.
230
+
231
+ ## Quick Troubleshooting
232
+
233
+ When you encounter issues, these quick fixes resolve the most common problems. Furthermore, the natural language interface means you can always ask for help and explanations.
234
+
235
+ | Problem | Quick Fix |
236
+ |---------|-----------|
237
+ | "File not found" | Use full file path: `/Users/name/data.csv` |
238
+ | Validation too slow | "Use a sample for testing" |
239
+ | Don't understand error | "Explain why validation failed" |
240
+ | Need help | "Show me examples of data quality checks" |
241
+
242
+ Remember, you can always ask the AI to explain what's happening or suggest solutions when you run into problems.
243
+
244
+ ## Now You're Ready!
245
+
246
+ You now have everything needed to start validating data through conversation. The beauty of Pointblank's MCP server is that it grows with your expertise: start simple and gradually build more sophisticated validation workflows as you become comfortable with the interface.
247
+
248
+ Start with simple commands and build up to more complex validation workflows. The AI will guide you through the process and help you create robust data quality checks!
@@ -86,6 +86,20 @@ thresholds_proportional = pb.Thresholds(error=0.1)
86
86
  With this configuration, the 'error' threshold would be triggered if 10% or more of the test units
87
87
  fail.
88
88
 
89
+ ### Boolean Shorthand
90
+
91
+ For cases where you want to allow exactly 1 failing test unit, you can use `True` as a convenient
92
+ shorthand:
93
+
94
+ ```python
95
+ # Critical threshold of exactly 1 failing test unit
96
+ thresholds_boolean = pb.Thresholds(critical=True)
97
+ ```
98
+
99
+ This is equivalent to setting `critical=1` but provides a more intuitive way to express "allow at
100
+ most one failure". This shorthand is particularly useful for strict validations where any failure
101
+ beyond a single edge case should trigger immediate attention.
102
+
89
103
  ## Understanding Severity Levels
90
104
 
91
105
  The three threshold levels in Pointblank ('warning', 'error', and 'critical') are inspired by
@@ -56,6 +56,40 @@ tbl:
56
56
  pl.scan_csv("data.csv").filter(pl.col("date") >= "2024-01-01")
57
57
  ```
58
58
 
59
+ #### Using Templates with `set_tbl=`
60
+
61
+ For reusable validation templates that will always use a custom data source via the `set_tbl=`
62
+ parameter in `yaml_interrogate()`, the `tbl` field is still required but its value doesn't matter
63
+ since it will be overridden. Recommended approaches:
64
+
65
+ ```yaml
66
+ # Option 1: Use a valid dataset name (gets overridden anyway)
67
+ tbl: small_table # Will be ignored when `set_tbl=` is used
68
+
69
+ # Option 2: Use YAML null (clearest semantic intent)
70
+ tbl: null # Indicates table will be provided via `set_tbl=`
71
+ ```
72
+
73
+ When using `yaml_interrogate()` with `set_tbl=`, the validation template becomes fully reusable:
74
+
75
+ ```python
76
+ # Define reusable template
77
+ template = """
78
+ tbl: null # Will be overridden
79
+ tbl_name: "Sales Validation"
80
+ steps:
81
+ - col_exists:
82
+ columns: [customer_id, revenue, region]
83
+ - col_vals_gt:
84
+ columns: [revenue]
85
+ value: 0
86
+ """
87
+
88
+ # Apply to different datasets
89
+ q1_result = pb.yaml_interrogate(template, set_tbl=q1_data)
90
+ q2_result = pb.yaml_interrogate(template, set_tbl=q2_data)
91
+ ```
92
+
59
93
  ### DataFrame Library (`df_library`)
60
94
 
61
95
  The `df_library` key controls which DataFrame library is used to load data sources. This parameter
@@ -117,7 +151,7 @@ thresholds:
117
151
  critical: 0.15 # 15% failure rate triggers critical
118
152
  ```
119
153
 
120
- - values: numbers between 0 and 1 (percentages) or integers (row counts)
154
+ - values: numbers between `0` and `1` (percentages) or integers (row counts)
121
155
  - levels: `warning`, `error`, `critical`
122
156
 
123
157
  ### Global Actions
@@ -477,6 +511,7 @@ For Pandas DataFrames (when using `df_library: pandas`):
477
511
  ```yaml
478
512
  - specially:
479
513
  expr: "lambda df: df.assign(is_valid=df['a'] + df['d'] > 0)"
514
+ ```
480
515
 
481
516
  ## Column Selection Patterns
482
517
 
@@ -167,6 +167,136 @@ tbl:
167
167
  )
168
168
  ```
169
169
 
170
+ ## Reusable Templates with `set_tbl=`
171
+
172
+ One of the most powerful features of YAML validation workflows is the ability to create reusable
173
+ templates that can be applied to different datasets. Using the `set_tbl=` parameter with
174
+ `yaml_interrogate()`, you can define validation logic once and apply it to multiple data sources.
175
+
176
+ ### Creating Validation Templates
177
+
178
+ When creating templates for use with `set_tbl=`, the `tbl` field is still required but its value
179
+ will be overridden. The recommended approach is to use `tbl: null`:
180
+
181
+ ```yaml
182
+ tbl: null
183
+ tbl_name: "Sales Data Validation Template"
184
+ label: "Standard validation checks for sales data"
185
+ steps:
186
+ - col_exists:
187
+ columns: [customer_id, revenue, region, date]
188
+ - col_vals_not_null:
189
+ columns: [customer_id, revenue]
190
+ - col_vals_gt:
191
+ columns: [revenue]
192
+ value: 0
193
+ - col_vals_in_set:
194
+ columns: [region]
195
+ set: [North, South, East, West]
196
+ ```
197
+
198
+ ### Applying Templates to Multiple Datasets
199
+
200
+ Here's a practical example showing how to apply the same validation template to multiple quarterly
201
+ datasets, demonstrating the power of reusable YAML configurations:
202
+
203
+ ```{python}
204
+ import pointblank as pb
205
+ import polars as pl
206
+
207
+ # Define the template once
208
+ sales_template = """
209
+ tbl: null # Will be overridden
210
+ tbl_name: "Sales Data Validation"
211
+ label: "Standard sales validation checks"
212
+ thresholds:
213
+ warning: 0.05
214
+ error: 0.1
215
+ steps:
216
+ - col_exists:
217
+ columns: [customer_id, revenue, region]
218
+ - col_vals_not_null:
219
+ columns: [customer_id, revenue]
220
+ - col_vals_gt:
221
+ columns: [revenue]
222
+ value: 0
223
+ - col_vals_in_set:
224
+ columns: [region]
225
+ set: [North, South, East, West]
226
+ """
227
+
228
+ # Create different datasets
229
+ q1_data = pl.DataFrame({
230
+ "customer_id": [1, 2, 3, 4],
231
+ "revenue": [100, 200, 150, 300],
232
+ "region": ["North", "South", "East", "West"]
233
+ })
234
+
235
+ q2_data = pl.DataFrame({
236
+ "customer_id": [5, 6, 7, 8],
237
+ "revenue": [250, 180, 220, 350],
238
+ "region": ["South", "North", "West", "East"]
239
+ })
240
+
241
+ # Apply the same template to both datasets
242
+ q1_result = pb.yaml_interrogate(sales_template, set_tbl=q1_data)
243
+ q2_result = pb.yaml_interrogate(sales_template, set_tbl=q2_data)
244
+
245
+ print(f"Q1 validation: {all(v.all_passed for v in q1_result.validation_info)}")
246
+ print(f"Q2 validation: {all(v.all_passed for v in q2_result.validation_info)}")
247
+ ```
248
+
249
+ ### Template Best Practices
250
+
251
+ 1. **Use `tbl: null`**: this clearly indicates the template expects a data source to be provided
252
+ 2. **Include comprehensive metadata**: use `tbl_name`, `label`, and `brief` to make results
253
+ self-documenting
254
+ 3. **Set appropriate thresholds**: define warning/error levels that make sense for your use case
255
+ 4. **Version control templates**: store templates in your repository alongside your data processing
256
+ code
257
+ 5. **Test with sample data**: validate your templates work with representative datasets
258
+
259
+ ### Common Template Patterns
260
+
261
+ For API response validation, you can ensure that responses have the expected structure and valid
262
+ status codes:
263
+
264
+ ```yaml
265
+ tbl: null
266
+ tbl_name: "API Response Validation"
267
+ brief: "Standard checks for API response data"
268
+ steps:
269
+ - col_exists:
270
+ columns: [user_id, status, timestamp]
271
+ - col_vals_in_set:
272
+ columns: [status]
273
+ set: [success, error, pending]
274
+ - col_vals_not_null:
275
+ columns: [user_id, timestamp]
276
+ ```
277
+
278
+ For file upload validation, you can check file sizes and formats to ensure they meet your
279
+ requirements:
280
+
281
+ ```yaml
282
+ tbl: null
283
+ tbl_name: "File Upload Validation"
284
+ steps:
285
+ - col_vals_gt:
286
+ columns: [file_size]
287
+ value: 0
288
+ - col_vals_lt:
289
+ columns: [file_size]
290
+ value: 10485760 # 10MB limit
291
+ - col_vals_in_set:
292
+ columns: [file_type]
293
+ set: [csv, json, xlsx, parquet]
294
+ ```
295
+
296
+ This template approach is particularly valuable in data pipelines, ETL processes, and automated
297
+ testing scenarios where you need to apply consistent validation logic across multiple similar
298
+ datasets.
299
+
170
300
  ## Validation Steps
171
301
 
172
302
  YAML supports all of Pointblank's validation methods. Here are some common patterns:
@@ -1388,6 +1388,17 @@ class RowsDistinct:
1388
1388
  def get_test_results(self):
1389
1389
  return self.test_unit_res
1390
1390
 
1391
+ def test(self):
1392
+ # Get the number of failing test units by counting instances of `False` in the `pb_is_good_`
1393
+ # column and then determine if the test passes overall by comparing the number of failing
1394
+ # test units to the threshold for failing test units
1395
+
1396
+ results_list = nw.from_native(self.test_unit_res)["pb_is_good_"].to_list()
1397
+
1398
+ return _threshold_check(
1399
+ failing_test_units=results_list.count(False), threshold=self.threshold
1400
+ )
1401
+
1391
1402
 
1392
1403
  @dataclass
1393
1404
  class RowsComplete:
@@ -2029,23 +2040,6 @@ def _column_has_null_values(table: FrameT, column: str) -> bool:
2029
2040
  return True
2030
2041
 
2031
2042
 
2032
- def _check_nulls_across_columns_ibis(table, columns_subset):
2033
- # Get all column names from the table
2034
- column_names = columns_subset if columns_subset else table.columns
2035
-
2036
- # Build the expression by combining each column's isnull() with OR operations
2037
- null_expr = functools.reduce(
2038
- lambda acc, col: acc | table[col].isnull() if acc is not None else table[col].isnull(),
2039
- column_names,
2040
- None,
2041
- )
2042
-
2043
- # Add the expression as a new column to the table
2044
- result = table.mutate(_any_is_null_=null_expr)
2045
-
2046
- return result
2047
-
2048
-
2049
2043
  def _check_nulls_across_columns_nw(table, columns_subset):
2050
2044
  # Get all column names from the table
2051
2045
  column_names = columns_subset if columns_subset else table.columns