tabalyst 0.7.2__tar.gz → 0.7.3__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 (543) hide show
  1. {tabalyst-0.7.2/src/tabalyst.egg-info → tabalyst-0.7.3}/PKG-INFO +7 -2
  2. {tabalyst-0.7.2 → tabalyst-0.7.3}/README.md +6 -1
  3. {tabalyst-0.7.2 → tabalyst-0.7.3}/pyproject.toml +1 -1
  4. tabalyst-0.7.3/src/tabalyst/cli/generate.py +190 -0
  5. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_anomalies.py +8 -1
  6. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_computer.py +39 -17
  7. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_computer_output.py +71 -23
  8. tabalyst-0.7.3/src/tabalyst/generate_computer_parallel.py +184 -0
  9. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_selection.py +170 -53
  10. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_service.py +228 -70
  11. {tabalyst-0.7.2 → tabalyst-0.7.3/src/tabalyst.egg-info}/PKG-INFO +7 -2
  12. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst.egg-info/SOURCES.txt +2 -0
  13. tabalyst-0.7.3/tests/test_generate_computer_parallel.py +115 -0
  14. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_computer_service.py +263 -0
  15. tabalyst-0.7.2/src/tabalyst/cli/generate.py +0 -106
  16. {tabalyst-0.7.2 → tabalyst-0.7.3}/LICENSE +0 -0
  17. {tabalyst-0.7.2 → tabalyst-0.7.3}/MANIFEST.in +0 -0
  18. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/README.md +0 -0
  19. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/config.json +0 -0
  20. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/datasets/basic.csv +0 -0
  21. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/datasets/insurance-customers.csv +0 -0
  22. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/generate/README.md +0 -0
  23. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/generate/cohorts-anomalies/catalog.yaml +0 -0
  24. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/generate/cohorts-anomalies/dataset.yaml +0 -0
  25. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/generate/cohorts-anomalies/schemas/accounts.yaml +0 -0
  26. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/generate/cohorts-anomalies/schemas/contacts.yaml +0 -0
  27. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/generate/common-references/catalog.yaml +0 -0
  28. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/generate/common-references/dataset.yaml +0 -0
  29. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/generate/common-references/schemas/contacts.yaml +0 -0
  30. {tabalyst-0.7.2 → tabalyst-0.7.3}/examples/generate/generate_examples.py +0 -0
  31. {tabalyst-0.7.2 → tabalyst-0.7.3}/setup.cfg +0 -0
  32. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/__init__.py +0 -0
  33. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/__main__.py +0 -0
  34. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/_version.py +0 -0
  35. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/batch.py +0 -0
  36. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cache_service.py +0 -0
  37. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/__init__.py +0 -0
  38. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/app.py +0 -0
  39. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/cache.py +0 -0
  40. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/confirm.py +0 -0
  41. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/dedup.py +0 -0
  42. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/inspect.py +0 -0
  43. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/report.py +0 -0
  44. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/sample.py +0 -0
  45. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/scan.py +0 -0
  46. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/cli/terminal.py +0 -0
  47. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/config.py +0 -0
  48. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/csv_records.py +0 -0
  49. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/__init__.py +0 -0
  50. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/analysis.py +0 -0
  51. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/batch_report.py +0 -0
  52. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/cache.py +0 -0
  53. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/calculation.py +0 -0
  54. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/count_only.py +0 -0
  55. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/discovery.py +0 -0
  56. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/diskstore.py +0 -0
  57. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/failures.py +0 -0
  58. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/groups.py +0 -0
  59. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/identity.py +0 -0
  60. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/pipeline.py +0 -0
  61. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/publish.py +0 -0
  62. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/report.py +0 -0
  63. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/settings.py +0 -0
  64. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/store.py +0 -0
  65. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/tiered.py +0 -0
  66. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup/writer.py +0 -0
  67. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/dedup_service.py +0 -0
  68. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/deep_service.py +0 -0
  69. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/deep_store.py +0 -0
  70. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/errors.py +0 -0
  71. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/execution_log.py +0 -0
  72. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_columns_package.py +0 -0
  73. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_csv.py +0 -0
  74. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_definition.py +0 -0
  75. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/SOURCES.md +0 -0
  76. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/catalog.yaml +0 -0
  77. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/brand.csv +0 -0
  78. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/color.csv +0 -0
  79. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/computer_type.csv +0 -0
  80. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/computer_type_form_factor.csv +0 -0
  81. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/computer_type_product_segment.csv +0 -0
  82. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/cpu.csv +0 -0
  83. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/cpu_memory_weight.csv +0 -0
  84. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/cpu_operating_system.csv +0 -0
  85. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/display.csv +0 -0
  86. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/extended_specs.csv +0 -0
  87. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/form_factor.csv +0 -0
  88. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_color.csv +0 -0
  89. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_cpu.csv +0 -0
  90. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_display.csv +0 -0
  91. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_gpu.csv +0 -0
  92. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_memory.csv +0 -0
  93. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_operating_system.csv +0 -0
  94. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_profile.csv +0 -0
  95. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_profile_computer_type.csv +0 -0
  96. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_profile_segment.csv +0 -0
  97. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_storage.csv +0 -0
  98. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/gpu.csv +0 -0
  99. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/gpu_display.csv +0 -0
  100. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/gpu_memory_weight.csv +0 -0
  101. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/gpu_storage_weight.csv +0 -0
  102. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/memory.csv +0 -0
  103. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/model_form_factor.csv +0 -0
  104. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/model_generation.csv +0 -0
  105. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/operating_system.csv +0 -0
  106. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_category.csv +0 -0
  107. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_family.csv +0 -0
  108. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_family_computer_type.csv +0 -0
  109. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_family_product_segment.csv +0 -0
  110. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_model.csv +0 -0
  111. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment.csv +0 -0
  112. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment_brand.csv +0 -0
  113. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment_display_weight.csv +0 -0
  114. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment_memory_weight.csv +0 -0
  115. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment_storage_weight.csv +0 -0
  116. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_subcategory.csv +0 -0
  117. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/profile_exclusions.csv +0 -0
  118. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/promotion_status.csv +0 -0
  119. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/promotion_type.csv +0 -0
  120. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/seller.csv +0 -0
  121. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/seller_type.csv +0 -0
  122. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/shipping_availability.csv +0 -0
  123. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/standard_specs.csv +0 -0
  124. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/storage.csv +0 -0
  125. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/warehouse.csv +0 -0
  126. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/dataset.yaml +0 -0
  127. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/computer_type.yaml +0 -0
  128. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/computer_type_form_factor.yaml +0 -0
  129. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/computer_type_product_segment.yaml +0 -0
  130. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/computers.yaml +0 -0
  131. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/cpu.yaml +0 -0
  132. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/cpu_memory_weight.yaml +0 -0
  133. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/cpu_operating_system.yaml +0 -0
  134. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/display.yaml +0 -0
  135. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/extended_specs.yaml +0 -0
  136. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_color.yaml +0 -0
  137. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_cpu.yaml +0 -0
  138. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_display.yaml +0 -0
  139. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_gpu.yaml +0 -0
  140. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_memory.yaml +0 -0
  141. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_operating_system.yaml +0 -0
  142. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_profile.yaml +0 -0
  143. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_profile_computer_type.yaml +0 -0
  144. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_profile_segment.yaml +0 -0
  145. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_storage.yaml +0 -0
  146. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/gpu.yaml +0 -0
  147. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/gpu_display.yaml +0 -0
  148. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/gpu_memory_weight.yaml +0 -0
  149. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/gpu_storage_weight.yaml +0 -0
  150. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/localized.yaml +0 -0
  151. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/memory.yaml +0 -0
  152. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/model_form_factor.yaml +0 -0
  153. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/model_generation.yaml +0 -0
  154. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/operating_system.yaml +0 -0
  155. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_family.yaml +0 -0
  156. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_family_computer_type.yaml +0 -0
  157. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_family_product_segment.yaml +0 -0
  158. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_model.yaml +0 -0
  159. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment.yaml +0 -0
  160. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment_brand.yaml +0 -0
  161. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment_display_weight.yaml +0 -0
  162. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment_memory_weight.yaml +0 -0
  163. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment_storage_weight.yaml +0 -0
  164. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_subcategory.yaml +0 -0
  165. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/profile_exclusions.yaml +0 -0
  166. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/seller.yaml +0 -0
  167. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/standard_specs.yaml +0 -0
  168. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/storage.yaml +0 -0
  169. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/warehouse.yaml +0 -0
  170. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/crm/catalog.yaml +0 -0
  171. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/crm/dataset.yaml +0 -0
  172. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/crm/schemas/accounts.yaml +0 -0
  173. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/crm/schemas/contacts.yaml +0 -0
  174. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/SOURCES.md +0 -0
  175. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/catalog.yaml +0 -0
  176. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/agencies.csv +0 -0
  177. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/branch_contract_weights.csv +0 -0
  178. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/claim_statuses.csv +0 -0
  179. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/contract_statuses.csv +0 -0
  180. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/contract_types.csv +0 -0
  181. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/payment_frequencies.csv +0 -0
  182. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/payment_methods.csv +0 -0
  183. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/dataset.yaml +0 -0
  184. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/agencies.yaml +0 -0
  185. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/branch_contract_weights.yaml +0 -0
  186. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/claim_statuses.yaml +0 -0
  187. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/contract_statuses.yaml +0 -0
  188. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/contract_types.yaml +0 -0
  189. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/customers.yaml +0 -0
  190. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/payment_frequencies.yaml +0 -0
  191. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/payment_methods.yaml +0 -0
  192. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_insurance.py +0 -0
  193. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_package.py +0 -0
  194. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_references.py +0 -0
  195. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/SOURCES.md +0 -0
  196. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/addresses/street_directions_ca.csv +0 -0
  197. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/addresses/street_names_ca.csv +0 -0
  198. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/addresses/street_types_ca.csv +0 -0
  199. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/addresses/unit_types_ca.csv +0 -0
  200. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/contact/email_patterns.csv +0 -0
  201. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/contact/email_providers_ca.csv +0 -0
  202. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/contact/phone_area_codes_ca.csv +0 -0
  203. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/geography/cities_ca.csv +0 -0
  204. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/geography/postal_prefixes_ca.csv +0 -0
  205. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/geography/provinces_ca.csv +0 -0
  206. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/people/family_names_ca.csv +0 -0
  207. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/people/first_names_en_ca.csv +0 -0
  208. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_resources/people/first_names_fr_qc.csv +0 -0
  209. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/generate_values.py +0 -0
  210. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/identifier_uniqueness/__init__.py +0 -0
  211. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/identifier_uniqueness/facts.py +0 -0
  212. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/identifier_uniqueness/models.py +0 -0
  213. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/identifier_uniqueness/near_unique.py +0 -0
  214. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/identifier_uniqueness/proof.py +0 -0
  215. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/identifier_uniqueness/rule.py +0 -0
  216. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspect_service.py +0 -0
  217. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/__init__.py +0 -0
  218. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/choices.py +0 -0
  219. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/excel_inspect/__init__.py +0 -0
  220. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/excel_inspect/build.py +0 -0
  221. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/excel_inspect/detect.py +0 -0
  222. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/excel_inspect/parameters.py +0 -0
  223. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/json_inspect/__init__.py +0 -0
  224. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/json_inspect/build.py +0 -0
  225. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/json_inspect/detect.py +0 -0
  226. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/json_inspect/parameters.py +0 -0
  227. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/models.py +0 -0
  228. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/persistence.py +0 -0
  229. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/inspector/resolution.py +0 -0
  230. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/json_text.py +0 -0
  231. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/models.py +0 -0
  232. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/option_notices.py +0 -0
  233. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/plan_service.py +0 -0
  234. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/progress.py +0 -0
  235. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/project_open_service.py +0 -0
  236. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/project_scan_service.py +0 -0
  237. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/__init__.py +0 -0
  238. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_bounded_values.py +0 -0
  239. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_cache.py +0 -0
  240. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_codec.py +0 -0
  241. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_generation.py +0 -0
  242. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_locks.py +0 -0
  243. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_publication.py +0 -0
  244. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_queries.py +0 -0
  245. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_query_budget.py +0 -0
  246. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_recovery.py +0 -0
  247. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_retention.py +0 -0
  248. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_schema.py +0 -0
  249. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_session.py +0 -0
  250. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_staging.py +0 -0
  251. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_sync.py +0 -0
  252. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/_validation.py +0 -0
  253. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/catalog.py +0 -0
  254. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/freshness.py +0 -0
  255. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/identity.py +0 -0
  256. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/index.py +0 -0
  257. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/location.py +0 -0
  258. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/models.py +0 -0
  259. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/projects/store.py +0 -0
  260. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_chain.py +0 -0
  261. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_classification.py +0 -0
  262. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_column_page.py +0 -0
  263. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_config.py +0 -0
  264. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_deep.py +0 -0
  265. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_details.py +0 -0
  266. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_finding_details.py +0 -0
  267. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_findings.py +0 -0
  268. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_insights.py +0 -0
  269. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_labels.py +0 -0
  270. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_measures.py +0 -0
  271. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_overview.py +0 -0
  272. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_plan.py +0 -0
  273. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_preview.py +0 -0
  274. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_profile.py +0 -0
  275. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_relations.py +0 -0
  276. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_schema.py +0 -0
  277. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_sections.py +0 -0
  278. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_service.py +0 -0
  279. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_signals.py +0 -0
  280. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_summary.py +0 -0
  281. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_table.py +0 -0
  282. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_uniqueness.py +0 -0
  283. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/report_views.py +0 -0
  284. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/reporting.py +0 -0
  285. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/result_model.py +0 -0
  286. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/sample_page.py +0 -0
  287. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/sampling.py +0 -0
  288. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/sampling_service.py +0 -0
  289. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scan_document.py +0 -0
  290. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scan_page.py +0 -0
  291. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scan_reuse.py +0 -0
  292. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scan_service.py +0 -0
  293. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/__init__.py +0 -0
  294. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/api.py +0 -0
  295. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/bottomk.py +0 -0
  296. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/cases.py +0 -0
  297. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/charactermap.py +0 -0
  298. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/characters.py +0 -0
  299. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/__init__.py +0 -0
  300. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/candidates.py +0 -0
  301. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/catalog.py +0 -0
  302. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/identifiers.py +0 -0
  303. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/models.py +0 -0
  304. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/names.py +0 -0
  305. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/rules.py +0 -0
  306. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/config.py +0 -0
  307. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/convention_rule.py +0 -0
  308. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/correlation_ratio.py +0 -0
  309. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/crosstab.py +0 -0
  310. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/__init__.py +0 -0
  311. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/amount.py +0 -0
  312. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/base.py +0 -0
  313. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/boolean.py +0 -0
  314. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/currency.py +0 -0
  315. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/email.py +0 -0
  316. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/enumeration.py +0 -0
  317. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/ip.py +0 -0
  318. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/keys.py +0 -0
  319. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/names.py +0 -0
  320. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/number.py +0 -0
  321. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/pattern.py +0 -0
  322. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/percentage.py +0 -0
  323. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/phone.py +0 -0
  324. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/postal.py +0 -0
  325. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/quantity.py +0 -0
  326. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/registry.py +0 -0
  327. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/shape.py +0 -0
  328. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/temporal.py +0 -0
  329. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/url.py +0 -0
  330. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/uuid.py +0 -0
  331. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/diagnostics.py +0 -0
  332. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/engine.py +0 -0
  333. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/exposure.py +0 -0
  334. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/features.py +0 -0
  335. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/field.py +0 -0
  336. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/identity.py +0 -0
  337. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/lengthsample.py +0 -0
  338. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/longtext.py +0 -0
  339. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/measures.py +0 -0
  340. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/memory.py +0 -0
  341. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/models.py +0 -0
  342. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/normalization.py +0 -0
  343. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/observations.py +0 -0
  344. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/paths.py +0 -0
  345. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/pattern_eligibility.py +0 -0
  346. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/patternfacets.py +0 -0
  347. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/patterninfer.py +0 -0
  348. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/patterntree.py +0 -0
  349. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/pearson.py +0 -0
  350. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/__init__.py +0 -0
  351. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzer.py +0 -0
  352. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/__init__.py +0 -0
  353. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/analytical.py +0 -0
  354. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/characters.py +0 -0
  355. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/common.py +0 -0
  356. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/copies.py +0 -0
  357. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/crosstab.py +0 -0
  358. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/date_order.py +0 -0
  359. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/distinct.py +0 -0
  360. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/drift.py +0 -0
  361. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/duplicates.py +0 -0
  362. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/forms.py +0 -0
  363. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/frequencies.py +0 -0
  364. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/histogram.py +0 -0
  365. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/lengths.py +0 -0
  366. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/matrix.py +0 -0
  367. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/measures.py +0 -0
  368. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/missing_copies.py +0 -0
  369. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/parts.py +0 -0
  370. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/patterns.py +0 -0
  371. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/pearson.py +0 -0
  372. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/residuals.py +0 -0
  373. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/shape.py +0 -0
  374. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/stats.py +0 -0
  375. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/structure.py +0 -0
  376. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/temporal.py +0 -0
  377. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/texts.py +0 -0
  378. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/categorystats.py +0 -0
  379. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/costmodel.py +0 -0
  380. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/crosstabs.py +0 -0
  381. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/facts.py +0 -0
  382. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/identifiers.py +0 -0
  383. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/models.py +0 -0
  384. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/orders.py +0 -0
  385. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/planner.py +0 -0
  386. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/reasons.py +0 -0
  387. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/registry.py +0 -0
  388. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/relations.py +0 -0
  389. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/render.py +0 -0
  390. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/samplerows.py +0 -0
  391. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/secondpass.py +0 -0
  392. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/stratification.py +0 -0
  393. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/stratmodels.py +0 -0
  394. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/process.py +0 -0
  395. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/quality.py +0 -0
  396. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/rankcorr.py +0 -0
  397. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/__init__.py +0 -0
  398. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/base.py +0 -0
  399. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/csv_reader.py +0 -0
  400. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/excel_common.py +0 -0
  401. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/excel_reader.py +0 -0
  402. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/excel_table.py +0 -0
  403. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/factory.py +0 -0
  404. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/json_common.py +0 -0
  405. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/json_reader.py +0 -0
  406. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/jsonl_reader.py +0 -0
  407. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/records.py +0 -0
  408. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/rowsample.py +0 -0
  409. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/schema.py +0 -0
  410. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/__init__.py +0 -0
  411. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/accumulators.py +0 -0
  412. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/analytical.py +0 -0
  413. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/bins.py +0 -0
  414. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/boundaries.py +0 -0
  415. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/characters.py +0 -0
  416. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/copies.py +0 -0
  417. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/crosstab.py +0 -0
  418. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/document.py +0 -0
  419. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/drift.py +0 -0
  420. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/duplicates.py +0 -0
  421. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/exactset.py +0 -0
  422. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/executor.py +0 -0
  423. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/forms.py +0 -0
  424. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/frequencies.py +0 -0
  425. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/matrix.py +0 -0
  426. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/measures.py +0 -0
  427. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/missing_copies.py +0 -0
  428. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/models.py +0 -0
  429. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/orders.py +0 -0
  430. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/parallel.py +0 -0
  431. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/parts.py +0 -0
  432. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/patternreader.py +0 -0
  433. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/patterns.py +0 -0
  434. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/pearson.py +0 -0
  435. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/periods.py +0 -0
  436. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/ranks.py +0 -0
  437. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/replay.py +0 -0
  438. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/residuals.py +0 -0
  439. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/routing.py +0 -0
  440. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/schema.py +0 -0
  441. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/shape.py +0 -0
  442. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/stats.py +0 -0
  443. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/structure.py +0 -0
  444. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/texts.py +0 -0
  445. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/__init__.py +0 -0
  446. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/bins.py +0 -0
  447. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/estimate.py +0 -0
  448. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/evaluate.py +0 -0
  449. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/execute.py +0 -0
  450. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/models.py +0 -0
  451. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/near.py +0 -0
  452. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/plan.py +0 -0
  453. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/reasons.py +0 -0
  454. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/render.py +0 -0
  455. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/result.py +0 -0
  456. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/select.py +0 -0
  457. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/targets.py +0 -0
  458. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/weights.py +0 -0
  459. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/stratify.py +0 -0
  460. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/structure.py +0 -0
  461. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/technical.py +0 -0
  462. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/validation.py +0 -0
  463. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/values.py +0 -0
  464. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/valuesample.py +0 -0
  465. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/scanner/workers.py +0 -0
  466. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.dedup.batch.schema.json +0 -0
  467. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.dedup.schema.json +0 -0
  468. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.report.schema.json +0 -0
  469. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.sample.schema.json +0 -0
  470. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.scan.deep.schema.json +0 -0
  471. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.scan.schema.json +0 -0
  472. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/service.py +0 -0
  473. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/shared_scan_service.py +0 -0
  474. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/smart_service.py +0 -0
  475. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/source_guard.py +0 -0
  476. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/static/report.js +0 -0
  477. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/static/theme.css +0 -0
  478. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/summary_models.py +0 -0
  479. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/templates/characters.html +0 -0
  480. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/templates/column.html +0 -0
  481. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/templates/insights.html +0 -0
  482. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/templates/patterns.html +0 -0
  483. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/templates/report.html +0 -0
  484. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst/templates/sample.html +0 -0
  485. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst.egg-info/dependency_links.txt +0 -0
  486. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst.egg-info/entry_points.txt +0 -0
  487. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst.egg-info/requires.txt +0 -0
  488. {tabalyst-0.7.2 → tabalyst-0.7.3}/src/tabalyst.egg-info/top_level.txt +0 -0
  489. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_all_collections.py +0 -0
  490. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_cli.py +0 -0
  491. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_csv_records.py +0 -0
  492. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_examples_index.py +0 -0
  493. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_examples_layout.py +0 -0
  494. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate.py +0 -0
  495. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_anomalies.py +0 -0
  496. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_anomalies_regression.py +0 -0
  497. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_computer_catalog.py +0 -0
  498. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_computer_components.py +0 -0
  499. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_computer_derivations.py +0 -0
  500. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_computer_hierarchy.py +0 -0
  501. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_computer_output.py +0 -0
  502. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_crm.py +0 -0
  503. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_crm_package.py +0 -0
  504. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_insurance.py +0 -0
  505. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_insurance_stress.py +0 -0
  506. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_lot4.py +0 -0
  507. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_package.py +0 -0
  508. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_references.py +0 -0
  509. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_generate_selection.py +0 -0
  510. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_json_text.py +0 -0
  511. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_license_headers.py +0 -0
  512. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_make_datasets.py +0 -0
  513. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_option_notices.py +0 -0
  514. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_cache.py +0 -0
  515. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_database.py +0 -0
  516. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_generations.py +0 -0
  517. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_identity.py +0 -0
  518. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_index.py +0 -0
  519. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_location.py +0 -0
  520. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_open_service.py +0 -0
  521. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_queries.py +0 -0
  522. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_rescan.py +0 -0
  523. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_scan.py +0 -0
  524. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_scan_model.py +0 -0
  525. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_sessions.py +0 -0
  526. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_project_store.py +0 -0
  527. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_public_api.py +0 -0
  528. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_report_contrast.py +0 -0
  529. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_reporting.py +0 -0
  530. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_sampling.py +0 -0
  531. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scan_command.py +0 -0
  532. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_amounts.py +0 -0
  533. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_batches.py +0 -0
  534. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_config.py +0 -0
  535. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_csv.py +0 -0
  536. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_email_url.py +0 -0
  537. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_exposure.py +0 -0
  538. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_paths.py +0 -0
  539. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_phone.py +0 -0
  540. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_postal.py +0 -0
  541. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_scanner_uuid_ip.py +0 -0
  542. {tabalyst-0.7.2 → tabalyst-0.7.3}/tests/test_shared_scan_cli.py +0 -0
  543. {tabalyst-0.7.2 → tabalyst-0.7.3}/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.2
