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
@@ -0,0 +1,44 @@
1
+ ---
2
+ import Layout from '../layouts/Layout.astro';
3
+ import DashboardConsole from '../components/DashboardConsole.vue';
4
+ import AvailabilityMatrix from '../components/AvailabilityMatrix.astro';
5
+ import FeaturesTable from '../components/FeaturesTable.astro';
6
+ import payloadData from '../data/sample.json';
7
+ import type { Payload } from '../lib/dashboard';
8
+
9
+ const payload = payloadData as unknown as Payload;
10
+ const envCount = Object.keys(payload.environments).length;
11
+ const runDate = payload.metadata.generated_at.slice(0, 10);
12
+ ---
13
+
14
+ <Layout title="Serialbench — Ruby serialization benchmarks">
15
+ <section class="mb-10">
16
+ <p class="font-mono text-[10px] uppercase tracking-[0.14em] text-phosphor mb-3">Measurement console · run {runDate}</p>
17
+ <h1 class="text-3xl sm:text-4xl font-semibold tracking-tight max-w-3xl">
18
+ How fast can Ruby read and write your data?
19
+ </h1>
20
+ <p class="mt-3 text-inkdim max-w-2xl leading-relaxed">
21
+ Every XML, JSON, YAML and TOML serializer in the ecosystem, measured on the same workloads across
22
+ {envCount}
23
+ platform and Ruby combinations. Pick a format, pin a reference, and read the field.
24
+ </p>
25
+ </section>
26
+
27
+ <DashboardConsole client:load payload={payload} />
28
+
29
+ <AvailabilityMatrix payload={payload} />
30
+
31
+ <FeaturesTable payload={payload} />
32
+
33
+ <section class="mt-12 border border-line bg-panel px-5 py-5">
34
+ <h2 class="font-mono text-[10px] uppercase tracking-[0.14em] text-inkmute mb-2">Raw data</h2>
35
+ <p class="text-sm text-inkdim max-w-2xl leading-relaxed">
36
+ Full results per environment and the complete resultset are exported as YAML alongside this site —
37
+ <span class="font-mono text-[13px] break-all">data/&lt;environment&gt;.yaml</span>
38
+ and
39
+ <span class="font-mono text-[13px] break-all">data/resultset.yaml</span>. Re-run any leg with
40
+ <span class="font-mono text-[13px] break-all">serialbench environment execute</span>
41
+ using the configs in the repository.
42
+ </p>
43
+ </section>
44
+ </Layout>
@@ -0,0 +1,128 @@
1
+ ---
2
+ import Layout from '../../layouts/Layout.astro';
3
+ import payloadData from '../../data/sample.json';
4
+ import type { Payload } from '../../lib/dashboard';
5
+ import {
6
+ availability,
7
+ environmentLabel,
8
+ environmentList,
9
+ formatIps,
10
+ formatsForSerializer,
11
+ libraryStats,
12
+ OPERATION_LABELS,
13
+ primaryEnvKey,
14
+ runnerShortLabel,
15
+ } from '../../lib/dashboard';
16
+ import { channelColor } from '../../lib/channels';
17
+ import { BASE } from '../../config';
18
+
19
+ export function getStaticPaths() {
20
+ const payload = payloadData as unknown as Payload;
21
+ return availability(payload).serializers.map((serializer) => ({
22
+ params: { slug: serializer },
23
+ }));
24
+ }
25
+
26
+ const { slug } = Astro.params;
27
+ const payload = payloadData as unknown as Payload;
28
+ const serializer = slug as string;
29
+
30
+ const { envKeys, cells } = availability(payload);
31
+ const envs = environmentList(payload);
32
+ const envKey = primaryEnvKey(payload);
33
+ const stats = libraryStats(payload, serializer, envKey);
34
+ const formats = formatsForSerializer(payload, serializer);
35
+ const covered = cells.get(serializer) ?? new Set<string>();
36
+ const rankOne = stats.filter((s) => s.rank === 1).length;
37
+ const color = channelColor(serializer);
38
+ const runDate = payload.metadata.generated_at.slice(0, 10);
39
+ ---
40
+
41
+ <Layout title={`${serializer} — Serialbench`}>
42
+ <section class="mb-8">
43
+ <p class="font-mono text-[10px] uppercase tracking-[0.14em] text-inkmute mb-3">
44
+ <a href={BASE} class="hover:text-phosphor transition-colors">← Field overview</a>
45
+ </p>
46
+ <div class="flex items-center gap-3">
47
+ <span class="h-3 w-3 rounded-full" style={`background: ${color}`}></span>
48
+ <h1 class="text-3xl font-semibold tracking-tight font-mono">{serializer}</h1>
49
+ </div>
50
+ <p class="mt-2 text-inkdim">
51
+ {formats.map((f) => f.toUpperCase()).join(' / ')} serializer ·
52
+ measured on {covered.size} of {envKeys.length} environments ·
53
+ <span class="text-phosphor">#1 in {rankOne} of {stats.length} measurements</span>
54
+ <span class="text-inkmute"> · primary environment: {environmentLabel(envKey, payload.environments[envKey])}</span>
55
+ </p>
56
+ </section>
57
+
58
+ <section aria-label="Availability" class="mb-10 border border-line bg-panel px-4 py-4">
59
+ <p class="font-mono text-[10px] uppercase tracking-[0.14em] text-inkmute mb-3">Measured environments</p>
60
+ <div class="flex flex-wrap gap-x-4 gap-y-2">
61
+ {
62
+ envs.map(({ key, env }) => (
63
+ <span class="font-mono text-[11px] flex items-center gap-1.5" title={environmentLabel(key, env)}>
64
+ {covered.has(key) ? (
65
+ <span class="h-2 w-2 rounded-full" style={`background: ${color}`} />
66
+ ) : (
67
+ <span class="h-2 w-2 rounded-full border border-line" />
68
+ )}
69
+ <span class={covered.has(key) ? 'text-inkdim' : 'text-inkmute line-through'}>{runnerShortLabel(key, env)}</span>
70
+ </span>
71
+ ))
72
+ }
73
+ </div>
74
+ </section>
75
+
76
+ <section aria-label="Measurements">
77
+ <p class="font-mono text-[10px] uppercase tracking-[0.14em] text-inkmute mb-3">
78
+ Iterations per second on the primary environment · rank vs the field
79
+ </p>
80
+ <div class="overflow-x-auto border border-line bg-panel">
81
+ <table class="w-full border-collapse">
82
+ <thead>
83
+ <tr class="font-mono text-[10px] uppercase tracking-[0.14em] text-inkmute">
84
+ <th class="text-left font-normal px-3 py-2 border-b border-line">Operation</th>
85
+ <th class="text-left font-normal px-3 py-2 border-b border-line">Input</th>
86
+ <th class="text-right font-normal px-3 py-2 border-b border-line">ips</th>
87
+ <th class="text-right font-normal px-3 py-2 border-b border-line">ms/op</th>
88
+ <th class="text-right font-normal px-3 py-2 border-b border-line">Rank</th>
89
+ <th class="text-left font-normal px-3 py-2 border-b border-line">vs best</th>
90
+ </tr>
91
+ </thead>
92
+ <tbody>
93
+ {
94
+ stats.map((s) => (
95
+ <tr>
96
+ <td class="px-3 py-1.5 border-b border-line/50 font-mono text-[12px]">
97
+ {OPERATION_LABELS[s.op as keyof typeof OPERATION_LABELS] ?? s.op}
98
+ </td>
99
+ <td class="px-3 py-1.5 border-b border-line/50 font-mono text-[12px] text-inkmute">{s.size}</td>
100
+ <td class="px-3 py-1.5 border-b border-line/50 font-mono text-[12px] text-right tabular">{formatIps(s.ips)}</td>
101
+ <td class="px-3 py-1.5 border-b border-line/50 font-mono text-[12px] text-right tabular text-inkdim">
102
+ {(1000 / s.ips).toFixed(s.ips < 10 ? 2 : 1)}
103
+ </td>
104
+ <td class="px-3 py-1.5 border-b border-line/50 font-mono text-[12px] text-right tabular">
105
+ <span class={s.rank === 1 ? 'text-phosphor' : 'text-inkdim'}>{s.rank}/{s.fieldSize}</span>
106
+ </td>
107
+ <td class="px-3 py-1.5 border-b border-line/50 font-mono text-[11px] text-inkmute whitespace-nowrap">
108
+ {s.ratioToBest == null ? '—' : s.rank === 1 ? 'best in field' : `${s.ratioToBest.toFixed(1)}× slower than ${s.bestSerializer}`}
109
+ </td>
110
+ </tr>
111
+ ))
112
+ }
113
+ </tbody>
114
+ </table>
115
+ </div>
116
+ <p class="font-mono text-[11px] text-inkmute mt-2">
117
+ Compare every library on every environment on the <a href={BASE} class="text-phosphor hover:underline">dashboard</a>.
118
+ </p>
119
+ </section>
120
+
121
+ <section class="mt-10 border border-line bg-panel px-4 py-3 flex flex-wrap items-center gap-4">
122
+ <span class="font-mono text-[10px] uppercase tracking-[0.14em] text-inkmute shrink-0">Cite</span>
123
+ <p class="flex-1 min-w-64 font-mono text-[12px] leading-relaxed text-inkdim">
124
+ {serializer} measured on {environmentLabel(envKey, payload.environments[envKey])}, {formats.map((f) => f.toUpperCase()).join('/')}
125
+ workloads — serialbench, {runDate}. Full data: data/{envKey}.yaml.
126
+ </p>
127
+ </section>
128
+ </Layout>
@@ -0,0 +1,55 @@
1
+ ---
2
+ import Layout from '../layouts/Layout.astro';
3
+ import { SITE } from '../config';
4
+ ---
5
+
6
+ <Layout title="Methodology — Serialbench">
7
+ <section class="mb-10">
8
+ <p class="font-mono text-[10px] uppercase tracking-[0.14em] text-phosphor mb-3">Calibration</p>
9
+ <h1 class="text-3xl sm:text-4xl font-semibold tracking-tight">Methodology</h1>
10
+ <p class="mt-3 text-inkdim max-w-2xl leading-relaxed">
11
+ A benchmark you can't reproduce is marketing. This page documents exactly how serialbench
12
+ produces every number on this site.
13
+ </p>
14
+ </section>
15
+
16
+ <div class="grid gap-6 md:grid-cols-2 max-w-4xl">
17
+ <section class="border border-line bg-panel p-5">
18
+ <h2 class="font-mono text-[11px] uppercase tracking-[0.14em] text-phosphor mb-3">Workloads</h2>
19
+ <p class="text-sm text-inkdim leading-relaxed">
20
+ Each serializer parses, generates, and (where supported) streams the same documents at each
21
+ configured size. Operations run after warmup iterations; throughput is reported as
22
+ iterations per second, memory as allocated and retained bytes measured around the operation.
23
+ </p>
24
+ </section>
25
+
26
+ <section class="border border-line bg-panel p-5">
27
+ <h2 class="font-mono text-[11px] uppercase tracking-[0.14em] text-phosphor mb-3">Environments</h2>
28
+ <p class="text-sm text-inkdim leading-relaxed">
29
+ Results are collected per GitHub-hosted runner platform and Ruby version, then aggregated into
30
+ one resultset. Runners differ in CPU and memory — compare within an environment, not across
31
+ environments, unless you are comparing environments.
32
+ </p>
33
+ </section>
34
+
35
+ <section class="border border-line bg-panel p-5">
36
+ <h2 class="font-mono text-[11px] uppercase tracking-[0.14em] text-phosphor mb-3">Fairness limits</h2>
37
+ <p class="text-sm text-inkdim leading-relaxed">
38
+ Libraries that fail to load or lack an operation are skipped for that leg rather than counted
39
+ as zero. A dot missing from the availability matrix means no measurement exists — never assume
40
+ a score. Microbenchmarks measure these workloads, not yours.
41
+ </p>
42
+ </section>
43
+
44
+ <section class="border border-line bg-panel p-5">
45
+ <h2 class="font-mono text-[11px] uppercase tracking-[0.14em] text-phosphor mb-3">Reproduce</h2>
46
+ <p class="text-sm text-inkdim leading-relaxed">
47
+ Clone
48
+ <a class="text-phosphor hover:underline" href={SITE.repoUrl}>{SITE.repoUrl.replace("https://github.com/", "")}</a>,
49
+ then run
50
+ <span class="font-mono text-[13px]">bundle exec serialbench environment execute &lt;env&gt; &lt;benchmark&gt; &lt;out&gt;</span>.
51
+ The raw YAML next to every chart is the exact output of that command.
52
+ </p>
53
+ </section>
54
+ </div>
55
+ </Layout>
@@ -0,0 +1,103 @@
1
+ @import 'tailwindcss';
2
+
3
+ /*
4
+ * serialbench design tokens — instrument console.
5
+ * Semantic colors are runtime CSS vars so [data-theme] can retarget them;
6
+ * @theme inline exposes them to Tailwind utilities (bg-panel, text-inkdim…).
7
+ */
8
+ :root {
9
+ --surface: #0b101b;
10
+ --panel: #111a2b;
11
+ --panel-2: #16223a;
12
+ --line: #22314e;
13
+ --ink: #e9eef6;
14
+ --ink-dim: #a9b6c9;
15
+ --ink-mute: #6f7f99;
16
+ --phosphor: #5fd4e8;
17
+ --phosphor-ink: #071018;
18
+ --grid: rgba(95, 212, 232, 0.07);
19
+ --grid-strong: rgba(95, 212, 232, 0.14);
20
+ }
21
+
22
+ [data-theme='light'] {
23
+ --surface: #f3f5f9;
24
+ --panel: #ffffff;
25
+ --panel-2: #eaeef4;
26
+ --line: #d5dce7;
27
+ --ink: #16202e;
28
+ --ink-dim: #46566b;
29
+ --ink-mute: #75849d;
30
+ --phosphor: #0b7d96;
31
+ --phosphor-ink: #ffffff;
32
+ --grid: rgba(11, 125, 150, 0.08);
33
+ --grid-strong: rgba(11, 125, 150, 0.16);
34
+ }
35
+
36
+ @theme inline {
37
+ --color-surface: var(--surface);
38
+ --color-panel: var(--panel);
39
+ --color-panel2: var(--panel-2);
40
+ --color-line: var(--line);
41
+ --color-ink: var(--ink);
42
+ --color-inkdim: var(--ink-dim);
43
+ --color-inkmute: var(--ink-mute);
44
+ --color-phosphor: var(--phosphor);
45
+ --color-phosphorink: var(--phosphor-ink);
46
+ --font-sans: 'IBM Plex Sans', ui-sans-serif, system-ui, sans-serif;
47
+ --font-mono: 'IBM Plex Mono', ui-monospace, 'SF Mono', monospace;
48
+ }
49
+
50
+ html {
51
+ color-scheme: dark;
52
+ }
53
+ [data-theme='light'] {
54
+ color-scheme: light;
55
+ }
56
+
57
+ body {
58
+ background-color: var(--surface);
59
+ color: var(--ink);
60
+ font-family: var(--font-sans);
61
+ -webkit-font-smoothing: antialiased;
62
+ }
63
+
64
+ /* scope graticule: faint calibration grid used behind bars and panels */
65
+ .graticule {
66
+ background-image:
67
+ linear-gradient(to right, var(--grid) 1px, transparent 1px),
68
+ linear-gradient(to bottom, var(--grid) 1px, transparent 1px);
69
+ background-size: 3rem 3rem;
70
+ }
71
+
72
+ .tabular {
73
+ font-variant-numeric: tabular-nums;
74
+ }
75
+
76
+ /* trace sweep-in for the leaderboard; disabled for reduced motion */
77
+ @keyframes trace-in {
78
+ from {
79
+ transform: scaleX(0);
80
+ }
81
+ to {
82
+ transform: scaleX(1);
83
+ }
84
+ }
85
+ .trace-in {
86
+ transform-origin: left center;
87
+ animation: trace-in 0.7s cubic-bezier(0.22, 1, 0.36, 1) both;
88
+ }
89
+ @media (prefers-reduced-motion: reduce) {
90
+ .trace-in {
91
+ animation: none;
92
+ }
93
+ }
94
+
95
+ ::selection {
96
+ background: var(--phosphor);
97
+ color: var(--phosphor-ink);
98
+ }
99
+
100
+ :focus-visible {
101
+ outline: 2px solid var(--phosphor);
102
+ outline-offset: 2px;
103
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "astro/tsconfigs/strict",
3
+ "include": [".astro/types.d.ts", "**/*"],
4
+ "exclude": ["dist"]
5
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serialbench
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-06-14 00:00:00.000000000 Z
11
+ date: 2026-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -53,21 +53,21 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: thor
56
+ name: octokit
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '8.0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '8.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: csv
70
+ name: thor
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: liquid
84
+ name: csv
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: libxml-ruby
98
+ name: liquid
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: nokogiri
112
+ name: oga
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,7 +123,7 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: oga
126
+ name: ox
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -137,7 +137,7 @@ dependencies:
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
- name: ox
140
+ name: rexml
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - ">="
@@ -151,7 +151,7 @@ dependencies:
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
- name: rexml
154
+ name: oj
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - ">="
@@ -165,7 +165,7 @@ dependencies:
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
- name: oj
168
+ name: rapidjson
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - ">="
@@ -179,7 +179,7 @@ dependencies:
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
181
  - !ruby/object:Gem::Dependency
182
- name: rapidjson
182
+ name: yajl-ruby
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
185
  - - ">="
@@ -193,7 +193,7 @@ dependencies:
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
195
  - !ruby/object:Gem::Dependency
196
- name: yajl-ruby
196
+ name: syck
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - ">="
@@ -207,7 +207,7 @@ dependencies:
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
209
  - !ruby/object:Gem::Dependency
210
- name: syck
210
+ name: tomlib
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
213
  - - ">="
@@ -221,7 +221,7 @@ dependencies:
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
223
  - !ruby/object:Gem::Dependency
224
- name: tomlib
224
+ name: toml-rb
225
225
  requirement: !ruby/object:Gem::Requirement
226
226
  requirements:
227
227
  - - ">="
@@ -235,7 +235,7 @@ dependencies:
235
235
  - !ruby/object:Gem::Version
236
236
  version: '0'
237
237
  - !ruby/object:Gem::Dependency
238
- name: toml-rb
238
+ name: tomlrb
239
239
  requirement: !ruby/object:Gem::Requirement
240
240
  requirements:
241
241
  - - ">="
@@ -249,7 +249,7 @@ dependencies:
249
249
  - !ruby/object:Gem::Version
250
250
  version: '0'
251
251
  - !ruby/object:Gem::Dependency
252
- name: tomlrb
252
+ name: json-schema
253
253
  requirement: !ruby/object:Gem::Requirement
254
254
  requirements:
255
255
  - - ">="
@@ -272,11 +272,13 @@ extensions: []
272
272
  extra_rdoc_files: []
273
273
  files:
274
274
  - ".github/workflows/benchmark.yml"
275
- - ".github/workflows/ci.yml"
276
- - ".github/workflows/docker.yml"
277
275
  - ".github/workflows/rake.yml"
278
276
  - ".github/workflows/release.yml"
277
+ - ".github/workflows/windows-debug.yml"
278
+ - ".gitignore"
279
279
  - ".rspec"
280
+ - ".rubocop.yml"
281
+ - ".rubocop_todo.yml"
280
282
  - Gemfile
281
283
  - README.adoc
282
284
  - Rakefile
@@ -289,9 +291,15 @@ files:
289
291
  - config/environments/docker-ruby-3.2.yml
290
292
  - config/environments/docker-ruby-3.3.yml
291
293
  - config/environments/docker-ruby-3.4.yml
294
+ - data/schemas/result.yml
292
295
  - docker/Dockerfile.alpine
293
296
  - docker/Dockerfile.ubuntu
294
297
  - docker/README.md
298
+ - docs/PLATFORM_VALIDATION_FIX.md
299
+ - docs/SYCK_YAML_FIX.md
300
+ - docs/WEBSITE_COMPLETION_PLAN.md
301
+ - docs/WINDOWS_LIBXML_FIX.md
302
+ - docs/WINDOWS_SETUP.md
295
303
  - exe/serialbench
296
304
  - lib/serialbench.rb
297
305
  - lib/serialbench/benchmark_runner.rb
@@ -301,6 +309,7 @@ files:
301
309
  - lib/serialbench/cli/environment_cli.rb
302
310
  - lib/serialbench/cli/resultset_cli.rb
303
311
  - lib/serialbench/cli/ruby_build_cli.rb
312
+ - lib/serialbench/cli/validate_cli.rb
304
313
  - lib/serialbench/config_manager.rb
305
314
  - lib/serialbench/memory_profiler.rb
306
315
  - lib/serialbench/models.rb
@@ -315,6 +324,7 @@ files:
315
324
  - lib/serialbench/runners/asdf_runner.rb
316
325
  - lib/serialbench/runners/base.rb
317
326
  - lib/serialbench/runners/docker_runner.rb
327
+ - lib/serialbench/runners/local_runner.rb
318
328
  - lib/serialbench/serializers.rb
319
329
  - lib/serialbench/serializers/base_serializer.rb
320
330
  - lib/serialbench/serializers/json/base_json_serializer.rb
@@ -327,6 +337,7 @@ files:
327
337
  - lib/serialbench/serializers/toml/tomlib_serializer.rb
328
338
  - lib/serialbench/serializers/toml/tomlrb_serializer.rb
329
339
  - lib/serialbench/serializers/xml/base_xml_serializer.rb
340
+ - lib/serialbench/serializers/xml/leptris_serializer.rb
330
341
  - lib/serialbench/serializers/xml/libxml_serializer.rb
331
342
  - lib/serialbench/serializers/xml/nokogiri_serializer.rb
332
343
  - lib/serialbench/serializers/xml/oga_serializer.rb
@@ -346,7 +357,31 @@ files:
346
357
  - lib/serialbench/templates/format_based.liquid
347
358
  - lib/serialbench/templates/partials/chart_section.liquid
348
359
  - lib/serialbench/version.rb
360
+ - lib/serialbench/yaml_validator.rb
349
361
  - serialbench.gemspec
362
+ - site/.gitignore
363
+ - site/README.md
364
+ - site/astro.config.mjs
365
+ - site/package-lock.json
366
+ - site/package.json
367
+ - site/public/favicon.svg
368
+ - site/scripts/gen-sample-data.mjs
369
+ - site/src/components/AvailabilityMatrix.astro
370
+ - site/src/components/CalibratedLeaderboard.vue
371
+ - site/src/components/CitationBox.vue
372
+ - site/src/components/DashboardConsole.vue
373
+ - site/src/components/FeaturesTable.astro
374
+ - site/src/components/MemoryPanel.vue
375
+ - site/src/components/OpsChart.vue
376
+ - site/src/config.ts
377
+ - site/src/layouts/Layout.astro
378
+ - site/src/lib/channels.ts
379
+ - site/src/lib/dashboard.ts
380
+ - site/src/pages/index.astro
381
+ - site/src/pages/library/[slug].astro
382
+ - site/src/pages/methodology.astro
383
+ - site/src/styles/global.css
384
+ - site/tsconfig.json
350
385
  homepage: https://github.com/metanorma/serialbench
351
386
  licenses:
352
387
  - BSD-2-Clause
@@ -1,74 +0,0 @@
1
- name: ci
2
-
3
- on:
4
- push:
5
- branches: [ main, master ]
6
- pull_request:
7
- branches: [ main, master ]
8
-
9
- jobs:
10
- setup:
11
- runs-on: ubuntu-latest
12
- outputs:
13
- ruby-versions: ${{ steps.set-matrix.outputs.ruby-versions }}
14
- steps:
15
- - name: Set Ruby version matrix
16
- id: set-matrix
17
- run: |
18
- echo 'ruby-versions=["3.1", "3.2", "3.3", "3.4"]' >> $GITHUB_OUTPUT
19
-
20
- test:
21
- runs-on: ubuntu-latest
22
- needs: setup
23
- strategy:
24
- matrix:
25
- ruby-version: ${{ fromJson(needs.setup.outputs.ruby-versions) }}
26
- fail-fast: false
27
-
28
- steps:
29
- - uses: actions/checkout@v4
30
-
31
- - name: Set up Ruby ${{ matrix.ruby-version }}
32
- uses: ruby/setup-ruby@v1
33
- with:
34
- ruby-version: ${{ matrix.ruby-version }}
35
- bundler-cache: true
36
-
37
- - name: Install system dependencies
38
- run: |
39
- sudo apt-get update
40
- sudo apt-get install -y libxml2-dev libxslt1-dev
41
-
42
- - name: List available serializers
43
- run: bundle exec serialbench list
44
-
45
- - name: Run tests
46
- run: bundle exec rspec
47
-
48
- - name: Run quick benchmark test
49
- run: |
50
- # Run a quick benchmark to ensure the CLI works
51
- bundle exec serialbench benchmark --formats xml --data-sizes small --iterations 5
52
-
53
- lint:
54
- runs-on: ubuntu-latest
55
- steps:
56
- - uses: actions/checkout@v4
57
-
58
- - name: Set up Ruby
59
- uses: ruby/setup-ruby@v1
60
- with:
61
- ruby-version: '3.3'
62
- bundler-cache: true
63
-
64
- - name: Run RuboCop (if available)
65
- run: |
66
- if bundle list | grep -q rubocop; then
67
- bundle exec rubocop
68
- else
69
- echo "RuboCop not found, skipping linting"
70
- fi
71
- continue-on-error: true
72
-
73
- - name: Check gemspec
74
- run: gem build serialbench.gemspec