tabalyst 0.7.1__tar.gz → 0.7.2__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 (540) hide show
  1. {tabalyst-0.7.1/src/tabalyst.egg-info → tabalyst-0.7.2}/PKG-INFO +7 -1
  2. {tabalyst-0.7.1 → tabalyst-0.7.2}/README.md +6 -0
  3. {tabalyst-0.7.1 → tabalyst-0.7.2}/pyproject.toml +3 -1
  4. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/report.py +13 -0
  5. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/config.py +22 -0
  6. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/analysis.py +2 -2
  7. tabalyst-0.7.2/src/tabalyst/dedup/calculation.py +14 -0
  8. tabalyst-0.7.2/src/tabalyst/dedup/count_only.py +321 -0
  9. tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/__init__.py +33 -0
  10. tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/facts.py +462 -0
  11. tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/models.py +278 -0
  12. tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/near_unique.py +59 -0
  13. tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/proof.py +130 -0
  14. tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/rule.py +396 -0
  15. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/models.py +2 -2
  16. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_chain.py +5 -0
  17. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_classification.py +4 -4
  18. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_column_page.py +12 -0
  19. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_deep.py +32 -0
  20. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_labels.py +99 -5
  21. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_profile.py +15 -3
  22. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_service.py +17 -0
  23. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_summary.py +25 -5
  24. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_table.py +7 -0
  25. tabalyst-0.7.2/src/tabalyst/report_uniqueness.py +350 -0
  26. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/reporting.py +2 -0
  27. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/identifiers.py +3 -2
  28. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzer.py +30 -0
  29. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/__init__.py +6 -0
  30. tabalyst-0.7.2/src/tabalyst/scanner/planner/analyzers/analytical.py +91 -0
  31. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/common.py +4 -0
  32. tabalyst-0.7.2/src/tabalyst/scanner/planner/analyzers/copies.py +108 -0
  33. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/distinct.py +12 -2
  34. tabalyst-0.7.2/src/tabalyst/scanner/planner/analyzers/missing_copies.py +114 -0
  35. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/costmodel.py +29 -1
  36. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/facts.py +161 -48
  37. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/planner.py +50 -5
  38. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/reasons.py +13 -0
  39. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/secondpass.py +6 -3
  40. tabalyst-0.7.2/src/tabalyst/scanner/secondpass/analytical.py +90 -0
  41. tabalyst-0.7.2/src/tabalyst/scanner/secondpass/copies.py +115 -0
  42. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/executor.py +110 -13
  43. tabalyst-0.7.2/src/tabalyst/scanner/secondpass/missing_copies.py +140 -0
  44. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/models.py +86 -1
  45. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/routing.py +14 -0
  46. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.report.schema.json +957 -4
  47. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.scan.deep.schema.json +277 -2
  48. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/service.py +48 -5
  49. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/static/theme.css +10 -0
  50. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/summary_models.py +4 -0
  51. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/column.html +14 -2
  52. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/report.html +2 -2
  53. {tabalyst-0.7.1 → tabalyst-0.7.2/src/tabalyst.egg-info}/PKG-INFO +7 -1
  54. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/SOURCES.txt +15 -0
  55. {tabalyst-0.7.1 → tabalyst-0.7.2}/LICENSE +0 -0
  56. {tabalyst-0.7.1 → tabalyst-0.7.2}/MANIFEST.in +0 -0
  57. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/README.md +0 -0
  58. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/config.json +0 -0
  59. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/datasets/basic.csv +0 -0
  60. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/datasets/insurance-customers.csv +0 -0
  61. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/README.md +0 -0
  62. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/cohorts-anomalies/catalog.yaml +0 -0
  63. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/cohorts-anomalies/dataset.yaml +0 -0
  64. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/cohorts-anomalies/schemas/accounts.yaml +0 -0
  65. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/cohorts-anomalies/schemas/contacts.yaml +0 -0
  66. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/common-references/catalog.yaml +0 -0
  67. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/common-references/dataset.yaml +0 -0
  68. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/common-references/schemas/contacts.yaml +0 -0
  69. {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/generate_examples.py +0 -0
  70. {tabalyst-0.7.1 → tabalyst-0.7.2}/setup.cfg +0 -0
  71. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/__init__.py +0 -0
  72. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/__main__.py +0 -0
  73. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/_version.py +0 -0
  74. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/batch.py +0 -0
  75. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cache_service.py +0 -0
  76. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/__init__.py +0 -0
  77. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/app.py +0 -0
  78. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/cache.py +0 -0
  79. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/confirm.py +0 -0
  80. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/dedup.py +0 -0
  81. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/generate.py +0 -0
  82. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/inspect.py +0 -0
  83. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/sample.py +0 -0
  84. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/scan.py +0 -0
  85. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/terminal.py +0 -0
  86. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/csv_records.py +0 -0
  87. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/__init__.py +0 -0
  88. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/batch_report.py +0 -0
  89. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/cache.py +0 -0
  90. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/discovery.py +0 -0
  91. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/diskstore.py +0 -0
  92. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/failures.py +0 -0
  93. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/groups.py +0 -0
  94. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/identity.py +0 -0
  95. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/pipeline.py +0 -0
  96. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/publish.py +0 -0
  97. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/report.py +0 -0
  98. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/settings.py +0 -0
  99. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/store.py +0 -0
  100. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/tiered.py +0 -0
  101. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/writer.py +0 -0
  102. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup_service.py +0 -0
  103. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/deep_service.py +0 -0
  104. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/deep_store.py +0 -0
  105. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/errors.py +0 -0
  106. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/execution_log.py +0 -0
  107. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_anomalies.py +0 -0
  108. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_columns_package.py +0 -0
  109. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_computer.py +0 -0
  110. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_computer_output.py +0 -0
  111. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_csv.py +0 -0
  112. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_definition.py +0 -0
  113. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/SOURCES.md +0 -0
  114. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/catalog.yaml +0 -0
  115. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/brand.csv +0 -0
  116. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/color.csv +0 -0
  117. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/computer_type.csv +0 -0
  118. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/computer_type_form_factor.csv +0 -0
  119. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/computer_type_product_segment.csv +0 -0
  120. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/cpu.csv +0 -0
  121. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/cpu_memory_weight.csv +0 -0
  122. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/cpu_operating_system.csv +0 -0
  123. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/display.csv +0 -0
  124. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/extended_specs.csv +0 -0
  125. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/form_factor.csv +0 -0
  126. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_color.csv +0 -0
  127. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_cpu.csv +0 -0
  128. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_display.csv +0 -0
  129. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_gpu.csv +0 -0
  130. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_memory.csv +0 -0
  131. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_operating_system.csv +0 -0
  132. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_profile.csv +0 -0
  133. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_profile_computer_type.csv +0 -0
  134. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_profile_segment.csv +0 -0
  135. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_storage.csv +0 -0
  136. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/gpu.csv +0 -0
  137. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/gpu_display.csv +0 -0
  138. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/gpu_memory_weight.csv +0 -0
  139. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/gpu_storage_weight.csv +0 -0
  140. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/memory.csv +0 -0
  141. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/model_form_factor.csv +0 -0
  142. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/model_generation.csv +0 -0
  143. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/operating_system.csv +0 -0
  144. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_category.csv +0 -0
  145. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_family.csv +0 -0
  146. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_family_computer_type.csv +0 -0
  147. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_family_product_segment.csv +0 -0
  148. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_model.csv +0 -0
  149. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment.csv +0 -0
  150. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment_brand.csv +0 -0
  151. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment_display_weight.csv +0 -0
  152. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment_memory_weight.csv +0 -0
  153. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment_storage_weight.csv +0 -0
  154. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_subcategory.csv +0 -0
  155. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/profile_exclusions.csv +0 -0
  156. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/promotion_status.csv +0 -0
  157. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/promotion_type.csv +0 -0
  158. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/seller.csv +0 -0
  159. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/seller_type.csv +0 -0
  160. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/shipping_availability.csv +0 -0
  161. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/standard_specs.csv +0 -0
  162. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/storage.csv +0 -0
  163. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/warehouse.csv +0 -0
  164. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/dataset.yaml +0 -0
  165. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/computer_type.yaml +0 -0
  166. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/computer_type_form_factor.yaml +0 -0
  167. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/computer_type_product_segment.yaml +0 -0
  168. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/computers.yaml +0 -0
  169. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/cpu.yaml +0 -0
  170. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/cpu_memory_weight.yaml +0 -0
  171. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/cpu_operating_system.yaml +0 -0
  172. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/display.yaml +0 -0
  173. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/extended_specs.yaml +0 -0
  174. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_color.yaml +0 -0
  175. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_cpu.yaml +0 -0
  176. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_display.yaml +0 -0
  177. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_gpu.yaml +0 -0
  178. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_memory.yaml +0 -0
  179. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_operating_system.yaml +0 -0
  180. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_profile.yaml +0 -0
  181. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_profile_computer_type.yaml +0 -0
  182. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_profile_segment.yaml +0 -0
  183. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_storage.yaml +0 -0
  184. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/gpu.yaml +0 -0
  185. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/gpu_display.yaml +0 -0
  186. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/gpu_memory_weight.yaml +0 -0
  187. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/gpu_storage_weight.yaml +0 -0
  188. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/localized.yaml +0 -0
  189. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/memory.yaml +0 -0
  190. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/model_form_factor.yaml +0 -0
  191. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/model_generation.yaml +0 -0
  192. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/operating_system.yaml +0 -0
  193. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_family.yaml +0 -0
  194. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_family_computer_type.yaml +0 -0
  195. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_family_product_segment.yaml +0 -0
  196. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_model.yaml +0 -0
  197. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment.yaml +0 -0
  198. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment_brand.yaml +0 -0
  199. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment_display_weight.yaml +0 -0
  200. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment_memory_weight.yaml +0 -0
  201. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment_storage_weight.yaml +0 -0
  202. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_subcategory.yaml +0 -0
  203. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/profile_exclusions.yaml +0 -0
  204. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/seller.yaml +0 -0
  205. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/standard_specs.yaml +0 -0
  206. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/storage.yaml +0 -0
  207. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/warehouse.yaml +0 -0
  208. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/crm/catalog.yaml +0 -0
  209. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/crm/dataset.yaml +0 -0
  210. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/crm/schemas/accounts.yaml +0 -0
  211. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/crm/schemas/contacts.yaml +0 -0
  212. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/SOURCES.md +0 -0
  213. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/catalog.yaml +0 -0
  214. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/agencies.csv +0 -0
  215. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/branch_contract_weights.csv +0 -0
  216. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/claim_statuses.csv +0 -0
  217. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/contract_statuses.csv +0 -0
  218. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/contract_types.csv +0 -0
  219. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/payment_frequencies.csv +0 -0
  220. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/payment_methods.csv +0 -0
  221. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/dataset.yaml +0 -0
  222. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/agencies.yaml +0 -0
  223. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/branch_contract_weights.yaml +0 -0
  224. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/claim_statuses.yaml +0 -0
  225. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/contract_statuses.yaml +0 -0
  226. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/contract_types.yaml +0 -0
  227. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/customers.yaml +0 -0
  228. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/payment_frequencies.yaml +0 -0
  229. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/payment_methods.yaml +0 -0
  230. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_insurance.py +0 -0
  231. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_package.py +0 -0
  232. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_references.py +0 -0
  233. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/SOURCES.md +0 -0
  234. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/addresses/street_directions_ca.csv +0 -0
  235. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/addresses/street_names_ca.csv +0 -0
  236. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/addresses/street_types_ca.csv +0 -0
  237. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/addresses/unit_types_ca.csv +0 -0
  238. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/contact/email_patterns.csv +0 -0
  239. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/contact/email_providers_ca.csv +0 -0
  240. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/contact/phone_area_codes_ca.csv +0 -0
  241. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/geography/cities_ca.csv +0 -0
  242. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/geography/postal_prefixes_ca.csv +0 -0
  243. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/geography/provinces_ca.csv +0 -0
  244. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/people/family_names_ca.csv +0 -0
  245. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/people/first_names_en_ca.csv +0 -0
  246. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/people/first_names_fr_qc.csv +0 -0
  247. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_selection.py +0 -0
  248. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_service.py +0 -0
  249. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_values.py +0 -0
  250. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspect_service.py +0 -0
  251. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/__init__.py +0 -0
  252. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/choices.py +0 -0
  253. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/excel_inspect/__init__.py +0 -0
  254. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/excel_inspect/build.py +0 -0
  255. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/excel_inspect/detect.py +0 -0
  256. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/excel_inspect/parameters.py +0 -0
  257. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/json_inspect/__init__.py +0 -0
  258. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/json_inspect/build.py +0 -0
  259. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/json_inspect/detect.py +0 -0
  260. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/json_inspect/parameters.py +0 -0
  261. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/models.py +0 -0
  262. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/persistence.py +0 -0
  263. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/resolution.py +0 -0
  264. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/json_text.py +0 -0
  265. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/option_notices.py +0 -0
  266. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/plan_service.py +0 -0
  267. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/progress.py +0 -0
  268. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/project_open_service.py +0 -0
  269. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/project_scan_service.py +0 -0
  270. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/__init__.py +0 -0
  271. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_bounded_values.py +0 -0
  272. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_cache.py +0 -0
  273. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_codec.py +0 -0
  274. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_generation.py +0 -0
  275. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_locks.py +0 -0
  276. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_publication.py +0 -0
  277. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_queries.py +0 -0
  278. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_query_budget.py +0 -0
  279. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_recovery.py +0 -0
  280. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_retention.py +0 -0
  281. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_schema.py +0 -0
  282. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_session.py +0 -0
  283. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_staging.py +0 -0
  284. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_sync.py +0 -0
  285. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_validation.py +0 -0
  286. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/catalog.py +0 -0
  287. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/freshness.py +0 -0
  288. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/identity.py +0 -0
  289. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/index.py +0 -0
  290. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/location.py +0 -0
  291. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/models.py +0 -0
  292. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/store.py +0 -0
  293. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_config.py +0 -0
  294. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_details.py +0 -0
  295. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_finding_details.py +0 -0
  296. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_findings.py +0 -0
  297. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_insights.py +0 -0
  298. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_measures.py +0 -0
  299. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_overview.py +0 -0
  300. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_plan.py +0 -0
  301. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_preview.py +0 -0
  302. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_relations.py +0 -0
  303. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_schema.py +0 -0
  304. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_sections.py +0 -0
  305. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_signals.py +0 -0
  306. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_views.py +0 -0
  307. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/result_model.py +0 -0
  308. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/sample_page.py +0 -0
  309. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/sampling.py +0 -0
  310. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/sampling_service.py +0 -0
  311. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scan_document.py +0 -0
  312. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scan_page.py +0 -0
  313. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scan_reuse.py +0 -0
  314. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scan_service.py +0 -0
  315. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/__init__.py +0 -0
  316. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/api.py +0 -0
  317. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/bottomk.py +0 -0
  318. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/cases.py +0 -0
  319. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/charactermap.py +0 -0
  320. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/characters.py +0 -0
  321. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/__init__.py +0 -0
  322. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/candidates.py +0 -0
  323. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/catalog.py +0 -0
  324. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/models.py +0 -0
  325. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/names.py +0 -0
  326. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/rules.py +0 -0
  327. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/config.py +0 -0
  328. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/convention_rule.py +0 -0
  329. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/correlation_ratio.py +0 -0
  330. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/crosstab.py +0 -0
  331. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/__init__.py +0 -0
  332. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/amount.py +0 -0
  333. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/base.py +0 -0
  334. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/boolean.py +0 -0
  335. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/currency.py +0 -0
  336. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/email.py +0 -0
  337. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/enumeration.py +0 -0
  338. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/ip.py +0 -0
  339. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/keys.py +0 -0
  340. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/names.py +0 -0
  341. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/number.py +0 -0
  342. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/pattern.py +0 -0
  343. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/percentage.py +0 -0
  344. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/phone.py +0 -0
  345. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/postal.py +0 -0
  346. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/quantity.py +0 -0
  347. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/registry.py +0 -0
  348. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/shape.py +0 -0
  349. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/temporal.py +0 -0
  350. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/url.py +0 -0
  351. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/uuid.py +0 -0
  352. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/diagnostics.py +0 -0
  353. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/engine.py +0 -0
  354. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/exposure.py +0 -0
  355. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/features.py +0 -0
  356. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/field.py +0 -0
  357. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/identity.py +0 -0
  358. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/lengthsample.py +0 -0
  359. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/longtext.py +0 -0
  360. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/measures.py +0 -0
  361. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/memory.py +0 -0
  362. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/models.py +0 -0
  363. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/normalization.py +0 -0
  364. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/observations.py +0 -0
  365. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/paths.py +0 -0
  366. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/pattern_eligibility.py +0 -0
  367. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/patternfacets.py +0 -0
  368. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/patterninfer.py +0 -0
  369. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/patterntree.py +0 -0
  370. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/pearson.py +0 -0
  371. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/__init__.py +0 -0
  372. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/characters.py +0 -0
  373. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/crosstab.py +0 -0
  374. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/date_order.py +0 -0
  375. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/drift.py +0 -0
  376. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/duplicates.py +0 -0
  377. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/forms.py +0 -0
  378. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/frequencies.py +0 -0
  379. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/histogram.py +0 -0
  380. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/lengths.py +0 -0
  381. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/matrix.py +0 -0
  382. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/measures.py +0 -0
  383. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/parts.py +0 -0
  384. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/patterns.py +0 -0
  385. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/pearson.py +0 -0
  386. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/residuals.py +0 -0
  387. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/shape.py +0 -0
  388. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/stats.py +0 -0
  389. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/structure.py +0 -0
  390. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/temporal.py +0 -0
  391. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/texts.py +0 -0
  392. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/categorystats.py +0 -0
  393. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/crosstabs.py +0 -0
  394. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/identifiers.py +0 -0
  395. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/models.py +0 -0
  396. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/orders.py +0 -0
  397. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/registry.py +0 -0
  398. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/relations.py +0 -0
  399. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/render.py +0 -0
  400. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/samplerows.py +0 -0
  401. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/stratification.py +0 -0
  402. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/stratmodels.py +0 -0
  403. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/process.py +0 -0
  404. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/quality.py +0 -0
  405. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/rankcorr.py +0 -0
  406. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/__init__.py +0 -0
  407. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/base.py +0 -0
  408. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/csv_reader.py +0 -0
  409. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/excel_common.py +0 -0
  410. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/excel_reader.py +0 -0
  411. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/excel_table.py +0 -0
  412. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/factory.py +0 -0
  413. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/json_common.py +0 -0
  414. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/json_reader.py +0 -0
  415. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/jsonl_reader.py +0 -0
  416. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/records.py +0 -0
  417. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/rowsample.py +0 -0
  418. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/schema.py +0 -0
  419. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/__init__.py +0 -0
  420. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/accumulators.py +0 -0
  421. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/bins.py +0 -0
  422. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/boundaries.py +0 -0
  423. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/characters.py +0 -0
  424. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/crosstab.py +0 -0
  425. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/document.py +0 -0
  426. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/drift.py +0 -0
  427. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/duplicates.py +0 -0
  428. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/exactset.py +0 -0
  429. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/forms.py +0 -0
  430. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/frequencies.py +0 -0
  431. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/matrix.py +0 -0
  432. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/measures.py +0 -0
  433. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/orders.py +0 -0
  434. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/parallel.py +0 -0
  435. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/parts.py +0 -0
  436. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/patternreader.py +0 -0
  437. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/patterns.py +0 -0
  438. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/pearson.py +0 -0
  439. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/periods.py +0 -0
  440. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/ranks.py +0 -0
  441. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/replay.py +0 -0
  442. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/residuals.py +0 -0
  443. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/schema.py +0 -0
  444. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/shape.py +0 -0
  445. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/stats.py +0 -0
  446. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/structure.py +0 -0
  447. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/texts.py +0 -0
  448. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/__init__.py +0 -0
  449. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/bins.py +0 -0
  450. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/estimate.py +0 -0
  451. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/evaluate.py +0 -0
  452. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/execute.py +0 -0
  453. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/models.py +0 -0
  454. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/near.py +0 -0
  455. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/plan.py +0 -0
  456. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/reasons.py +0 -0
  457. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/render.py +0 -0
  458. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/result.py +0 -0
  459. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/select.py +0 -0
  460. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/targets.py +0 -0
  461. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/weights.py +0 -0
  462. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/stratify.py +0 -0
  463. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/structure.py +0 -0
  464. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/technical.py +0 -0
  465. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/validation.py +0 -0
  466. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/values.py +0 -0
  467. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/valuesample.py +0 -0
  468. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/workers.py +0 -0
  469. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.dedup.batch.schema.json +0 -0
  470. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.dedup.schema.json +0 -0
  471. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.sample.schema.json +0 -0
  472. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.scan.schema.json +0 -0
  473. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/shared_scan_service.py +0 -0
  474. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/smart_service.py +0 -0
  475. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/source_guard.py +0 -0
  476. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/static/report.js +0 -0
  477. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/characters.html +0 -0
  478. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/insights.html +0 -0
  479. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/patterns.html +0 -0
  480. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/sample.html +0 -0
  481. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/dependency_links.txt +0 -0
  482. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/entry_points.txt +0 -0
  483. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/requires.txt +0 -0
  484. {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/top_level.txt +0 -0
  485. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_all_collections.py +0 -0
  486. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_cli.py +0 -0
  487. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_csv_records.py +0 -0
  488. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_examples_index.py +0 -0
  489. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_examples_layout.py +0 -0
  490. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate.py +0 -0
  491. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_anomalies.py +0 -0
  492. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_anomalies_regression.py +0 -0
  493. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_catalog.py +0 -0
  494. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_components.py +0 -0
  495. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_derivations.py +0 -0
  496. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_hierarchy.py +0 -0
  497. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_output.py +0 -0
  498. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_service.py +0 -0
  499. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_crm.py +0 -0
  500. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_crm_package.py +0 -0
  501. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_insurance.py +0 -0
  502. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_insurance_stress.py +0 -0
  503. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_lot4.py +0 -0
  504. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_package.py +0 -0
  505. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_references.py +0 -0
  506. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_selection.py +0 -0
  507. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_json_text.py +0 -0
  508. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_license_headers.py +0 -0
  509. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_make_datasets.py +0 -0
  510. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_option_notices.py +0 -0
  511. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_cache.py +0 -0
  512. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_database.py +0 -0
  513. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_generations.py +0 -0
  514. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_identity.py +0 -0
  515. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_index.py +0 -0
  516. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_location.py +0 -0
  517. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_open_service.py +0 -0
  518. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_queries.py +0 -0
  519. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_rescan.py +0 -0
  520. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_scan.py +0 -0
  521. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_scan_model.py +0 -0
  522. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_sessions.py +0 -0
  523. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_store.py +0 -0
  524. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_public_api.py +0 -0
  525. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_report_contrast.py +0 -0
  526. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_reporting.py +0 -0
  527. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_sampling.py +0 -0
  528. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scan_command.py +0 -0
  529. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_amounts.py +0 -0
  530. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_batches.py +0 -0
  531. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_config.py +0 -0
  532. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_csv.py +0 -0
  533. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_email_url.py +0 -0
  534. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_exposure.py +0 -0
  535. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_paths.py +0 -0
  536. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_phone.py +0 -0
  537. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_postal.py +0 -0
  538. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_uuid_ip.py +0 -0
  539. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_shared_scan_cli.py +0 -0
  540. {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_source_freshness.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tabalyst
3
- Version: 0.7.1
3
+ Version: 0.7.2
4
4
  Summary: Open-source toolkit for understanding and working with unfamiliar data.
5
5
  Author: Gregory Borelli
6
6
  License-Expression: MPL-2.0
@@ -146,6 +146,12 @@ Details: [Tabalyst Report](https://docs.tabalyst.com/report/),
146
146
  - Dataset dimensions, missing cells, duplicates, and quality observations.
147
147
  - A family and a type for each column (identifier, text, date, boolean...),
148
148
  with the evidence behind them, and the technical type with its error rates.
149
+ - For an identifier column, whether the ID is unique across all rows and after
150
+ row deduplication: the repetitions that exact copies of whole rows explain
151
+ are told apart from those between distinct records, with the evidence (the
152
+ Scan, the second pass or a [Dedup](https://docs.tabalyst.com/dedup/) report),
153
+ the case of missing IDs, and a non-binding near-unique reading of the few
154
+ repetitions that remain.
149
155
  - A summary table with one row per column: its type, a sentence about its
150
156
  values, the missing share, its Errors and Issues with a preview of each, and
151
157
  its details; above it, the Column quality and Signals cards.
@@ -106,6 +106,12 @@ Details: [Tabalyst Report](https://docs.tabalyst.com/report/),
106
106
  - Dataset dimensions, missing cells, duplicates, and quality observations.
107
107
  - A family and a type for each column (identifier, text, date, boolean...),
108
108
  with the evidence behind them, and the technical type with its error rates.
109
+ - For an identifier column, whether the ID is unique across all rows and after
110
+ row deduplication: the repetitions that exact copies of whole rows explain
111
+ are told apart from those between distinct records, with the evidence (the
112
+ Scan, the second pass or a [Dedup](https://docs.tabalyst.com/dedup/) report),
113
+ the case of missing IDs, and a non-binding near-unique reading of the few
114
+ repetitions that remain.
109
115
  - A summary table with one row per column: its type, a sentence about its
110
116
  values, the missing share, its Errors and Issues with a preview of each, and
111
117
  its details; above it, the Column quality and Signals cards.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tabalyst"
7
- version = "0.7.1"
7
+ version = "0.7.2"
8
8
  description = "Open-source toolkit for understanding and working with unfamiliar data."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -80,6 +80,8 @@ markers = [
80
80
  "dedup_lot(name): Tabalyst Dedup implementation lot (plan 2026-10-22) that provides the tested behavior; skipped until the lot is enabled in tests/dedup/conftest.py",
81
81
  "dedup_t(*ids): requirement tests (T01 to T30 of the Dedup specification) that the test covers",
82
82
  "dedup_heavy: Dedup large-scale test, never run by default; select it with -m dedup_heavy",
83
+ "uid_lot(name): Unique ID plan (2026-10-23) lot that provides the tested behavior; skipped until the lot is enabled in tests/report/conftest.py",
84
+ "uid_t(*ids): requirement tests (T01 to T34 of the Unique ID specification) that the test covers",
83
85
  "shipped_exposure_default: the test reads the shipped default of scan.exposure.sensitive_values (show), not the masking default the suite runs with",
84
86
  ]
85
87
 
@@ -250,6 +250,18 @@ def report_command(
250
250
  ),
251
251
  ),
252
252
  ] = False,
253
+ dedup_report: Annotated[
254
+ Path | None,
255
+ typer.Option(
256
+ "--dedup-report",
257
+ help=(
258
+ "A Dedup report (.dedup.json), or the folder holding the one of each "
259
+ "source, that proves the copies of rows behind the uniqueness of "
260
+ "identifier columns. CSV sources only. Without it, the report beside "
261
+ "each source is tried."
262
+ ),
263
+ ),
264
+ ] = None,
253
265
  yes: Annotated[
254
266
  bool,
255
267
  typer.Option(
@@ -292,6 +304,7 @@ def report_command(
292
304
  all_collections=all_collections,
293
305
  deep=deep,
294
306
  confirm=confirm,
307
+ dedup_report=dedup_report,
295
308
  )
296
309
  except ConfirmationRequired as exc:
297
310
  if decisions and decisions[-1] is Decision.DECLINED:
@@ -118,6 +118,10 @@ class PresentationSettings(BaseModel):
118
118
  default_factory=ValueExamplesSettings
119
119
  )
120
120
  row_sample: RowSampleSettings = Field(default_factory=RowSampleSettings)
121
+ # A Dedup report (file) or the folder holding ``<source stem>.dedup.json``: the proof of
122
+ # the copies of rows behind ``identifier_uniqueness``. A CSV source only; the path is not
123
+ # stored in the Report, which names the file only.
124
+ dedup_report: str | None = None
121
125
 
122
126
 
123
127
  class OutputSettings(BaseModel):
@@ -349,6 +353,23 @@ class DuplicateSettings(BaseModel):
349
353
  records: bool = False
350
354
 
351
355
 
356
+ class CopySettings(BaseModel):
357
+ """The ceilings of the count of the extra copies of rows (design 20.40).
358
+
359
+ ``memory_mb`` is the accounted size of the table of distinct rows, ``disk_mb``
360
+ the estimated size of the temporary database that takes over when the table
361
+ passes it (``0`` forbids the disk), ``max_rows`` the records read. A count that
362
+ meets a ceiling stops and is ``limited``: its copies are a lower bound. All are
363
+ part of the key of a result, and none depends on a clock or a machine.
364
+ """
365
+
366
+ model_config = ConfigDict(extra="forbid", frozen=True)
367
+
368
+ memory_mb: int = Field(default=256, ge=1, le=1_048_576)
369
+ disk_mb: int = Field(default=2_048, ge=0, le=16_777_216)
370
+ max_rows: int = Field(default=10_000_000, ge=1)
371
+
372
+
352
373
  class PatternCountSettings(BaseModel):
353
374
  """How the validation of the patterns is bounded in memory (design 20.9).
354
375
 
@@ -520,6 +541,7 @@ class DeepSettings(BaseModel):
520
541
  patterns: PatternCountSettings = Field(default_factory=PatternCountSettings)
521
542
  residuals: ResidualSettings = Field(default_factory=ResidualSettings)
522
543
  duplicates: DuplicateSettings = Field(default_factory=DuplicateSettings)
544
+ copies: CopySettings = Field(default_factory=CopySettings)
523
545
  drift: DriftSettings = Field(default_factory=DriftSettings)
524
546
  date_order: DateOrderSettings = Field(default_factory=DateOrderSettings)
525
547
  missing: MissingSettings = Field(default_factory=MissingSettings)
@@ -123,7 +123,7 @@ def analyze_dedup(
123
123
  path = Path(source)
124
124
  started = time.perf_counter()
125
125
  before = stat_source(path)
126
- forward = _staged(on_progress)
126
+ forward = staged(on_progress)
127
127
  spilled_at: int | None = None
128
128
 
129
129
  def spilled(event: SpillEvent) -> None:
@@ -204,7 +204,7 @@ def source_changed_error(records_read: int) -> DedupInputError:
204
204
  )
205
205
 
206
206
 
207
- def _staged(callback: ProgressCallback | None) -> ProgressCallback | None:
207
+ def staged(callback: ProgressCallback | None) -> ProgressCallback | None:
208
208
  """Name the stage on every event that the pass emits."""
209
209
  if callback is None:
210
210
  return None
@@ -0,0 +1,14 @@
1
+ # This Source Code Form is subject to the terms of the Mozilla Public
2
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+
5
+ """The versions of the counts of the copies of rows, apart from the engine so the planner can read them."""
6
+
7
+ # Changes with any change of what the count means (identity, ceilings, order of the checks). The
8
+ # analyzer ``duplicate_rows_count`` takes it as its version, so stored results of an older count
9
+ # are stale (Unique ID lot 8, cahier 12.5).
10
+ CALCULATION_VERSION = 1
11
+
12
+ # The same for the light count of the copies of the rows that have no ID (``missing_id_copies``,
13
+ # Unique ID lot 10): what it counts, the identity of the rows, the order of the checks.
14
+ MISSING_CALCULATION_VERSION = 1
@@ -0,0 +1,321 @@
1
+ # This Source Code Form is subject to the terms of the Mozilla Public
2
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+
5
+ """Count-only modes of Dedup: the exact count of the extra copies of rows, whole or among the rows
6
+ without an ID, with ceilings and no output."""
7
+
8
+ import time
9
+ from collections.abc import Callable
10
+ from dataclasses import dataclass
11
+ from pathlib import Path
12
+ from typing import Literal
13
+
14
+ from tabalyst.config import CsvConfig
15
+ from tabalyst.csv_records import CsvRecordError, open_records
16
+ from tabalyst.dedup.analysis import (
17
+ source_changed_error,
18
+ staged,
19
+ stat_differs,
20
+ stat_source,
21
+ )
22
+ from tabalyst.dedup.calculation import CALCULATION_VERSION, MISSING_CALCULATION_VERSION
23
+ from tabalyst.dedup.diskstore import MIB
24
+ from tabalyst.dedup.failures import DedupInputError
25
+ from tabalyst.dedup.groups import GroupCounters
26
+ from tabalyst.dedup.identity import IDENTITY, canonical_key
27
+ from tabalyst.dedup.settings import require_positive_int
28
+ from tabalyst.dedup.store import ExactRowStore, MemoryRowStore
29
+ from tabalyst.dedup.tiered import TieredRowStore, estimate_disk_bytes
30
+ from tabalyst.errors import ConfigurationError
31
+ from tabalyst.progress import ProgressCallback, byte_progress
32
+
33
+ CopyStatus = Literal["exact", "limited"]
34
+ LimitReason = Literal["memory_budget", "disk_budget", "row_limit"]
35
+
36
+
37
+ @dataclass(frozen=True)
38
+ class CopyLimits:
39
+ """The ceilings of one count, all deterministic (they never depend on a clock).
40
+
41
+ ``memory_budget_mb`` is the accounted size of the table of distinct rows, as for
42
+ ``tabalyst dedup``. ``disk_budget_mb`` is the estimated size of the temporary
43
+ database that takes over when the table passes it; ``0`` forbids the disk, so the
44
+ count stops at the memory budget. ``max_rows`` is the number of records read.
45
+ """
46
+
47
+ max_rows: int
48
+ memory_budget_mb: int
49
+ disk_budget_mb: int
50
+ temp_dir: Path | None = None
51
+
52
+
53
+ @dataclass(frozen=True)
54
+ class CopyCount:
55
+ """What a count-only run proves about the rows of a CSV file.
56
+
57
+ ``exact`` counts every record of the file. ``limited`` stopped at a ceiling after
58
+ ``records_read`` records: ``extra_copies`` and ``duplicate_groups`` are then lower
59
+ bounds of the file's, ``distinct_rows`` is the number of distinct rows among the
60
+ records read. ``content_sha256`` is the digest of the whole file and is only known
61
+ when the reading went to its end.
62
+ """
63
+
64
+ status: CopyStatus
65
+ records_read: int
66
+ distinct_rows: int
67
+ extra_copies: int
68
+ duplicate_groups: int
69
+ reason: LimitReason | None
70
+ content_sha256: str | None
71
+ bytes_read: int
72
+ storage_mode: str
73
+ seconds: float
74
+ identity: str = IDENTITY
75
+ calculation_version: int = CALCULATION_VERSION
76
+
77
+
78
+ @dataclass(frozen=True)
79
+ class IdColumn:
80
+ """A column whose absent cells the light count follows: ``key`` names it for the caller and
81
+ ``index`` is its 0-based position in a record."""
82
+
83
+ key: str
84
+ index: int
85
+
86
+
87
+ @dataclass(frozen=True)
88
+ class ColumnCopies:
89
+ """The rows of a file whose cell in one column is absent: how many records, how many of them
90
+ are distinct rows and how many repeat an earlier row (``E_missing``, lower bounds when the
91
+ count stopped)."""
92
+
93
+ key: str
94
+ rows_without_id: int
95
+ distinct_rows_without_id: int
96
+ extra_copies_without_id: int
97
+
98
+
99
+ @dataclass(frozen=True)
100
+ class MissingCopyCount:
101
+ """What a light count proves about the copies of the rows that have no ID.
102
+
103
+ The shape of ``CopyCount``: ``exact`` read the whole file (``content_sha256`` is then its
104
+ digest), ``limited`` stopped at a ceiling after ``records_read`` records and every figure of
105
+ ``columns`` is a lower bound.
106
+ """
107
+
108
+ status: CopyStatus
109
+ records_read: int
110
+ columns: tuple[ColumnCopies, ...]
111
+ reason: LimitReason | None
112
+ content_sha256: str | None
113
+ bytes_read: int
114
+ storage_mode: str
115
+ seconds: float
116
+ identity: str = IDENTITY
117
+ calculation_version: int = MISSING_CALCULATION_VERSION
118
+
119
+
120
+ @dataclass(frozen=True)
121
+ class _Reading:
122
+ """How a reading of the rows ended, whatever it counted."""
123
+
124
+ read: int
125
+ reason: LimitReason | None
126
+ digest: str | None
127
+ bytes_read: int
128
+ storage_mode: str
129
+
130
+
131
+ def _check_limits(limits: CopyLimits) -> None:
132
+ require_positive_int("max_rows", limits.max_rows)
133
+ require_positive_int("memory_budget_mb", limits.memory_budget_mb)
134
+ if limits.disk_budget_mb < 0:
135
+ raise ConfigurationError("disk_budget_mb must be 0 or more.")
136
+
137
+
138
+ def _read(
139
+ path: Path,
140
+ csv: CsvConfig,
141
+ limits: CopyLimits,
142
+ on_progress: ProgressCallback | None,
143
+ observe: Callable[[list[str], int, ExactRowStore], int | None],
144
+ ) -> _Reading:
145
+ """Read ``path`` once and hand each record to ``observe``, within the ceilings.
146
+
147
+ ``observe`` returns the length of the key of a row it added to the store (a distinct row), or
148
+ ``None`` when it added none. The reading stops at the first ceiling; the temporary database,
149
+ if any, is deleted whatever happens. Raises ``DedupInputError`` as ``count_extra_copies``.
150
+ """
151
+ before = stat_source(path)
152
+ forward = staged(on_progress)
153
+ memory_bytes = limits.memory_budget_mb * MIB
154
+ disk_bytes = limits.disk_budget_mb * MIB
155
+ store: ExactRowStore
156
+ if disk_bytes:
157
+ store = TieredRowStore(memory_bytes, limits.temp_dir)
158
+ else:
159
+ store = MemoryRowStore()
160
+ key_bytes = 0
161
+ distinct = 0
162
+ read = 0
163
+ reason: LimitReason | None = None
164
+ digest: str | None = None
165
+ try:
166
+ with open_records(
167
+ path,
168
+ csv,
169
+ hash_content=True,
170
+ on_bytes=byte_progress(forward, path, before.st_size),
171
+ ) as records:
172
+ for position, row in enumerate(records):
173
+ if position >= limits.max_rows:
174
+ reason = "row_limit"
175
+ break
176
+ read = position + 1
177
+ added = observe(row, position, store)
178
+ if added is None:
179
+ continue
180
+ key_bytes += added
181
+ distinct += 1
182
+ if isinstance(store, MemoryRowStore):
183
+ if store.accounted_bytes > memory_bytes:
184
+ reason = "memory_budget"
185
+ break
186
+ elif store.storage_mode == "disk" and (
187
+ estimate_disk_bytes(key_bytes, distinct) > disk_bytes
188
+ ):
189
+ reason = "disk_budget"
190
+ break
191
+ if reason is None:
192
+ digest = records.content_digest()
193
+ bytes_read = records.bytes_read
194
+ storage_mode = store.storage_mode
195
+ except CsvRecordError as exc:
196
+ # A file rewritten during the read often looks malformed: say what changed.
197
+ if stat_differs(before, stat_source(path)):
198
+ raise source_changed_error(exc.records_read) from exc
199
+ message = (
200
+ "The source cannot be opened or read."
201
+ if exc.kind == "source_unreadable"
202
+ else str(exc)
203
+ )
204
+ raise DedupInputError(
205
+ message, reason=exc.kind, records_read=exc.records_read
206
+ ) from exc
207
+ finally:
208
+ store.close()
209
+ if stat_differs(before, stat_source(path)) or (
210
+ reason is None and bytes_read != before.st_size
211
+ ):
212
+ raise source_changed_error(read)
213
+ return _Reading(read, reason, digest, bytes_read, storage_mode)
214
+
215
+
216
+ def count_extra_copies(
217
+ source: str | Path,
218
+ *,
219
+ csv: CsvConfig,
220
+ limits: CopyLimits,
221
+ on_progress: ProgressCallback | None = None,
222
+ ) -> CopyCount:
223
+ """Read ``source`` once and count its extra copies of rows, writing nothing.
224
+
225
+ The rows are compared as ``tabalyst dedup`` compares them (``full_decoded_csv_row_v1``,
226
+ whole and without normalization), so an ``exact`` result equals ``extra_copies`` of
227
+ ``dedup_csv``. The ceilings stop the reading cleanly: the copies met so far are a lower
228
+ bound, never a count. The temporary database, if any, is deleted whatever happens and
229
+ no other file is created.
230
+
231
+ Raises ``DedupInputError`` for an unreadable or malformed source (``invalid_csv``,
232
+ ``encoding_error``, ``source_unreadable``) and for a source whose size or time changed
233
+ during the reading (``source_changed``); ``DedupReportError`` for a storage failure.
234
+ ``ConfigurationError`` if a ceiling is below its minimum.
235
+ """
236
+ _check_limits(limits)
237
+ path = Path(source)
238
+ started = time.perf_counter()
239
+ counters = GroupCounters()
240
+
241
+ def observe(row: list[str], position: int, store: ExactRowStore) -> int | None:
242
+ key = canonical_key(row)
243
+ occurrence = store.observe(key, position)
244
+ counters.update(occurrence.count)
245
+ return len(key) if occurrence.count == 1 else None
246
+
247
+ reading = _read(path, csv, limits, on_progress, observe)
248
+ stats = counters.stats()
249
+ stats.check()
250
+ return CopyCount(
251
+ status="exact" if reading.reason is None else "limited",
252
+ records_read=stats.total,
253
+ distinct_rows=stats.distinct,
254
+ extra_copies=stats.extra_copies,
255
+ duplicate_groups=stats.duplicate_groups,
256
+ reason=reading.reason,
257
+ content_sha256=reading.digest,
258
+ bytes_read=reading.bytes_read,
259
+ storage_mode=reading.storage_mode,
260
+ seconds=time.perf_counter() - started,
261
+ )
262
+
263
+
264
+ def count_missing_id_copies(
265
+ source: str | Path,
266
+ *,
267
+ csv: CsvConfig,
268
+ limits: CopyLimits,
269
+ columns: tuple[IdColumn, ...],
270
+ is_present: Callable[[str], bool],
271
+ on_progress: ProgressCallback | None = None,
272
+ ) -> MissingCopyCount:
273
+ """Read ``source`` once and count, per column, the copies of the rows whose cell is absent.
274
+
275
+ ``is_present`` says whether a cell holds a value (the caller gives the Scan's definition).
276
+ Only the rows that lack a value in at least one of ``columns`` are keyed and stored, so the
277
+ table follows the number of such rows and not the size of the file; every other row costs
278
+ its reading alone. A copy of a row repeats the whole row, so the absence of a value is the
279
+ same in all of its copies and ``extra_copies_without_id`` of a column is exactly the copies
280
+ of the rows that lack its value (``E_missing``). Rows are compared as in
281
+ ``count_extra_copies``. The ceilings, the files and the errors are those of that function.
282
+ """
283
+ _check_limits(limits)
284
+ if not columns:
285
+ raise ConfigurationError("count_missing_id_copies needs at least one column.")
286
+ path = Path(source)
287
+ started = time.perf_counter()
288
+ rows = [0] * len(columns)
289
+ distinct = [0] * len(columns)
290
+ extra = [0] * len(columns)
291
+ indexes = [column.index for column in columns]
292
+
293
+ def observe(row: list[str], position: int, store: ExactRowStore) -> int | None:
294
+ absent = [n for n, index in enumerate(indexes) if not is_present(row[index])]
295
+ if not absent:
296
+ return None
297
+ key = canonical_key(row)
298
+ occurrence = store.observe(key, position)
299
+ first = occurrence.count == 1
300
+ for n in absent:
301
+ rows[n] += 1
302
+ if first:
303
+ distinct[n] += 1
304
+ else:
305
+ extra[n] += 1
306
+ return len(key) if first else None
307
+
308
+ reading = _read(path, csv, limits, on_progress, observe)
309
+ return MissingCopyCount(
310
+ status="exact" if reading.reason is None else "limited",
311
+ records_read=reading.read,
312
+ columns=tuple(
313
+ ColumnCopies(column.key, rows[n], distinct[n], extra[n])
314
+ for n, column in enumerate(columns)
315
+ ),
316
+ reason=reading.reason,
317
+ content_sha256=reading.digest,
318
+ bytes_read=reading.bytes_read,
319
+ storage_mode=reading.storage_mode,
320
+ seconds=time.perf_counter() - started,
321
+ )
@@ -0,0 +1,33 @@
1
+ # This Source Code Form is subject to the terms of the Mozilla Public
2
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+
5
+ """Identifier uniqueness: separate ID repetitions explained by copied rows from residual ones."""
6
+
7
+ from tabalyst.identifier_uniqueness.models import (
8
+ NEAR_UNIQUE_VERSION,
9
+ RULE_VERSION,
10
+ DedupReportRef,
11
+ DistinctEvidence,
12
+ DuplicateEvidence,
13
+ IdentifierUniqueness,
14
+ NearUnique,
15
+ RejectedProof,
16
+ UniquenessFacts,
17
+ )
18
+ from tabalyst.identifier_uniqueness.near_unique import assess_near_unique
19
+ from tabalyst.identifier_uniqueness.rule import assess_identifier_uniqueness
20
+
21
+ __all__ = [
22
+ "NEAR_UNIQUE_VERSION",
23
+ "RULE_VERSION",
24
+ "DedupReportRef",
25
+ "DistinctEvidence",
26
+ "DuplicateEvidence",
27
+ "IdentifierUniqueness",
28
+ "NearUnique",
29
+ "RejectedProof",
30
+ "UniquenessFacts",
31
+ "assess_identifier_uniqueness",
32
+ "assess_near_unique",
33
+ ]