serialbench 0.1.2 → 0.2.0

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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/benchmark.yml +294 -229
  3. data/.github/workflows/rake.yml +11 -0
  4. data/.github/workflows/windows-debug.yml +171 -0
  5. data/.gitignore +32 -0
  6. data/.rubocop.yml +1 -0
  7. data/.rubocop_todo.yml +274 -0
  8. data/Gemfile +15 -1
  9. data/README.adoc +41 -0
  10. data/data/schemas/result.yml +29 -0
  11. data/docs/PLATFORM_VALIDATION_FIX.md +79 -0
  12. data/docs/SYCK_YAML_FIX.md +91 -0
  13. data/docs/WEBSITE_COMPLETION_PLAN.md +440 -0
  14. data/docs/WINDOWS_LIBXML_FIX.md +136 -0
  15. data/docs/WINDOWS_SETUP.md +122 -0
  16. data/lib/serialbench/benchmark_runner.rb +3 -3
  17. data/lib/serialbench/cli/benchmark_cli.rb +74 -1
  18. data/lib/serialbench/cli/environment_cli.rb +3 -3
  19. data/lib/serialbench/cli/resultset_cli.rb +112 -26
  20. data/lib/serialbench/cli/ruby_build_cli.rb +75 -88
  21. data/lib/serialbench/cli/validate_cli.rb +88 -0
  22. data/lib/serialbench/cli.rb +6 -2
  23. data/lib/serialbench/config_manager.rb +15 -26
  24. data/lib/serialbench/models/benchmark_config.rb +12 -0
  25. data/lib/serialbench/models/benchmark_result.rb +39 -3
  26. data/lib/serialbench/models/environment_config.rb +3 -2
  27. data/lib/serialbench/models/platform.rb +61 -6
  28. data/lib/serialbench/models/result.rb +28 -1
  29. data/lib/serialbench/models/result_set.rb +8 -0
  30. data/lib/serialbench/ruby_build_manager.rb +19 -23
  31. data/lib/serialbench/runners/asdf_runner.rb +1 -1
  32. data/lib/serialbench/runners/docker_runner.rb +2 -4
  33. data/lib/serialbench/runners/local_runner.rb +71 -0
  34. data/lib/serialbench/serializers/base_serializer.rb +1 -1
  35. data/lib/serialbench/serializers/json/rapidjson_serializer.rb +1 -5
  36. data/lib/serialbench/serializers/toml/base_toml_serializer.rb +0 -2
  37. data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +1 -1
  38. data/lib/serialbench/serializers/toml/tomlib_serializer.rb +1 -1
  39. data/lib/serialbench/serializers/xml/base_xml_serializer.rb +6 -1
  40. data/lib/serialbench/serializers/xml/leptris_serializer.rb +167 -0
  41. data/lib/serialbench/serializers/xml/libxml_serializer.rb +13 -8
  42. data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +11 -2
  43. data/lib/serialbench/serializers/xml/oga_serializer.rb +8 -8
  44. data/lib/serialbench/serializers/xml/ox_serializer.rb +2 -2
  45. data/lib/serialbench/serializers/xml/rexml_serializer.rb +3 -3
  46. data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +1 -3
  47. data/lib/serialbench/serializers/yaml/psych_serializer.rb +1 -5
  48. data/lib/serialbench/serializers/yaml/syck_serializer.rb +1 -1
  49. data/lib/serialbench/serializers.rb +5 -3
  50. data/lib/serialbench/site_generator.rb +234 -2
  51. data/lib/serialbench/templates/assets/css/format_based.css +1 -53
  52. data/lib/serialbench/templates/assets/css/themes.css +5 -4
  53. data/lib/serialbench/templates/assets/js/chart_helpers.js +44 -14
  54. data/lib/serialbench/templates/assets/js/dashboard.js +14 -15
  55. data/lib/serialbench/templates/format_based.liquid +480 -252
  56. data/lib/serialbench/version.rb +1 -1
  57. data/lib/serialbench/yaml_validator.rb +36 -0
  58. data/serialbench.gemspec +11 -2
  59. data/site/.gitignore +5 -0
  60. data/site/README.md +32 -0
  61. data/site/astro.config.mjs +12 -0
  62. data/site/package-lock.json +6160 -0
  63. data/site/package.json +22 -0
  64. data/site/public/favicon.svg +4 -0
  65. data/site/scripts/gen-sample-data.mjs +154 -0
  66. data/site/src/components/AvailabilityMatrix.astro +61 -0
  67. data/site/src/components/CalibratedLeaderboard.vue +134 -0
  68. data/site/src/components/CitationBox.vue +50 -0
  69. data/site/src/components/DashboardConsole.vue +193 -0
  70. data/site/src/components/FeaturesTable.astro +97 -0
  71. data/site/src/components/MemoryPanel.vue +44 -0
  72. data/site/src/components/OpsChart.vue +135 -0
  73. data/site/src/config.ts +18 -0
  74. data/site/src/layouts/Layout.astro +85 -0
  75. data/site/src/lib/channels.ts +24 -0
  76. data/site/src/lib/dashboard.ts +269 -0
  77. data/site/src/pages/index.astro +44 -0
  78. data/site/src/pages/library/[slug].astro +128 -0
  79. data/site/src/pages/methodology.astro +55 -0
  80. data/site/src/styles/global.css +103 -0
  81. data/site/tsconfig.json +5 -0
  82. metadata +58 -23
  83. data/.github/workflows/ci.yml +0 -74
  84. data/.github/workflows/docker.yml +0 -272
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Serialbench
4
- VERSION = '0.1.2'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json-schema'
4
+ require 'yaml'
5
+
6
+ module Serialbench
7
+ # Validates YAML files against YAML Schema definitions
8
+ class YamlValidator
9
+ SCHEMA_DIR = File.join(__dir__, '..', '..', 'data', 'schemas')
10
+
11
+ class << self
12
+ def validate(file_path, schema_name)
13
+ unless File.exist?(file_path)
14
+ raise ArgumentError, "File not found: #{file_path}"
15
+ end
16
+
17
+ data = YAML.load_file(file_path)
18
+ schema_path = File.join(SCHEMA_DIR, "#{schema_name}.yml")
19
+
20
+ unless File.exist?(schema_path)
21
+ raise ArgumentError, "Schema not found: #{schema_path}"
22
+ end
23
+
24
+ schema = YAML.load_file(schema_path)
25
+
26
+ # Validate without strict schema checking (allow additional properties)
27
+ JSON::Validator.validate!(schema, data, strict: false)
28
+
29
+ true
30
+ rescue JSON::Schema::ValidationError => e
31
+ puts "❌ Validation failed: #{e.message}"
32
+ false
33
+ end
34
+ end
35
+ end
36
+ end
data/serialbench.gemspec CHANGED
@@ -26,6 +26,9 @@ Gem::Specification.new do |spec|
26
26
  spec.files = all_files_in_git