3
+ Version: 0.7.3
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
@@ -280,10 +280,15 @@ tabalyst generate --example crm -o crm-contacts.csv
280
280
  tabalyst generate --example insurance --rows 3000 -d insurance-output/
281
281
  tabalyst generate --example computer --rows 10000 -d computer-output/
282
282
  tabalyst generate --example insurance --rows 3000 --anomaly-profile dirty_realistic -d insurance-dirty/
283
+ tabalyst generate --example computer --rows 30000 -o pcs.csv --anomaly-profile dirty_realistic
283
284
  ```
284
285
 
285
286
  An anomaly profile writes an altered CSV, a cell change log and a summary
286
- beside the untouched clean CSV.
287
+ beside the untouched clean CSV. For Computer, `-o` writes one CSV with the
288
+ errors and its `.changes.csv` log, and `--anomaly-profile` accepts several
289
+ profiles with `-d` to get one variant of each. Computer rows are generated by
290
+ several processes from 5,000 rows (`--workers` sets the number), and the command
291
+ shows its progress and ends with a timing report.
287
292
 
288
293
  Details: [Tabalyst Generate](https://docs.tabalyst.com/generate/),
289
294
  [`examples/generate/README.md`](examples/generate/README.md) and the
@@ -240,10 +240,15 @@ tabalyst generate --example crm -o crm-contacts.csv
240
240
  tabalyst generate --example insurance --rows 3000 -d insurance-output/
241
241
  tabalyst generate --example computer --rows 10000 -d computer-output/
242
242
  tabalyst generate --example insurance --rows 3000 --anomaly-profile dirty_realistic -d insurance-dirty/
243
+ tabalyst generate --example computer --rows 30000 -o pcs.csv --anomaly-profile dirty_realistic
243
244
  ```
