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.
- benchbox/__init__.py +1 -1
- benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query72.tpl +1 -1
- benchbox/_binaries/tpc-ds/{darwin-x86_64/query_templates/ansi.tpl → templates/query_templates/sqlserver.tpl} +1 -1
- benchbox/_binaries/tpc-ds/templates/query_variants/README +6 -0
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query10.tpl → templates/query_variants/query10a.tpl} +13 -14
- benchbox/_binaries/tpc-ds/{darwin-x86_64/query_templates/query14.tpl → templates/query_variants/query14a.tpl} +30 -26
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query18.tpl → templates/query_variants/query18a.tpl} +40 -19
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query22.tpl → templates/query_variants/query22a.tpl} +31 -9
- benchbox/_binaries/tpc-ds/{darwin-x86_64/query_templates/query27.tpl → templates/query_variants/query27a.tpl} +23 -10
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query35.tpl → templates/query_variants/query35a.tpl} +9 -8
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query36.tpl → templates/query_variants/query36a.tpl} +24 -12
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query51.tpl → templates/query_variants/query51a.tpl} +37 -20
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query5.tpl → templates/query_variants/query5a.tpl} +15 -10
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query67.tpl → templates/query_variants/query67a.tpl} +46 -18
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query70.tpl → templates/query_variants/query70a.tpl} +31 -27
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query77.tpl → templates/query_variants/query77a.tpl} +22 -15
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query80.tpl → templates/query_variants/query80a.tpl} +22 -8
- benchbox/_binaries/tpc-ds/{linux-arm64/query_templates/query86.tpl → templates/query_variants/query86a.tpl} +22 -13
- benchbox/_binaries/tpc-h/templates/dists.dss +836 -0
- benchbox/_binaries/tpc-h/templates/queries/1.sql +28 -0
- benchbox/_binaries/tpc-h/templates/queries/10.sql +38 -0
- benchbox/_binaries/tpc-h/templates/queries/11.sql +34 -0
- benchbox/_binaries/tpc-h/templates/queries/12.sql +35 -0
- benchbox/_binaries/tpc-h/templates/queries/13.sql +27 -0
- benchbox/_binaries/tpc-h/templates/queries/14.sql +20 -0
- benchbox/_binaries/tpc-h/templates/queries/15.sql +40 -0
- benchbox/_binaries/tpc-h/templates/queries/16.sql +37 -0
- benchbox/_binaries/tpc-h/templates/queries/17.sql +24 -0
- benchbox/_binaries/tpc-h/templates/queries/18.sql +39 -0
- benchbox/_binaries/tpc-h/templates/queries/19.sql +42 -0
- benchbox/_binaries/tpc-h/templates/queries/2.sql +50 -0
- benchbox/_binaries/tpc-h/templates/queries/20.sql +44 -0
- benchbox/_binaries/tpc-h/templates/queries/21.sql +46 -0
- benchbox/_binaries/tpc-h/templates/queries/22.sql +44 -0
- benchbox/_binaries/tpc-h/templates/queries/3.sql +29 -0
- benchbox/_binaries/tpc-h/templates/queries/4.sql +28 -0
- benchbox/_binaries/tpc-h/templates/queries/5.sql +31 -0
- benchbox/_binaries/tpc-h/templates/queries/6.sql +16 -0
- benchbox/_binaries/tpc-h/templates/queries/7.sql +46 -0
- benchbox/_binaries/tpc-h/templates/queries/8.sql +44 -0
- benchbox/_binaries/tpc-h/templates/queries/9.sql +39 -0
- benchbox/_binaries/tpc-h/templates/variants/12a.sql +27 -0
- benchbox/_binaries/tpc-h/templates/variants/13a.sql +30 -0
- benchbox/_binaries/tpc-h/templates/variants/14a.sql +18 -0
- benchbox/_binaries/tpc-h/templates/variants/15a.sql +39 -0
- benchbox/_binaries/tpc-h/templates/variants/8a.sql +77 -0
- benchbox/base.py +88 -121
- benchbox/cli/benchmarks.py +3 -3
- benchbox/cli/commands/calculate_qphh.py +55 -14
- benchbox/cli/commands/checks.py +1 -4
- benchbox/cli/commands/convert.py +8 -3
- benchbox/cli/commands/metrics.py +55 -14
- benchbox/cli/commands/results.py +131 -3
- benchbox/cli/commands/run.py +157 -22
- benchbox/cli/commands/visualize.py +3 -3
- benchbox/cli/composite_params.py +1 -1
- benchbox/cli/config.py +13 -3
- benchbox/cli/database.py +3 -3
- benchbox/cli/dryrun.py +30 -4
- benchbox/cli/exceptions.py +2 -1
- benchbox/cli/execution_pipeline.py +2 -1
- benchbox/cli/orchestrator.py +25 -71
- benchbox/cli/tuning.py +1 -1
- benchbox/core/ai_primitives/benchmark.py +53 -0
- benchbox/core/ai_primitives/dataframe_operations.py +1217 -0
- benchbox/core/base_benchmark.py +90 -68
- benchbox/core/coffeeshop/queries.py +1 -1
- benchbox/core/coffeeshop/schema.py +1 -1
- benchbox/core/comparison/plotter.py +5 -4
- benchbox/core/dataframe/__init__.py +26 -0
- benchbox/core/dataframe/benchmark_suite.py +5 -4
- benchbox/core/dataframe/context.py +45 -0
- benchbox/core/dataframe/data_loader.py +180 -79
- benchbox/core/dataframe/maintenance_interface.py +866 -0
- benchbox/core/dryrun.py +152 -22
- benchbox/core/expected_results/registry.py +22 -5
- benchbox/core/manifest/io.py +4 -3
- benchbox/core/metadata_primitives/__init__.py +31 -0
- benchbox/core/metadata_primitives/benchmark.py +337 -0
- benchbox/core/metadata_primitives/dataframe_operations.py +1824 -0
- benchbox/core/platform_registry.py +134 -45
- benchbox/core/read_primitives/benchmark.py +56 -4
- benchbox/core/read_primitives/dataframe_queries.py +6547 -0
- benchbox/core/results/__init__.py +47 -6
- benchbox/core/results/builder.py +909 -0
- benchbox/core/results/database.py +5 -5
- benchbox/core/results/exporter.py +58 -96
- benchbox/core/results/filenames.py +102 -0
- benchbox/core/results/loader.py +10 -9
- benchbox/core/results/metrics.py +211 -0
- benchbox/core/results/models.py +3 -1
- benchbox/core/results/normalizer.py +346 -0
- benchbox/core/results/platform_info.py +235 -0
- benchbox/core/results/query_normalizer.py +200 -0
- benchbox/core/results/schema.py +368 -69
- benchbox/core/runner/conversion.py +2 -0
- benchbox/core/runner/dataframe_runner.py +135 -131
- benchbox/core/runner/runner.py +111 -18
- benchbox/core/schemas.py +145 -3
- benchbox/core/ssb/generator.py +14 -2
- benchbox/core/tpc_compliance.py +4 -4
- benchbox/core/tpc_metrics.py +9 -4
- benchbox/core/tpcdi/generator/manifest.py +15 -2
- benchbox/core/tpcds/benchmark/runner.py +3 -7
- benchbox/core/tpcds/c_tools.py +34 -28
- benchbox/core/tpcds/dataframe_queries/queries.py +44 -21
- benchbox/core/tpcds/generator/filesystem.py +23 -11
- benchbox/core/tpcds/generator/manager.py +3 -2
- benchbox/core/tpcds/maintenance_test.py +281 -0
- benchbox/core/tpcds/power_test.py +21 -11
- benchbox/core/tpcds/throughput_test.py +27 -9
- benchbox/core/tpcds_obt/etl/transformer.py +24 -5
- benchbox/core/tpch/dataframe_queries.py +46 -43
- benchbox/core/tpch/generator.py +21 -8
- benchbox/core/tpch/maintenance_test.py +87 -0
- benchbox/core/tpch/power_test.py +21 -5
- benchbox/core/tpch/queries.py +2 -7
- benchbox/core/tpch/streams.py +3 -19
- benchbox/core/transaction_primitives/benchmark.py +99 -0
- benchbox/core/transaction_primitives/dataframe_operations.py +1294 -0
- benchbox/core/transaction_primitives/generator.py +11 -4
- benchbox/core/visualization/__init__.py +2 -2
- benchbox/core/visualization/charts.py +4 -4
- benchbox/core/visualization/dependencies.py +1 -12
- benchbox/core/visualization/exporters.py +15 -26
- benchbox/core/visualization/result_plotter.py +90 -49
- benchbox/core/visualization/templates.py +6 -6
- benchbox/core/write_primitives/__init__.py +13 -0
- benchbox/core/write_primitives/benchmark.py +66 -0
- benchbox/core/write_primitives/dataframe_operations.py +912 -0
- benchbox/core/write_primitives/generator.py +11 -4
- benchbox/mcp/__init__.py +5 -1
- benchbox/mcp/errors.py +29 -0
- benchbox/mcp/resources/registry.py +12 -7
- benchbox/mcp/schemas.py +62 -0
- benchbox/mcp/server.py +17 -14
- benchbox/mcp/tools/__init__.py +3 -0
- benchbox/mcp/tools/analytics.py +550 -582
- benchbox/mcp/tools/benchmark.py +603 -611
- benchbox/mcp/tools/discovery.py +156 -205
- benchbox/mcp/tools/results.py +332 -533
- benchbox/mcp/tools/visualization.py +449 -0
- benchbox/platforms/__init__.py +740 -622
- benchbox/platforms/adapter_factory.py +6 -6
- benchbox/platforms/azure_synapse.py +3 -7
- benchbox/platforms/base/adapter.py +189 -49
- benchbox/platforms/base/cloud_spark/config.py +8 -0
- benchbox/platforms/base/cloud_spark/mixins.py +96 -0
- benchbox/platforms/base/cloud_spark/session.py +4 -2
- benchbox/platforms/base/cloud_spark/staging.py +15 -7
- benchbox/platforms/base/data_loading.py +315 -1
- benchbox/platforms/base/format_capabilities.py +37 -2
- benchbox/platforms/base/utils.py +6 -4
- benchbox/platforms/bigquery.py +5 -6
- benchbox/platforms/clickhouse_cloud.py +263 -0
- benchbox/platforms/databricks/adapter.py +16 -15
- benchbox/platforms/databricks/dataframe_adapter.py +4 -1
- benchbox/platforms/dataframe/__init__.py +31 -0
- benchbox/platforms/dataframe/benchmark_mixin.py +779 -0
- benchbox/platforms/dataframe/cudf_df.py +3 -3
- benchbox/platforms/dataframe/dask_df.py +3 -3
- benchbox/platforms/dataframe/datafusion_df.py +152 -15
- benchbox/platforms/dataframe/delta_lake_maintenance.py +341 -0
- benchbox/platforms/dataframe/ducklake_maintenance.py +402 -0
- benchbox/platforms/dataframe/expression_family.py +47 -8
- benchbox/platforms/dataframe/hudi_maintenance.py +437 -0
- benchbox/platforms/dataframe/iceberg_maintenance.py +605 -0
- benchbox/platforms/dataframe/modin_df.py +3 -3
- benchbox/platforms/dataframe/pandas_df.py +3 -3
- benchbox/platforms/dataframe/pandas_family.py +59 -8
- benchbox/platforms/dataframe/platform_checker.py +16 -49
- benchbox/platforms/dataframe/polars_df.py +14 -12
- benchbox/platforms/dataframe/polars_maintenance.py +630 -0
- benchbox/platforms/dataframe/pyspark_df.py +15 -0
- benchbox/platforms/dataframe/pyspark_maintenance.py +613 -0
- benchbox/platforms/datafusion.py +5 -6
- benchbox/platforms/duckdb.py +2 -1
- benchbox/platforms/fabric_warehouse.py +15 -15
- benchbox/platforms/firebolt.py +3 -2
- benchbox/platforms/influxdb/adapter.py +7 -3
- benchbox/platforms/motherduck.py +3 -2
- benchbox/platforms/onehouse/__init__.py +39 -0
- benchbox/platforms/onehouse/onehouse_client.py +509 -0
- benchbox/platforms/onehouse/quanton_adapter.py +646 -0
- benchbox/platforms/postgresql.py +5 -9
- benchbox/platforms/presto.py +2 -2
- benchbox/platforms/pyspark/session.py +3 -3
- benchbox/platforms/pyspark/sql_adapter.py +2 -3
- benchbox/platforms/redshift.py +7 -7
- benchbox/platforms/snowflake.py +4 -4
- benchbox/platforms/snowpark_connect.py +2 -1
- benchbox/platforms/trino.py +2 -2
- benchbox/release/__init__.py +17 -0
- benchbox/release/content_validation.py +745 -0
- benchbox/release/workflow.py +17 -0
- benchbox/utils/VERSION_MANAGEMENT.md +1 -1
- benchbox/utils/cloud_storage.py +7 -5
- benchbox/utils/compression.py +8 -8
- benchbox/utils/compression_mixin.py +2 -1
- benchbox/utils/data_validation.py +23 -14
- benchbox/utils/dependencies.py +47 -7
- benchbox/utils/file_format.py +407 -0
- benchbox/utils/format_converters/__init__.py +5 -1
- benchbox/utils/format_converters/ducklake_converter.py +227 -0
- benchbox/utils/format_converters/vortex_converter.py +168 -0
- benchbox/utils/tpc_compilation.py +43 -0
- benchbox/utils/version.py +14 -2
- {benchbox-0.1.0.dist-info → benchbox-0.1.1.dist-info}/METADATA +15 -15
- benchbox-0.1.1.dist-info/RECORD +839 -0
- {benchbox-0.1.0.dist-info → benchbox-0.1.1.dist-info}/WHEEL +1 -1
- benchbox/_binaries/tpc-ds/darwin-arm64/query_templates/sqlserver.tpl +0 -37
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/README +0 -4
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/db2.tpl +0 -38
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/netezza.tpl +0 -38
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/oracle.tpl +0 -38
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query1.tpl +0 -62
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query10.tpl +0 -98
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query11.tpl +0 -119
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query12.tpl +0 -72
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query13.tpl +0 -89
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query15.tpl +0 -56
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query16.tpl +0 -76
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query17.tpl +0 -80
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query18.tpl +0 -73
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query19.tpl +0 -64
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query2.tpl +0 -94
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query20.tpl +0 -67
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query21.tpl +0 -65
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query22.tpl +0 -54
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query23.tpl +0 -144
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query24.tpl +0 -147
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query25.tpl +0 -84
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query26.tpl +0 -61
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query28.tpl +0 -90
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query29.tpl +0 -85
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query3.tpl +0 -58
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query30.tpl +0 -66
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query31.tpl +0 -88
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query32.tpl +0 -65
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query33.tpl +0 -113
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query34.tpl +0 -77
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query35.tpl +0 -98
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query36.tpl +0 -74
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query37.tpl +0 -57
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query38.tpl +0 -58
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query39.tpl +0 -93
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query4.tpl +0 -154
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query40.tpl +0 -63
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query41.tpl +0 -90
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query42.tpl +0 -64
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query43.tpl +0 -55
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query44.tpl +0 -72
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query45.tpl +0 -56
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query46.tpl +0 -78
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query47.tpl +0 -89
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query48.tpl +0 -104
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query49.tpl +0 -164
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query5.tpl +0 -165
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query50.tpl +0 -96
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query51.tpl +0 -80
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query52.tpl +0 -59
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query53.tpl +0 -64
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query54.tpl +0 -95
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query55.tpl +0 -52
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query56.tpl +0 -108
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query57.tpl +0 -87
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query58.tpl +0 -101
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query59.tpl +0 -79
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query6.tpl +0 -62
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query60.tpl +0 -115
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query61.tpl +0 -83
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query62.tpl +0 -71
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query63.tpl +0 -64
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query64.tpl +0 -157
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query65.tpl +0 -62
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query66.tpl +0 -261
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query67.tpl +0 -81
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query68.tpl +0 -82
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query69.tpl +0 -85
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query7.tpl +0 -60
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query70.tpl +0 -73
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query71.tpl +0 -74
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query72.tpl +0 -67
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query73.tpl +0 -69
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query74.tpl +0 -99
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query75.tpl +0 -107
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query76.tpl +0 -64
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query77.tpl +0 -145
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query78.tpl +0 -94
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query79.tpl +0 -60
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query8.tpl +0 -144
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query80.tpl +0 -131
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query81.tpl +0 -68
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query82.tpl +0 -56
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query83.tpl +0 -104
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query84.tpl +0 -58
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query85.tpl +0 -121
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query86.tpl +0 -60
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query87.tpl +0 -56
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query88.tpl +0 -128
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query89.tpl +0 -75
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query9.tpl +0 -88
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query90.tpl +0 -58
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query91.tpl +0 -68
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query92.tpl +0 -68
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query93.tpl +0 -53
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query94.tpl +0 -67
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query95.tpl +0 -71
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query96.tpl +0 -52
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query97.tpl +0 -62
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query98.tpl +0 -70
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/query99.tpl +0 -69
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/sqlserver.tpl +0 -37
- benchbox/_binaries/tpc-ds/darwin-x86_64/query_templates/templates.lst +0 -99
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/README +0 -4
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/ansi.tpl +0 -38
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/db2.tpl +0 -38
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/netezza.tpl +0 -38
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/oracle.tpl +0 -38
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query1.tpl +0 -62
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query11.tpl +0 -119
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query12.tpl +0 -72
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query13.tpl +0 -89
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query14.tpl +0 -247
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query15.tpl +0 -56
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query16.tpl +0 -76
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query17.tpl +0 -80
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query19.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query2.tpl +0 -94
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query20.tpl +0 -67
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query21.tpl +0 -65
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query23.tpl +0 -144
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query24.tpl +0 -147
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query25.tpl +0 -84
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query26.tpl +0 -61
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query27.tpl +0 -68
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query28.tpl +0 -90
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query29.tpl +0 -85
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query3.tpl +0 -58
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query30.tpl +0 -66
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query31.tpl +0 -88
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query32.tpl +0 -65
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query33.tpl +0 -113
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query34.tpl +0 -77
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query37.tpl +0 -57
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query38.tpl +0 -58
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query39.tpl +0 -93
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query4.tpl +0 -154
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query40.tpl +0 -63
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query41.tpl +0 -90
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query42.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query43.tpl +0 -55
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query44.tpl +0 -72
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query45.tpl +0 -56
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query46.tpl +0 -78
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query47.tpl +0 -89
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query48.tpl +0 -104
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query49.tpl +0 -164
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query50.tpl +0 -96
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query52.tpl +0 -59
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query53.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query54.tpl +0 -95
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query55.tpl +0 -52
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query56.tpl +0 -108
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query57.tpl +0 -87
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query58.tpl +0 -101
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query59.tpl +0 -79
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query6.tpl +0 -62
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query60.tpl +0 -115
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query61.tpl +0 -83
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query62.tpl +0 -71
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query63.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query64.tpl +0 -157
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query65.tpl +0 -62
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query66.tpl +0 -261
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query68.tpl +0 -82
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query69.tpl +0 -85
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query7.tpl +0 -60
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query71.tpl +0 -74
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query72.tpl +0 -67
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query73.tpl +0 -69
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query74.tpl +0 -99
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query75.tpl +0 -107
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query76.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query78.tpl +0 -94
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query79.tpl +0 -60
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query8.tpl +0 -144
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query81.tpl +0 -68
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query82.tpl +0 -56
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query83.tpl +0 -104
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query84.tpl +0 -58
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query85.tpl +0 -121
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query87.tpl +0 -56
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query88.tpl +0 -128
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query89.tpl +0 -75
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query9.tpl +0 -88
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query90.tpl +0 -58
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query91.tpl +0 -68
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query92.tpl +0 -68
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query93.tpl +0 -53
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query94.tpl +0 -67
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query95.tpl +0 -71
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query96.tpl +0 -52
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query97.tpl +0 -62
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query98.tpl +0 -70
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/query99.tpl +0 -69
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/sqlserver.tpl +0 -37
- benchbox/_binaries/tpc-ds/linux-arm64/query_templates/templates.lst +0 -99
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/README +0 -4
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/ansi.tpl +0 -38
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/db2.tpl +0 -38
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/netezza.tpl +0 -38
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/oracle.tpl +0 -38
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query1.tpl +0 -62
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query10.tpl +0 -98
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query11.tpl +0 -119
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query12.tpl +0 -72
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query13.tpl +0 -89
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query14.tpl +0 -247
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query15.tpl +0 -56
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query16.tpl +0 -76
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query17.tpl +0 -80
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query18.tpl +0 -73
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query19.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query2.tpl +0 -94
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query20.tpl +0 -67
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query21.tpl +0 -65
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query22.tpl +0 -54
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query23.tpl +0 -144
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query24.tpl +0 -147
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query25.tpl +0 -84
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query26.tpl +0 -61
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query27.tpl +0 -68
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query28.tpl +0 -90
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query29.tpl +0 -85
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query3.tpl +0 -58
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query30.tpl +0 -66
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query31.tpl +0 -88
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query32.tpl +0 -65
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query33.tpl +0 -113
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query34.tpl +0 -77
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query35.tpl +0 -98
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query36.tpl +0 -74
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query37.tpl +0 -57
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query38.tpl +0 -58
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query39.tpl +0 -93
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query4.tpl +0 -154
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query40.tpl +0 -63
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query41.tpl +0 -90
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query42.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query43.tpl +0 -55
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query44.tpl +0 -72
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query45.tpl +0 -56
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query46.tpl +0 -78
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query47.tpl +0 -89
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query48.tpl +0 -104
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query49.tpl +0 -164
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query5.tpl +0 -165
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query50.tpl +0 -96
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query51.tpl +0 -80
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query52.tpl +0 -59
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query53.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query54.tpl +0 -95
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query55.tpl +0 -52
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query56.tpl +0 -108
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query57.tpl +0 -87
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query58.tpl +0 -101
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query59.tpl +0 -79
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query6.tpl +0 -62
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query60.tpl +0 -115
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query61.tpl +0 -83
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query62.tpl +0 -71
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query63.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query64.tpl +0 -157
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query65.tpl +0 -62
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query66.tpl +0 -261
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query67.tpl +0 -81
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query68.tpl +0 -82
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query69.tpl +0 -85
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query7.tpl +0 -60
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query70.tpl +0 -73
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query71.tpl +0 -74
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query72.tpl +0 -67
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query73.tpl +0 -69
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query74.tpl +0 -99
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query75.tpl +0 -107
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query76.tpl +0 -64
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query77.tpl +0 -145
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query78.tpl +0 -94
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query79.tpl +0 -60
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query8.tpl +0 -144
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query80.tpl +0 -131
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query81.tpl +0 -68
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query82.tpl +0 -56
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query83.tpl +0 -104
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query84.tpl +0 -58
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query85.tpl +0 -121
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query86.tpl +0 -60
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query87.tpl +0 -56
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query88.tpl +0 -128
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query89.tpl +0 -75
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query9.tpl +0 -88
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query90.tpl +0 -58
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query91.tpl +0 -68
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query92.tpl +0 -68
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query93.tpl +0 -53
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query94.tpl +0 -67
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query95.tpl +0 -71
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query96.tpl +0 -52
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query97.tpl +0 -62
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query98.tpl +0 -70
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/query99.tpl +0 -69
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/sqlserver.tpl +0 -37
- benchbox/_binaries/tpc-ds/linux-x86_64/query_templates/templates.lst +0 -99
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/README +0 -4
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/ansi.tpl +0 -38
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/db2.tpl +0 -38
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/netezza.tpl +0 -38
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/oracle.tpl +0 -38
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query1.tpl +0 -62
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query10.tpl +0 -98
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query11.tpl +0 -119
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query12.tpl +0 -72
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query13.tpl +0 -89
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query14.tpl +0 -247
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query15.tpl +0 -56
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query16.tpl +0 -76
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query17.tpl +0 -80
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query18.tpl +0 -73
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query19.tpl +0 -64
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query2.tpl +0 -94
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query20.tpl +0 -67
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query21.tpl +0 -65
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query22.tpl +0 -54
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query23.tpl +0 -144
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query24.tpl +0 -147
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query25.tpl +0 -84
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query26.tpl +0 -61
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query27.tpl +0 -68
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query28.tpl +0 -90
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query29.tpl +0 -85
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query3.tpl +0 -58
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query30.tpl +0 -66
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query31.tpl +0 -88
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query32.tpl +0 -65
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query33.tpl +0 -113
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query34.tpl +0 -77
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query35.tpl +0 -98
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query36.tpl +0 -74
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query37.tpl +0 -57
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query38.tpl +0 -58
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query39.tpl +0 -93
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query4.tpl +0 -154
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query40.tpl +0 -63
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query41.tpl +0 -90
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query42.tpl +0 -64
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query43.tpl +0 -55
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query44.tpl +0 -72
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query45.tpl +0 -56
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query46.tpl +0 -78
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query47.tpl +0 -89
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query48.tpl +0 -104
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query49.tpl +0 -164
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query5.tpl +0 -165
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query50.tpl +0 -96
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query51.tpl +0 -80
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query52.tpl +0 -59
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query53.tpl +0 -64
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query54.tpl +0 -95
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query55.tpl +0 -52
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query56.tpl +0 -108
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query57.tpl +0 -87
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query58.tpl +0 -101
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query59.tpl +0 -79
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query6.tpl +0 -62
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query60.tpl +0 -115
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query61.tpl +0 -83
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query62.tpl +0 -71
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query63.tpl +0 -64
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query64.tpl +0 -157
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query65.tpl +0 -62
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query66.tpl +0 -261
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query67.tpl +0 -81
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query68.tpl +0 -82
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query69.tpl +0 -85
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query7.tpl +0 -60
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query70.tpl +0 -73
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query71.tpl +0 -74
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query72.tpl +0 -67
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query73.tpl +0 -69
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query74.tpl +0 -99
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query75.tpl +0 -107
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query76.tpl +0 -64
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query77.tpl +0 -145
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query78.tpl +0 -94
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query79.tpl +0 -60
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query8.tpl +0 -144
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query80.tpl +0 -131
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query81.tpl +0 -68
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query82.tpl +0 -56
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query83.tpl +0 -104
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query84.tpl +0 -58
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query85.tpl +0 -121
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query86.tpl +0 -60
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query87.tpl +0 -56
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query88.tpl +0 -128
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query89.tpl +0 -75
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query9.tpl +0 -88
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query90.tpl +0 -58
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query91.tpl +0 -68
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query92.tpl +0 -68
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query93.tpl +0 -53
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query94.tpl +0 -67
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query95.tpl +0 -71
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query96.tpl +0 -52
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query97.tpl +0 -62
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query98.tpl +0 -70
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/query99.tpl +0 -69
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/sqlserver.tpl +0 -37
- benchbox/_binaries/tpc-ds/windows-x86_64/query_templates/templates.lst +0 -99
- benchbox-0.1.0.dist-info/RECORD +0 -1192
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/README +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/ansi.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/db2.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/netezza.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/oracle.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query1.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query10.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query11.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query12.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query13.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query14.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query15.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query16.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query17.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query18.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query19.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query2.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query20.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query21.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query22.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query23.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query24.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query25.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query26.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query27.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query28.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query29.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query3.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query30.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query31.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query32.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query33.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query34.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query35.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query36.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query37.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query38.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query39.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query4.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query40.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query41.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query42.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query43.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query44.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query45.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query46.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query47.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query48.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query49.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query5.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query50.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query51.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query52.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query53.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query54.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query55.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query56.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query57.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query58.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query59.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query6.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query60.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query61.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query62.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query63.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query64.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query65.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query66.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query67.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query68.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query69.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query7.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query70.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query71.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query73.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query74.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query75.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query76.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query77.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query78.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query79.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query8.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query80.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query81.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query82.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query83.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query84.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query85.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query86.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query87.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query88.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query89.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query9.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query90.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query91.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query92.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query93.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query94.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query95.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query96.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query97.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query98.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/query99.tpl +0 -0
- /benchbox/_binaries/tpc-ds/{darwin-arm64 → templates}/query_templates/templates.lst +0 -0
- {benchbox-0.1.0.dist-info → benchbox-0.1.1.dist-info}/entry_points.txt +0 -0
- {benchbox-0.1.0.dist-info → benchbox-0.1.1.dist-info}/licenses/LICENSE +0 -0
- {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
|
+
]
|