benchbox 0.1.0__py3-none-any.whl → 0.1.1__py3-none-any.whl

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 (728) hide show
  1. benchbox/__init__.py +1 -1
  2. benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query72.tpl +1 -1
  3. benchbox/_binaries/tpc-ds/{darwin-x86_64/query_templates/ansi.tpl → templates/query_templates/sqlserver.tpl} +1 -1
  4. benchbox/_binaries/tpc-ds/templates/query_variants/README +6 -0
  5. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query10.tpl → templates/query_variants/query10a.tpl} +13 -14
  6. benchbox/_binaries/tpc-ds/{darwin-x86_64/query_templates/query14.tpl → templates/query_variants/query14a.tpl} +30 -26
  7. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query18.tpl → templates/query_variants/query18a.tpl} +40 -19
  8. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query22.tpl → templates/query_variants/query22a.tpl} +31 -9
  9. benchbox/_binaries/tpc-ds/{darwin-x86_64/query_templates/query27.tpl → templates/query_variants/query27a.tpl} +23 -10
  10. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query35.tpl → templates/query_variants/query35a.tpl} +9 -8
  11. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query36.tpl → templates/query_variants/query36a.tpl} +24 -12
  12. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query51.tpl → templates/query_variants/query51a.tpl} +37 -20
  13. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query5.tpl → templates/query_variants/query5a.tpl} +15 -10
  14. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query67.tpl → templates/query_variants/query67a.tpl} +46 -18
  15. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query70.tpl → templates/query_variants/query70a.tpl} +31 -27
  16. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query77.tpl → templates/query_variants/query77a.tpl} +22 -15
  17. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query80.tpl → templates/query_variants/query80a.tpl} +22 -8
  18. benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query86.tpl → templates/query_variants/query86a.tpl} +22 -13
  19. benchbox/_binaries/tpc-h/templates/dists.dss +836 -0
  20. benchbox/_binaries/tpc-h/templates/queries/1.sql +28 -0
  21. benchbox/_binaries/tpc-h/templates/queries/10.sql +38 -0
  22. benchbox/_binaries/tpc-h/templates/queries/11.sql +34 -0
  23. benchbox/_binaries/tpc-h/templates/queries/12.sql +35 -0
  24. benchbox/_binaries/tpc-h/templates/queries/13.sql +27 -0
  25. benchbox/_binaries/tpc-h/templates/queries/14.sql +20 -0
  26. benchbox/_binaries/tpc-h/templates/queries/15.sql +40 -0
  27. benchbox/_binaries/tpc-h/templates/queries/16.sql +37 -0
  28. benchbox/_binaries/tpc-h/templates/queries/17.sql +24 -0
  29. benchbox/_binaries/tpc-h/templates/queries/18.sql +39 -0
  30. benchbox/_binaries/tpc-h/templates/queries/19.sql +42 -0
  31. benchbox/_binaries/tpc-h/templates/queries/2.sql +50 -0
  32. benchbox/_binaries/tpc-h/templates/queries/20.sql +44 -0
  33. benchbox/_binaries/tpc-h/templates/queries/21.sql +46 -0
  34. benchbox/_binaries/tpc-h/templates/queries/22.sql +44 -0
  35. benchbox/_binaries/tpc-h/templates/queries/3.sql +29 -0
  36. benchbox/_binaries/tpc-h/templates/queries/4.sql +28 -0
  37. benchbox/_binaries/tpc-h/templates/queries/5.sql +31 -0
  38. benchbox/_binaries/tpc-h/templates/queries/6.sql +16 -0
  39. benchbox/_binaries/tpc-h/templates/queries/7.sql +46 -0
  40. benchbox/_binaries/tpc-h/templates/queries/8.sql +44 -0
  41. benchbox/_binaries/tpc-h/templates/queries/9.sql +39 -0
  42. benchbox/_binaries/tpc-h/templates/variants/12a.sql +27 -0
  43. benchbox/_binaries/tpc-h/templates/variants/13a.sql +30 -0
  44. benchbox/_binaries/tpc-h/templates/variants/14a.sql +18 -0
  45. benchbox/_binaries/tpc-h/templates/variants/15a.sql +39 -0
  46. benchbox/_binaries/tpc-h/templates/variants/8a.sql +77 -0
  47. benchbox/base.py +88 -121
  48. benchbox/cli/benchmarks.py +3 -3
  49. benchbox/cli/commands/calculate_qphh.py +55 -14
  50. benchbox/cli/commands/checks.py +1 -4
  51. benchbox/cli/commands/convert.py +8 -3
  52. benchbox/cli/commands/metrics.py +55 -14
  53. benchbox/cli/commands/results.py +131 -3
  54. benchbox/cli/commands/run.py +157 -22
  55. benchbox/cli/commands/visualize.py +3 -3
  56. benchbox/cli/composite_params.py +1 -1
  57. benchbox/cli/config.py +13 -3
  58. benchbox/cli/database.py +3 -3
  59. benchbox/cli/dryrun.py +30 -4
  60. benchbox/cli/exceptions.py +2 -1
  61. benchbox/cli/execution_pipeline.py +2 -1
  62. benchbox/cli/orchestrator.py +25 -71
  63. benchbox/cli/tuning.py +1 -1
  64. benchbox/core/ai_primitives/benchmark.py +53 -0
  65. benchbox/core/ai_primitives/dataframe_operations.py +1217 -0
  66. benchbox/core/base_benchmark.py +90 -68
  67. benchbox/core/coffeeshop/queries.py +1 -1
  68. benchbox/core/coffeeshop/schema.py +1 -1
  69. benchbox/core/comparison/plotter.py +5 -4
  70. benchbox/core/dataframe/__init__.py +26 -0
  71. benchbox/core/dataframe/benchmark_suite.py +5 -4
  72. benchbox/core/dataframe/context.py +45 -0
  73. benchbox/core/dataframe/data_loader.py +180 -79
  74. benchbox/core/dataframe/maintenance_interface.py +866 -0
  75. benchbox/core/dryrun.py +152 -22
  76. benchbox/core/expected_results/registry.py +22 -5
  77. benchbox/core/manifest/io.py +4 -3
  78. benchbox/core/metadata_primitives/__init__.py +31 -0
  79. benchbox/core/metadata_primitives/benchmark.py +337 -0
  80. benchbox/core/metadata_primitives/dataframe_operations.py +1824 -0
  81. benchbox/core/platform_registry.py +134 -45
  82. benchbox/core/read_primitives/benchmark.py +56 -4
  83. benchbox/core/read_primitives/dataframe_queries.py +6547 -0
  84. benchbox/core/results/__init__.py +47 -6
  85. benchbox/core/results/builder.py +909 -0
  86. benchbox/core/results/database.py +5 -5
  87. benchbox/core/results/exporter.py +58 -96
  88. benchbox/core/results/filenames.py +102 -0
  89. benchbox/core/results/loader.py +10 -9
  90. benchbox/core/results/metrics.py +211 -0
  91. benchbox/core/results/models.py +3 -1
  92. benchbox/core/results/normalizer.py +346 -0
  93. benchbox/core/results/platform_info.py +235 -0
  94. benchbox/core/results/query_normalizer.py +200 -0
  95. benchbox/core/results/schema.py +368 -69
  96. benchbox/core/runner/conversion.py +2 -0
  97. benchbox/core/runner/dataframe_runner.py +135 -131
  98. benchbox/core/runner/runner.py +111 -18
  99. benchbox/core/schemas.py +145 -3
  100. benchbox/core/ssb/generator.py +14 -2
  101. benchbox/core/tpc_compliance.py +4 -4
  102. benchbox/core/tpc_metrics.py +9 -4
  103. benchbox/core/tpcdi/generator/manifest.py +15 -2
  104. benchbox/core/tpcds/benchmark/runner.py +3 -7
  105. benchbox/core/tpcds/c_tools.py +34 -28
  106. benchbox/core/tpcds/dataframe_queries/queries.py +44 -21
  107. benchbox/core/tpcds/generator/filesystem.py +23 -11
  108. benchbox/core/tpcds/generator/manager.py +3 -2
  109. benchbox/core/tpcds/maintenance_test.py +281 -0
  110. benchbox/core/tpcds/power_test.py +21 -11
  111. benchbox/core/tpcds/throughput_test.py +27 -9
  112. benchbox/core/tpcds_obt/etl/transformer.py +24 -5
  113. benchbox/core/tpch/dataframe_queries.py +46 -43
  114. benchbox/core/tpch/generator.py +21 -8
  115. benchbox/core/tpch/maintenance_test.py +87 -0
  116. benchbox/core/tpch/power_test.py +21 -5
  117. benchbox/core/tpch/queries.py +2 -7
  118. benchbox/core/tpch/streams.py +3 -19
  119. benchbox/core/transaction_primitives/benchmark.py +99 -0
  120. benchbox/core/transaction_primitives/dataframe_operations.py +1294 -0
  121. benchbox/core/transaction_primitives/generator.py +11 -4
  122. benchbox/core/visualization/__init__.py +2 -2
  123. benchbox/core/visualization/charts.py +4 -4
  124. benchbox/core/visualization/dependencies.py +1 -12
  125. benchbox/core/visualization/exporters.py +15 -26
  126. benchbox/core/visualization/result_plotter.py +90 -49
  127. benchbox/core/visualization/templates.py +6 -6
  128. benchbox/core/write_primitives/__init__.py +13 -0
  129. benchbox/core/write_primitives/benchmark.py +66 -0
  130. benchbox/core/write_primitives/dataframe_operations.py +912 -0
  131. benchbox/core/write_primitives/generator.py +11 -4
  132. benchbox/mcp/__init__.py +5 -1
  133. benchbox/mcp/errors.py +29 -0
  134. benchbox/mcp/resources/registry.py +12 -7
  135. benchbox/mcp/schemas.py +62 -0
  136. benchbox/mcp/server.py +17 -14
  137. benchbox/mcp/tools/__init__.py +3 -0
  138. benchbox/mcp/tools/analytics.py +550 -582
  139. benchbox/mcp/tools/benchmark.py +603 -611
  140. benchbox/mcp/tools/discovery.py +156 -205
  141. benchbox/mcp/tools/results.py +332 -533
  142. benchbox/mcp/tools/visualization.py +449 -0
  143. benchbox/platforms/__init__.py +740 -622
  144. benchbox/platforms/adapter_factory.py +6 -6
  145. benchbox/platforms/azure_synapse.py +3 -7
  146. benchbox/platforms/base/adapter.py +189 -49
  147. benchbox/platforms/base/cloud_spark/config.py +8 -0
  148. benchbox/platforms/base/cloud_spark/mixins.py +96 -0
  149. benchbox/platforms/base/cloud_spark/session.py +4 -2
  150. benchbox/platforms/base/cloud_spark/staging.py +15 -7
  151. benchbox/platforms/base/data_loading.py +315 -1
  152. benchbox/platforms/base/format_capabilities.py +37 -2
  153. benchbox/platforms/base/utils.py +6 -4
  154. benchbox/platforms/bigquery.py +5 -6
  155. benchbox/platforms/clickhouse_cloud.py +263 -0
  156. benchbox/platforms/databricks/adapter.py +16 -15
  157. benchbox/platforms/databricks/dataframe_adapter.py +4 -1
  158. benchbox/platforms/dataframe/__init__.py +31 -0
  159. benchbox/platforms/dataframe/benchmark_mixin.py +779 -0
  160. benchbox/platforms/dataframe/cudf_df.py +3 -3
  161. benchbox/platforms/dataframe/dask_df.py +3 -3
  162. benchbox/platforms/dataframe/datafusion_df.py +152 -15
  163. benchbox/platforms/dataframe/delta_lake_maintenance.py +341 -0
  164. benchbox/platforms/dataframe/ducklake_maintenance.py +402 -0
  165. benchbox/platforms/dataframe/expression_family.py +47 -8
  166. benchbox/platforms/dataframe/hudi_maintenance.py +437 -0
  167. benchbox/platforms/dataframe/iceberg_maintenance.py +605 -0
  168. benchbox/platforms/dataframe/modin_df.py +3 -3
  169. benchbox/platforms/dataframe/pandas_df.py +3 -3
  170. benchbox/platforms/dataframe/pandas_family.py +59 -8
  171. benchbox/platforms/dataframe/platform_checker.py +16 -49
  172. benchbox/platforms/dataframe/polars_df.py +14 -12
  173. benchbox/platforms/dataframe/polars_maintenance.py +630 -0
  174. benchbox/platforms/dataframe/pyspark_df.py +15 -0
  175. benchbox/platforms/dataframe/pyspark_maintenance.py +613 -0
  176. benchbox/platforms/datafusion.py +5 -6
  177. benchbox/platforms/duckdb.py +2 -1
  178. benchbox/platforms/fabric_warehouse.py +15 -15
  179. benchbox/platforms/firebolt.py +3 -2
  180. benchbox/platforms/influxdb/adapter.py +7 -3
  181. benchbox/platforms/motherduck.py +3 -2
  182. benchbox/platforms/onehouse/__init__.py +39 -0
  183. benchbox/platforms/onehouse/onehouse_client.py +509 -0
  184. benchbox/platforms/onehouse/quanton_adapter.py +646 -0
  185. benchbox/platforms/postgresql.py +5 -9
  186. benchbox/platforms/presto.py +2 -2
  187. benchbox/platforms/pyspark/session.py +3 -3
  188. benchbox/platforms/pyspark/sql_adapter.py +2 -3
  189. benchbox/platforms/redshift.py +7 -7
  190. benchbox/platforms/snowflake.py +4 -4
  191. benchbox/platforms/snowpark_connect.py +2 -1
  192. benchbox/platforms/trino.py +2 -2
  193. benchbox/release/__init__.py +17 -0
  194. benchbox/release/content_validation.py +745 -0
  195. benchbox/release/workflow.py +17 -0
  196. benchbox/utils/VERSION_MANAGEMENT.md +1 -1
  197. benchbox/utils/cloud_storage.py +7 -5
  198. benchbox/utils/compression.py +8 -8
  199. benchbox/utils/compression_mixin.py +2 -1
  200. benchbox/utils/data_validation.py +23 -14
  201. benchbox/utils/dependencies.py +47 -7
  202. benchbox/utils/file_format.py +407 -0
  203. benchbox/utils/format_converters/__init__.py +5 -1
  204. benchbox/utils/format_converters/ducklake_converter.py +227 -0
  205. benchbox/utils/format_converters/vortex_converter.py +168 -0
  206. benchbox/utils/tpc_compilation.py +43 -0
  207. benchbox/utils/version.py +14 -2
  208. {benchbox-0.1.0.dist-info → benchbox-0.1.1.dist-info}/METADATA +15 -15
  209. benchbox-0.1.1.dist-info/RECORD +839 -0
  210. {benchbox-0.1.0.dist-info → benchbox-0.1.1.dist-info}/WHEEL +1 -1
  211. benchbox/_binaries/tpc-ds/darwin-arm64/query_templates/sqlserver.tpl +0 -37
  212. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/README +0 -4
  213. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/db2.tpl +0 -38
  214. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/netezza.tpl +0 -38
  215. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/oracle.tpl +0 -38
  216. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query1.tpl +0 -62
  217. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query10.tpl +0 -98
  218. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query11.tpl +0 -119
  219. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query12.tpl +0 -72
  220. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query13.tpl +0 -89
  221. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query15.tpl +0 -56
  222. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query16.tpl +0 -76
  223. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query17.tpl +0 -80
  224. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query18.tpl +0 -73
  225. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query19.tpl +0 -64
  226. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query2.tpl +0 -94
  227. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query20.tpl +0 -67
  228. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query21.tpl +0 -65
  229. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query22.tpl +0 -54
  230. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query23.tpl +0 -144
  231. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query24.tpl +0 -147
  232. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query25.tpl +0 -84
  233. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query26.tpl +0 -61
  234. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query28.tpl +0 -90
  235. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query29.tpl +0 -85
  236. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query3.tpl +0 -58
  237. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query30.tpl +0 -66
  238. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query31.tpl +0 -88
  239. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query32.tpl +0 -65
  240. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query33.tpl +0 -113
  241. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query34.tpl +0 -77
  242. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query35.tpl +0 -98
  243. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query36.tpl +0 -74
  244. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query37.tpl +0 -57
  245. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query38.tpl +0 -58
  246. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query39.tpl +0 -93
  247. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query4.tpl +0 -154
  248. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query40.tpl +0 -63
  249. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query41.tpl +0 -90
  250. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query42.tpl +0 -64
  251. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query43.tpl +0 -55
  252. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query44.tpl +0 -72
  253. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query45.tpl +0 -56
  254. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query46.tpl +0 -78
  255. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query47.tpl +0 -89
  256. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query48.tpl +0 -104
  257. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query49.tpl +0 -164
  258. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query5.tpl +0 -165
  259. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query50.tpl +0 -96
  260. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query51.tpl +0 -80
  261. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query52.tpl +0 -59
  262. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query53.tpl +0 -64
  263. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query54.tpl +0 -95
  264. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query55.tpl +0 -52
  265. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query56.tpl +0 -108
  266. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query57.tpl +0 -87
  267. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query58.tpl +0 -101
  268. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query59.tpl +0 -79
  269. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query6.tpl +0 -62
  270. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query60.tpl +0 -115
  271. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query61.tpl +0 -83
  272. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query62.tpl +0 -71
  273. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query63.tpl +0 -64
  274. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query64.tpl +0 -157
  275. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query65.tpl +0 -62
  276. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query66.tpl +0 -261
  277. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query67.tpl +0 -81
  278. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query68.tpl +0 -82
  279. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query69.tpl +0 -85
  280. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query7.tpl +0 -60
  281. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query70.tpl +0 -73
  282. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query71.tpl +0 -74
  283. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query72.tpl +0 -67
  284. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query73.tpl +0 -69
  285. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query74.tpl +0 -99
  286. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query75.tpl +0 -107
  287. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query76.tpl +0 -64
  288. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query77.tpl +0 -145
  289. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query78.tpl +0 -94
  290. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query79.tpl +0 -60
  291. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query8.tpl +0 -144
  292. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query80.tpl +0 -131
  293. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query81.tpl +0 -68
  294. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query82.tpl +0 -56
  295. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query83.tpl +0 -104
  296. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query84.tpl +0 -58
  297. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query85.tpl +0 -121
  298. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query86.tpl +0 -60
  299. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query87.tpl +0 -56
  300. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query88.tpl +0 -128
  301. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query89.tpl +0 -75
  302. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query9.tpl +0 -88
  303. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query90.tpl +0 -58
  304. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query91.tpl +0 -68
  305. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query92.tpl +0 -68
  306. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query93.tpl +0 -53
  307. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query94.tpl +0 -67
  308. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query95.tpl +0 -71
  309. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query96.tpl +0 -52
  310. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query97.tpl +0 -62
  311. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query98.tpl +0 -70
  312. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query99.tpl +0 -69
  313. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/sqlserver.tpl +0 -37
  314. benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/templates.lst +0 -99
  315. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/README +0 -4
  316. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/ansi.tpl +0 -38
  317. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/db2.tpl +0 -38
  318. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/netezza.tpl +0 -38
  319. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/oracle.tpl +0 -38
  320. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query1.tpl +0 -62
  321. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query11.tpl +0 -119
  322. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query12.tpl +0 -72
  323. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query13.tpl +0 -89
  324. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query14.tpl +0 -247
  325. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query15.tpl +0 -56
  326. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query16.tpl +0 -76
  327. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query17.tpl +0 -80
  328. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query19.tpl +0 -64
  329. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query2.tpl +0 -94
  330. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query20.tpl +0 -67
  331. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query21.tpl +0 -65
  332. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query23.tpl +0 -144
  333. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query24.tpl +0 -147
  334. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query25.tpl +0 -84
  335. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query26.tpl +0 -61
  336. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query27.tpl +0 -68
  337. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query28.tpl +0 -90
  338. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query29.tpl +0 -85
  339. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query3.tpl +0 -58
  340. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query30.tpl +0 -66
  341. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query31.tpl +0 -88
  342. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query32.tpl +0 -65
  343. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query33.tpl +0 -113
  344. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query34.tpl +0 -77
  345. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query37.tpl +0 -57
  346. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query38.tpl +0 -58
  347. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query39.tpl +0 -93
  348. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query4.tpl +0 -154
  349. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query40.tpl +0 -63
  350. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query41.tpl +0 -90
  351. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query42.tpl +0 -64
  352. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query43.tpl +0 -55
  353. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query44.tpl +0 -72
  354. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query45.tpl +0 -56
  355. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query46.tpl +0 -78
  356. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query47.tpl +0 -89
  357. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query48.tpl +0 -104
  358. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query49.tpl +0 -164
  359. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query50.tpl +0 -96
  360. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query52.tpl +0 -59
  361. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query53.tpl +0 -64
  362. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query54.tpl +0 -95
  363. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query55.tpl +0 -52
  364. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query56.tpl +0 -108
  365. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query57.tpl +0 -87
  366. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query58.tpl +0 -101
  367. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query59.tpl +0 -79
  368. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query6.tpl +0 -62
  369. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query60.tpl +0 -115
  370. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query61.tpl +0 -83
  371. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query62.tpl +0 -71
  372. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query63.tpl +0 -64
  373. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query64.tpl +0 -157
  374. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query65.tpl +0 -62
  375. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query66.tpl +0 -261
  376. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query68.tpl +0 -82
  377. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query69.tpl +0 -85
  378. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query7.tpl +0 -60
  379. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query71.tpl +0 -74
  380. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query72.tpl +0 -67
  381. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query73.tpl +0 -69
  382. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query74.tpl +0 -99
  383. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query75.tpl +0 -107
  384. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query76.tpl +0 -64
  385. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query78.tpl +0 -94
  386. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query79.tpl +0 -60
  387. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query8.tpl +0 -144
  388. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query81.tpl +0 -68
  389. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query82.tpl +0 -56
  390. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query83.tpl +0 -104
  391. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query84.tpl +0 -58
  392. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query85.tpl +0 -121
  393. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query87.tpl +0 -56
  394. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query88.tpl +0 -128
  395. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query89.tpl +0 -75
  396. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query9.tpl +0 -88
  397. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query90.tpl +0 -58
  398. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query91.tpl +0 -68
  399. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query92.tpl +0 -68
  400. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query93.tpl +0 -53
  401. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query94.tpl +0 -67
  402. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query95.tpl +0 -71
  403. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query96.tpl +0 -52
  404. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query97.tpl +0 -62
  405. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query98.tpl +0 -70
  406. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query99.tpl +0 -69
  407. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/sqlserver.tpl +0 -37
  408. benchbox/_binaries/tpc-ds/linux-arm64/query_templates/templates.lst +0 -99
  409. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/README +0 -4
  410. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/ansi.tpl +0 -38
  411. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/db2.tpl +0 -38
  412. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/netezza.tpl +0 -38
  413. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/oracle.tpl +0 -38
  414. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query1.tpl +0 -62
  415. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query10.tpl +0 -98
  416. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query11.tpl +0 -119
  417. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query12.tpl +0 -72
  418. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query13.tpl +0 -89
  419. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query14.tpl +0 -247
  420. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query15.tpl +0 -56
  421. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query16.tpl +0 -76
  422. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query17.tpl +0 -80
  423. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query18.tpl +0 -73
  424. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query19.tpl +0 -64
  425. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query2.tpl +0 -94
  426. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query20.tpl +0 -67
  427. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query21.tpl +0 -65
  428. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query22.tpl +0 -54
  429. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query23.tpl +0 -144
  430. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query24.tpl +0 -147
  431. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query25.tpl +0 -84
  432. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query26.tpl +0 -61
  433. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query27.tpl +0 -68
  434. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query28.tpl +0 -90
  435. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query29.tpl +0 -85
  436. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query3.tpl +0 -58
  437. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query30.tpl +0 -66
  438. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query31.tpl +0 -88
  439. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query32.tpl +0 -65
  440. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query33.tpl +0 -113
  441. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query34.tpl +0 -77
  442. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query35.tpl +0 -98
  443. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query36.tpl +0 -74
  444. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query37.tpl +0 -57
  445. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query38.tpl +0 -58
  446. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query39.tpl +0 -93
  447. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query4.tpl +0 -154
  448. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query40.tpl +0 -63
  449. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query41.tpl +0 -90
  450. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query42.tpl +0 -64
  451. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query43.tpl +0 -55
  452. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query44.tpl +0 -72
  453. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query45.tpl +0 -56
  454. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query46.tpl +0 -78
  455. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query47.tpl +0 -89
  456. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query48.tpl +0 -104
  457. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query49.tpl +0 -164
  458. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query5.tpl +0 -165
  459. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query50.tpl +0 -96
  460. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query51.tpl +0 -80
  461. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query52.tpl +0 -59
  462. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query53.tpl +0 -64
  463. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query54.tpl +0 -95
  464. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query55.tpl +0 -52
  465. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query56.tpl +0 -108
  466. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query57.tpl +0 -87
  467. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query58.tpl +0 -101
  468. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query59.tpl +0 -79
  469. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query6.tpl +0 -62
  470. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query60.tpl +0 -115
  471. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query61.tpl +0 -83
  472. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query62.tpl +0 -71
  473. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query63.tpl +0 -64
  474. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query64.tpl +0 -157
  475. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query65.tpl +0 -62
  476. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query66.tpl +0 -261
  477. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query67.tpl +0 -81
  478. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query68.tpl +0 -82
  479. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query69.tpl +0 -85
  480. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query7.tpl +0 -60
  481. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query70.tpl +0 -73
  482. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query71.tpl +0 -74
  483. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query72.tpl +0 -67
  484. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query73.tpl +0 -69
  485. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query74.tpl +0 -99
  486. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query75.tpl +0 -107
  487. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query76.tpl +0 -64
  488. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query77.tpl +0 -145
  489. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query78.tpl +0 -94
  490. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query79.tpl +0 -60
  491. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query8.tpl +0 -144
  492. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query80.tpl +0 -131
  493. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query81.tpl +0 -68
  494. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query82.tpl +0 -56
  495. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query83.tpl +0 -104
  496. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query84.tpl +0 -58
  497. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query85.tpl +0 -121
  498. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query86.tpl +0 -60
  499. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query87.tpl +0 -56
  500. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query88.tpl +0 -128
  501. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query89.tpl +0 -75
  502. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query9.tpl +0 -88
  503. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query90.tpl +0 -58
  504. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query91.tpl +0 -68
  505. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query92.tpl +0 -68
  506. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query93.tpl +0 -53
  507. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query94.tpl +0 -67
  508. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query95.tpl +0 -71
  509. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query96.tpl +0 -52
  510. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query97.tpl +0 -62
  511. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query98.tpl +0 -70
  512. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query99.tpl +0 -69
  513. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/sqlserver.tpl +0 -37
  514. benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/templates.lst +0 -99
  515. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/README +0 -4
  516. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/ansi.tpl +0 -38
  517. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/db2.tpl +0 -38
  518. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/netezza.tpl +0 -38
  519. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/oracle.tpl +0 -38
  520. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query1.tpl +0 -62
  521. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query10.tpl +0 -98
  522. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query11.tpl +0 -119
  523. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query12.tpl +0 -72
  524. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query13.tpl +0 -89
  525. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query14.tpl +0 -247
  526. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query15.tpl +0 -56
  527. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query16.tpl +0 -76
  528. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query17.tpl +0 -80
  529. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query18.tpl +0 -73
  530. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query19.tpl +0 -64
  531. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query2.tpl +0 -94
  532. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query20.tpl +0 -67
  533. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query21.tpl +0 -65
  534. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query22.tpl +0 -54
  535. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query23.tpl +0 -144
  536. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query24.tpl +0 -147
  537. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query25.tpl +0 -84
  538. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query26.tpl +0 -61
  539. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query27.tpl +0 -68
  540. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query28.tpl +0 -90
  541. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query29.tpl +0 -85
  542. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query3.tpl +0 -58
  543. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query30.tpl +0 -66
  544. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query31.tpl +0 -88
  545. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query32.tpl +0 -65
  546. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query33.tpl +0 -113
  547. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query34.tpl +0 -77
  548. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query35.tpl +0 -98
  549. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query36.tpl +0 -74
  550. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query37.tpl +0 -57
  551. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query38.tpl +0 -58
  552. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query39.tpl +0 -93
  553. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query4.tpl +0 -154
  554. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query40.tpl +0 -63
  555. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query41.tpl +0 -90
  556. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query42.tpl +0 -64
  557. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query43.tpl +0 -55
  558. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query44.tpl +0 -72
  559. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query45.tpl +0 -56
  560. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query46.tpl +0 -78
  561. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query47.tpl +0 -89
  562. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query48.tpl +0 -104
  563. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query49.tpl +0 -164
  564. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query5.tpl +0 -165
  565. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query50.tpl +0 -96
  566. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query51.tpl +0 -80
  567. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query52.tpl +0 -59
  568. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query53.tpl +0 -64
  569. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query54.tpl +0 -95
  570. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query55.tpl +0 -52
  571. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query56.tpl +0 -108
  572. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query57.tpl +0 -87
  573. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query58.tpl +0 -101
  574. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query59.tpl +0 -79
  575. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query6.tpl +0 -62
  576. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query60.tpl +0 -115
  577. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query61.tpl +0 -83
  578. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query62.tpl +0 -71
  579. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query63.tpl +0 -64
  580. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query64.tpl +0 -157
  581. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query65.tpl +0 -62
  582. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query66.tpl +0 -261
  583. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query67.tpl +0 -81
  584. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query68.tpl +0 -82
  585. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query69.tpl +0 -85
  586. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query7.tpl +0 -60
  587. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query70.tpl +0 -73
  588. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query71.tpl +0 -74
  589. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query72.tpl +0 -67
  590. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query73.tpl +0 -69
  591. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query74.tpl +0 -99
  592. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query75.tpl +0 -107
  593. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query76.tpl +0 -64
  594. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query77.tpl +0 -145
  595. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query78.tpl +0 -94
  596. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query79.tpl +0 -60
  597. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query8.tpl +0 -144
  598. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query80.tpl +0 -131
  599. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query81.tpl +0 -68
  600. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query82.tpl +0 -56
  601. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query83.tpl +0 -104
  602. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query84.tpl +0 -58
  603. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query85.tpl +0 -121
  604. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query86.tpl +0 -60
  605. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query87.tpl +0 -56
  606. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query88.tpl +0 -128
  607. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query89.tpl +0 -75
  608. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query9.tpl +0 -88
  609. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query90.tpl +0 -58
  610. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query91.tpl +0 -68
  611. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query92.tpl +0 -68
  612. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query93.tpl +0 -53
  613. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query94.tpl +0 -67
  614. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query95.tpl +0 -71
  615. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query96.tpl +0 -52
  616. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query97.tpl +0 -62
  617. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query98.tpl +0 -70
  618. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query99.tpl +0 -69
  619. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/sqlserver.tpl +0 -37
  620. benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/templates.lst +0 -99
  621. benchbox-0.1.0.dist-info/RECORD +0 -1192
  622. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/README +0 -0
  623. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/ansi.tpl +0 -0
  624. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/db2.tpl +0 -0
  625. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/netezza.tpl +0 -0
  626. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/oracle.tpl +0 -0
  627. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query1.tpl +0 -0
  628. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query10.tpl +0 -0
  629. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query11.tpl +0 -0
  630. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query12.tpl +0 -0
  631. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query13.tpl +0 -0
  632. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query14.tpl +0 -0
  633. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query15.tpl +0 -0
  634. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query16.tpl +0 -0
  635. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query17.tpl +0 -0
  636. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query18.tpl +0 -0
  637. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query19.tpl +0 -0
  638. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query2.tpl +0 -0
  639. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query20.tpl +0 -0
  640. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query21.tpl +0 -0
  641. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query22.tpl +0 -0
  642. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query23.tpl +0 -0
  643. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query24.tpl +0 -0
  644. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query25.tpl +0 -0
  645. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query26.tpl +0 -0
  646. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query27.tpl +0 -0
  647. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query28.tpl +0 -0
  648. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query29.tpl +0 -0
  649. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query3.tpl +0 -0
  650. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query30.tpl +0 -0
  651. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query31.tpl +0 -0
  652. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query32.tpl +0 -0
  653. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query33.tpl +0 -0
  654. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query34.tpl +0 -0
  655. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query35.tpl +0 -0
  656. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query36.tpl +0 -0
  657. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query37.tpl +0 -0
  658. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query38.tpl +0 -0
  659. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query39.tpl +0 -0
  660. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query4.tpl +0 -0
  661. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query40.tpl +0 -0
  662. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query41.tpl +0 -0
  663. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query42.tpl +0 -0
  664. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query43.tpl +0 -0
  665. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query44.tpl +0 -0
  666. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query45.tpl +0 -0
  667. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query46.tpl +0 -0
  668. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query47.tpl +0 -0
  669. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query48.tpl +0 -0
  670. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query49.tpl +0 -0
  671. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query5.tpl +0 -0
  672. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query50.tpl +0 -0
  673. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query51.tpl +0 -0
  674. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query52.tpl +0 -0
  675. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query53.tpl +0 -0
  676. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query54.tpl +0 -0
  677. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query55.tpl +0 -0
  678. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query56.tpl +0 -0
  679. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query57.tpl +0 -0
  680. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query58.tpl +0 -0
  681. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query59.tpl +0 -0
  682. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query6.tpl +0 -0
  683. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query60.tpl +0 -0
  684. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query61.tpl +0 -0
  685. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query62.tpl +0 -0
  686. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query63.tpl +0 -0
  687. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query64.tpl +0 -0
  688. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query65.tpl +0 -0
  689. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query66.tpl +0 -0
  690. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query67.tpl +0 -0
  691. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query68.tpl +0 -0
  692. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query69.tpl +0 -0
  693. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query7.tpl +0 -0
  694. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query70.tpl +0 -0
  695. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query71.tpl +0 -0
  696. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query73.tpl +0 -0
  697. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query74.tpl +0 -0
  698. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query75.tpl +0 -0
  699. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query76.tpl +0 -0
  700. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query77.tpl +0 -0
  701. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query78.tpl +0 -0
  702. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query79.tpl +0 -0
  703. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query8.tpl +0 -0
  704. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query80.tpl +0 -0
  705. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query81.tpl +0 -0
  706. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query82.tpl +0 -0
  707. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query83.tpl +0 -0
  708. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query84.tpl +0 -0
  709. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query85.tpl +0 -0
  710. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query86.tpl +0 -0
  711. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query87.tpl +0 -0
  712. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query88.tpl +0 -0
  713. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query89.tpl +0 -0
  714. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query9.tpl +0 -0
  715. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query90.tpl +0 -0
  716. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query91.tpl +0 -0
  717. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query92.tpl +0 -0
  718. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query93.tpl +0 -0
  719. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query94.tpl +0 -0
  720. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query95.tpl +0 -0
  721. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query96.tpl +0 -0
  722. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query97.tpl +0 -0
  723. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query98.tpl +0 -0
  724. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query99.tpl +0 -0
  725. /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/templates.lst +0 -0
  726. {benchbox-0.1.0.dist-info → benchbox-0.1.1.dist-info}/entry_points.txt +0 -0
  727. {benchbox-0.1.0.dist-info → benchbox-0.1.1.dist-info}/licenses/LICENSE +0 -0
  728. {benchbox-0.1.0.dist-info → benchbox-0.1.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,745 @@
1
+ """Content validation for docs and blog prior to release.
2
+
3
+ This module checks markdown content for style guide violations that should
4
+ be caught before publication. Validates against BenchBox's voice and style
5
+ guidelines documented in _blog/BenchBox_Blog_Style_Guide.md.
6
+
7
+ Rule Categories:
8
+ - PUNCTUATION: Prohibited characters (em-dash, en-dash)
9
+ - VAGUE_CLAIMS: Unquantified statements that need specific data
10
+ - MARKETING: Corporate/marketing language to avoid
11
+ - HEDGING: Excessive hedging that undermines confidence
12
+ - CLICHE: Overused phrases that weaken writing
13
+ - PLATFORM_ADVOCACY: Biased language about specific platforms
14
+ - VOICE: First-person singular (use "we" not "I")
15
+ - RESTRICTED_VENDOR: Vendors with restrictive benchmark licensing (DeWitt clause)
16
+
17
+ Exception Mechanisms:
18
+ - VALIDATED_EXCEPTIONS: File-level exceptions for known, reviewed content
19
+ (e.g., SQLGlot dialect docs that legitimately mention Oracle)
20
+ - Inline directives: Add <!-- content-ok: category --> to suppress warnings
21
+ on that line or the following line (e.g., <!-- content-ok: restricted_vendor -->)
22
+
23
+ These rules are integrated into the release automation process and can also
24
+ be run standalone for pre-commit validation.
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import fnmatch
30
+ import re
31
+ from collections.abc import Sequence
32
+ from dataclasses import dataclass, field
33
+ from enum import Enum
34
+ from pathlib import Path
35
+
36
+ # =============================================================================
37
+ # Rule Severity Levels
38
+ # =============================================================================
39
+
40
+
41
+ class Severity(Enum):
42
+ """Severity level for content violations."""
43
+
44
+ ERROR = "error" # Must fix before release
45
+ WARNING = "warning" # Should fix, but can proceed
46
+ SUGGESTION = "suggestion" # Consider fixing
47
+
48
+
49
+ # =============================================================================
50
+ # Punctuation Rules (ERROR)
51
+ # =============================================================================
52
+
53
+ # Unicode code points for prohibited dash characters
54
+ EM_DASH = "\u2014" # -
55
+ EN_DASH = "\u2013" # –
56
+
57
+ PUNCTUATION_RULES: list[tuple[str, str, str]] = [
58
+ (re.escape(EM_DASH), "em-dash (-)", "Use comma, colon, or hyphen instead"),
59
+ (re.escape(EN_DASH), "en-dash (–)", "Use hyphen (-) for ranges"),
60
+ ]
61
+
62
+ # =============================================================================
63
+ # Vague Claims Rules (WARNING)
64
+ # BenchBox principle: "Lead with Data, Not Opinions"
65
+ # =============================================================================
66
+
67
+ VAGUE_CLAIMS_RULES: list[tuple[str, str, str]] = [
68
+ (r"\bmuch faster\b", "much faster", "Add specific numbers: '2.3x faster' or '45% reduction'"),
69
+ (r"\bmuch slower\b", "much slower", "Add specific numbers: '3x slower' or 'added 2.1s overhead'"),
70
+ (r"\bsignificantly better\b", "significantly better", "Quantify the improvement with metrics"),
71
+ (r"\bsignificantly worse\b", "significantly worse", "Quantify the difference with metrics"),
72
+ (r"\bsignificantly faster\b", "significantly faster", "Quantify: '2.3x faster' or 'completed in 45s vs 120s'"),
73
+ (r"\bsignificantly slower\b", "significantly slower", "Quantify: '3x slower' or 'added 75s overhead'"),
74
+ (r"\blarge dataset\b", "large dataset", "Specify size: '1.1B rows, 170GB' or 'TPC-H SF100'"),
75
+ (r"\bsmall dataset\b", "small dataset", "Specify size: '10K rows' or 'TPC-H SF0.01'"),
76
+ (r"\bhuge improvement\b", "huge improvement", "Quantify: '47% reduction' or '3.2x speedup'"),
77
+ (r"\bbetter performance\b", "better performance", "Add metrics: 'completed in 45s' or '2.3x throughput'"),
78
+ (r"\bpoor performance\b", "poor performance", "Add metrics: 'took 3 minutes' or 'only 100 rows/sec'"),
79
+ (r"\bmany users\b", "many users", "Specify: '10,000+ users' or 'majority of respondents'"),
80
+ (r"\bmost databases\b", "most databases", "Specify which ones: 'PostgreSQL, MySQL, and DuckDB'"),
81
+ (r"\brecently\b", "recently", "Specify when: 'in January 2026' or 'in v0.2.0'"),
82
+ (r"\ba lot of\b", "a lot of", "Be specific: use actual numbers or percentages"),
83
+ (r"\bvery fast\b", "very fast", "Quantify: 'completed in 2.3s' or 'processes 1M rows/sec'"),
84
+ (r"\bvery slow\b", "very slow", "Quantify: 'took 45 minutes' or 'only 100 rows/sec'"),
85
+ (r"\bhigh performance\b", "high performance", "Add metrics: 'processes 10M rows/sec'"),
86
+ (r"\blow latency\b", "low latency", "Quantify: 'p99 latency of 12ms'"),
87
+ (r"\bhigh latency\b", "high latency", "Quantify: 'p99 latency exceeded 500ms'"),
88
+ ]
89
+
90
+ # =============================================================================
91
+ # Marketing/Corporate Language Rules (WARNING)
92
+ # BenchBox anti-pattern: "Marketing-Speak"
93
+ # =============================================================================
94
+
95
+ MARKETING_RULES: list[tuple[str, str, str]] = [
96
+ (r"\brevolutionary\b", "revolutionary", "Describe what it actually does instead"),
97
+ (r"\bgame[- ]?changing\b", "game-changing", "Describe the specific improvement"),
98
+ (r"\bworld[- ]?class\b", "world-class", "Use specific metrics or comparisons"),
99
+ (r"\bcutting[- ]?edge\b", "cutting-edge", "Describe the specific innovation"),
100
+ (r"\bnext[- ]?generation\b", "next-generation", "Describe what's different"),
101
+ (r"\bindustry[- ]?leading\b", "industry-leading", "Provide supporting data"),
102
+ (r"\bpassionate about\b", "passionate about", "Show don't tell: describe actions"),
103
+ (r"\bleverage\b", "leverage", "Use 'use' instead"),
104
+ (r"\bsynergy\b", "synergy", "Be specific about the benefit"),
105
+ (r"\bparadigm shift\b", "paradigm shift", "Describe the actual change"),
106
+ (r"\bdisruptive\b", "disruptive", "Describe the specific impact"),
107
+ (r"\binnovative solution\b", "innovative solution", "Describe what it does"),
108
+ (r"\bunlock the power\b", "unlock the power", "Be specific about capabilities"),
109
+ (r"\bseamless integration\b", "seamless integration", "Describe the integration process"),
110
+ (r"\brobust platform\b", "robust platform", "Describe specific reliability features"),
111
+ (r"\bbest[- ]?in[- ]?class\b", "best-in-class", "Provide comparative metrics"),
112
+ (r"\benterprise[- ]?grade\b", "enterprise-grade", "Describe specific features"),
113
+ (r"\bmission[- ]?critical\b", "mission-critical", "Be specific about requirements"),
114
+ (r"\bturnkey solution\b", "turnkey solution", "Describe what's included"),
115
+ (r"\bscalable solution\b", "scalable solution", "Describe scaling characteristics"),
116
+ (r"\bholistic approach\b", "holistic approach", "Be specific about methodology"),
117
+ (r"\baction(able)? insights?\b", "actionable insights", "Describe what users can do"),
118
+ (r"\bdata[- ]?driven\b", "data-driven", "Show the data instead"),
119
+ ]
120
+
121
+ # =============================================================================
122
+ # Hedging Phrases Rules (SUGGESTION)
123
+ # BenchBox anti-pattern: "Hedging Everything"
124
+ # =============================================================================
125
+
126
+ HEDGING_RULES: list[tuple[str, str, str]] = [
127
+ (r"\bit might possibly\b", "it might possibly", "Be more direct about findings"),
128
+ (r"\bperhaps maybe\b", "perhaps maybe", "Choose one or be direct"),
129
+ (r"\bsome might argue\b", "some might argue", "State the argument directly"),
130
+ (r"\bit could potentially\b", "it could potentially", "State what it does or doesn't do"),
131
+ (r"\bseems like it could\b", "seems like it could", "Be direct: 'it does' or 'it doesn't'"),
132
+ (r"\bI think maybe\b", "I think maybe", "State findings directly (also use 'we')"),
133
+ (r"\bpossibly perhaps\b", "possibly perhaps", "Be direct about uncertainty"),
134
+ (r"\bkind of\b", "kind of", "Be precise or remove"),
135
+ (r"\bsort of\b", "sort of", "Be precise or remove"),
136
+ (r"\bmore or less\b", "more or less", "Provide specific numbers"),
137
+ (r"\bto some extent\b", "to some extent", "Quantify the extent"),
138
+ (r"\bin some cases\b", "in some cases", "Specify which cases"),
139
+ (r"\bfor the most part\b", "for the most part", "Quantify or be specific"),
140
+ ]
141
+
142
+ # =============================================================================
143
+ # Cliché Phrases Rules (SUGGESTION)
144
+ # =============================================================================
145
+
146
+ CLICHE_RULES: list[tuple[str, str, str]] = [
147
+ (r"\bat the end of the day\b", "at the end of the day", "Remove or be direct"),
148
+ (r"\blow[- ]?hanging fruit\b", "low-hanging fruit", "Describe the specific opportunity"),
149
+ (r"\bmove the needle\b", "move the needle", "Describe the specific impact"),
150
+ (r"\bboil the ocean\b", "boil the ocean", "Describe the scope concern"),
151
+ (r"\bdrink the kool[- ]?aid\b", "drink the kool-aid", "Describe the concern directly"),
152
+ (r"\bthink outside the box\b", "think outside the box", "Describe the creative approach"),
153
+ (r"\b10,?000[- ]?foot view\b", "10,000-foot view", "Use 'overview' or 'summary'"),
154
+ (r"\bdeep dive\b", "deep dive", "Use 'detailed analysis' or 'thorough examination'"),
155
+ (r"\bpain point\b", "pain point", "Describe the specific problem"),
156
+ (r"\bsecret sauce\b", "secret sauce", "Describe the specific technique"),
157
+ (r"\bsilver bullet\b", "silver bullet", "Describe limitations directly"),
158
+ (r"\bbandwidth\b", "bandwidth (for capacity)", "Use 'capacity' or 'availability'"),
159
+ (r"\bsync up\b", "sync up", "Use 'meet' or 'discuss'"),
160
+ (r"\bcircle back\b", "circle back", "Use 'follow up' or 'revisit'"),
161
+ (r"\bloop in\b", "loop in", "Use 'include' or 'involve'"),
162
+ ]
163
+
164
+ # =============================================================================
165
+ # Platform Advocacy Rules (ERROR)
166
+ # BenchBox principle: "Neutral on Platforms"
167
+ # =============================================================================
168
+
169
+ PLATFORM_ADVOCACY_RULES: list[tuple[str, str, str]] = [
170
+ (r"\bclearly superior\b", "clearly superior", "Present data neutrally without judgment"),
171
+ (r"\bclearly inferior\b", "clearly inferior", "Present data neutrally without judgment"),
172
+ (r"\bobviously better\b", "obviously better", "Let data speak for itself"),
173
+ (r"\bobviously worse\b", "obviously worse", "Let data speak for itself"),
174
+ (r"\bshould be avoided\b", "should be avoided", "Present trade-offs, not recommendations"),
175
+ (r"\bwaste of time\b", "waste of time", "Present findings without judgment"),
176
+ (r"\bthe best choice\b", "the best choice", "Present options without advocacy"),
177
+ (r"\bthe worst choice\b", "the worst choice", "Present options without advocacy"),
178
+ (r"\bthe only choice\b", "the only choice", "Present as 'one option' with trade-offs"),
179
+ (r"\bneeds to fix\b", "needs to fix", "Report findings, don't prescribe vendor actions"),
180
+ (r"\bfailing to\b", "failing to", "Use neutral language: 'does not currently'"),
181
+ (r"\bwake up\b", "wake up (to vendors)", "Avoid telling vendors what to do"),
182
+ (r"\babsolutely destroyed\b", "absolutely destroyed", "Use neutral comparison language"),
183
+ (r"\bcrushes\b", "crushes", "Use neutral comparison: 'outperformed by X%'"),
184
+ (r"\bwins hands down\b", "wins hands down", "Present data without declaring winners"),
185
+ (r"\bloses badly\b", "loses badly", "Present data without judgment"),
186
+ ]
187
+
188
+ # =============================================================================
189
+ # Voice Rules (WARNING)
190
+ # BenchBox principle: "Community-Inclusive" - use "we" not "I"
191
+ # =============================================================================
192
+
193
+ VOICE_RULES: list[tuple[str, str, str]] = [
194
+ (r"\bI think\b", "I think", "Use 'we found' or 'our testing showed'"),
195
+ (r"\bI believe\b", "I believe", "Use 'we believe' or state findings directly"),
196
+ (r"\bI found\b", "I found", "Use 'we found' or 'our analysis showed'"),
197
+ (r"\bIn my opinion\b", "In my opinion", "Use 'Based on our testing' or remove"),
198
+ (r"\bIn my experience\b", "In my experience", "Use 'In our experience' or 'Our testing showed'"),
199
+ (r"\bI recommend\b", "I recommend", "Use 'we recommend' or present as option"),
200
+ (r"\bI suggest\b", "I suggest", "Use 'we suggest' or 'consider'"),
201
+ (r"\bmy view\b", "my view", "Use 'our view' or 'the data suggests'"),
202
+ (r"\bmy testing\b", "my testing", "Use 'our testing'"),
203
+ (r"\bmy analysis\b", "my analysis", "Use 'our analysis'"),
204
+ ]
205
+
206
+ # =============================================================================
207
+ # Restricted Vendor Rules (WARNING)
208
+ # Vendors with restrictive benchmark licensing (DeWitt clause)
209
+ # =============================================================================
210
+
211
+ RESTRICTED_VENDOR_RULES: list[tuple[str, str, str]] = [
212
+ (
213
+ r"\bOracle\b",
214
+ "Oracle",
215
+ "Oracle may only be mentioned in reference to the DeWitt clause. "
216
+ "Remove or rephrase to avoid implying Oracle platform support.",
217
+ ),
218
+ ]
219
+
220
+ # =============================================================================
221
+ # Configuration
222
+ # =============================================================================
223
+
224
+ # Glob patterns for content directories to validate
225
+ DEFAULT_CONTENT_PATTERNS: Sequence[str] = (
226
+ "_blog/**/*.md",
227
+ "docs/**/*.md",
228
+ "docs/**/*.rst",
229
+ )
230
+
231
+ # Files to exclude from validation (relative to repo root)
232
+ VALIDATION_EXCLUDES: Sequence[str] = (
233
+ "docs/_build", # Built docs
234
+ "docs/_tags", # Generated tag pages
235
+ )
236
+
237
+ # =============================================================================
238
+ # Validated Exceptions
239
+ # Files with known, reviewed exceptions for specific rule categories.
240
+ # Format: {file_pattern: [categories]} - uses fnmatch for pattern matching
241
+ # =============================================================================
242
+
243
+ VALIDATED_EXCEPTIONS: dict[str, Sequence[str]] = {
244
+ # SQLGlot dialect documentation - describes SQLGlot's capabilities, not BenchBox support
245
+ "docs/usage/dialect-translation.md": ["restricted_vendor"],
246
+ "docs/reference/python-api/utilities.rst": ["restricted_vendor"],
247
+ # Comparative analysis of other benchmarking tools (HammerDB, etc.)
248
+ "docs/concepts/benchmarking-tools-compared.md": ["restricted_vendor"],
249
+ "_blog/**/hammerdb*.md": ["restricted_vendor"],
250
+ "_blog/**/benchmarking-tools-compared.md": ["restricted_vendor"],
251
+ # Free trial series mentions database connectors supported by cloud platforms
252
+ "_blog/free-trial-benchmarking/**/*.md": ["restricted_vendor"],
253
+ # Technical blog posts discussing database technology in general
254
+ "_blog/analytics-architecture/**/*.md": ["restricted_vendor"],
255
+ }
256
+
257
+ # Inline ignore directive pattern: <!-- content-ok: category1, category2 -->
258
+ # Can appear on the same line or the line immediately before
259
+ IGNORE_DIRECTIVE_PATTERN = re.compile(r"<!--\s*content-ok:\s*([^>]+?)\s*-->", re.IGNORECASE)
260
+
261
+ # Map rule categories to their rules and severity
262
+ RULE_CATEGORIES: dict[str, tuple[Severity, list[tuple[str, str, str]]]] = {
263
+ "punctuation": (Severity.ERROR, PUNCTUATION_RULES),
264
+ "platform_advocacy": (Severity.ERROR, PLATFORM_ADVOCACY_RULES),
265
+ "restricted_vendor": (Severity.WARNING, RESTRICTED_VENDOR_RULES),
266
+ "marketing": (Severity.WARNING, MARKETING_RULES),
267
+ "vague_claims": (Severity.WARNING, VAGUE_CLAIMS_RULES),
268
+ "voice": (Severity.WARNING, VOICE_RULES),
269
+ "hedging": (Severity.SUGGESTION, HEDGING_RULES),
270
+ "cliche": (Severity.SUGGESTION, CLICHE_RULES),
271
+ }
272
+
273
+
274
+ # =============================================================================
275
+ # Data Classes
276
+ # =============================================================================
277
+
278
+
279
+ @dataclass
280
+ class ContentViolation:
281
+ """A single content validation violation."""
282
+
283
+ file_path: Path
284
+ line_number: int
285
+ column: int
286
+ matched_text: str
287
+ context: str
288
+ rule: str
289
+ category: str
290
+ severity: Severity
291
+ suggestion: str
292
+
293
+ def __str__(self) -> str:
294
+ severity_prefix = {
295
+ Severity.ERROR: "❌",
296
+ Severity.WARNING: "⚠️ ",
297
+ Severity.SUGGESTION: "💡",
298
+ }
299
+ prefix = severity_prefix.get(self.severity, "")
300
+ return (
301
+ f"{prefix} {self.file_path}:{self.line_number}:{self.column}: "
302
+ f"'{self.matched_text}' [{self.category}]\n"
303
+ f" {self.context}\n"
304
+ f" → {self.suggestion}"
305
+ )
306
+
307
+
308
+ @dataclass
309
+ class ValidationResult:
310
+ """Result of content validation across files."""
311
+
312
+ violations: list[ContentViolation] = field(default_factory=list)
313
+ files_checked: int = 0
314
+ files_with_violations: int = 0
315
+
316
+ @property
317
+ def passed(self) -> bool:
318
+ """Check if validation passed (no errors)."""
319
+ return not any(v.severity == Severity.ERROR for v in self.violations)
320
+
321
+ @property
322
+ def error_count(self) -> int:
323
+ return sum(1 for v in self.violations if v.severity == Severity.ERROR)
324
+
325
+ @property
326
+ def warning_count(self) -> int:
327
+ return sum(1 for v in self.violations if v.severity == Severity.WARNING)
328
+
329
+ @property
330
+ def suggestion_count(self) -> int:
331
+ return sum(1 for v in self.violations if v.severity == Severity.SUGGESTION)
332
+
333
+ def summary(self) -> str:
334
+ if len(self.violations) == 0:
335
+ return f"✓ Content validation passed ({self.files_checked} files checked)"
336
+
337
+ parts = []
338
+ if self.error_count > 0:
339
+ parts.append(f"{self.error_count} error(s)")
340
+ if self.warning_count > 0:
341
+ parts.append(f"{self.warning_count} warning(s)")
342
+ if self.suggestion_count > 0:
343
+ parts.append(f"{self.suggestion_count} suggestion(s)")
344
+
345
+ status = "❌ FAILED" if not self.passed else "⚠️ WARNINGS"
346
+ return f"{status}: {', '.join(parts)} in {self.files_with_violations} file(s)"
347
+
348
+
349
+ # =============================================================================
350
+ # Validation Functions
351
+ # =============================================================================
352
+
353
+
354
+ def _should_skip_file(file_path: Path, repo_root: Path) -> bool:
355
+ """Check if a file should be skipped from validation.
356
+
357
+ Args:
358
+ file_path: Absolute path to the file
359
+ repo_root: Repository root path
360
+
361
+ Returns:
362
+ True if the file should be skipped
363
+ """
364
+ try:
365
+ rel_path = file_path.relative_to(repo_root)
366
+ except ValueError:
367
+ return True # File outside repo
368
+
369
+ rel_str = str(rel_path)
370
+ for exclude in VALIDATION_EXCLUDES:
371
+ if rel_str.startswith(exclude):
372
+ return True
373
+ return False
374
+
375
+
376
+ def _get_file_exceptions(file_path: Path, repo_root: Path) -> set[str]:
377
+ """Get categories that are excepted for a specific file.
378
+
379
+ Args:
380
+ file_path: Absolute path to the file
381
+ repo_root: Repository root path
382
+
383
+ Returns:
384
+ Set of category names that should be skipped for this file
385
+ """
386
+ try:
387
+ rel_path = file_path.relative_to(repo_root)
388
+ except ValueError:
389
+ return set()
390
+
391
+ rel_str = str(rel_path)
392
+ excepted_categories: set[str] = set()
393
+
394
+ for pattern, categories in VALIDATED_EXCEPTIONS.items():
395
+ if fnmatch.fnmatch(rel_str, pattern):
396
+ excepted_categories.update(categories)
397
+
398
+ return excepted_categories
399
+
400
+
401
+ def _has_inline_ignore(lines: list[str], line_idx: int, category: str) -> bool:
402
+ """Check if a line has an inline ignore directive for the given category.
403
+
404
+ Checks both the current line and the previous line for directives like:
405
+ <!-- content-ok: restricted_vendor -->
406
+ <!-- content-ok: restricted_vendor, marketing -->
407
+
408
+ Args:
409
+ lines: All lines in the file
410
+ line_idx: Index of the current line (0-based)
411
+ category: Category to check for
412
+
413
+ Returns:
414
+ True if the line should be ignored for this category
415
+ """
416
+ # Check current line and previous line
417
+ lines_to_check = [lines[line_idx]]
418
+ if line_idx > 0:
419
+ lines_to_check.append(lines[line_idx - 1])
420
+
421
+ for check_line in lines_to_check:
422
+ match = IGNORE_DIRECTIVE_PATTERN.search(check_line)
423
+ if match:
424
+ # Parse comma-separated categories
425
+ directive_categories = [c.strip().lower() for c in match.group(1).split(",")]
426
+ if category.lower() in directive_categories or "all" in directive_categories:
427
+ return True
428
+
429
+ return False
430
+
431
+
432
+ def _get_context(line: str, match_start: int, match_end: int, max_len: int = 60) -> str:
433
+ """Extract context around a match for display.
434
+
435
+ Args:
436
+ line: The full line of text
437
+ match_start: Start position of the match
438
+ match_end: End position of the match
439
+ max_len: Maximum context length
440
+
441
+ Returns:
442
+ Context string with ellipsis if truncated
443
+ """
444
+ half_context = (max_len - (match_end - match_start)) // 2
445
+ start = max(0, match_start - half_context)
446
+ end = min(len(line), match_end + half_context)
447
+ context = line[start:end]
448
+ if start > 0:
449
+ context = "..." + context
450
+ if end < len(line):
451
+ context = context + "..."
452
+ return context
453
+
454
+
455
+ def _is_example_line(line: str, lines: list[str], line_idx: int) -> bool:
456
+ """Check if a line is an example of what NOT to do (skip validation).
457
+
458
+ Style guides often show anti-patterns as examples. These lines should not
459
+ be flagged as violations since they're demonstrating bad practices to avoid.
460
+
461
+ Args:
462
+ line: The line to check
463
+ lines: All lines in the file (for context)
464
+ line_idx: Index of the current line (0-based)
465
+
466
+ Returns:
467
+ True if the line appears to be a "don't do this" example
468
+ """
469
+ stripped = line.strip()
470
+
471
+ # Lines starting with ❌ are explicit "don't" examples
472
+ # Also handle "- ❌" bullet points
473
+ if stripped.startswith("❌") or stripped.startswith("- ❌"):
474
+ return True
475
+
476
+ # Lines in "Don't" table columns (markdown tables with | Don't | or | ❌ |)
477
+ if "| ❌" in line or "|❌" in line:
478
+ return True
479
+
480
+ # Quoted examples showing bad writing (> ❌ "...")
481
+ if stripped.startswith(">") and "❌" in stripped:
482
+ return True
483
+
484
+ # Table rows after a "| Don't |" or "| If you wrote |" header row
485
+ # These tables show anti-patterns in the first column
486
+ if stripped.startswith("|"):
487
+ # Look back up to 20 lines for a header indicating anti-patterns
488
+ anti_pattern_headers = ["Don't", "If you wrote", "Instead of"]
489
+ for i in range(max(0, line_idx - 20), line_idx):
490
+ prev_line = lines[i].strip()
491
+ if prev_line.startswith("|"):
492
+ for header in anti_pattern_headers:
493
+ if header in prev_line:
494
+ return True
495
+
496
+ # Bullet points under "❌ **Don't**:" sections
497
+ # Look back for a "Don't" header
498
+ if stripped.startswith("-") and stripped.startswith('- "'):
499
+ for i in range(max(0, line_idx - 10), line_idx):
500
+ prev_line = lines[i].strip()
501
+ if "Don't" in prev_line and ("❌" in prev_line or "**Don't**" in prev_line):
502
+ return True
503
+
504
+ # Blockquotes showing bad examples (lines starting with >)
505
+ # Check if preceded by a "Bad" or "Don't" label
506
+ if stripped.startswith(">"):
507
+ for i in range(max(0, line_idx - 3), line_idx):
508
+ prev_line = lines[i].strip()
509
+ if "**Bad**" in prev_line or "Bad:" in prev_line or "Don't" in prev_line:
510
+ return True
511
+
512
+ return False
513
+
514
+
515
+ def _find_violations_for_rules(
516
+ content: str,
517
+ file_path: Path,
518
+ category: str,
519
+ severity: Severity,
520
+ rules: list[tuple[str, str, str]],
521
+ ) -> list[ContentViolation]:
522
+ """Find violations for a set of rules.
523
+
524
+ Args:
525
+ content: File content to check
526
+ file_path: Path to the file (for error reporting)
527
+ category: Rule category name
528
+ severity: Severity level for these rules
529
+ rules: List of (pattern, display_name, suggestion) tuples
530
+
531
+ Returns:
532
+ List of violations found
533
+ """
534
+ violations: list[ContentViolation] = []
535
+ lines = content.split("\n")
536
+
537
+ for line_idx, line in enumerate(lines):
538
+ line_num = line_idx + 1
539
+ # Skip code blocks (basic heuristic: lines starting with spaces/tabs or ```)
540
+ stripped = line.strip()
541
+ if stripped.startswith("```") or stripped.startswith(" ") or stripped.startswith("\t"):
542
+ continue
543
+ # Skip lines that are clearly code (contain common code patterns)
544
+ if "def " in line or "class " in line or "import " in line or "from " in line:
545
+ continue
546
+ # Skip example lines showing anti-patterns (style guide "Don't" examples)
547
+ if _is_example_line(line, lines, line_idx):
548
+ continue
549
+
550
+ # Check for inline ignore directive for this category
551
+ if _has_inline_ignore(lines, line_idx, category):
552
+ continue
553
+
554
+ for pattern, display_name, suggestion in rules:
555
+ for match in re.finditer(pattern, line, re.IGNORECASE):
556
+ col = match.start() + 1
557
+ context = _get_context(line, match.start(), match.end())
558
+ matched_text = match.group()
559
+
560
+ violations.append(
561
+ ContentViolation(
562
+ file_path=file_path,
563
+ line_number=line_num,
564
+ column=col,
565
+ matched_text=matched_text,
566
+ context=context,
567
+ rule=display_name,
568
+ category=category,
569
+ severity=severity,
570
+ suggestion=suggestion,
571
+ )
572
+ )
573
+
574
+ return violations
575
+
576
+
577
+ def validate_file(
578
+ file_path: Path,
579
+ categories: Sequence[str] | None = None,
580
+ repo_root: Path | None = None,
581
+ ) -> list[ContentViolation]:
582
+ """Validate a single file for content violations.
583
+
584
+ Args:
585
+ file_path: Path to the file to validate
586
+ categories: Rule categories to check (default: all)
587
+ repo_root: Repository root for checking file-level exceptions
588
+
589
+ Returns:
590
+ List of violations found
591
+ """
592
+ try:
593
+ content = file_path.read_text(encoding="utf-8")
594
+ except (OSError, UnicodeDecodeError):
595
+ return [] # Skip files that can't be read
596
+
597
+ if categories is None:
598
+ categories = list(RULE_CATEGORIES.keys())
599
+
600
+ # Get file-level exceptions if repo_root is provided
601
+ excepted_categories: set[str] = set()
602
+ if repo_root is not None:
603
+ excepted_categories = _get_file_exceptions(file_path, repo_root)
604
+
605
+ violations: list[ContentViolation] = []
606
+
607
+ for category in categories:
608
+ if category not in RULE_CATEGORIES:
609
+ continue
610
+ # Skip categories that have validated exceptions for this file
611
+ if category in excepted_categories:
612
+ continue
613
+ severity, rules = RULE_CATEGORIES[category]
614
+ violations.extend(_find_violations_for_rules(content, file_path, category, severity, rules))
615
+
616
+ return violations
617
+
618
+
619
+ def validate_content(
620
+ repo_root: Path,
621
+ patterns: Sequence[str] | None = None,
622
+ categories: Sequence[str] | None = None,
623
+ verbose: bool = False,
624
+ ) -> ValidationResult:
625
+ """Validate content files in the repository for style violations.
626
+
627
+ Args:
628
+ repo_root: Root directory of the repository
629
+ patterns: Glob patterns for files to check (default: blog and docs)
630
+ categories: Rule categories to check (default: all)
631
+ verbose: Print progress information
632
+
633
+ Returns:
634
+ ValidationResult with all violations found
635
+ """
636
+ if patterns is None:
637
+ patterns = DEFAULT_CONTENT_PATTERNS
638
+
639
+ result = ValidationResult()
640
+ checked_files: set[Path] = set()
641
+ files_with_issues: set[Path] = set()
642
+
643
+ for pattern in patterns:
644
+ for file_path in repo_root.glob(pattern):
645
+ if not file_path.is_file():
646
+ continue
647
+ if file_path in checked_files:
648
+ continue
649
+ if _should_skip_file(file_path, repo_root):
650
+ continue
651
+
652
+ checked_files.add(file_path)
653
+
654
+ if verbose:
655
+ rel_path = file_path.relative_to(repo_root)
656
+ print(f" Checking {rel_path}...")
657
+
658
+ violations = validate_file(file_path, categories, repo_root)
659
+ if violations:
660
+ result.violations.extend(violations)
661
+ files_with_issues.add(file_path)
662
+
663
+ result.files_checked = len(checked_files)
664
+ result.files_with_violations = len(files_with_issues)
665
+
666
+ return result
667
+
668
+
669
+ def check_content_for_release(
670
+ source: Path,
671
+ auto_continue: bool = False,
672
+ errors_only: bool = False,
673
+ ) -> bool:
674
+ """Run content validation as part of release process.
675
+
676
+ This function is designed to be called from the release automation script.
677
+ It validates blog and docs content and prints results.
678
+
679
+ Args:
680
+ source: Source repository path
681
+ auto_continue: If True, print warning but don't fail on violations
682
+ errors_only: If True, only check for ERROR-level violations
683
+
684
+ Returns:
685
+ True if validation passed (no errors), False otherwise
686
+ """
687
+ print("\n" + "=" * 60)
688
+ print("Content Validation (Docs & Blog)")
689
+ print("=" * 60)
690
+ print("Checking for style guide violations...\n")
691
+
692
+ result = validate_content(source, verbose=False)
693
+
694
+ if len(result.violations) == 0:
695
+ print(result.summary())
696
+ return True
697
+
698
+ # Group violations by severity
699
+ errors = [v for v in result.violations if v.severity == Severity.ERROR]
700
+ warnings = [v for v in result.violations if v.severity == Severity.WARNING]
701
+ suggestions = [v for v in result.violations if v.severity == Severity.SUGGESTION]
702
+
703
+ # Show errors (always)
704
+ if errors:
705
+ print(f"ERRORS ({len(errors)}) - Must fix before release:\n")
706
+ for violation in errors[:15]:
707
+ print(str(violation))
708
+ print()
709
+ if len(errors) > 15:
710
+ print(f"... and {len(errors) - 15} more errors\n")
711
+
712
+ # Show warnings (unless errors_only)
713
+ if warnings and not errors_only:
714
+ print(f"WARNINGS ({len(warnings)}) - Should fix:\n")
715
+ for violation in warnings[:10]:
716
+ print(str(violation))
717
+ print()
718
+ if len(warnings) > 10:
719
+ print(f"... and {len(warnings) - 10} more warnings\n")
720
+
721
+ # Show suggestions count only
722
+ if suggestions and not errors_only:
723
+ print(f"SUGGESTIONS ({len(suggestions)}) - Consider reviewing\n")
724
+
725
+ print(result.summary())
726
+ print("\nSee _blog/BenchBox_Blog_Style_Guide.md for voice and style guidance.")
727
+
728
+ if auto_continue:
729
+ print("\n⚠️ Continuing despite violations (--auto-continue)")
730
+ return True
731
+
732
+ return result.passed
733
+
734
+
735
+ __all__ = [
736
+ "ContentViolation",
737
+ "ValidationResult",
738
+ "Severity",
739
+ "validate_file",
740
+ "validate_content",
741
+ "check_content_for_release",
742
+ "RULE_CATEGORIES",
743
+ "EM_DASH",
744
+ "EN_DASH",
745
+ ]