244
245
 
245
246
  An anomaly profile writes an altered CSV, a cell change log and a summary
246
- beside the untouched clean CSV.
247
+ beside the untouched clean CSV. For Computer, `-o` writes one CSV with the
248
+ errors and its `.changes.csv` log, and `--anomaly-profile` accepts several
249
+ profiles with `-d` to get one variant of each. Computer rows are generated by
250
+ several processes from 5,000 rows (`--workers` sets the number), and the command
251
+ shows its progress and ends with a timing report.
247
252
 
248
253
  Details: [Tabalyst Generate](https://docs.tabalyst.com/generate/),
249
254
  [`examples/generate/README.md`](examples/generate/README.md) and the
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tabalyst"
7
- version = "0.7.2"
7
+ version = "0.7.3"
8
8
  description = "Open-source toolkit for understanding and working with unfamiliar data."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1,190 @@
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
+ """CLI adapter for Tabalyst Generate."""
6
+
7
+ import sys
8
+ from pathlib import Path
9
+ from typing import Annotated
10
+
11
+ import typer
12
+
13
+ from tabalyst.cli.terminal import error_exit_code
14
+ from tabalyst.errors import TabalystError
15
+ from tabalyst.generate_service import (
16
+ GenerateProgress,
17
+ GenerateResult,
18
+ build_generate_plan,
19
+ generate_datasets,
20
+ )
21
+
22
+ PHASE_NAMES = {"rows": "generating rows", "errors": "injecting errors", "publish": "writing files"}
23
+ # Below this, a phase is noise in the report.
24
+ MIN_REPORTED_SECONDS = 0.05
25
+
26
+
27
+ def format_duration(seconds: float) -> str:
28
+ """A duration for people: tenths of a second under a minute, then minutes and seconds."""
29
+ if seconds < 60:
30
+ return f"{seconds:.1f}s"
31
+ minutes, rest = divmod(round(seconds), 60)
32
+ if minutes < 60:
33
+ return f"{minutes}m {rest:02d}s"
34
+ hours, minutes = divmod(minutes, 60)
35
+ return f"{hours}h {minutes:02d}m"
36
+
37
+
38
+ class GenerateProgressPrinter:
39
+ """One rewritten standard error line per stage, with the time left once it is known."""
40
+
41
+ def __init__(self, enabled: bool) -> None:
42
+ self.enabled = enabled
43
+ self._stage: str | None = None
44
+ self._stage_start = 0.0
45
+ self._width = 0
46
+
47
+ def __call__(self, event: GenerateProgress) -> None:
48
+ if not self.enabled or not event.total:
49
+ return
50
+ if event.stage != self._stage:
51
+ self._stage = event.stage
52
+ self._stage_start = event.elapsed_seconds
53
+ spent = event.elapsed_seconds - self._stage_start
54
+ message = f"{event.stage} {event.done:,}/{event.total:,} ({100 * event.done // event.total}%)"
55
+ if event.done >= event.total:
56
+ message += f" - {format_duration(spent)}"
57
+ elif event.done and spent >= 1:
58
+ message += (f" - {format_duration(spent)}, "
59
+ f"about {format_duration(spent * (event.total - event.done) / event.done)} left")
60
+ finished = event.done >= event.total
61
+ typer.echo(f"\r{message.ljust(self._width)}", nl=finished, err=True)
62
+ self._width = 0 if finished else max(self._width, len(message))
63
+
64
+
65
+ def timing_report(result: GenerateResult) -> str:
66
+ """The closing line: rows, total time, rate and where the time went."""
67
+ rows = sum(result.row_counts.values()) if len(result.row_counts) == 1 else None
68
+ text = f"Done in {format_duration(result.seconds)}"
69
+ if rows is not None:
70
+ text = f"{rows:,} rows in {format_duration(result.seconds)}"
71
+ if result.seconds > 0:
72
+ processes = f", {result.workers} processes" if result.workers > 1 else ""
73
+ text += f" ({rows / result.seconds:,.0f} rows/s{processes})"
74
+ changed = sum(result.anomaly_counts.values())
75
+ if changed:
76
+ profiles = {key.split("/", 1)[1] for key in result.anomaly_counts if "/" in key}
77
+ text += f", {changed:,} cells changed"
78
+ if len(profiles) > 1:
79
+ text += f" in {len(profiles)} profiles"
80
+ parts = [f"{PHASE_NAMES[name]} {format_duration(value)}"
81
+ for name, value in result.timings.items()
82
+ if name in PHASE_NAMES and value >= MIN_REPORTED_SECONDS]
83
+ return f"{text}: {', '.join(parts)}" if len(parts) > 1 else text
84
+
85
+
86
+ def generate_command(
87
+ definition: Annotated[
88
+ Path | None,
89
+ typer.Argument(help="Generate definition or package directory."),
90
+ ] = None,
91
+ example: Annotated[
92
+ str | None,
93
+ typer.Option("--example", help="Packaged example: crm, insurance, or computer."),
94
+ ] = None,
95
+ output: Annotated[
96
+ Path | None,
97
+ typer.Option("--output", "-o", help="One CSV file (with --anomaly-profile: the CSV with errors, plus FILE.changes.csv)."),
98
+ ] = None,
99
+ output_dir: Annotated[
100
+ Path | None,
101
+ typer.Option("--output-dir", "-d", help="Directory for all artifacts."),
102
+ ] = None,
103
+ rows: Annotated[
104
+ int | None,
105
+ typer.Option("--rows", help="Number of generated rows."),
106
+ ] = None,
107
+ seed: Annotated[
108
+ int | None,
109
+ typer.Option("--seed", help="Root random seed."),
110
+ ] = None,
111
+ as_of_date: Annotated[
112
+ str | None,
113
+ typer.Option("--as-of-date", help="Reference date (YYYY-MM-DD)."),
114
+ ] = None,
115
+ anomaly_profile: Annotated[
116
+ str | None,
117
+ typer.Option("--anomaly-profile", help="Inject errors. Computer: dirty_realistic, dirty_stress, unit_variants, unit_variants_extended; several, comma separated, with -d."),
118
+ ] = None,
119
+ request: Annotated[
120
+ Path | None,
121
+ typer.Option("--request", help="JSON generation request."),
122
+ ] = None,
123
+ generation_profile: Annotated[
124
+ str | None,
125
+ typer.Option("--generation-profile", help="Catalog selection profile."),
126
+ ] = None,
127
+ output_profile: Annotated[
128
+ str | None,
129
+ typer.Option("--output-profile", help="Output column profile."),
130
+ ] = None,
131
+ market: Annotated[
132
+ str | None,
133
+ typer.Option("--market", help="Offer market: ca or us."),
134
+ ] = None,
135
+ locales: Annotated[
136
+ str | None,
137
+ typer.Option("--locales", help="Computer locales: en, fr or en,fr (default en with -o, en,fr with -d)."),
138
+ ] = None,
139
+ unit_style: Annotated[
140
+ str | None,
141
+ typer.Option("--unit-style", help="Computer values: numeric or localized units."),
142
+ ] = None,
143
+ unit_columns: Annotated[
144
+ str | None,
145
+ typer.Option("--unit-columns", help="Comma-separated Computer measurement columns to format with units."),
146
+ ] = None,
147
+ validate_only: Annotated[
148
+ bool,
149
+ typer.Option("--validate-only", help="Validate a package without writing."),
150
+ ] = False,
151
+ force: Annotated[
152
+ bool,
153
+ typer.Option("--force", "-f", help="Replace existing artifacts."),
154
+ ] = False,
155
+ no_progress: Annotated[
156
+ bool,
157
+ typer.Option("--no-progress", help="Hide the progress line. It is also hidden outside a terminal."),
158
+ ] = False,
159
+ workers: Annotated[
160
+ int | None,
161
+ typer.Option(
162
+ "--workers", min=1,
163
+ help=("Computer: processes that generate the rows, 1 for one process. By default, "
164
+ "5,000 rows or more use one per spare processor, at most 6."),
165
+ ),
166
+ ] = None,
167
+ ) -> None:
168
+ """Validate and generate datasets from a definition or package."""
169
+ try:
170
+ plan = build_generate_plan(
171
+ definition, example=example, output=output, output_dir=output_dir,
172
+ rows=rows, seed=seed, as_of_date=as_of_date,
173
+ anomaly_profile=anomaly_profile, force=force, request=request,
174
+ generation_profile=generation_profile, output_profile=output_profile,
175
+ market=market, locales=locales, unit_style=unit_style,
176
+ unit_columns=unit_columns,
177
+ validate_only=validate_only, workers=workers,
178
+ )
179
+ if validate_only:
180
+ typer.echo("Valid Generate package.", err=True)
181
+ return
182
+ result = generate_datasets(
183
+ plan, on_progress=GenerateProgressPrinter(not no_progress and sys.stderr.isatty()),
184
+ )
185
+ except TabalystError as exc:
186
+ typer.echo(f"Error: {exc}", err=True)
187
+ raise typer.Exit(error_exit_code(exc)) from exc
188
+ for path in result.paths:
189
+ typer.echo(f"Created: {path}", err=True)
190
+ typer.echo(timing_report(result), err=True)
@@ -354,7 +354,8 @@ def _choose_rows(clean: Path, delimiter: str, operations: Sequence[Mapping[str,
354
354
  def inject_anomalies(clean: Path, altered: Path, changes: Path, *,
355
355
  dataset: str, profile: Mapping[str, object], seed: int, count: int,
356
356
  delimiter: str, locale: str = "en",
357
- unit_suffixes: Mapping[str, tuple[str, str]] | None = None) -> dict[str, object]:
357
+ unit_suffixes: Mapping[str, tuple[str, str]] | None = None,
358
+ on_row: Callable[[int], None] | None = None) -> dict[str, object]:
358
359
  """Write altered CSV and cell log; return requested and actual counts.
359
360
 
360
361
  Computer unit suffixes are supplied by its output register. An operation
@@ -369,6 +370,7 @@ def inject_anomalies(clean: Path, altered: Path, changes: Path, *,
369
370
  row had already received are then gone from the file, so their journal
370
371
  entries are dropped and their operations count the row as skipped: the
371
372
  journal always describes the file.
373
+ ``on_row`` receives the number of rows written, about 200 times per file and at the end.
372
374
  """
373
375
  # Imported here because generate_values reaches generate_definition, which
374
376
  # imports this module for the operation rules.
@@ -416,8 +418,11 @@ def inject_anomalies(clean: Path, altered: Path, changes: Path, *,
416
418
  writer.writeheader()
417
419
  log.writeheader()
418
420
  observed = 0
421
+ report_every = max(1, count // 200)
419
422
  for row_index, clean_row in enumerate(reader):
420
423
  observed += 1
424
+ if on_row is not None and row_index % report_every == 0:
425
+ on_row(row_index)
421
426
  row = clean_row.copy()
422
427
  # (operation index, cell updates) of this row, written once it is final.
423
428
  pending: list[tuple[int, list[tuple[str, str, str, str]]]] = []
@@ -488,6 +493,8 @@ def inject_anomalies(clean: Path, altered: Path, changes: Path, *,
488
493
  history[field].append(value)
489
494
  if observed != count:
490
495
  raise ValueError(f"Clean row count changed for {dataset}: {observed} != {count}")
496
+ if on_row is not None:
497
+ on_row(observed)
491
498
  return {
492
499
  "dataset": dataset, "profile": profile_id, "seed": seed,
493
500
  "total_rows": count, "affected_rows": affected_rows,
@@ -26,12 +26,11 @@ MARKET_CURRENCY = {"ca": "CAD", "us": "USD"}
26
26
 
27
27
 
28
28
  def _digest(parts: tuple[str, ...]) -> str:
29
- digest = hashlib.sha256()
30
- for part in parts:
31
- encoded = part.encode("utf-8")
32
- digest.update(len(encoded).to_bytes(8, "big"))
33
- digest.update(encoded)
34
- return digest.hexdigest()[:40]
29
+ # One hash call over the same length-prefixed bytes: parts hashed one by one would cost more.
30
+ encoded = [part.encode("utf-8") for part in parts]
31
+ return hashlib.sha256(b"".join(
32
+ [len(item).to_bytes(8, "big") + item for item in encoded]
33
+ )).hexdigest()[:40]
35
34
 
36
35
 
37
36
  def _stream(seed: int, dataset_id: str, row_index: int, decision: str,
@@ -39,13 +38,45 @@ def _stream(seed: int, dataset_id: str, row_index: int, decision: str,
39
38
  return random.Random(int(_digest((str(seed), dataset_id, str(row_index), decision, *context)), 16))
40
39
 
41
40
 
41
+ _ID_INDEXES: dict[tuple[int, str], tuple[DatasetPackage, dict[Cell, list[dict[str, Cell]]]]] = {}
42
+ _MARKET_CHOICES: dict[tuple[int, str, str], tuple[DatasetPackage, tuple[str, ...], tuple[str, ...]]] = {}
43
+
44
+
42
45
  def _entry(package: DatasetPackage, table_id: str, selected_id: Cell) -> dict[str, Cell]:
43
- matches = [row for row in package.tables[table_id].rows if row["id"] == selected_id]
46
+ key = (id(package), table_id)
47
+ cached = _ID_INDEXES.get(key)
48
+ # The cache keeps the package alive, so a matching id is always the same object.
49
+ if cached is None or cached[0] is not package:
50
+ index: dict[Cell, list[dict[str, Cell]]] = {}
51
+ for row in package.tables[table_id].rows:
52
+ index.setdefault(row["id"], []).append(row)
53
+ cached = _ID_INDEXES[key] = (package, index)
54
+ matches = cached[1].get(selected_id, [])
44
55
  if len(matches) != 1:
45
56
  raise ConfigurationError(f"PACKAGE_STEP_REFERENCE: unknown {table_id} ID {selected_id!r}")
46
57
  return matches[0]
47
58
 
48
59
 
60
+ def _market_choices(package: DatasetPackage, market: str, brand_id: str
61
+ ) -> tuple[tuple[str, ...], tuple[str, ...]]:
62
+ """Sellers a brand may use and warehouses of a market, in the order the draws index them."""
63
+ key = (id(package), market, brand_id)
64
+ cached = _MARKET_CHOICES.get(key)
65
+ if cached is None or cached[0] is not package:
66
+ sellers = tuple(sorted(
67
+ str(row["id"]) for row in package.tables["seller"].rows
68
+ if row["market"] == market
69
+ and (row["seller_type_id"] != "manufacturer"
70
+ or row["id"] == f"{brand_id}_direct_{market}")
71
+ ))
72
+ warehouses = tuple(sorted(
73
+ str(row["id"]) for row in package.tables["warehouse"].rows
74
+ if row["market"] == market
75
+ ))
76
+ cached = _MARKET_CHOICES[key] = (package, sellers, warehouses)
77
+ return cached[1], cached[2]
78
+
79
+
49
80
  def _integer(value: Cell, field: str) -> int:
50
81
  if type(value) is not int:
51
82
  raise ConfigurationError(f"PACKAGE_STEP_REFERENCE: expected integer Computer field {field!r}")
@@ -274,18 +305,9 @@ def derive_computer_row(package: DatasetPackage, selected: dict[str, Cell],
274
305
  return_rate = (Decimal("0.10") - (rating_value - 3) * Decimal("0.02")
275
306
  + Decimal(_stream(seed, dataset_id, row_index, "returns", context).randrange(0, 6))
276
307
  / 1000).quantize(Decimal("0.001"))
277
- seller_ids = tuple(sorted(
278
- str(row["id"]) for row in package.tables["seller"].rows
279
- if row["market"] == market
280
- and (row["seller_type_id"] != "manufacturer"
281
- or row["id"] == f"{values['brand_id']}_direct_{market}")
282
- ))
308
+ seller_ids, warehouse_ids = _market_choices(package, market, str(values["brand_id"]))
283
309
  seller_id = _stream(seed, dataset_id, row_index, "seller", context).choice(seller_ids)
284
310
  seller = _entry(package, "seller", seller_id)
285
- warehouse_ids = tuple(sorted(
286
- str(row["id"]) for row in package.tables["warehouse"].rows
287
- if row["market"] == market
288
- ))
289
311
  warehouse_id = _stream(seed, dataset_id, row_index, "warehouse", context).choice(
290
312
  warehouse_ids
291
313
  )
@@ -8,8 +8,11 @@ from __future__ import annotations
8
8
 
9
9
  import csv
10
10
  import hashlib
11
+ import io
11
12
  import json
12
13
  import sys
14
+ import tempfile
15
+ from collections.abc import Callable
13
16
  from contextlib import ExitStack
14
17
  from datetime import date
15
18
  from pathlib import Path
@@ -209,6 +212,33 @@ def render_computer_row(package: DatasetPackage, row: dict[str, Cell],
209
212
  return rendered
210
213
 
211
214
 
215
+ def _write_rows_in_workers(
216
+ package: DatasetPackage, outputs: dict[str, Path], locales: tuple[str, ...],
217
+ columns: tuple[str, ...], dataset_id: str, rows: int, seed: int, as_of_date: date,
218
+ generation_profile: str, output_profile: str, market: str, unit_style: str,
219
+ selected_units: tuple[str, ...], workers: int, on_rows: Callable[[int], None] | None,
220
+ ) -> None:
221
+ """Write the CSVs from rows rendered by worker processes."""
222
+ # Imported here because the workers module imports this one.
223
+ from tabalyst.generate_computer_parallel import SpanSettings, write_rows
224
+
225
+ header = io.StringIO()
226
+ csv.writer(header, lineterminator="\n").writerow(columns)
227
+ with ExitStack() as stack:
228
+ # The parts sit beside the outputs: millions of rows would fill a small system temp.
229
+ directory = Path(stack.enter_context(tempfile.TemporaryDirectory(
230
+ prefix=".generate-parts-", dir=outputs[locales[0]].parent)))
231
+ streams = {locale: stack.enter_context(outputs[locale].open("wb")) for locale in locales}
232
+ for stream in streams.values():
233
+ stream.write(header.getvalue().encode("utf-8"))
234
+ write_rows(
235
+ SpanSettings(package.root, dataset_id, seed, as_of_date, generation_profile,
236
+ output_profile, market, unit_style, selected_units, locales,
237
+ columns, directory),
238
+ rows, workers, streams, on_rows,
239
+ )
240
+
241
+
212
242
  def write_computer_csvs(package: DatasetPackage, outputs: dict[str, Path],
213
243
  metadata_path: Path, *, dataset_id: str = "computers",
214
244
  rows: int = 10, seed: int = 42,
@@ -216,15 +246,23 @@ def write_computer_csvs(package: DatasetPackage, outputs: dict[str, Path],
216
246
  generation_profile: str = "balanced",
217
247
  output_profile: str = "compact", market: str = "ca",
218
248
  unit_style: str = "numeric",
219
- unit_columns: tuple[str, ...] | None = None) -> dict[str, object]:
249
+ unit_columns: tuple[str, ...] | None = None,
250
+ on_rows: Callable[[int], None] | None = None,
251
+ workers: int = 1) -> dict[str, object]:
220
252
  """Write paired CSVs and reproducible metadata to caller supplied paths.
221
253
 
222
254
  The caller owns path planning, staging, collision checks, and publication.
223
- One selected and derived record feeds both locale writers per iteration.
255
+ One selected and derived record feeds every requested locale writer per iteration.
256
+ `outputs` holds `en`, `fr` or both; a single locale writes only that file.
257
+ `on_rows` receives the number of rows written, about 200 times and at the end.
258
+ With `workers` above 1 the rows are rendered by that many processes and the
259
+ files are byte for byte those of one process; `on_rows` then moves by span.
224
260
  Localized units are recorded with the effective column selection.
225
261
  """
226
- if set(outputs) != {"en", "fr"} or len(set(outputs.values()) | {metadata_path}) != 3:
227
- raise ValueError("Computer outputs need distinct en, fr, and metadata paths")
262
+ locales = tuple(locale for locale in ("en", "fr") if locale in outputs)
263
+ if (not locales or len(locales) != len(outputs)
264
+ or len(set(outputs.values()) | {metadata_path}) != len(outputs) + 1):
265
+ raise ValueError("Computer outputs need distinct en or fr paths and a metadata path")
228
266
  if type(rows) is not int or rows < 1:
229
267
  raise ValueError("rows must be positive")
230
268
  if output_profile not in PROFILE_COLUMNS:
@@ -241,23 +279,33 @@ def write_computer_csvs(package: DatasetPackage, outputs: dict[str, Path],
241
279
  or any(column not in columns or column not in UNIT_COLUMNS for column in selected_units)
242
280
  or unit_style == "numeric" and unit_columns is not None):
243
281
  raise ValueError("invalid Computer unit columns")
244
- with ExitStack() as stack:
245
- writers: dict[str, csv.DictWriter] = {}
246
- for locale in ("en", "fr"):
247
- stream = stack.enter_context(outputs[locale].open("w", encoding="utf-8", newline=""))
248
- writer = csv.DictWriter(stream, fieldnames=columns,
249
- extrasaction="raise", lineterminator="\n")
250
- writer.writeheader()
251
- writers[locale] = writer
252
- for index in range(rows):
253
- selected = select_catalog_row(package, dataset_id, seed, index,
254
- generation_profile)
255
- internal = derive_computer_row(package, selected, dataset_id, seed,
256
- index, as_of_date, market)
257
- for locale in ("en", "fr"):
258
- writers[locale].writerow(render_computer_row(
259
- package, internal, locale, output_profile, unit_style, selected_units,
260
- ))
282
+ if workers > 1:
283
+ _write_rows_in_workers(package, outputs, locales, columns, dataset_id, rows, seed,
284
+ as_of_date, generation_profile, output_profile, market,
285
+ unit_style, selected_units, workers, on_rows)
286
+ else:
287
+ with ExitStack() as stack:
288
+ writers: dict[str, csv.DictWriter] = {}
289
+ for locale in locales:
290
+ stream = stack.enter_context(outputs[locale].open("w", encoding="utf-8", newline=""))
291
+ writer = csv.DictWriter(stream, fieldnames=columns,
292
+ extrasaction="raise", lineterminator="\n")
293
+ writer.writeheader()
294
+ writers[locale] = writer
295
+ report_every = max(1, rows // 200)
296
+ for index in range(rows):
297
+ if on_rows is not None and index % report_every == 0:
298
+ on_rows(index)
299
+ selected = select_catalog_row(package, dataset_id, seed, index,
300
+ generation_profile)
301
+ internal = derive_computer_row(package, selected, dataset_id, seed,
302
+ index, as_of_date, market)
303
+ for locale in locales:
304
+ writers[locale].writerow(render_computer_row(
305
+ package, internal, locale, output_profile, unit_style, selected_units,
306
+ ))
307
+ if on_rows is not None:
308
+ on_rows(rows)
261
309
  resources: dict[str, str] = {}
262
310
  for path in sorted(package.input_paths):
263
311
  with path.open("rb") as source:
@@ -273,10 +321,10 @@ def write_computer_csvs(package: DatasetPackage, outputs: dict[str, Path],
273
321
  "request": {"dataset": dataset_id, "rows": rows, "seed": seed,
274
322
  "as_of_date": as_of_date.isoformat(),
275
323
  "generation_profile": generation_profile,
276
- "output_profile": output_profile, "locales": ["en", "fr"],
324
+ "output_profile": output_profile, "locales": list(locales),
277
325
  "market": market},
278
326
  "outputs": {locale: {"rows": rows, "profile": output_profile,
279
- "columns": len(columns)} for locale in ("en", "fr")},
327
+ "columns": len(columns)} for locale in locales},
280
328
  "engine_version": __version__,
281
329
  "python_version": f"{sys.version_info.major}.{sys.version_info.minor}",
282
330
  }