27
27
  .reject { |f| f.match(%r{\A(?:spec|features|bin|\.)/}) }
28
28
 
29
+ # Ensure data directory is included
30
+ spec.files += Dir['data/**/*'].select { |f| File.file?(f) }
31
+
29
32
  spec.bindir = 'exe'
30
33
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
34
  spec.require_paths = ['lib']
@@ -34,6 +37,7 @@ Gem::Specification.new do |spec|
34
37
  spec.add_dependency 'benchmark-ips'
35
38
  spec.add_dependency 'lutaml-model'
36
39
  spec.add_dependency 'memory_profiler'
40
+ spec.add_dependency 'octokit', '~> 8.0'
37
41
  spec.add_dependency 'thor'
38
42
 
39
43
  # Reporting dependencies
@@ -41,12 +45,14 @@ Gem::Specification.new do |spec|
41
45
  spec.add_dependency 'liquid' # Template engine for HTML reports
42
46
 
43
47
  # XML serializers
44
- spec.add_dependency 'libxml-ruby'
45
- spec.add_dependency 'nokogiri'
46
48
  spec.add_dependency 'oga'
47
49
  spec.add_dependency 'ox'
48
50
  spec.add_dependency 'rexml' # needed for Ruby 3.4+
49
51
 
52
+ # Note: nokogiri and libxml-ruby are defined in Gemfile with platform
53
+ # conditionals to properly exclude them on Windows ARM where libxml2
54
+ # compilation fails
55
+
50
56
  # JSON serializers
51
57
  spec.add_dependency 'oj'
52
58
  spec.add_dependency 'rapidjson'
@@ -59,4 +65,7 @@ Gem::Specification.new do |spec|
59
65
  spec.add_dependency 'tomlib'
60
66
  spec.add_dependency 'toml-rb'
61
67
  spec.add_dependency 'tomlrb'
68
+
69
+ # YAML validation
70
+ spec.add_dependency 'json-schema'
62
71
  end
data/site/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ node_modules/
2
+ dist/
3
+ .astro/
4
+ src/data/sample.json
5
+ public/data/
data/site/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # serialbench site
2
+
3
+ The benchmark console at https://metanorma.github.io/serialbench/.
4
+
5
+ Astro 7 (Vite 8) with Vue islands and Tailwind 4. Charts are Chart.js 4,
6
+ bundled — no CDN.
7
+
8
+ ## Develop
9
+
10
+ ```
11
+ npm install
12
+ npm run generate:sample-data # writes src/data/sample.json (gitignored)
13
+ npm run dev # http://localhost:4321/serialbench/
14
+ ```
15
+
16
+ `src/data/sample.json` is generated from the race numbers in
17
+ `scripts/gen-sample-data.mjs` and is ignored by git. In CI the real payload
18
+ (written by `serialbench resultset export-data`) replaces it before
19
+ `astro build`; the shape is identical — see `src/lib/dashboard.ts`.
20
+
21
+ ## Data contract
22
+
23
+ ```
24
+ combined_results[op][size][format][serializer][envKey] = {
25
+ iterations_per_second, time_per_iteration # perf ops
26
+ allocated_memory, retained_memory # op == "memory"
27
+ }
28
+ environments[envKey] = { ruby_version, os, arch, timestamp, ... }
29
+ metadata = { resultset_name, total_runs, generated_at }
30
+ ```
31
+
32
+ Missing entries mean "not measured on that leg" — never zero.
@@ -0,0 +1,12 @@
1
+ import { defineConfig } from 'astro/config';
2
+ import vue from '@astrojs/vue';
3
+ import tailwindcss from '@tailwindcss/vite';
4
+
5
+ export default defineConfig({
6
+ site: 'https://metanorma.github.io',
7
+ base: '/serialbench/',
8
+ integrations: [vue()],
9
+ vite: {
10
+ plugins: [tailwindcss()],
11
+ },
12
+ });