tabalyst 0.6.1__tar.gz → 0.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. tabalyst-0.7.0/MANIFEST.in +14 -0
  2. tabalyst-0.7.0/PKG-INFO +351 -0
  3. tabalyst-0.7.0/README.md +311 -0
  4. tabalyst-0.7.0/examples/README.md +232 -0
  5. tabalyst-0.7.0/examples/config.json +89 -0
  6. tabalyst-0.7.0/examples/generate/README.md +28 -0
  7. tabalyst-0.7.0/examples/generate/cohorts-anomalies/catalog.yaml +1 -0
  8. tabalyst-0.7.0/examples/generate/cohorts-anomalies/dataset.yaml +45 -0
  9. tabalyst-0.7.0/examples/generate/cohorts-anomalies/schemas/accounts.yaml +6 -0
  10. tabalyst-0.7.0/examples/generate/cohorts-anomalies/schemas/contacts.yaml +22 -0
  11. tabalyst-0.7.0/examples/generate/common-references/catalog.yaml +1 -0
  12. tabalyst-0.7.0/examples/generate/common-references/dataset.yaml +14 -0
  13. tabalyst-0.7.0/examples/generate/common-references/schemas/contacts.yaml +113 -0
  14. tabalyst-0.7.0/examples/generate/generate_examples.py +86 -0
  15. {tabalyst-0.6.1 → tabalyst-0.7.0}/pyproject.toml +15 -2
  16. tabalyst-0.7.0/src/tabalyst/__init__.py +189 -0
  17. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/cli/app.py +2 -0
  18. tabalyst-0.7.0/src/tabalyst/cli/confirm.py +59 -0
  19. tabalyst-0.7.0/src/tabalyst/cli/generate.py +106 -0
  20. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/cli/report.py +78 -5
  21. tabalyst-0.7.0/src/tabalyst/cli/sample.py +336 -0
  22. tabalyst-0.7.0/src/tabalyst/cli/scan.py +607 -0
  23. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/cli/terminal.py +18 -0
  24. tabalyst-0.7.0/src/tabalyst/config.py +855 -0
  25. tabalyst-0.7.0/src/tabalyst/deep_service.py +326 -0
  26. tabalyst-0.7.0/src/tabalyst/deep_store.py +71 -0
  27. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/execution_log.py +3 -3
  28. tabalyst-0.7.0/src/tabalyst/generate_anomalies.py +516 -0
  29. tabalyst-0.7.0/src/tabalyst/generate_columns_package.py +106 -0
  30. tabalyst-0.7.0/src/tabalyst/generate_computer.py +315 -0
  31. tabalyst-0.7.0/src/tabalyst/generate_computer_output.py +294 -0
  32. tabalyst-0.7.0/src/tabalyst/generate_csv.py +34 -0
  33. tabalyst-0.7.0/src/tabalyst/generate_definition.py +581 -0
  34. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/SOURCES.md +88 -0
  35. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/catalog.yaml +50 -0
  36. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/brand.csv +23 -0
  37. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/color.csv +16 -0
  38. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/computer_type.csv +7 -0
  39. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/computer_type_form_factor.csv +16 -0
  40. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/computer_type_product_segment.csv +44 -0
  41. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/cpu.csv +18 -0
  42. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/cpu_memory_weight.csv +74 -0
  43. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/cpu_operating_system.csv +89 -0
  44. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/display.csv +36 -0
  45. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/extended_specs.csv +105 -0
  46. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/form_factor.csv +14 -0
  47. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_color.csv +98 -0
  48. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_cpu.csv +93 -0
  49. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_display.csv +91 -0
  50. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_gpu.csv +100 -0
  51. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_memory.csv +106 -0
  52. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_operating_system.csv +100 -0
  53. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_profile.csv +10 -0
  54. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_profile_computer_type.csv +25 -0
  55. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_profile_segment.csv +27 -0
  56. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/generation_storage.csv +117 -0
  57. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/gpu.csv +48 -0
  58. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/gpu_display.csv +212 -0
  59. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/gpu_memory_weight.csv +222 -0
  60. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/gpu_storage_weight.csv +156 -0
  61. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/memory.csv +47 -0
  62. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/model_form_factor.csv +70 -0
  63. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/model_generation.csv +75 -0
  64. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/operating_system.csv +13 -0
  65. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_category.csv +9 -0
  66. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_family.csv +58 -0
  67. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_family_computer_type.csv +74 -0
  68. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_family_product_segment.csv +148 -0
  69. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_model.csv +70 -0
  70. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_segment.csv +11 -0
  71. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_segment_brand.csv +102 -0
  72. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_segment_display_weight.csv +202 -0
  73. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_segment_memory_weight.csv +185 -0
  74. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_segment_storage_weight.csv +73 -0
  75. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/product_subcategory.csv +20 -0
  76. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/profile_exclusions.csv +110 -0
  77. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/promotion_status.csv +6 -0
  78. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/promotion_type.csv +12 -0
  79. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/seller.csv +52 -0
  80. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/seller_type.csv +7 -0
  81. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/shipping_availability.csv +6 -0
  82. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/standard_specs.csv +105 -0
  83. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/storage.csv +35 -0
  84. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/data/warehouse.csv +9 -0
  85. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/dataset.yaml +255 -0
  86. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/computer_type.yaml +6 -0
  87. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/computer_type_form_factor.yaml +5 -0
  88. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/computer_type_product_segment.yaml +5 -0
  89. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/computers.yaml +15 -0
  90. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/cpu.yaml +15 -0
  91. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/cpu_memory_weight.yaml +5 -0
  92. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/cpu_operating_system.yaml +4 -0
  93. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/display.yaml +15 -0
  94. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/extended_specs.yaml +22 -0
  95. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_color.yaml +5 -0
  96. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_cpu.yaml +5 -0
  97. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_display.yaml +5 -0
  98. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_gpu.yaml +5 -0
  99. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_memory.yaml +5 -0
  100. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_operating_system.yaml +5 -0
  101. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_profile.yaml +5 -0
  102. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_profile_computer_type.yaml +5 -0
  103. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_profile_segment.yaml +5 -0
  104. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/generation_storage.yaml +5 -0
  105. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/gpu.yaml +10 -0
  106. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/gpu_display.yaml +4 -0
  107. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/gpu_memory_weight.yaml +5 -0
  108. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/gpu_storage_weight.yaml +5 -0
  109. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/localized.yaml +5 -0
  110. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/memory.yaml +7 -0
  111. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/model_form_factor.yaml +5 -0
  112. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/model_generation.yaml +7 -0
  113. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/operating_system.yaml +6 -0
  114. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_family.yaml +6 -0
  115. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_family_computer_type.yaml +5 -0
  116. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_family_product_segment.yaml +5 -0
  117. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_model.yaml +6 -0
  118. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_segment.yaml +6 -0
  119. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_segment_brand.yaml +5 -0
  120. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_segment_display_weight.yaml +5 -0
  121. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_segment_memory_weight.yaml +5 -0
  122. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_segment_storage_weight.yaml +5 -0
  123. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/product_subcategory.yaml +6 -0
  124. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/profile_exclusions.yaml +8 -0
  125. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/seller.yaml +7 -0
  126. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/standard_specs.yaml +15 -0
  127. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/storage.yaml +7 -0
  128. tabalyst-0.7.0/src/tabalyst/generate_examples/computer/schemas/warehouse.yaml +6 -0
  129. tabalyst-0.7.0/src/tabalyst/generate_examples/crm/catalog.yaml +1 -0
  130. tabalyst-0.7.0/src/tabalyst/generate_examples/crm/dataset.yaml +76 -0
  131. tabalyst-0.7.0/src/tabalyst/generate_examples/crm/schemas/accounts.yaml +63 -0
  132. tabalyst-0.7.0/src/tabalyst/generate_examples/crm/schemas/contacts.yaml +219 -0
  133. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/SOURCES.md +23 -0
  134. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/catalog.yaml +29 -0
  135. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/data/agencies.csv +21 -0
  136. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/data/branch_contract_weights.csv +13 -0
  137. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/data/claim_statuses.csv +5 -0
  138. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/data/contract_statuses.csv +5 -0
  139. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/data/contract_types.csv +5 -0
  140. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/data/payment_frequencies.csv +5 -0
  141. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/data/payment_methods.csv +5 -0
  142. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/dataset.yaml +605 -0
  143. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/schemas/agencies.yaml +21 -0
  144. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/schemas/branch_contract_weights.yaml +14 -0
  145. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/schemas/claim_statuses.yaml +19 -0
  146. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/schemas/contract_statuses.yaml +15 -0
  147. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/schemas/contract_types.yaml +34 -0
  148. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/schemas/customers.yaml +232 -0
  149. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/schemas/payment_frequencies.yaml +17 -0
  150. tabalyst-0.7.0/src/tabalyst/generate_examples/insurance/schemas/payment_methods.yaml +12 -0
  151. tabalyst-0.7.0/src/tabalyst/generate_insurance.py +208 -0
  152. tabalyst-0.7.0/src/tabalyst/generate_package.py +600 -0
  153. tabalyst-0.7.0/src/tabalyst/generate_references.py +221 -0
  154. tabalyst-0.7.0/src/tabalyst/generate_resources/SOURCES.md +27 -0
  155. tabalyst-0.7.0/src/tabalyst/generate_resources/addresses/street_directions_ca.csv +9 -0
  156. tabalyst-0.7.0/src/tabalyst/generate_resources/addresses/street_names_ca.csv +109 -0
  157. tabalyst-0.7.0/src/tabalyst/generate_resources/addresses/street_types_ca.csv +32 -0
  158. tabalyst-0.7.0/src/tabalyst/generate_resources/addresses/unit_types_ca.csv +12 -0
  159. tabalyst-0.7.0/src/tabalyst/generate_resources/contact/email_patterns.csv +12 -0
  160. tabalyst-0.7.0/src/tabalyst/generate_resources/contact/email_providers_ca.csv +10 -0
  161. tabalyst-0.7.0/src/tabalyst/generate_resources/contact/phone_area_codes_ca.csv +14 -0
  162. tabalyst-0.7.0/src/tabalyst/generate_resources/geography/cities_ca.csv +72 -0
  163. tabalyst-0.7.0/src/tabalyst/generate_resources/geography/postal_prefixes_ca.csv +72 -0
  164. tabalyst-0.7.0/src/tabalyst/generate_resources/geography/provinces_ca.csv +14 -0
  165. tabalyst-0.7.0/src/tabalyst/generate_resources/people/family_names_ca.csv +136 -0
  166. tabalyst-0.7.0/src/tabalyst/generate_resources/people/first_names_en_ca.csv +81 -0
  167. tabalyst-0.7.0/src/tabalyst/generate_resources/people/first_names_fr_qc.csv +101 -0
  168. tabalyst-0.7.0/src/tabalyst/generate_selection.py +337 -0
  169. tabalyst-0.7.0/src/tabalyst/generate_service.py +772 -0
  170. tabalyst-0.7.0/src/tabalyst/generate_values.py +202 -0
  171. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/models.py +2 -2
  172. tabalyst-0.7.0/src/tabalyst/json_text.py +132 -0
  173. tabalyst-0.7.0/src/tabalyst/models.py +388 -0
  174. tabalyst-0.7.0/src/tabalyst/plan_service.py +180 -0
  175. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/progress.py +9 -0
  176. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_validation.py +8 -0
  177. tabalyst-0.7.0/src/tabalyst/report_chain.py +243 -0
  178. tabalyst-0.7.0/src/tabalyst/report_classification.py +155 -0
  179. tabalyst-0.7.0/src/tabalyst/report_column_page.py +181 -0
  180. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/report_config.py +38 -8
  181. tabalyst-0.7.0/src/tabalyst/report_deep.py +545 -0
  182. tabalyst-0.7.0/src/tabalyst/report_details.py +252 -0
  183. tabalyst-0.7.0/src/tabalyst/report_finding_details.py +502 -0
  184. tabalyst-0.7.0/src/tabalyst/report_findings.py +1039 -0
  185. tabalyst-0.7.0/src/tabalyst/report_insights.py +1565 -0
  186. tabalyst-0.7.0/src/tabalyst/report_labels.py +931 -0
  187. tabalyst-0.7.0/src/tabalyst/report_measures.py +217 -0
  188. tabalyst-0.7.0/src/tabalyst/report_overview.py +397 -0
  189. tabalyst-0.7.0/src/tabalyst/report_plan.py +72 -0
  190. tabalyst-0.7.0/src/tabalyst/report_preview.py +279 -0
  191. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/report_profile.py +330 -374
  192. tabalyst-0.7.0/src/tabalyst/report_relations.py +317 -0
  193. tabalyst-0.7.0/src/tabalyst/report_schema.py +36 -0
  194. tabalyst-0.7.0/src/tabalyst/report_sections.py +621 -0
  195. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/report_service.py +116 -45
  196. tabalyst-0.7.0/src/tabalyst/report_signals.py +193 -0
  197. tabalyst-0.7.0/src/tabalyst/report_summary.py +137 -0
  198. tabalyst-0.7.0/src/tabalyst/report_table.py +788 -0
  199. tabalyst-0.7.0/src/tabalyst/report_views.py +744 -0
  200. tabalyst-0.7.0/src/tabalyst/reporting.py +503 -0
  201. tabalyst-0.7.0/src/tabalyst/result_model.py +13 -0
  202. tabalyst-0.7.0/src/tabalyst/sample_page.py +54 -0
  203. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/sampling.py +159 -63
  204. tabalyst-0.7.0/src/tabalyst/sampling_service.py +237 -0
  205. tabalyst-0.7.0/src/tabalyst/scan_document.py +195 -0
  206. tabalyst-0.7.0/src/tabalyst/scan_page.py +68 -0
  207. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scan_reuse.py +58 -15
  208. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scan_service.py +78 -13
  209. tabalyst-0.7.0/src/tabalyst/scanner/__init__.py +43 -0
  210. tabalyst-0.7.0/src/tabalyst/scanner/api.py +370 -0
  211. tabalyst-0.7.0/src/tabalyst/scanner/bottomk.py +591 -0
  212. tabalyst-0.7.0/src/tabalyst/scanner/cases.py +357 -0
  213. tabalyst-0.7.0/src/tabalyst/scanner/charactermap.py +292 -0
  214. tabalyst-0.7.0/src/tabalyst/scanner/characters.py +432 -0
  215. tabalyst-0.7.0/src/tabalyst/scanner/classify/__init__.py +28 -0
  216. tabalyst-0.7.0/src/tabalyst/scanner/classify/candidates.py +192 -0
  217. tabalyst-0.7.0/src/tabalyst/scanner/classify/catalog.py +357 -0
  218. tabalyst-0.7.0/src/tabalyst/scanner/classify/identifiers.py +242 -0
  219. tabalyst-0.7.0/src/tabalyst/scanner/classify/models.py +90 -0
  220. tabalyst-0.7.0/src/tabalyst/scanner/classify/names.py +707 -0
  221. tabalyst-0.7.0/src/tabalyst/scanner/classify/rules.py +483 -0
  222. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/config.py +199 -7
  223. tabalyst-0.7.0/src/tabalyst/scanner/convention_rule.py +122 -0
  224. tabalyst-0.7.0/src/tabalyst/scanner/correlation_ratio.py +112 -0
  225. tabalyst-0.7.0/src/tabalyst/scanner/crosstab.py +197 -0
  226. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/amount.py +4 -0
  227. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/base.py +4 -3
  228. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/currency.py +19 -0
  229. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/email.py +38 -5
  230. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/ip.py +90 -0
  231. tabalyst-0.7.0/src/tabalyst/scanner/detectors/keys.py +130 -0
  232. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/percentage.py +13 -0
  233. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/phone.py +53 -3
  234. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/postal.py +19 -2
  235. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/quantity.py +18 -0
  236. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/registry.py +91 -5
  237. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/temporal.py +3 -2
  238. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/diagnostics.py +15 -2
  239. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/engine.py +71 -32
  240. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/exposure.py +11 -2
  241. tabalyst-0.7.0/src/tabalyst/scanner/features.py +368 -0
  242. tabalyst-0.7.0/src/tabalyst/scanner/identity.py +133 -0
  243. tabalyst-0.7.0/src/tabalyst/scanner/lengthsample.py +326 -0
  244. tabalyst-0.7.0/src/tabalyst/scanner/longtext.py +189 -0
  245. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/measures.py +190 -5
  246. tabalyst-0.7.0/src/tabalyst/scanner/memory.py +194 -0
  247. tabalyst-0.7.0/src/tabalyst/scanner/models.py +1763 -0
  248. tabalyst-0.7.0/src/tabalyst/scanner/pattern_eligibility.py +186 -0
  249. tabalyst-0.7.0/src/tabalyst/scanner/patternfacets.py +399 -0
  250. tabalyst-0.7.0/src/tabalyst/scanner/patterninfer.py +1379 -0
  251. tabalyst-0.7.0/src/tabalyst/scanner/patterntree.py +307 -0
  252. tabalyst-0.7.0/src/tabalyst/scanner/pearson.py +168 -0
  253. tabalyst-0.7.0/src/tabalyst/scanner/planner/__init__.py +56 -0
  254. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzer.py +267 -0
  255. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/__init__.py +56 -0
  256. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/characters.py +76 -0
  257. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/common.py +66 -0
  258. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/crosstab.py +220 -0
  259. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/date_order.py +152 -0
  260. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/distinct.py +117 -0
  261. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/drift.py +98 -0
  262. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/duplicates.py +259 -0
  263. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/forms.py +83 -0
  264. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/frequencies.py +91 -0
  265. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/histogram.py +110 -0
  266. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/lengths.py +66 -0
  267. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/matrix.py +59 -0
  268. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/measures.py +149 -0
  269. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/parts.py +106 -0
  270. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/patterns.py +135 -0
  271. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/pearson.py +195 -0
  272. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/residuals.py +194 -0
  273. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/shape.py +110 -0
  274. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/stats.py +192 -0
  275. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/structure.py +141 -0
  276. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/temporal.py +129 -0
  277. tabalyst-0.7.0/src/tabalyst/scanner/planner/analyzers/texts.py +137 -0
  278. tabalyst-0.7.0/src/tabalyst/scanner/planner/categorystats.py +309 -0
  279. tabalyst-0.7.0/src/tabalyst/scanner/planner/costmodel.py +440 -0
  280. tabalyst-0.7.0/src/tabalyst/scanner/planner/crosstabs.py +493 -0
  281. tabalyst-0.7.0/src/tabalyst/scanner/planner/facts.py +705 -0
  282. tabalyst-0.7.0/src/tabalyst/scanner/planner/identifiers.py +41 -0
  283. tabalyst-0.7.0/src/tabalyst/scanner/planner/models.py +489 -0
  284. tabalyst-0.7.0/src/tabalyst/scanner/planner/orders.py +258 -0
  285. tabalyst-0.7.0/src/tabalyst/scanner/planner/planner.py +639 -0
  286. tabalyst-0.7.0/src/tabalyst/scanner/planner/reasons.py +167 -0
  287. tabalyst-0.7.0/src/tabalyst/scanner/planner/registry.py +64 -0
  288. tabalyst-0.7.0/src/tabalyst/scanner/planner/relations.py +319 -0
  289. tabalyst-0.7.0/src/tabalyst/scanner/planner/render.py +221 -0
  290. tabalyst-0.7.0/src/tabalyst/scanner/planner/samplerows.py +52 -0
  291. tabalyst-0.7.0/src/tabalyst/scanner/planner/secondpass.py +201 -0
  292. tabalyst-0.7.0/src/tabalyst/scanner/planner/stratification.py +374 -0
  293. tabalyst-0.7.0/src/tabalyst/scanner/planner/stratmodels.py +144 -0
  294. tabalyst-0.7.0/src/tabalyst/scanner/process.py +54 -0
  295. tabalyst-0.7.0/src/tabalyst/scanner/quality.py +621 -0
  296. tabalyst-0.7.0/src/tabalyst/scanner/rankcorr.py +172 -0
  297. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/readers/base.py +8 -0
  298. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/readers/csv_reader.py +47 -6
  299. tabalyst-0.7.0/src/tabalyst/scanner/readers/factory.py +33 -0
  300. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/records.py +40 -71
  301. tabalyst-0.7.0/src/tabalyst/scanner/rowsample.py +492 -0
  302. tabalyst-0.7.0/src/tabalyst/scanner/schema.py +65 -0
  303. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/__init__.py +44 -0
  304. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/accumulators.py +251 -0
  305. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/bins.py +225 -0
  306. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/boundaries.py +116 -0
  307. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/characters.py +50 -0
  308. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/crosstab.py +464 -0
  309. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/document.py +113 -0
  310. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/drift.py +210 -0
  311. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/duplicates.py +446 -0
  312. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/exactset.py +203 -0
  313. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/executor.py +1339 -0
  314. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/forms.py +202 -0
  315. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/frequencies.py +96 -0
  316. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/matrix.py +175 -0
  317. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/measures.py +644 -0
  318. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/models.py +1760 -0
  319. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/orders.py +259 -0
  320. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/parallel.py +333 -0
  321. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/parts.py +276 -0
  322. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/patternreader.py +597 -0
  323. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/patterns.py +436 -0
  324. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/pearson.py +230 -0
  325. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/periods.py +106 -0
  326. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/ranks.py +87 -0
  327. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/replay.py +427 -0
  328. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/residuals.py +454 -0
  329. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/routing.py +650 -0
  330. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/schema.py +38 -0
  331. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/shape.py +485 -0
  332. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/stats.py +306 -0
  333. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/structure.py +246 -0
  334. tabalyst-0.7.0/src/tabalyst/scanner/secondpass/texts.py +291 -0
  335. tabalyst-0.7.0/src/tabalyst/scanner/smart/__init__.py +22 -0
  336. tabalyst-0.7.0/src/tabalyst/scanner/smart/bins.py +35 -0
  337. tabalyst-0.7.0/src/tabalyst/scanner/smart/estimate.py +139 -0
  338. tabalyst-0.7.0/src/tabalyst/scanner/smart/evaluate.py +879 -0
  339. tabalyst-0.7.0/src/tabalyst/scanner/smart/execute.py +148 -0
  340. tabalyst-0.7.0/src/tabalyst/scanner/smart/models.py +314 -0
  341. tabalyst-0.7.0/src/tabalyst/scanner/smart/near.py +122 -0
  342. tabalyst-0.7.0/src/tabalyst/scanner/smart/plan.py +356 -0
  343. tabalyst-0.7.0/src/tabalyst/scanner/smart/reasons.py +88 -0
  344. tabalyst-0.7.0/src/tabalyst/scanner/smart/render.py +123 -0
  345. tabalyst-0.7.0/src/tabalyst/scanner/smart/result.py +440 -0
  346. tabalyst-0.7.0/src/tabalyst/scanner/smart/select.py +368 -0
  347. tabalyst-0.7.0/src/tabalyst/scanner/smart/targets.py +1049 -0
  348. tabalyst-0.7.0/src/tabalyst/scanner/smart/weights.py +62 -0
  349. tabalyst-0.7.0/src/tabalyst/scanner/stratify.py +80 -0
  350. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/structure.py +64 -28
  351. tabalyst-0.7.0/src/tabalyst/scanner/validation.py +1479 -0
  352. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/values.py +489 -85
  353. tabalyst-0.7.0/src/tabalyst/scanner/valuesample.py +619 -0
  354. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/workers.py +76 -19
  355. tabalyst-0.7.0/src/tabalyst/schemas/tabalyst.report.schema.json +18549 -0
  356. tabalyst-0.7.0/src/tabalyst/schemas/tabalyst.sample.schema.json +2097 -0
  357. tabalyst-0.7.0/src/tabalyst/schemas/tabalyst.scan.deep.schema.json +8632 -0
  358. tabalyst-0.7.0/src/tabalyst/schemas/tabalyst.scan.schema.json +7602 -0
  359. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/service.py +215 -69
  360. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/shared_scan_service.py +48 -6
  361. tabalyst-0.7.0/src/tabalyst/smart_service.py +352 -0
  362. tabalyst-0.7.0/src/tabalyst/source_guard.py +126 -0
  363. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/static/report.js +164 -19
  364. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/static/theme.css +470 -6
  365. tabalyst-0.7.0/src/tabalyst/summary_models.py +622 -0
  366. tabalyst-0.7.0/src/tabalyst/templates/characters.html +20 -0
  367. tabalyst-0.7.0/src/tabalyst/templates/column.html +182 -0
  368. tabalyst-0.7.0/src/tabalyst/templates/insights.html +9 -0
  369. tabalyst-0.7.0/src/tabalyst/templates/patterns.html +17 -0
  370. tabalyst-0.7.0/src/tabalyst/templates/report.html +167 -0
  371. tabalyst-0.7.0/src/tabalyst/templates/sample.html +83 -0
  372. tabalyst-0.7.0/src/tabalyst.egg-info/PKG-INFO +351 -0
  373. tabalyst-0.7.0/src/tabalyst.egg-info/SOURCES.txt +501 -0
  374. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst.egg-info/requires.txt +2 -0
  375. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_all_collections.py +2 -2
  376. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_cli.py +29 -14
  377. tabalyst-0.7.0/tests/test_examples_index.py +99 -0
  378. tabalyst-0.7.0/tests/test_examples_layout.py +165 -0
  379. tabalyst-0.7.0/tests/test_generate.py +347 -0
  380. tabalyst-0.7.0/tests/test_generate_anomalies.py +492 -0
  381. tabalyst-0.7.0/tests/test_generate_anomalies_regression.py +179 -0
  382. tabalyst-0.7.0/tests/test_generate_computer_catalog.py +148 -0
  383. tabalyst-0.7.0/tests/test_generate_computer_components.py +168 -0
  384. tabalyst-0.7.0/tests/test_generate_computer_derivations.py +254 -0
  385. tabalyst-0.7.0/tests/test_generate_computer_hierarchy.py +146 -0
  386. tabalyst-0.7.0/tests/test_generate_computer_output.py +302 -0
  387. tabalyst-0.7.0/tests/test_generate_computer_service.py +491 -0
  388. tabalyst-0.7.0/tests/test_generate_crm.py +51 -0
  389. tabalyst-0.7.0/tests/test_generate_crm_package.py +81 -0
  390. tabalyst-0.7.0/tests/test_generate_insurance.py +146 -0
  391. tabalyst-0.7.0/tests/test_generate_insurance_stress.py +183 -0
  392. tabalyst-0.7.0/tests/test_generate_lot4.py +120 -0
  393. tabalyst-0.7.0/tests/test_generate_package.py +337 -0
  394. tabalyst-0.7.0/tests/test_generate_references.py +122 -0
  395. tabalyst-0.7.0/tests/test_generate_selection.py +264 -0
  396. tabalyst-0.7.0/tests/test_json_text.py +139 -0
  397. tabalyst-0.7.0/tests/test_make_datasets.py +116 -0
  398. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_database.py +2 -2
  399. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_index.py +9 -3
  400. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_queries.py +1 -0
  401. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_scan.py +1 -2
  402. tabalyst-0.7.0/tests/test_project_scan_model.py +97 -0
  403. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_public_api.py +42 -3
  404. tabalyst-0.7.0/tests/test_report_contrast.py +132 -0
  405. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_reporting.py +29 -18
  406. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_sampling.py +33 -0
  407. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scan_command.py +26 -7
  408. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_config.py +43 -0
  409. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_csv.py +34 -1
  410. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_email_url.py +1 -1
  411. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_exposure.py +44 -7
  412. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_phone.py +4 -4
  413. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_postal.py +5 -5
  414. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_shared_scan_cli.py +1 -1
  415. tabalyst-0.6.1/MANIFEST.in +0 -5
  416. tabalyst-0.6.1/PKG-INFO +0 -543
  417. tabalyst-0.6.1/README.md +0 -505
  418. tabalyst-0.6.1/examples/README.md +0 -75
  419. tabalyst-0.6.1/examples/config.json +0 -60
  420. tabalyst-0.6.1/src/tabalyst/__init__.py +0 -44
  421. tabalyst-0.6.1/src/tabalyst/cli/sample.py +0 -136
  422. tabalyst-0.6.1/src/tabalyst/cli/scan.py +0 -214
  423. tabalyst-0.6.1/src/tabalyst/config.py +0 -266
  424. tabalyst-0.6.1/src/tabalyst/models.py +0 -429
  425. tabalyst-0.6.1/src/tabalyst/reporting.py +0 -199
  426. tabalyst-0.6.1/src/tabalyst/sampling_service.py +0 -137
  427. tabalyst-0.6.1/src/tabalyst/scanner/__init__.py +0 -16
  428. tabalyst-0.6.1/src/tabalyst/scanner/api.py +0 -211
  429. tabalyst-0.6.1/src/tabalyst/scanner/identity.py +0 -63
  430. tabalyst-0.6.1/src/tabalyst/scanner/models.py +0 -564
  431. tabalyst-0.6.1/src/tabalyst/templates/column.html +0 -66
  432. tabalyst-0.6.1/src/tabalyst/templates/report.html +0 -114
  433. tabalyst-0.6.1/src/tabalyst.egg-info/PKG-INFO +0 -543
  434. tabalyst-0.6.1/src/tabalyst.egg-info/SOURCES.txt +0 -165
  435. {tabalyst-0.6.1 → tabalyst-0.7.0}/LICENSE +0 -0
  436. {tabalyst-0.6.1/examples/input → tabalyst-0.7.0/examples/datasets}/basic.csv +0 -0
  437. {tabalyst-0.6.1/examples/input → tabalyst-0.7.0/examples/datasets}/insurance-customers.csv +0 -0
  438. {tabalyst-0.6.1 → tabalyst-0.7.0}/setup.cfg +0 -0
  439. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/__main__.py +0 -0
  440. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/_version.py +0 -0
  441. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/batch.py +0 -0
  442. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/cache_service.py +0 -0
  443. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/cli/__init__.py +0 -0
  444. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/cli/cache.py +0 -0
  445. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/cli/inspect.py +0 -0
  446. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/errors.py +0 -0
  447. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspect_service.py +0 -0
  448. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/__init__.py +0 -0
  449. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/choices.py +0 -0
  450. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/excel_inspect/__init__.py +0 -0
  451. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/excel_inspect/build.py +0 -0
  452. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/excel_inspect/detect.py +0 -0
  453. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/excel_inspect/parameters.py +0 -0
  454. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/json_inspect/__init__.py +0 -0
  455. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/json_inspect/build.py +0 -0
  456. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/json_inspect/detect.py +0 -0
  457. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/json_inspect/parameters.py +0 -0
  458. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/persistence.py +0 -0
  459. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/inspector/resolution.py +0 -0
  460. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/option_notices.py +0 -0
  461. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/project_open_service.py +0 -0
  462. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/project_scan_service.py +0 -0
  463. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/__init__.py +0 -0
  464. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_bounded_values.py +0 -0
  465. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_cache.py +0 -0
  466. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_codec.py +0 -0
  467. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_generation.py +0 -0
  468. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_locks.py +0 -0
  469. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_publication.py +0 -0
  470. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_queries.py +0 -0
  471. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_query_budget.py +0 -0
  472. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_recovery.py +0 -0
  473. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_retention.py +0 -0
  474. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_schema.py +0 -0
  475. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_session.py +0 -0
  476. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_staging.py +0 -0
  477. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/_sync.py +0 -0
  478. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/catalog.py +0 -0
  479. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/freshness.py +0 -0
  480. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/identity.py +0 -0
  481. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/index.py +0 -0
  482. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/location.py +0 -0
  483. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/models.py +0 -0
  484. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/projects/store.py +0 -0
  485. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/__init__.py +0 -0
  486. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/boolean.py +0 -0
  487. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/enumeration.py +0 -0
  488. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/names.py +0 -0
  489. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/number.py +0 -0
  490. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/pattern.py +0 -0
  491. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/shape.py +0 -0
  492. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/url.py +0 -0
  493. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/detectors/uuid.py +0 -0
  494. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/field.py +0 -0
  495. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/normalization.py +0 -0
  496. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/observations.py +0 -0
  497. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/paths.py +0 -0
  498. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/readers/__init__.py +0 -0
  499. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/readers/excel_common.py +0 -0
  500. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/readers/excel_reader.py +0 -0
  501. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/readers/excel_table.py +0 -0
  502. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/readers/json_common.py +0 -0
  503. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/readers/json_reader.py +0 -0
  504. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/readers/jsonl_reader.py +0 -0
  505. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst/scanner/technical.py +0 -0
  506. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst.egg-info/dependency_links.txt +0 -0
  507. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst.egg-info/entry_points.txt +0 -0
  508. {tabalyst-0.6.1 → tabalyst-0.7.0}/src/tabalyst.egg-info/top_level.txt +0 -0
  509. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_license_headers.py +0 -0
  510. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_option_notices.py +0 -0
  511. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_cache.py +0 -0
  512. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_generations.py +0 -0
  513. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_identity.py +0 -0
  514. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_location.py +0 -0
  515. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_open_service.py +0 -0
  516. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_rescan.py +0 -0
  517. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_sessions.py +0 -0
  518. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_project_store.py +0 -0
  519. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_amounts.py +0 -0
  520. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_batches.py +0 -0
  521. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_paths.py +0 -0
  522. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_scanner_uuid_ip.py +0 -0
  523. {tabalyst-0.6.1 → tabalyst-0.7.0}/tests/test_source_freshness.py +0 -0
