pointblank 0.11.3__tar.gz → 0.11.4__tar.gz

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