pointblank 0.13.3__tar.gz → 0.13.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 (404) hide show
  1. {pointblank-0.13.3 → pointblank-0.13.4}/PKG-INFO +1 -1
  2. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_constants_translations.py +54 -0
  3. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_interrogation.py +16 -1
  4. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_utils.py +40 -0
  5. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/validate.py +182 -11
  6. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/PKG-INFO +1 -1
  7. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/SOURCES.txt +0 -1
  8. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_validate.py +981 -1
  9. pointblank-0.13.3/pointblank/_constants_docs.py +0 -40
  10. {pointblank-0.13.3 → pointblank-0.13.4}/.github/CODE_OF_CONDUCT.md +0 -0
  11. {pointblank-0.13.3 → pointblank-0.13.4}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  12. {pointblank-0.13.3 → pointblank-0.13.4}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  13. {pointblank-0.13.3 → pointblank-0.13.4}/.github/ISSUE_TEMPLATE/question.md +0 -0
  14. {pointblank-0.13.3 → pointblank-0.13.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  15. {pointblank-0.13.3 → pointblank-0.13.4}/.github/SECURITY.md +0 -0
  16. {pointblank-0.13.3 → pointblank-0.13.4}/.github/workflows/ci-docs.yaml +0 -0
  17. {pointblank-0.13.3 → pointblank-0.13.4}/.github/workflows/ci-tests.yaml +0 -0
  18. {pointblank-0.13.3 → pointblank-0.13.4}/.github/workflows/code-checks.yaml +0 -0
  19. {pointblank-0.13.3 → pointblank-0.13.4}/.gitignore +0 -0
  20. {pointblank-0.13.3 → pointblank-0.13.4}/.pre-commit-config.yaml +0 -0
  21. {pointblank-0.13.3 → pointblank-0.13.4}/.vscode/settings.json +0 -0
  22. {pointblank-0.13.3 → pointblank-0.13.4}/CITATION.cff +0 -0
  23. {pointblank-0.13.3 → pointblank-0.13.4}/CONTRIBUTING.md +0 -0
  24. {pointblank-0.13.3 → pointblank-0.13.4}/LICENSE +0 -0
  25. {pointblank-0.13.3 → pointblank-0.13.4}/Makefile +0 -0
  26. {pointblank-0.13.3 → pointblank-0.13.4}/README.md +0 -0
  27. {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/game_revenue.csv +0 -0
  28. {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/global_sales.csv +0 -0
  29. {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/global_sales_dataset.qmd +0 -0
  30. {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/nycflights.csv +0 -0
  31. {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/small_table.csv +0 -0
  32. {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/worldcities.csv +0 -0
  33. {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/x-01-parquet.qmd +0 -0
  34. {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/x-02-duckdb.qmd +0 -0
  35. {pointblank-0.13.3 → pointblank-0.13.4}/data_raw/x-03-sqlite.qmd +0 -0
  36. {pointblank-0.13.3 → pointblank-0.13.4}/docs/.gitignore +0 -0
  37. {pointblank-0.13.3 → pointblank-0.13.4}/docs/_extensions/machow/interlinks/.gitignore +0 -0
  38. {pointblank-0.13.3 → pointblank-0.13.4}/docs/_extensions/machow/interlinks/_extension.yml +0 -0
  39. {pointblank-0.13.3 → pointblank-0.13.4}/docs/_extensions/machow/interlinks/interlinks.lua +0 -0
  40. {pointblank-0.13.3 → pointblank-0.13.4}/docs/_quarto.yml +0 -0
  41. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/fav-logo.png +0 -0
  42. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-info-worldcities-csv.png +0 -0
  43. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-info-worldcities-github-csv.png +0 -0
  44. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-make-template.png +0 -0
  45. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-missing-worldcities-csv.png +0 -0
  46. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-game_revenue-all-columns.png +0 -0
  47. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-game_revenue-column-names.png +0 -0
  48. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-game_revenue-column-range.png +0 -0
  49. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-worldcities-csv-no-row-numbers.png +0 -0
  50. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-preview-worldcities-csv.png +0 -0
  51. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-run-worldcities_validation-extracts.png +0 -0
  52. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-run-worldcities_validation-fail-on-warning.png +0 -0
  53. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-run-worldcities_validation-output.png +0 -0
  54. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-run-worldcities_validation.png +0 -0
  55. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-scan-worldcities-csv.png +0 -0
  56. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-exit-code.png +0 -0
  57. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-multi-check.png +0 -0
  58. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-rows-complete-worldcities-csv.png +0 -0
  59. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-rows-distinct-worldcities-csv.png +0 -0
  60. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-show-extract.png +0 -0
  61. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-worldcities-gt-0-population.png +0 -0
  62. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-worldcities-not-null-city_name.png +0 -0
  63. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pb-validate-write-extract.png +0 -0
  64. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.de.png +0 -0
  65. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.es.png +0 -0
  66. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.fr.png +0 -0
  67. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.it.png +0 -0
  68. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.ja.png +0 -0
  69. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.ko.png +0 -0
  70. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.nl.png +0 -0
  71. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.png +0 -0
  72. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.pt-BR.png +0 -0
  73. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-sales-data.zh-CN.png +0 -0
  74. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-step-report.png +0 -0
  75. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank-tabular-report.png +0 -0
  76. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/pointblank_logo.svg +0 -0
  77. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/posit-logo-black.svg +0 -0
  78. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/validation-table-diagram.png +0 -0
  79. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/validation-test-units.png +0 -0
  80. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/.gitignore +0 -0
  81. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-cicd-workflows.gif +0 -0
  82. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-cicd-workflows.tape +0 -0
  83. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-complete-workflow.gif +0 -0
  84. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-complete-workflow.tape +0 -0
  85. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-data-exploration.gif +0 -0
  86. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-data-exploration.tape +0 -0
  87. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-essential-validations.gif +0 -0
  88. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-essential-validations.tape +0 -0
  89. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-getting-started.gif +0 -0
  90. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-getting-started.tape +0 -0
  91. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-using-polars.gif +0 -0
  92. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/cli-using-polars.tape +0 -0
  93. {pointblank-0.13.3 → pointblank-0.13.4}/docs/assets/vhs/validation.py +0 -0
  94. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/all-about-actions/index.qmd +0 -0
  95. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/index.qmd +0 -0
  96. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/index.qmd +0 -0
  97. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/pointblank-localized.png +0 -0
  98. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/step_report.png +0 -0
  99. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/validation-table-diagram.png +0 -0
  100. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/intro-pointblank/validation-test-units.png +0 -0
  101. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/lets-workshop-together/index.qmd +0 -0
  102. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/advanced-in-sidebar.png +0 -0
  103. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/breadth-and-depth.png +0 -0
  104. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/explanation-of-visual.png +0 -0
  105. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/index.qmd +0 -0
  106. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/links-in-guide.png +0 -0
  107. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/segments.png +0 -0
  108. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/step-report.png +0 -0
  109. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/overhauled-user-guide/validation-three-things.png +0 -0
  110. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/pointblank_blog_logo.png +0 -0
  111. {pointblank-0.13.3 → pointblank-0.13.4}/docs/blog/validation-libs-2025/index.qmd +0 -0
  112. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/01-starter/index.qmd +0 -0
  113. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/02-advanced/index.qmd +0 -0
  114. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/03-data-extracts/index.qmd +0 -0
  115. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/04-sundered-data/index.qmd +0 -0
  116. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/05-step-report-column-check/index.qmd +0 -0
  117. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/06-step-report-schema-check/index.qmd +0 -0
  118. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/07-validation-with-actions/index.qmd +0 -0
  119. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/08-validation-with-final-actions/index.qmd +0 -0
  120. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/apply-checks-to-several-columns/index.qmd +0 -0
  121. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/check-for-freshness/index.qmd +0 -0
  122. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/check-row-column-counts/index.qmd +0 -0
  123. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/checks-for-missing/index.qmd +0 -0
  124. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/cli-interactive/index.qmd +0 -0
  125. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/col-vals-custom-expr/index.qmd +0 -0
  126. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/column-selector-functions/index.qmd +0 -0
  127. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/comparisons-across-columns/index.qmd +0 -0
  128. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/custom-validation-specially/index.qmd +0 -0
  129. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/data/game_revenue.parquet +0 -0
  130. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/expect-no-duplicate-rows/index.qmd +0 -0
  131. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/expect-no-duplicate-values/index.qmd +0 -0
  132. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/expect-text-pattern/index.qmd +0 -0
  133. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/failure-thresholds/index.qmd +0 -0
  134. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/advanced_validation.png +0 -0
  135. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/data_extracts.png +0 -0
  136. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/starter_validation.png +0 -0
  137. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/step_report_column_schema.png +0 -0
  138. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/step_report_column_values.png +0 -0
  139. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/sundered_data.png +0 -0
  140. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/validation_with_actions.png +0 -0
  141. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/img/validation_with_final_actions.png +0 -0
  142. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/index.qmd +0 -0
  143. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/mutate-table-in-step/index.qmd +0 -0
  144. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/numeric-comparisons/index.qmd +0 -0
  145. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/schema-check/index.qmd +0 -0
  146. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/set-membership/index.qmd +0 -0
  147. {pointblank-0.13.3 → pointblank-0.13.4}/docs/demos/using-parquet-data/index.qmd +0 -0
  148. {pointblank-0.13.3 → pointblank-0.13.4}/docs/index.qmd +0 -0
  149. {pointblank-0.13.3 → pointblank-0.13.4}/docs/scripts/post-render.py +0 -0
  150. {pointblank-0.13.3 → pointblank-0.13.4}/docs/styles.css +0 -0
  151. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/actions.qmd +0 -0
  152. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/assertions.qmd +0 -0
  153. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/briefs.qmd +0 -0
  154. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/cli-data-inspection.qmd +0 -0
  155. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/cli-data-validation.qmd +0 -0
  156. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/cli-reference.qmd +0 -0
  157. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/col-summary-tbl.qmd +0 -0
  158. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/column-selection-patterns.qmd +0 -0
  159. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/draft-validation.qmd +0 -0
  160. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/expressions.qmd +0 -0
  161. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/extracts.qmd +0 -0
  162. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/index.qmd +0 -0
  163. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/installation.qmd +0 -0
  164. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/langs.qmd +0 -0
  165. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/mcp-quick-start.qmd +0 -0
  166. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/missing-vals-tbl.qmd +0 -0
  167. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/preprocessing.qmd +0 -0
  168. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/preview.qmd +0 -0
  169. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/schema-validation.qmd +0 -0
  170. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/segmentation.qmd +0 -0
  171. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/step-reports.qmd +0 -0
  172. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/sundering.qmd +0 -0
  173. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/thresholds.qmd +0 -0
  174. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/validation-methods.qmd +0 -0
  175. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/validation-overview.qmd +0 -0
  176. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/yaml-reference.qmd +0 -0
  177. {pointblank-0.13.3 → pointblank-0.13.4}/docs/user-guide/yaml-validation-workflows.qmd +0 -0
  178. {pointblank-0.13.3 → pointblank-0.13.4}/images/pointblank-tabular-report.png +0 -0
  179. {pointblank-0.13.3 → pointblank-0.13.4}/images/pointblank_logo.svg +0 -0
  180. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/__init__.py +0 -0
  181. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_constants.py +0 -0
  182. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_datascan_utils.py +0 -0
  183. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_typing.py +0 -0
  184. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_utils_check_args.py +0 -0
  185. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/_utils_html.py +0 -0
  186. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/actions.py +0 -0
  187. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/assistant.py +0 -0
  188. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/cli.py +0 -0
  189. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/column.py +0 -0
  190. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/compare.py +0 -0
  191. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/api-docs.txt +0 -0
  192. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/game_revenue-duckdb.zip +0 -0
  193. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/game_revenue.zip +0 -0
  194. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/global_sales-duckdb.zip +0 -0
  195. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/global_sales.zip +0 -0
  196. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/nycflights-duckdb.zip +0 -0
  197. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/nycflights.zip +0 -0
  198. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/polars-api-docs.txt +0 -0
  199. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/small_table-duckdb.zip +0 -0
  200. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/data/small_table.zip +0 -0
  201. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/datascan.py +0 -0
  202. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/draft.py +0 -0
  203. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/scan_profile.py +0 -0
  204. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/scan_profile_stats.py +0 -0
  205. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/schema.py +0 -0
  206. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/segments.py +0 -0
  207. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/thresholds.py +0 -0
  208. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank/yaml.py +0 -0
  209. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/dependency_links.txt +0 -0
  210. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/entry_points.txt +0 -0
  211. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/requires.txt +0 -0
  212. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank.egg-info/top_level.txt +0 -0
  213. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank_mcp_server/pointblank_server.py +0 -0
  214. {pointblank-0.13.3 → pointblank-0.13.4}/pointblank_mcp_server/readme.md +0 -0
  215. {pointblank-0.13.3 → pointblank-0.13.4}/pyproject.toml +0 -0
  216. {pointblank-0.13.3 → pointblank-0.13.4}/setup.cfg +0 -0
  217. {pointblank-0.13.3 → pointblank-0.13.4}/tests/__init__.py +0 -0
  218. {pointblank-0.13.3 → pointblank-0.13.4}/tests/manual_tests/schema_step_reports.qmd +0 -0
  219. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_datascan/test_col_summary_tbl_duckdb_snap/col_summary_html_duckdb.html +0 -0
  220. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_datascan/test_col_summary_tbl_pandas_snap/col_summary_html_pandas.html +0 -0
  221. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_datascan/test_col_summary_tbl_polars_snap/col_summary_html_polars.html +0 -0
  222. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_comprehensive_validation_report_html_snap/comprehensive_validation_report.html +0 -0
  223. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_01/schema_step_report_01-0.txt +0 -0
  224. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_01_1/schema_step_report_01-1.txt +0 -0
  225. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_01_2/schema_step_report_01-2.txt +0 -0
  226. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_01_3/schema_step_report_01-3.txt +0 -0
  227. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_02/schema_step_report_02-0.txt +0 -0
  228. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_02_1/schema_step_report_02-1.txt +0 -0
  229. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_02_2/schema_step_report_02-2.txt +0 -0
  230. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_02_3/schema_step_report_02-3.txt +0 -0
  231. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_03/schema_step_report_03-0.txt +0 -0
  232. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_03_1/schema_step_report_03-1.txt +0 -0
  233. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_03_2/schema_step_report_03-2.txt +0 -0
  234. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_03_3/schema_step_report_03-3.txt +0 -0
  235. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_04/schema_step_report_04-0.txt +0 -0
  236. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_05/schema_step_report_05-0.txt +0 -0
  237. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_06/schema_step_report_06-0.txt +0 -0
  238. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_07/schema_step_report_07-0.txt +0 -0
  239. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_08/schema_step_report_08-0.txt +0 -0
  240. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_09/schema_step_report_09-0.txt +0 -0
  241. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_10/schema_step_report_10-0.txt +0 -0
  242. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_11/schema_step_report_11-0.txt +0 -0
  243. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_12/schema_step_report_12-0.txt +0 -0
  244. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_13/schema_step_report_13-0.txt +0 -0
  245. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_14/schema_step_report_14-0.txt +0 -0
  246. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_14_1/schema_step_report_14-1.txt +0 -0
  247. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_15/schema_step_report_15-0.txt +0 -0
  248. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_15_1/schema_step_report_15-1.txt +0 -0
  249. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_16/schema_step_report_16-0.txt +0 -0
  250. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_16_1/schema_step_report_16-1.txt +0 -0
  251. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_17/schema_step_report_17-0.txt +0 -0
  252. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_17_1/schema_step_report_17-1.txt +0 -0
  253. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_18/schema_step_report_18-0.txt +0 -0
  254. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_18_1/schema_step_report_18-1.txt +0 -0
  255. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_19/schema_step_report_19-0.txt +0 -0
  256. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_19_1/schema_step_report_19-1.txt +0 -0
  257. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_20/schema_step_report_20-0.txt +0 -0
  258. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_20_1/schema_step_report_20-1.txt +0 -0
  259. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_21/schema_step_report_21-0.txt +0 -0
  260. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_21_1/schema_step_report_21-1.txt +0 -0
  261. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_21_2/schema_step_report_21-2.txt +0 -0
  262. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_21_3/schema_step_report_21-3.txt +0 -0
  263. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_22/schema_step_report_22-0.txt +0 -0
  264. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_22_1/schema_step_report_22-1.txt +0 -0
  265. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_23/schema_step_report_23-0.txt +0 -0
  266. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_23_1/schema_step_report_23-1.txt +0 -0
  267. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_24/schema_step_report_24-0.txt +0 -0
  268. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_24_1/schema_step_report_24-1.txt +0 -0
  269. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_24_2/schema_step_report_24-2.txt +0 -0
  270. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_24_3/schema_step_report_24-3.txt +0 -0
  271. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25/schema_step_report_25-0.txt +0 -0
  272. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_1/schema_step_report_25-1.txt +0 -0
  273. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_2/schema_step_report_25-2.txt +0 -0
  274. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_3/schema_step_report_25-3.txt +0 -0
  275. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_4/schema_step_report_25-4.txt +0 -0
  276. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_step_report_25_5/schema_step_report_25-5.txt +0 -0
  277. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_01-0.txt +0 -0
  278. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_02-0.txt +0 -0
  279. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_03-0.txt +0 -0
  280. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_04-0.txt +0 -0
  281. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_05-0.txt +0 -0
  282. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_06-0.txt +0 -0
  283. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_07-0.txt +0 -0
  284. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_08-0.txt +0 -0
  285. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_09-0.txt +0 -0
  286. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_10-0.txt +0 -0
  287. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_11-0.txt +0 -0
  288. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_12-0.txt +0 -0
  289. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_13-0.txt +0 -0
  290. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-0.txt +0 -0
  291. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_14-1.txt +0 -0
  292. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-0.txt +0 -0
  293. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_15-1.txt +0 -0
  294. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-0.txt +0 -0
  295. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_16-1.txt +0 -0
  296. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-0.txt +0 -0
  297. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_17-1.txt +0 -0
  298. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-0.txt +0 -0
  299. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_18-1.txt +0 -0
  300. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-0.txt +0 -0
  301. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_19-1.txt +0 -0
  302. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-0.txt +0 -0
  303. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_20-1.txt +0 -0
  304. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-0.txt +0 -0
  305. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-1.txt +0 -0
  306. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-2.txt +0 -0
  307. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_21-3.txt +0 -0
  308. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-0.txt +0 -0
  309. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_22-1.txt +0 -0
  310. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-0.txt +0 -0
  311. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_23-1.txt +0 -0
  312. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-0.txt +0 -0
  313. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-1.txt +0 -0
  314. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-2.txt +0 -0
  315. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_24-3.txt +0 -0
  316. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-0.txt +0 -0
  317. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-1.txt +0 -0
  318. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-2.txt +0 -0
  319. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-3.txt +0 -0
  320. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-4.txt +0 -0
  321. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_get_schema_validation_info/schema_info_25-5.txt +0 -0
  322. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_no_interrogation_validation_report_html_snap/no_interrogation_validation_report.html +0 -0
  323. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_no_steps_validation_report_html_snap/no_steps_validation_report.html +0 -0
  324. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_briefs_global_local_html/validation_report_briefs_global_local.html +0 -0
  325. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_briefs_html/validation_report_with_briefs.html +0 -0
  326. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
  327. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_parquet/validation_report.json +0 -0
  328. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pd/validation_report.json +0 -0
  329. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pl/validation_report.json +0 -0
  330. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
  331. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
  332. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_duckdb/validation_report.json +0 -0
  333. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_parquet/validation_report.json +0 -0
  334. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pd/validation_report.json +0 -0
  335. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pl/validation_report.json +0 -0
  336. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_pyspark/validation_report.json +0 -0
  337. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_no_interrogate_snap/tbl_sqlite/validation_report.json +0 -0
  338. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_html/duckdb/validation_report_segments.html +0 -0
  339. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_html/pandas/validation_report_segments.html +0 -0
  340. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_html/polars/validation_report_segments.html +0 -0
  341. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/polars/validation_report_segments_with_pre.html +0 -0
  342. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_segments_with_pre_html/validation_report_segments_with_pre.html +0 -0
  343. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_duckdb/validation_report.json +0 -0
  344. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_parquet/validation_report.json +0 -0
  345. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pd/validation_report.json +0 -0
  346. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pl/validation_report.json +0 -0
  347. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_pyspark/validation_report.json +0 -0
  348. {pointblank-0.13.3 → pointblank-0.13.4}/tests/snapshots/test_validate/test_validation_report_use_fields_snap/tbl_sqlite/validation_report.json +0 -0
  349. {pointblank-0.13.3 → pointblank-0.13.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
  350. {pointblank-0.13.3 → pointblank-0.13.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
  351. {pointblank-0.13.3 → pointblank-0.13.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
  352. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/parquet_data/data_a.parquet +0 -0
  353. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/parquet_data/data_b.parquet +0 -0
  354. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/parquet_data/subdir/nested_data.parquet +0 -0
  355. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=cancelled/0.parquet +0 -0
  356. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=delivered/0.parquet +0 -0
  357. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=pending/0.parquet +0 -0
  358. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=returned/0.parquet +0 -0
  359. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_sales/status=shipped/0.parquet +0 -0
  360. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_small_table/f=high/0.parquet +0 -0
  361. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_small_table/f=low/0.parquet +0 -0
  362. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/partitioned_small_table/f=mid/0.parquet +0 -0
  363. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/taxi_part_01.parquet +0 -0
  364. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/taxi_part_02.parquet +0 -0
  365. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/taxi_part_03.parquet +0 -0
  366. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/taxi_sample.parquet +0 -0
  367. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_dates_times_text.ddb +0 -0
  368. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_dates_times_text.parquet +0 -0
  369. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_dates_times_text.sqlite +0 -0
  370. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_true_dates_times.ddb +0 -0
  371. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz.ddb +0 -0
  372. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz.parquet +0 -0
  373. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz.sqlite +0 -0
  374. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz_missing.ddb +0 -0
  375. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz_missing.parquet +0 -0
  376. {pointblank-0.13.3 → pointblank-0.13.4}/tests/tbl_files/tbl_xyz_missing.sqlite +0 -0
  377. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test__interrogation.py +0 -0
  378. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test__utils.py +0 -0
  379. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test__utils_check_args.py +0 -0
  380. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_actions.py +0 -0
  381. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_assistant.py +0 -0
  382. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_cli.py +0 -0
  383. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_column.py +0 -0
  384. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_compare.py +0 -0
  385. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_datascan.py +0 -0
  386. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_draft.py +0 -0
  387. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_mcp_integration.py +0 -0
  388. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_mcp_server.py +0 -0
  389. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_meta.py +0 -0
  390. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_schema.py +0 -0
  391. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_segments.py +0 -0
  392. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_thresholds.py +0 -0
  393. {pointblank-0.13.3 → pointblank-0.13.4}/tests/test_yaml.py +0 -0
  394. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.ar.md +0 -0
  395. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.de.md +0 -0
  396. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.es.md +0 -0
  397. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.fr.md +0 -0
  398. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.hi.md +0 -0
  399. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.it.md +0 -0
  400. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.ja.md +0 -0
  401. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.ko.md +0 -0
  402. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.nl.md +0 -0
  403. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.pt-BR.md +0 -0
  404. {pointblank-0.13.3 → pointblank-0.13.4}/translations/README.zh-CN.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pointblank
3
- Version: 0.13.3
3
+ Version: 0.13.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
@@ -512,6 +512,60 @@ EXPECT_FAIL_TEXT = {
512
512
  "hi": "{column_text} में मान नियमित अभिव्यक्ति से मेल खाने चाहिए थे: {values_text}, ऐसे असफल परीक्षण इकाइयों की अधिकता।",
513
513
  "el": "Υπέρβαση αποτυχημένων μονάδων δοκιμής όπου οι τιμές στη στήλη {column_text} θα έπρεπε να ταιριάζουν με την κανονική έκφραση: {values_text}.",
514
514
  },
515
+ "regex_inverse_expectation_text": {
516
+ "en": "Expect that values in {column_text} should not match the regular expression: {values_text}.",
517
+ "fr": "On s'attend à ce que les valeurs de {column_text} ne correspondent pas à l'expression régulière : {values_text}.",
518
+ "de": "Erwarten Sie, dass die Werte in {column_text} nicht mit dem regulären Ausdruck {values_text} übereinstimmen.",
519
+ "it": "Aspettati che i valori in {column_text} non debbano corrispondere all'espressione regolare: {values_text}.",
520
+ "es": "Se espera que los valores en {column_text} no coincidan con la expresión regular: {values_text}.",
521
+ "pt": "Espera-se que os valores em {column_text} não concorde com a expressão regular: {values_text}.",
522
+ "ro": "Se așteaptă ca valorile din {column_text} să nu corespundă expresiei regulate: {values_text}.",
523
+ "tr": "Beklenti, {column_text} 'deki değerlerin şu normal ifadeyle eşleşmemesi gerektiğidir: {values_text}.",
524
+ "zh-Hans": "预期在{column_text} 的值不应当匹配正则表达式。",
525
+ "zh-Hant": "{column_text}之值不應該匹配正則表達式。",
526
+ "ja": "{column_text}の値が正規表現: {values_text}に一致しないことを期待します。",
527
+ "ko": "{column_text}의 값이 정규식 {values_text}와 일치하지 않아야 합니다.",
528
+ "vi": "Kỳ vọng các giá trị trong {column_text} không được khớp với biểu thức chính quy: {values_text}.",
529
+ "ru": "Ожидайте, что значения в {column_text} не должны соответствовать регулярному выражению: {values_text}.",
530
+ "cs": "Očekává se, že hodnoty ve sloupci {column_text} nebudou odpovídat regulárnímu výrazu: {values_text}.",
531
+ "pl": "Spodziewaj się, że wartości w {column_text} nie powinny byc zgodne z wyrażeniem regularnym: {values_text}.",
532
+ "da": "Forvent at værdierne i {column_text} ikke stemmer overens med følgende regular expression: {values_text}.",
533
+ "sv": "Förvänta dig att värdena i {column_text} inte ska matcha följande reguljära uttryck: {values_text}.",
534
+ "nb": "Forvent at verdier i {column_text} ikke skal samsvare med regulæruttrykket: {values_text}.",
535
+ "nl": "Verwacht dat de waarden in {column_text} niet overeenkomen met de reguliere expressie {values_text}.",
536
+ "fi": "Odota, että arvot sarakkeessa {column_text} eivät vastaa säännöllistä lauseketta: {values_text}.",
537
+ "is": "Væntir þess að gildi í {column_text} passi ekki við reglulega segðina: {values_text}.",
538
+ "ar": "توقع ألا تتطابق القيم في {column_text} مع التعبير المنتظم: {values_text}.",
539
+ "hi": "अपेक्षा है कि {column_text} में मान नियमित अभिव्यक्ति से मेल नहीं खाने चाहिए: {values_text}।",
540
+ "el": "Αναμένεται οι τιμές στη στήλη {column_text} να μην ταιριάζουν με την κανονική έκφραση: {values_text}.",
541
+ },
542
+ "regex_inverse_failure_text": {
543
+ "en": "Exceedance of failed test units where values in {column_text} should not have matched the regular expression: {values_text}.",
544
+ "fr": "Dépassement des unités de test ayant échoué où les valeurs dans {column_text} n'auraient pas dû correspondre à l'expression régulière : {values_text}.",
545
+ "de": "Überschreitung fehlgeschlagener Testeinheiten, bei denen die Werte in {column_text} nicht mit dem regulären Ausdruck {values_text} übereinstimmen sollten.",
546
+ "it": "Superamento delle unità di test non riuscite in cui i valori in {column_text} non avrebbero dovuto corrispondere all'espressione regolare: {values_text}.",
547
+ "es": "Se superó el número de unidades de prueba fallidas en que los valores en {column_text} no deberían coincidir con la expresión regular: {values_text}.",
548
+ "pt": "Excedeu o número de unidades de teste com falha onde os valores em {column_text} não deve concordar com a expressão regular: {values_text}.",
549
+ "ro": "Depășirea unităților de test eșuate unde valorile din {column_text} nu ar fi trebuit să corespundă expresiei regulate: {values_text}.",
550
+ "tr": "{column_text} daki değerlerin normal ifade {values_text} ile eşleşmemesi gereken başarısız test birimlerinin aşılması.",
551
+ "zh-Hans": "错误过多,其中{column_text}中的值不应当匹配正则表达式。",
552
+ "zh-Hant": "錯誤過多,{column_text}之值不應該匹配正則表達式。",
553
+ "ja": "{column_text}の値が正規表現: {values_text}に一致すべきでないテスト単位の失敗の超過。",
554
+ "ko": "{column_text}의 값이 정규식 {values_text}와 일치하지 않았어야 했던 실패한 테스트 단위 초과.",
555
+ "vi": "Vượt quá số đơn vị kiểm tra thất bại trong đó các giá trị trong {column_text} đáng lẽ không được khớp với biểu thức chính quy: {values_text}.",
556
+ "ru": "Превышение неудачных тестовых единиц, где значения в {column_text} не должны были соответствовать регулярному выражению: {values_text}.",
557
+ "cs": "Překročení počtu neúspěšných testů, kde hodnoty ve sloupci {column_text} neměly odpovídat regulárnímu výrazu: {values_text}.",
558
+ "pl": "Wystapiło przekroczenie liczby jednostek testowych zakończonych niepowodzeniem, w przypadku których wartości w {column_text} nie powinny odpowiadac wyrażeniu regularnemu: {values_text}.",
559
+ "da": "Overskridelse af antallet af fejlslagne testenheder, hvor værdier {column_text} ikke skulle have været i overensstemmelse med følgende regular expression: {values_text}.",
560
+ "sv": "Överskrider antalet misslyckade testenheter där värden {column_text} inte borde ha matchat följande reguljära uttryck: {values_text}.",
561
+ "nb": "Overskridelse av mislykkede testenheter hvor verdier i {column_text} ikke skulle ha samsvart med regulæruttrykket: {values_text}.",
562
+ "nl": "Overschrijding van mislukte testeenheden waarbij waarden in {column_text} niet overeen mogen komen met de reguliere expressie: {values_text}.",
563
+ "fi": "Epäonnistuneiden testiyksikköjen ylitys, joissa sarakkeen {column_text} arvojen ei olisi pitänyt vastata säännöllistä lauseketta: {values_text}.",
564
+ "is": "Of mörg misheppnuð próf þar sem gildi í {column_text} hefðu ekki átt að passa við reglulega segðina: {values_text}.",
565
+ "ar": "تجاوز وحدات الاختبار الفاشلة حيث كان يجب ألا تتطابق القيم في {column_text} مع التعبير المنتظم: {values_text}.",
566
+ "hi": "{column_text} में मान नियमित अभिव्यक्ति से मेल नहीं खाने चाहिए थे: {values_text}, ऐसे असफल परीक्षण इकाइयों की अधिकता।",
567
+ "el": "Υπέρβαση αποτυχημένων μονάδων δοκιμής όπου οι τιμές στη στήλη {column_text} δεν θα έπρεπε να ταιριάζουν με την κανονική έκφραση: {values_text}.",
568
+ },
515
569
  "col_vals_expr_expectation_text": {
516
570
  "en": "Expect that values should agree with the given Python expression.",
517
571
  "fr": "On s'attend à ce que les valeurs soient en accord avec l'expression Python donnée.",
@@ -1688,15 +1688,30 @@ def interrogate_notin(tbl: FrameT, column: str, set_values: any) -> FrameT:
1688
1688
  return result_tbl.to_native()
1689
1689
 
1690
1690
 
1691
- def interrogate_regex(tbl: FrameT, column: str, pattern: str, na_pass: bool) -> FrameT:
1691
+ def interrogate_regex(tbl: FrameT, column: str, values: dict | str, na_pass: bool) -> FrameT:
1692
1692
  """Regex interrogation."""
1693
1693
 
1694
+ # Handle both old and new formats for backward compatibility
1695
+ if isinstance(values, str):
1696
+ pattern = values
1697
+ inverse = False
1698
+ else:
1699
+ pattern = values["pattern"]
1700
+ inverse = values["inverse"]
1701
+
1694
1702
  nw_tbl = nw.from_native(tbl)
1695
1703
  result_tbl = nw_tbl.with_columns(
1696
1704
  pb_is_good_1=nw.col(column).is_null() & na_pass,
1697
1705
  pb_is_good_2=nw.col(column).str.contains(pattern, literal=False).fill_null(False),
1698
1706
  )
1699
1707
 
1708
+ # Apply inverse logic if needed
1709
+ if inverse:
1710
+ # Use explicit boolean logic instead of bitwise NOT for pandas compatibility
1711
+ result_tbl = result_tbl.with_columns(
1712
+ pb_is_good_2=nw.when(nw.col("pb_is_good_2")).then(False).otherwise(True)
1713
+ )
1714
+
1700
1715
  result_tbl = result_tbl.with_columns(
1701
1716
  pb_is_good_=nw.col("pb_is_good_1") | nw.col("pb_is_good_2")
1702
1717
  ).drop("pb_is_good_1", "pb_is_good_2")
@@ -240,6 +240,46 @@ def _select_df_lib(preference: str = "polars") -> Any:
240
240
  return pl if pl is not None else pd
241
241
 
242
242
 
243
+ def _copy_dataframe(df):
244
+ """
245
+ Create a copy of a DataFrame, handling different DataFrame types.
246
+
247
+ This function attempts to create a proper copy of the DataFrame using
248
+ the most appropriate method for each DataFrame type.
249
+ """
250
+ # Try standard copy methods first
251
+ if hasattr(df, "copy") and callable(getattr(df, "copy")):
252
+ try:
253
+ return df.copy()
254
+ except Exception:
255
+ pass
256
+
257
+ if hasattr(df, "clone") and callable(getattr(df, "clone")):
258
+ try:
259
+ return df.clone()
260
+ except Exception:
261
+ pass
262
+
263
+ # Try the select('*') approach for DataFrames that support it
264
+ # This works well for PySpark and other SQL-like DataFrames
265
+ if hasattr(df, "select") and callable(getattr(df, "select")):
266
+ try:
267
+ return df.select("*")
268
+ except Exception:
269
+ pass
270
+
271
+ # For DataFrames that can't be copied, return original
272
+ # This provides some protection while avoiding crashes
273
+ try:
274
+ import copy
275
+
276
+ return copy.deepcopy(df)
277
+ except Exception:
278
+ # If all else fails, return the original DataFrame
279
+ # This is better than crashing the validation
280
+ return df
281
+
282
+
243
283
  def _convert_to_narwhals(df: FrameT) -> nw.DataFrame:
244
284
  # Convert the DataFrame to a format that narwhals can work with
245
285
  return nw.from_native(df)
@@ -10,6 +10,7 @@ import re
10
10
  import tempfile
11
11
  import threading
12
12
  from dataclasses import dataclass
13
+ from enum import Enum
13
14
  from importlib.metadata import version
14
15
  from typing import TYPE_CHECKING, Any, Callable, Literal
15
16
  from zipfile import ZipFile
@@ -74,6 +75,7 @@ from pointblank._utils import (
74
75
  _check_any_df_lib,
75
76
  _check_invalid_fields,
76
77
  _column_test_prep,
78
+ _copy_dataframe,
77
79
  _count_null_values_in_column,
78
80
  _count_true_values_in_column,
79
81
  _derive_bounds,
@@ -2650,6 +2652,48 @@ def get_column_count(data: FrameT | Any) -> int:
2650
2652
  raise ValueError("The input table type supplied in `data=` is not supported.")
2651
2653
 
2652
2654
 
2655
+ def _extract_enum_values(set_values: Any) -> list[Any]:
2656
+ """
2657
+ Extract values from Enum classes or collections containing Enum instances.
2658
+
2659
+ This helper function handles:
2660
+ 1. Enum classes: extracts all enum values
2661
+ 2. Collections containing Enum instances: extracts their values
2662
+ 3. Regular collections: returns as-is
2663
+
2664
+ Parameters
2665
+ ----------
2666
+ set_values
2667
+ The input collection that may contain Enum class or Enum instances.
2668
+
2669
+ Returns
2670
+ -------
2671
+ list[Any]
2672
+ A list of extracted values
2673
+ """
2674
+ from collections.abc import Collection
2675
+
2676
+ # Check if set_values is an Enum class (not an instance)
2677
+ if inspect.isclass(set_values) and issubclass(set_values, Enum):
2678
+ # Extract all values from the Enum class
2679
+ return [enum_member.value for enum_member in set_values]
2680
+
2681
+ # Check if set_values is a collection
2682
+ if isinstance(set_values, Collection) and not isinstance(set_values, (str, bytes)):
2683
+ extracted_values = []
2684
+ for item in set_values:
2685
+ if isinstance(item, Enum):
2686
+ # If item is an Enum instance, extract its value
2687
+ extracted_values.append(item.value)
2688
+ else:
2689
+ # If item is not an Enum instance, keep as-is
2690
+ extracted_values.append(item)
2691
+ return extracted_values
2692
+
2693
+ # If set_values is neither an Enum class nor a collection, return as list
2694
+ return [set_values]
2695
+
2696
+
2653
2697
  def get_row_count(data: FrameT | Any) -> int:
2654
2698
  """
2655
2699
  Get the number of rows in a table.
@@ -6332,7 +6376,10 @@ class Validate:
6332
6376
  multiple columns are supplied or resolved, there will be a separate validation step
6333
6377
  generated for each column.
6334
6378
  set
6335
- A list of values to compare against.
6379
+ A collection of values to compare against. Can be a list of values, a Python Enum class,
6380
+ or a collection containing Enum instances. When an Enum class is provided, all enum
6381
+ values will be used. When a collection contains Enum instances, their values will be
6382
+ extracted automatically.
6336
6383
  pre
6337
6384
  An optional preprocessing function or lambda to apply to the data table during
6338
6385
  interrogation. This function should take a table as input and return a modified table.
@@ -6509,12 +6556,69 @@ class Validate:
6509
6556
 
6510
6557
  The validation table reports two failing test units. The specific failing cases are for the
6511
6558
  column `b` values of `8` and `1`, which are not in the set of `[2, 3, 4, 5, 6]`.
6559
+
6560
+ **Using Python Enums**
6561
+
6562
+ The `col_vals_in_set()` method also supports Python Enum classes and instances, which can
6563
+ make validations more readable and maintainable:
6564
+
6565
+ ```{python}
6566
+ from enum import Enum
6567
+
6568
+ class Color(Enum):
6569
+ RED = "red"
6570
+ GREEN = "green"
6571
+ BLUE = "blue"
6572
+
6573
+ # Create a table with color data
6574
+ tbl_colors = pl.DataFrame({
6575
+ "product": ["shirt", "pants", "hat", "shoes"],
6576
+ "color": ["red", "blue", "green", "yellow"]
6577
+ })
6578
+
6579
+ # Validate using an Enum class (all enum values are allowed)
6580
+ validation = (
6581
+ pb.Validate(data=tbl_colors)
6582
+ .col_vals_in_set(columns="color", set=Color)
6583
+ .interrogate()
6584
+ )
6585
+
6586
+ validation
6587
+ ```
6588
+
6589
+ This validation will fail for the `"yellow"` value since it's not in the `Color` enum.
6590
+
6591
+ You can also use specific Enum instances or mix them with regular values:
6592
+
6593
+ ```{python}
6594
+ # Validate using specific Enum instances
6595
+ validation = (
6596
+ pb.Validate(data=tbl_colors)
6597
+ .col_vals_in_set(columns="color", set=[Color.RED, Color.BLUE])
6598
+ .interrogate()
6599
+ )
6600
+
6601
+ # Mix Enum instances with regular values
6602
+ validation = (
6603
+ pb.Validate(data=tbl_colors)
6604
+ .col_vals_in_set(columns="color", set=[Color.RED, Color.BLUE, "yellow"])
6605
+ .interrogate()
6606
+ )
6607
+
6608
+ validation
6609
+ ```
6610
+
6611
+ In this case, the `"green"` value will cause a failing test unit since it's not part of the
6612
+ specified set.
6512
6613
  """
6513
6614
 
6514
6615
  assertion_type = _get_fn_name()
6515
6616
 
6516
6617
  _check_column(column=columns)
6517
6618
 
6619
+ # Extract values from Enum classes or Enum instances if present
6620
+ set = _extract_enum_values(set)
6621
+
6518
6622
  for val in set:
6519
6623
  if val is None:
6520
6624
  continue
@@ -6565,7 +6669,7 @@ class Validate:
6565
6669
  def col_vals_not_in_set(
6566
6670
  self,
6567
6671
  columns: str | list[str] | Column | ColumnSelector | ColumnSelectorNarwhals,
6568
- set: list[float | int],
6672
+ set: Collection[Any],
6569
6673
  pre: Callable | None = None,
6570
6674
  segments: SegmentSpec | None = None,
6571
6675
  thresholds: int | float | bool | tuple | dict | Thresholds = None,
@@ -6589,7 +6693,10 @@ class Validate:
6589
6693
  multiple columns are supplied or resolved, there will be a separate validation step
6590
6694
  generated for each column.
6591
6695
  set
6592
- A list of values to compare against.
6696
+ A collection of values to compare against. Can be a list of values, a Python Enum class,
6697
+ or a collection containing Enum instances. When an Enum class is provided, all enum
6698
+ values will be used. When a collection contains Enum instances, their values will be
6699
+ extracted automatically.
6593
6700
  pre
6594
6701
  An optional preprocessing function or lambda to apply to the data table during
6595
6702
  interrogation. This function should take a table as input and return a modified table.
@@ -6767,11 +6874,45 @@ class Validate:
6767
6874
 
6768
6875
  The validation table reports two failing test units. The specific failing cases are for the
6769
6876
  column `b` values of `2` and `6`, both of which are in the set of `[2, 3, 4, 5, 6]`.
6877
+
6878
+ **Using Python Enums**
6879
+
6880
+ Like `col_vals_in_set()`, this method also supports Python Enum classes and instances:
6881
+
6882
+ ```{python}
6883
+ from enum import Enum
6884
+
6885
+ class InvalidStatus(Enum):
6886
+ DELETED = "deleted"
6887
+ ARCHIVED = "archived"
6888
+
6889
+ # Create a table with status data
6890
+ status_table = pl.DataFrame({
6891
+ "product": ["widget", "gadget", "tool", "device"],
6892
+ "status": ["active", "pending", "deleted", "active"]
6893
+ })
6894
+
6895
+ # Validate that no values are in the invalid status set
6896
+ validation = (
6897
+ pb.Validate(data=status_table)
6898
+ .col_vals_not_in_set(columns="status", set=InvalidStatus)
6899
+ .interrogate()
6900
+ )
6901
+
6902
+ validation
6903
+ ```
6904
+
6905
+ This `"deleted"` value in the `status` column will fail since it matches one of the invalid
6906
+ statuses in the `InvalidStatus` enum.
6770
6907
  """
6771
6908
 
6772
6909
  assertion_type = _get_fn_name()
6773
6910
 
6774
6911
  _check_column(column=columns)
6912
+
6913
+ # Extract values from Enum classes or Enum instances if present
6914
+ set = _extract_enum_values(set)
6915
+
6775
6916
  _check_set_types(set=set)
6776
6917
  _check_pre(pre=pre)
6777
6918
  # TODO: add check for segments
@@ -7305,6 +7446,7 @@ class Validate:
7305
7446
  columns: str | list[str] | Column | ColumnSelector | ColumnSelectorNarwhals,
7306
7447
  pattern: str,
7307
7448
  na_pass: bool = False,
7449
+ inverse: bool = False,
7308
7450
  pre: Callable | None = None,
7309
7451
  segments: SegmentSpec | None = None,
7310
7452
  thresholds: int | float | bool | tuple | dict | Thresholds = None,
@@ -7332,6 +7474,9 @@ class Validate:
7332
7474
  na_pass
7333
7475
  Should any encountered None, NA, or Null values be considered as passing test units? By
7334
7476
  default, this is `False`. Set to `True` to pass test units with missing values.
7477
+ inverse
7478
+ Should the validation step be inverted? If `True`, then the expectation is that column
7479
+ values should *not* match the specified `pattern=` regex.
7335
7480
  pre
7336
7481
  An optional preprocessing function or lambda to apply to the data table during
7337
7482
  interrogation. This function should take a table as input and return a modified table.
@@ -7518,6 +7663,7 @@ class Validate:
7518
7663
  # _check_segments(segments=segments)
7519
7664
  _check_thresholds(thresholds=thresholds)
7520
7665
  _check_boolean_input(param=na_pass, param_name="na_pass")
7666
+ _check_boolean_input(param=inverse, param_name="inverse")
7521
7667
  _check_boolean_input(param=active, param_name="active")
7522
7668
 
7523
7669
  # Determine threshold to use (global or local) and normalize a local `thresholds=` value
@@ -7537,12 +7683,15 @@ class Validate:
7537
7683
  # Determine brief to use (global or local) and transform any shorthands of `brief=`
7538
7684
  brief = self.brief if brief is None else _transform_auto_brief(brief=brief)
7539
7685
 
7686
+ # Package up the `pattern=` and boolean params into a dictionary for later interrogation
7687
+ values = {"pattern": pattern, "inverse": inverse}
7688
+
7540
7689
  # Iterate over the columns and create a validation step for each
7541
7690
  for column in columns:
7542
7691
  val_info = _ValidationInfo(
7543
7692
  assertion_type=assertion_type,
7544
7693
  column=column,
7545
- values=pattern,
7694
+ values=values,
7546
7695
  na_pass=na_pass,
7547
7696
  pre=pre,
7548
7697
  segments=segments,
@@ -9838,8 +9987,9 @@ class Validate:
9838
9987
  validation.active = False
9839
9988
  continue
9840
9989
 
9841
- # Make a copy of the table for this step
9842
- data_tbl_step = data_tbl
9990
+ # Make a deep copy of the table for this step to ensure proper isolation
9991
+ # This prevents modifications from one validation step affecting others
9992
+ data_tbl_step = _copy_dataframe(data_tbl)
9843
9993
 
9844
9994
  # ------------------------------------------------
9845
9995
  # Preprocessing stage
@@ -10006,7 +10156,7 @@ class Validate:
10006
10156
 
10007
10157
  elif assertion_type == "col_vals_regex":
10008
10158
  results_tbl = interrogate_regex(
10009
- tbl=tbl, column=column, pattern=value, na_pass=na_pass
10159
+ tbl=tbl, column=column, values=value, na_pass=na_pass
10010
10160
  )
10011
10161
 
10012
10162
  elif assertion_type == "col_vals_expr":
@@ -12569,6 +12719,11 @@ class Validate:
12569
12719
  elif assertion_type[i] in ["specially"]:
12570
12720
  values_upd.append("EXPR")
12571
12721
 
12722
+ elif assertion_type[i] in ["col_vals_regex"]:
12723
+ pattern = value["pattern"]
12724
+
12725
+ values_upd.append(str(pattern))
12726
+
12572
12727
  # If the assertion type is not recognized, add the value as a string
12573
12728
  else:
12574
12729
  values_upd.append(str(value))
@@ -14218,15 +14373,30 @@ def _create_text_null(
14218
14373
 
14219
14374
 
14220
14375
  def _create_text_regex(
14221
- lang: str, column: str | None, pattern: str, for_failure: bool = False
14376
+ lang: str, column: str | None, pattern: str | dict, for_failure: bool = False
14222
14377
  ) -> str:
14223
14378
  type_ = _expect_failure_type(for_failure=for_failure)
14224
14379
 
14225
14380
  column_text = _prep_column_text(column=column)
14226
14381
 
14227
- return EXPECT_FAIL_TEXT[f"regex_{type_}_text"][lang].format(
14382
+ # Handle case where pattern is a dictionary containing `pattern` and `inverse`
14383
+ if isinstance(pattern, dict):
14384
+ pattern_str = pattern["pattern"]
14385
+ inverse = pattern.get("inverse", False)
14386
+ else:
14387
+ # For backward compatibility, assume it's just the pattern string
14388
+ pattern_str = pattern
14389
+ inverse = False
14390
+
14391
+ # Use inverse-specific translations if inverse=True
14392
+ if inverse:
14393
+ text_key = f"regex_inverse_{type_}_text"
14394
+ else:
14395
+ text_key = f"regex_{type_}_text"
14396
+
14397
+ return EXPECT_FAIL_TEXT[text_key][lang].format(
14228
14398
  column_text=column_text,
14229
- values_text=pattern,
14399
+ values_text=pattern_str,
14230
14400
  )
14231
14401
 
14232
14402
 
@@ -15379,7 +15549,8 @@ def _step_report_row_based(
15379
15549
  elements = ", ".join(values)
15380
15550
  text = f"{column} &NotElement; {{{elements}}}"
15381
15551
  elif assertion_type == "col_vals_regex":
15382
- text = STEP_REPORT_TEXT["column_matches_regex"][lang].format(column=column, values=values)
15552
+ pattern = values["pattern"]
15553
+ text = STEP_REPORT_TEXT["column_matches_regex"][lang].format(column=column, values=pattern)
15383
15554
  elif assertion_type == "col_vals_null":
15384
15555
  text = STEP_REPORT_TEXT["column_is_null"][lang].format(column=column)
15385
15556
  elif assertion_type == "col_vals_not_null":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pointblank
3
- Version: 0.13.3
3
+ Version: 0.13.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
@@ -171,7 +171,6 @@ images/pointblank-tabular-report.png
171
171
  images/pointblank_logo.svg
172
172
  pointblank/__init__.py
173
173
  pointblank/_constants.py
174
- pointblank/_constants_docs.py
175
174
  pointblank/_constants_translations.py
176
175
  pointblank/_datascan_utils.py
177
176
  pointblank/_interrogation.py