@@ -0,0 +1,14 @@
1
+ include LICENSE
2
+ include README.md
3
+ include examples/README.md
4
+ include examples/config.json
5
+ recursive-include examples/datasets *.csv
6
+ include examples/generate/README.md
7
+ include examples/generate/generate_examples.py
8
+ recursive-include src/tabalyst/generate_examples/crm *.yaml
9
+ recursive-include src/tabalyst/generate_examples/insurance *.yaml *.csv *.md
10
+ recursive-include src/tabalyst/generate_examples/computer *.yaml *.csv *.md
11
+ exclude src/tabalyst/generate_examples/computer/data/csv_files.md
12
+ recursive-include examples/generate/common-references *.yaml
13
+ recursive-include examples/generate/cohorts-anomalies *.yaml
14
+ recursive-include src/tabalyst/generate_resources *.csv *.md
@@ -0,0 +1,351 @@
1
+ Metadata-Version: 2.4
2
+ Name: tabalyst
3
+ Version: 0.7.0
4
+ Summary: Open-source toolkit for understanding and working with unfamiliar data.
5
+ Author: Gregory Borelli
6
+ License-Expression: MPL-2.0
7
+ Project-URL: Homepage, https://github.com/loribel-labs/tabalyst
8
+ Project-URL: Repository, https://github.com/loribel-labs/tabalyst.git
9
+ Project-URL: Issues, https://github.com/loribel-labs/tabalyst/issues
10
+ Keywords: csv,data-analysis,data-profiling,data-quality,eda,html-report,json
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
21
+ Requires-Python: >=3.11
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: duckdb==1.5.5
25
+ Requires-Dist: ijson>=3.3
26
+ Requires-Dist: jinja2>=3.1
27
+ Requires-Dist: platformdirs>=4
28
+ Requires-Dist: pydantic>=2.11
29
+ Requires-Dist: python-calamine>=0.8
30
+ Requires-Dist: PyYAML>=6.0
31
+ Requires-Dist: typer>=0.12
32
+ Provides-Extra: dev
33
+ Requires-Dist: build>=1.2; extra == "dev"
34
+ Requires-Dist: jsonschema>=4; extra == "dev"
35
+ Requires-Dist: pytest>=8; extra == "dev"
36
+ Requires-Dist: pytest-cov>=6; extra == "dev"
37
+ Requires-Dist: ruff>=0.11; extra == "dev"
38
+ Requires-Dist: xlsxwriter>=3; extra == "dev"
39
+ Dynamic: license-file
40
+
41
+ # Tabalyst
42
+
43
+ **Open-source Python toolkit for data profiling and data quality analysis.**
44
+
45
+ *Tools for unfamiliar data.*
46
+
47
+ Tabalyst helps you understand CSV, Excel, JSON and JSONL datasets with minimal
48
+ configuration. Detect missing values, duplicates, mixed types, data formats and
49
+ quality issues. Generate interactive HTML reports and structured JSON profiles,
50
+ entirely on your computer.
51
+
52
+ **Simple. Clear. Smart.**
53
+
54
+ ## Quick start
55
+
56
+ Tabalyst supports Python 3.11, 3.12, 3.13, and 3.14.
57
+
58
+ ```console
59
+ pip install --upgrade tabalyst
60
+ tabalyst report insurance-customers.csv
61
+ ```
62
+
63
+ Save [`insurance-customers.csv`](https://github.com/loribel-labs/tabalyst/blob/main/examples/datasets/insurance-customers.csv),
64
+ a synthetic example, in your working folder, or use your own file. Explore the
65
+ interactive HTML report or use the generated JSON profile in your own
66
+ workflows. The same `pip` command installs Tabalyst or updates it.
67
+
68
+ Tabalyst is in beta. Commands and interfaces may change between releases.
69
+ Update before each new test.
70
+
71
+ ## Tabalyst Websites
72
+
73
+ - [tabalyst.com](https://tabalyst.com/): the official website, with an interactive demo.
74
+ - [docs.tabalyst.com](https://docs.tabalyst.com/): the documentation, for people and for AI assistants.
75
+ - [Interactive report](https://tabalyst.com/examples/report.html): a real Tabalyst report you can explore in your browser.
76
+
77
+ ## What can Tabalyst do?
78
+
79
+ | Tool | Purpose |
80
+ | --- | --- |
81
+ | [**Tabalyst Report**](https://docs.tabalyst.com/report/) | Generate interactive HTML profiling reports and JSON profiles |
82
+ | [**Tabalyst Scan**](https://docs.tabalyst.com/scan/) | Profile datasets and generate JSON and HTML scan summaries |
83
+ | [**Tabalyst Inspect**](https://docs.tabalyst.com/inspect/) | Discover and configure JSON collections and Excel tables |
84
+ | [**Tabalyst Sample**](https://docs.tabalyst.com/sample/) | Create random, stratified and smart CSV samples |
85
+ | [**Tabalyst Generate**](https://docs.tabalyst.com/generate/) | Generate synthetic CSV datasets for testing and demos |
86
+
87
+ ## Tabalyst Report
88
+
89
+ | Use case | Command | Destination |
90
+ | --- | --- | --- |
91
+ | One file, automatic name | `tabalyst report data.csv` | `data.html` beside the source |
92
+ | One file, custom name | `tabalyst report data.csv -o report.html` | The file `report.html` |
93
+ | Several files, automatic names | `tabalyst report *.csv` | Beside each source |
94
+ | Several files, one directory | `tabalyst report *.csv -d reports/` | The directory `reports/` |
95
+ | One JSON file | `tabalyst report data.json` | `data.report.html` beside the source |
96
+ | One JSONL file | `tabalyst report events.jsonl` | `events.report.html` beside the source |
97
+ | One Excel workbook | `tabalyst report sales.xlsx` | `sales.report.html` beside the source |
98
+ | Every table of a workbook | `tabalyst report shop.xlsx --all-collections` | `shop.costs.html`, `shop.sales.html`, ... beside the source |
99
+ | From a scan document | `tabalyst report --scan data.scan.json` | `data.html` beside the scan |
100
+
101
+ The simplest command keeps the source filename:
102
+
103
+ ```console
104
+ tabalyst report customers.csv
105
+ ```
106
+
107
+ It creates these files beside the source:
108
+
109
+ ```text
110
+ customers.csv
111
+ customers.html
112
+ customers.json
113
+ executions.json
114
+ ```
115
+
116
+ Add `--details` to generate one self-contained HTML page per column, and `-o`
117
+ to choose another HTML filename for one source:
118
+
119
+ ```console
120
+ tabalyst report customers.csv --details
121
+ tabalyst report customers.csv -o customer-analysis.html
122
+ ```
123
+
124
+ Existing outputs are never replaced silently: add `--force` when replacement is
125
+ intentional. A batch is checked for name collisions before any file is
126
+ processed, and a malformed file does not stop the others.
127
+
128
+ JSON, JSONL and Excel sources work the same way. When a JSON file or a workbook
129
+ holds several equally plausible collections, Tabalyst stops and prints one
130
+ command per candidate to copy, such as
131
+ `tabalyst report shop.xlsx --collection Costs`.
132
+
133
+ Useful options: `--delimiter`, `--encoding`, `--config`, `--workers`,
134
+ `--verbose`, `--quiet` and `--help`. `python -m tabalyst` accepts the same
135
+ commands.
136
+
137
+ Details: [Tabalyst Report](https://docs.tabalyst.com/report/),
138
+ [JSON and JSONL](https://docs.tabalyst.com/report/json/),
139
+ [Excel](https://docs.tabalyst.com/report/excel/),
140
+ [CSV batches and options](https://docs.tabalyst.com/report/csv/) and the
141
+ [`report` command reference](https://docs.tabalyst.com/reference/cli/report/).
142
+
143
+ ### What the report analyzes
144
+
145
+ - Dataset dimensions, missing cells, duplicates, and quality observations.
146
+ - A family and a type for each column (identifier, text, date, boolean...),
147
+ with the evidence behind them, and the technical type with its error rates.
148
+ - A summary table with one row per column: its type, a sentence about its
149
+ values, the missing share, its Errors and Issues with a preview of each, and
150
+ its details; above it, the Column quality and Signals cards.
151
+ - Numeric, date, string-length, normalization, and value distributions.
152
+ - Distinct values, representative examples, date formats, and semantic types
153
+ such as enumerations, email addresses, phone numbers, and postal codes.
154
+ - CSV record widths, quoting, encoding, and delimiter configuration.
155
+ - A bounded raw-data preview while every record is analyzed.
156
+
157
+ The report is built on Tabalyst Scan; values of sensitive columns can be masked
158
+ or hidden. Ambiguous dates stay
159
+ ambiguous; the report shows the evidence of the column without applying it. The
160
+ HTML report is self-contained and works without a CDN or network connection.
161
+ The JSON profile contains the same canonical analysis result for scripts and
162
+ future Tabalyst tools. See
163
+ [how to read the report](https://docs.tabalyst.com/report/read-report/).
164
+
165
+ ## Tabalyst Scan
166
+
167
+ Describe every field of a CSV, JSON, JSONL or Excel file in one JSON document:
168
+
169
+ ```console
170
+ tabalyst scan customers.csv
171
+ tabalyst scan orders.json --collection "$.customers[]"
172
+ tabalyst scan sales.xlsx --collection Orders
173
+ ```
174
+
175
+ Scan reads a text file once as a stream, with bounded memory. An Excel sheet is
176
+ loaded into memory. It records for each
177
+ field its types, missing values, frequencies, statistics and the result of every
178
+ detector (dates, numbers with decimal commas, emails, URLs, phone numbers,
179
+ postal codes, currencies, UUIDs, IP addresses and more). It also writes
180
+ `customers.scan.html`, a page that shows the scan (`--no-html` skips it).
181
+
182
+ A second reading can provide exact distinct counts, frequencies, histograms,
183
+ medians, patterns, correlations and more, within the limits of your data. `--plan` shows what it would add and
184
+ cost without running it, and `--deep` runs it:
185
+
186
+ ```console
187
+ tabalyst scan customers.csv --plan
188
+ tabalyst scan customers.csv --deep
189
+ ```
190
+
191
+ `tabalyst report` decides by itself whether that second reading is worth its
192
+ cost, and says what it added. `tabalyst report` also reuses a stored scan
193
+ while the source is unchanged.
194
+
195
+ Details: [Scan CSV and JSON files](https://docs.tabalyst.com/scan/files/),
196
+ [the second reading](https://docs.tabalyst.com/scan/deep/),
197
+ [reading exact, estimated and limited results](https://docs.tabalyst.com/scan/reading-results/),
198
+ [scan storage and cache](https://docs.tabalyst.com/scan/cache/) and the
199
+ [scan format](https://docs.tabalyst.com/scan/format/).
200
+
201
+ ## Tabalyst Inspect
202
+
203
+ A JSON file can hold several arrays, and an Excel workbook several sheets.
204
+ **Tabalyst Inspect** finds which array, sheet or table holds the records and
205
+ writes its answer in `<source>-inspect.json` beside the source:
206
+
207
+ ```console
208
+ tabalyst inspect orders.json
209
+ tabalyst inspect sales.xlsx
210
+ ```
211
+
212
+ The `config` section of that file holds the rules that `tabalyst scan` and
213
+ `tabalyst report` apply (collection, flatten settings, header row). Inspect is
214
+ optional: both commands inspect a source themselves, and stop with exit code
215
+ `2` and a list of candidates when the choice is ambiguous. Pass
216
+ `--collection` to choose.
217
+
218
+ Details: [Inspect JSON and JSONL files](https://docs.tabalyst.com/inspect/json/),
219
+ [Inspect Excel workbooks](https://docs.tabalyst.com/inspect/excel/) and the
220
+ [Inspect format](https://docs.tabalyst.com/inspect/format/).
221
+
222
+ ## Tabalyst Sample
223
+
224
+ Create a smaller CSV without modifying the source:
225
+
226
+ ```console
227
+ tabalyst sample customers.csv --sample-method random --rows 1000 --seed 42
228
+ tabalyst sample customers.csv --smart --rows 1000
229
+ ```
230
+
231
+ Methods are `first`, `last`, `random`, `stratified` and `smart`. A smart sample
232
+ keeps the diversity of the file (rare values, extremes, formats, odd cases)
233
+ instead of its proportions, and writes a report of what it covers, so never
234
+ estimate the population from it. Sampling reads records as a stream.
235
+
236
+ Details: [Tabalyst Sample](https://docs.tabalyst.com/sample/).
237
+
238
+ ## Tabalyst Generate
239
+
240
+ Generate synthetic CSV data from a packaged example (`crm`, `insurance` or
241
+ `computer`) or from a Generate package:
242
+
243
+ ```console
244
+ tabalyst generate --example crm -o crm-contacts.csv
245
+ tabalyst generate --example insurance --rows 3000 -d insurance-output/
246
+ tabalyst generate --example computer --rows 10000 -d computer-output/
247
+ tabalyst generate --example insurance --rows 3000 --anomaly-profile dirty_realistic -d insurance-dirty/
248
+ ```
249
+
250
+ An anomaly profile writes an altered CSV, a cell change log and a summary
251
+ beside the untouched clean CSV.
252
+
253
+ Details: [Tabalyst Generate](https://docs.tabalyst.com/generate/),
254
+ [`examples/generate/README.md`](examples/generate/README.md) and the
255
+ [Computer package contract](docs/dev/generate/computer.md).
256
+
257
+ ## Python API
258
+
259
+ The same operations are available without the CLI:
260
+
261
+ ```python
262
+ import tabalyst
263
+
264
+ result = tabalyst.analyze("customers.csv", "customers.html")
265
+ batch = tabalyst.generate_reports(["*.csv"], output_dir="reports")
266
+ sample = tabalyst.sample_csv("customers.csv", method="random", rows=1000, seed=42)
267
+ scan = tabalyst.scan("orders.json")
268
+ inspection = tabalyst.inspect("orders.json")
269
+ ```
270
+
271
+ Existing artifacts are never replaced silently: pass `force=True` when
272
+ replacement is intentional. Expected failures derive from
273
+ `tabalyst.TabalystError`. See the
274
+ [Python API reference](https://docs.tabalyst.com/reference/python-api/).
275
+
276
+ ## Configuration
277
+
278
+ Configuration files are strict JSON, loaded only with `--config`:
279
+
280
+ ```json
281
+ {
282
+ "scan": {
283
+ "csv": {"delimiter": ";", "encoding": "cp1252"},
284
+ "values": {"null_markers": ["N/A"]}
285
+ }
286
+ }
287
+ ```
288
+
289
+ Explicit CLI or Python arguments override the configuration file, which
290
+ overrides Tabalyst defaults. See the
291
+ [configuration reference](https://docs.tabalyst.com/reference/configuration/).
292
+
293
+ ## Local-first behavior and current limits
294
+
295
+ Tabalyst performs analysis locally and adds no telemetry or remote processing.
296
+ Generated JSON and HTML may contain source values and should be shared
297
+ accordingly.
298
+
299
+ Reports, samples, and scans read CSV, JSON and JSONL files as a stream, with
300
+ memory bounded by configurable limits. An Excel workbook is read by sheet into
301
+ memory, and a sheet above 1 GiB of XML is refused. See
302
+ [limitations](https://docs.tabalyst.com/about/limitations/).
303
+
304
+ ## Examples and development
305
+
306
+ The repository includes small and synthetic public examples under `examples/`.
307
+ See the [examples README](https://github.com/loribel-labs/tabalyst/blob/main/examples/README.md)
308
+ for regeneration commands.
309
+
310
+ ```console
311
+ python -m pytest
312
+ python -m ruff check .
313
+ python -m build
314
+ ```
315
+
316
+ Additional documentation:
317
+
318
+ - [Documentation site](https://docs.tabalyst.com/)
319
+ - [Architecture](https://github.com/loribel-labs/tabalyst/blob/main/docs/dev/architecture.md)
320
+ - [Release procedure](https://github.com/loribel-labs/tabalyst/blob/main/RELEASING.md)
321
+
322
+ Please report defects and feature requests through the
323
+ [GitHub issue tracker](https://github.com/loribel-labs/tabalyst/issues).
324
+
325
+ ## For AI assistants
326
+
327
+ To get help from an AI assistant, paste this prompt into a chat that can read
328
+ web pages:
329
+
330
+ ```text
331
+ Read the complete Tabalyst documentation at
332
+ https://docs.tabalyst.com/llms-full.txt, then help me use Tabalyst well.
333
+ Ask me what my data looks like and what I want to learn from it, then suggest
334
+ the right commands and options. Base your answers only on that documentation.
335
+ ```
336
+
337
+ If the assistant cannot open links, paste the content of the file instead.
338
+
339
+ The documentation site publishes plain-text versions of its pages:
340
+ [llms.txt](https://docs.tabalyst.com/llms.txt) lists every page with a
341
+ one-line description, and
342
+ [llms-full.txt](https://docs.tabalyst.com/llms-full.txt) holds the whole
343
+ documentation in one file. Every page is also available as Markdown by adding
344
+ `.md` to its URL, for example
345
+ [report.md](https://docs.tabalyst.com/report.md).
346
+
347
+ ## License
348
+
349
+ Tabalyst is released under the [Mozilla Public License 2.0](LICENSE).
350
+
351
+ Created by Gregory Borelli. Open source project by Loribel Labs.
@@ -0,0 +1,311 @@
1
+ # Tabalyst
2
+
3
+ **Open-source Python toolkit for data profiling and data quality analysis.**
4
+
5
+ *Tools for unfamiliar data.*
6
+
7
+ Tabalyst helps you understand CSV, Excel, JSON and JSONL datasets with minimal
8
+ configuration. Detect missing values, duplicates, mixed types, data formats and
9
+ quality issues. Generate interactive HTML reports and structured JSON profiles,
10
+ entirely on your computer.
11
+
12
+ **Simple. Clear. Smart.**
13
+
14
+ ## Quick start
15
+
16
+ Tabalyst supports Python 3.11, 3.12, 3.13, and 3.14.
17
+
18
+ ```console
19
+ pip install --upgrade tabalyst
20
+ tabalyst report insurance-customers.csv
21
+ ```
22
+
23
+ Save [`insurance-customers.csv`](https://github.com/loribel-labs/tabalyst/blob/main/examples/datasets/insurance-customers.csv),
24
+ a synthetic example, in your working folder, or use your own file. Explore the
25
+ interactive HTML report or use the generated JSON profile in your own
26
+ workflows. The same `pip` command installs Tabalyst or updates it.
27
+
28
+ Tabalyst is in beta. Commands and interfaces may change between releases.
29
+ Update before each new test.
30
+
31
+ ## Tabalyst Websites
32
+
33
+ - [tabalyst.com](https://tabalyst.com/): the official website, with an interactive demo.
34
+ - [docs.tabalyst.com](https://docs.tabalyst.com/): the documentation, for people and for AI assistants.
35
+ - [Interactive report](https://tabalyst.com/examples/report.html): a real Tabalyst report you can explore in your browser.
36
+
37
+ ## What can Tabalyst do?
38
+
39
+ | Tool | Purpose |
40
+ | --- | --- |
41
+ | [**Tabalyst Report**](https://docs.tabalyst.com/report/) | Generate interactive HTML profiling reports and JSON profiles |
42
+ | [**Tabalyst Scan**](https://docs.tabalyst.com/scan/) | Profile datasets and generate JSON and HTML scan summaries |
43
+ | [**Tabalyst Inspect**](https://docs.tabalyst.com/inspect/) | Discover and configure JSON collections and Excel tables |
44
+ | [**Tabalyst Sample**](https://docs.tabalyst.com/sample/) | Create random, stratified and smart CSV samples |
45
+ | [**Tabalyst Generate**](https://docs.tabalyst.com/generate/) | Generate synthetic CSV datasets for testing and demos |
46
+
47
+ ## Tabalyst Report
48
+
49
+ | Use case | Command | Destination |
50
+ | --- | --- | --- |
51
+ | One file, automatic name | `tabalyst report data.csv` | `data.html` beside the source |
52
+ | One file, custom name | `tabalyst report data.csv -o report.html` | The file `report.html` |
53
+ | Several files, automatic names | `tabalyst report *.csv` | Beside each source |
54
+ | Several files, one directory | `tabalyst report *.csv -d reports/` | The directory `reports/` |
55
+ | One JSON file | `tabalyst report data.json` | `data.report.html` beside the source |
56
+ | One JSONL file | `tabalyst report events.jsonl` | `events.report.html` beside the source |
57
+ | One Excel workbook | `tabalyst report sales.xlsx` | `sales.report.html` beside the source |
58
+ | Every table of a workbook | `tabalyst report shop.xlsx --all-collections` | `shop.costs.html`, `shop.sales.html`, ... beside the source |
59
+ | From a scan document | `tabalyst report --scan data.scan.json` | `data.html` beside the scan |
60
+
61
+ The simplest command keeps the source filename:
62
+
63
+ ```console
64
+ tabalyst report customers.csv
65
+ ```
66
+
67
+ It creates these files beside the source:
68
+
69
+ ```text
70
+ customers.csv
71
+ customers.html
72
+ customers.json
73
+ executions.json
74
+ ```
75
+
76
+ Add `--details` to generate one self-contained HTML page per column, and `-o`
77
+ to choose another HTML filename for one source:
78
+
79
+ ```console
80
+ tabalyst report customers.csv --details
81
+ tabalyst report customers.csv -o customer-analysis.html
82
+ ```
83
+
84
+ Existing outputs are never replaced silently: add `--force` when replacement is
85
+ intentional. A batch is checked for name collisions before any file is
86
+ processed, and a malformed file does not stop the others.
87
+
88
+ JSON, JSONL and Excel sources work the same way. When a JSON file or a workbook
89
+ holds several equally plausible collections, Tabalyst stops and prints one
90
+ command per candidate to copy, such as
91
+ `tabalyst report shop.xlsx --collection Costs`.
92
+
93
+ Useful options: `--delimiter`, `--encoding`, `--config`, `--workers`,
94
+ `--verbose`, `--quiet` and `--help`. `python -m tabalyst` accepts the same
95
+ commands.
96
+
97
+ Details: [Tabalyst Report](https://docs.tabalyst.com/report/),
98
+ [JSON and JSONL](https://docs.tabalyst.com/report/json/),
99
+ [Excel](https://docs.tabalyst.com/report/excel/),
100
+ [CSV batches and options](https://docs.tabalyst.com/report/csv/) and the
101
+ [`report` command reference](https://docs.tabalyst.com/reference/cli/report/).
102
+
103
+ ### What the report analyzes
104
+
105
+ - Dataset dimensions, missing cells, duplicates, and quality observations.
106
+ - A family and a type for each column (identifier, text, date, boolean...),
107
+ with the evidence behind them, and the technical type with its error rates.
108
+ - A summary table with one row per column: its type, a sentence about its
109
+ values, the missing share, its Errors and Issues with a preview of each, and
110
+ its details; above it, the Column quality and Signals cards.
111
+ - Numeric, date, string-length, normalization, and value distributions.
112
+ - Distinct values, representative examples, date formats, and semantic types
113
+ such as enumerations, email addresses, phone numbers, and postal codes.
114
+ - CSV record widths, quoting, encoding, and delimiter configuration.
115
+ - A bounded raw-data preview while every record is analyzed.
116
+
117
+ The report is built on Tabalyst Scan; values of sensitive columns can be masked
118
+ or hidden. Ambiguous dates stay
119
+ ambiguous; the report shows the evidence of the column without applying it. The
120
+ HTML report is self-contained and works without a CDN or network connection.
121
+ The JSON profile contains the same canonical analysis result for scripts and
122
+ future Tabalyst tools. See
123
+ [how to read the report](https://docs.tabalyst.com/report/read-report/).
124
+
125
+ ## Tabalyst Scan
126
+
127
+ Describe every field of a CSV, JSON, JSONL or Excel file in one JSON document:
128
+
129
+ ```console
130
+ tabalyst scan customers.csv
131
+ tabalyst scan orders.json --collection "$.customers[]"
132
+ tabalyst scan sales.xlsx --collection Orders
133
+ ```
134
+
135
+ Scan reads a text file once as a stream, with bounded memory. An Excel sheet is
136
+ loaded into memory. It records for each
137
+ field its types, missing values, frequencies, statistics and the result of every
138
+ detector (dates, numbers with decimal commas, emails, URLs, phone numbers,
139
+ postal codes, currencies, UUIDs, IP addresses and more). It also writes
140
+ `customers.scan.html`, a page that shows the scan (`--no-html` skips it).
141
+
142
+ A second reading can provide exact distinct counts, frequencies, histograms,
143
+ medians, patterns, correlations and more, within the limits of your data. `--plan` shows what it would add and
144
+ cost without running it, and `--deep` runs it:
145
+
146
+ ```console
147
+ tabalyst scan customers.csv --plan
148
+ tabalyst scan customers.csv --deep
149
+ ```
150
+
151
+ `tabalyst report` decides by itself whether that second reading is worth its
152
+ cost, and says what it added. `tabalyst report` also reuses a stored scan
153
+ while the source is unchanged.
154
+
155
+ Details: [Scan CSV and JSON files](https://docs.tabalyst.com/scan/files/),
156
+ [the second reading](https://docs.tabalyst.com/scan/deep/),
157
+ [reading exact, estimated and limited results](https://docs.tabalyst.com/scan/reading-results/),
158
+ [scan storage and cache](https://docs.tabalyst.com/scan/cache/) and the
159
+ [scan format](https://docs.tabalyst.com/scan/format/).
160
+
161
+ ## Tabalyst Inspect
162
+
163
+ A JSON file can hold several arrays, and an Excel workbook several sheets.
164
+ **Tabalyst Inspect** finds which array, sheet or table holds the records and
165
+ writes its answer in `<source>-inspect.json` beside the source:
166
+
167
+ ```console
168
+ tabalyst inspect orders.json
169
+ tabalyst inspect sales.xlsx
170
+ ```
171
+
172
+ The `config` section of that file holds the rules that `tabalyst scan` and
173
+ `tabalyst report` apply (collection, flatten settings, header row). Inspect is
174
+ optional: both commands inspect a source themselves, and stop with exit code
175
+ `2` and a list of candidates when the choice is ambiguous. Pass
176
+ `--collection` to choose.
177
+
178
+ Details: [Inspect JSON and JSONL files](https://docs.tabalyst.com/inspect/json/),
179
+ [Inspect Excel workbooks](https://docs.tabalyst.com/inspect/excel/) and the
180
+ [Inspect format](https://docs.tabalyst.com/inspect/format/).
181
+
182
+ ## Tabalyst Sample
183
+
184
+ Create a smaller CSV without modifying the source:
185
+
186
+ ```console
187
+ tabalyst sample customers.csv --sample-method random --rows 1000 --seed 42
188
+ tabalyst sample customers.csv --smart --rows 1000
189
+ ```
190
+
191
+ Methods are `first`, `last`, `random`, `stratified` and `smart`. A smart sample
192
+ keeps the diversity of the file (rare values, extremes, formats, odd cases)
193
+ instead of its proportions, and writes a report of what it covers, so never
194
+ estimate the population from it. Sampling reads records as a stream.
195
+
196
+ Details: [Tabalyst Sample](https://docs.tabalyst.com/sample/).
197
+
198
+ ## Tabalyst Generate
199
+
200
+ Generate synthetic CSV data from a packaged example (`crm`, `insurance` or
201
+ `computer`) or from a Generate package:
202
+
203
+ ```console
204
+ tabalyst generate --example crm -o crm-contacts.csv
205
+ tabalyst generate --example insurance --rows 3000 -d insurance-output/
206
+ tabalyst generate --example computer --rows 10000 -d computer-output/
207
+ tabalyst generate --example insurance --rows 3000 --anomaly-profile dirty_realistic -d insurance-dirty/
208
+ ```
209
+
210
+ An anomaly profile writes an altered CSV, a cell change log and a summary
211
+ beside the untouched clean CSV.
212
+
213
+ Details: [Tabalyst Generate](https://docs.tabalyst.com/generate/),
214
+ [`examples/generate/README.md`](examples/generate/README.md) and the
215
+ [Computer package contract](docs/dev/generate/computer.md).
216
+
217
+ ## Python API
218
+
219
+ The same operations are available without the CLI:
220
+
221
+ ```python
222
+ import tabalyst
223
+
224
+ result = tabalyst.analyze("customers.csv", "customers.html")
225
+ batch = tabalyst.generate_reports(["*.csv"], output_dir="reports")
226
+ sample = tabalyst.sample_csv("customers.csv", method="random", rows=1000, seed=42)
227
+ scan = tabalyst.scan("orders.json")
228
+ inspection = tabalyst.inspect("orders.json")
229
+ ```
230
+
231
+ Existing artifacts are never replaced silently: pass `force=True` when
232
+ replacement is intentional. Expected failures derive from
233
+ `tabalyst.TabalystError`. See the
234
+ [Python API reference](https://docs.tabalyst.com/reference/python-api/).
235
+
236
+ ## Configuration
237
+
238
+ Configuration files are strict JSON, loaded only with `--config`:
239
+
240
+ ```json
241
+ {
242
+ "scan": {
243
+ "csv": {"delimiter": ";", "encoding": "cp1252"},
244
+ "values": {"null_markers": ["N/A"]}
245
+ }
246
+ }
247
+ ```
248
+
249
+ Explicit CLI or Python arguments override the configuration file, which
250
+ overrides Tabalyst defaults. See the
251
+ [configuration reference](https://docs.tabalyst.com/reference/configuration/).
252
+
253
+ ## Local-first behavior and current limits
254
+
255
+ Tabalyst performs analysis locally and adds no telemetry or remote processing.
256
+ Generated JSON and HTML may contain source values and should be shared
257
+ accordingly.
258
+
259
+ Reports, samples, and scans read CSV, JSON and JSONL files as a stream, with
260
+ memory bounded by configurable limits. An Excel workbook is read by sheet into
261
+ memory, and a sheet above 1 GiB of XML is refused. See
262
+ [limitations](https://docs.tabalyst.com/about/limitations/).
263
+
264
+ ## Examples and development
265
+
266
+ The repository includes small and synthetic public examples under `examples/`.
267
+ See the [examples README](https://github.com/loribel-labs/tabalyst/blob/main/examples/README.md)
268
+ for regeneration commands.
269
+
270
+ ```console
271
+ python -m pytest
272
+ python -m ruff check .
273
+ python -m build
274
+ ```
275
+
276
+ Additional documentation:
277
+
278
+ - [Documentation site](https://docs.tabalyst.com/)
279
+ - [Architecture](https://github.com/loribel-labs/tabalyst/blob/main/docs/dev/architecture.md)
280
+ - [Release procedure](https://github.com/loribel-labs/tabalyst/blob/main/RELEASING.md)
281
+
282
+ Please report defects and feature requests through the
283
+ [GitHub issue tracker](https://github.com/loribel-labs/tabalyst/issues).
284
+
285
+ ## For AI assistants
286
+
287
+ To get help from an AI assistant, paste this prompt into a chat that can read
288
+ web pages:
289
+
290
+ ```text
291
+ Read the complete Tabalyst documentation at
292
+ https://docs.tabalyst.com/llms-full.txt, then help me use Tabalyst well.
293
+ Ask me what my data looks like and what I want to learn from it, then suggest
294
+ the right commands and options. Base your answers only on that documentation.
295
+ ```
296
+
297
+ If the assistant cannot open links, paste the content of the file instead.
298
+
299
+ The documentation site publishes plain-text versions of its pages:
300
+ [llms.txt](https://docs.tabalyst.com/llms.txt) lists every page with a
301
+ one-line description, and
302
+ [llms-full.txt](https://docs.tabalyst.com/llms-full.txt) holds the whole
303
+ documentation in one file. Every page is also available as Markdown by adding
304
+ `.md` to its URL, for example
305
+ [report.md](https://docs.tabalyst.com/report.md).
306
+
307
+ ## License
308
+
309
+ Tabalyst is released under the [Mozilla Public License 2.0](LICENSE).
310
+
311
+ Created by Gregory Borelli. Open source project by Loribel Labs.