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.
- checksums.yaml +4 -4
- data/.github/workflows/benchmark.yml +294 -229
- data/.github/workflows/rake.yml +11 -0
- data/.github/workflows/windows-debug.yml +171 -0
- data/.gitignore +32 -0
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +274 -0
- data/Gemfile +15 -1
- data/README.adoc +41 -0
- data/data/schemas/result.yml +29 -0
- data/docs/PLATFORM_VALIDATION_FIX.md +79 -0
- data/docs/SYCK_YAML_FIX.md +91 -0
- data/docs/WEBSITE_COMPLETION_PLAN.md +440 -0
- data/docs/WINDOWS_LIBXML_FIX.md +136 -0
- data/docs/WINDOWS_SETUP.md +122 -0
- data/lib/serialbench/benchmark_runner.rb +3 -3
- data/lib/serialbench/cli/benchmark_cli.rb +74 -1
- data/lib/serialbench/cli/environment_cli.rb +3 -3
- data/lib/serialbench/cli/resultset_cli.rb +112 -26
- data/lib/serialbench/cli/ruby_build_cli.rb +75 -88
- data/lib/serialbench/cli/validate_cli.rb +88 -0
- data/lib/serialbench/cli.rb +6 -2
- data/lib/serialbench/config_manager.rb +15 -26
- data/lib/serialbench/models/benchmark_config.rb +12 -0
- data/lib/serialbench/models/benchmark_result.rb +39 -3
- data/lib/serialbench/models/environment_config.rb +3 -2
- data/lib/serialbench/models/platform.rb +61 -6
- data/lib/serialbench/models/result.rb +28 -1
- data/lib/serialbench/models/result_set.rb +8 -0
- data/lib/serialbench/ruby_build_manager.rb +19 -23
- data/lib/serialbench/runners/asdf_runner.rb +1 -1
- data/lib/serialbench/runners/docker_runner.rb +2 -4
- data/lib/serialbench/runners/local_runner.rb +71 -0
- data/lib/serialbench/serializers/base_serializer.rb +1 -1
- data/lib/serialbench/serializers/json/rapidjson_serializer.rb +1 -5
- data/lib/serialbench/serializers/toml/base_toml_serializer.rb +0 -2
- data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +1 -1
- data/lib/serialbench/serializers/toml/tomlib_serializer.rb +1 -1
- data/lib/serialbench/serializers/xml/base_xml_serializer.rb +6 -1
- data/lib/serialbench/serializers/xml/leptris_serializer.rb +167 -0
- data/lib/serialbench/serializers/xml/libxml_serializer.rb +13 -8
- data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +11 -2
- data/lib/serialbench/serializers/xml/oga_serializer.rb +8 -8
- data/lib/serialbench/serializers/xml/ox_serializer.rb +2 -2
- data/lib/serialbench/serializers/xml/rexml_serializer.rb +3 -3
- data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +1 -3
- data/lib/serialbench/serializers/yaml/psych_serializer.rb +1 -5
- data/lib/serialbench/serializers/yaml/syck_serializer.rb +1 -1
- data/lib/serialbench/serializers.rb +5 -3
- data/lib/serialbench/site_generator.rb +234 -2
- data/lib/serialbench/templates/assets/css/format_based.css +1 -53
- data/lib/serialbench/templates/assets/css/themes.css +5 -4
- data/lib/serialbench/templates/assets/js/chart_helpers.js +44 -14
- data/lib/serialbench/templates/assets/js/dashboard.js +14 -15
- data/lib/serialbench/templates/format_based.liquid +480 -252
- data/lib/serialbench/version.rb +1 -1
- data/lib/serialbench/yaml_validator.rb +36 -0
- data/serialbench.gemspec +11 -2
- data/site/.gitignore +5 -0
- data/site/README.md +32 -0
- data/site/astro.config.mjs +12 -0
- data/site/package-lock.json +6160 -0
- data/site/package.json +22 -0
- data/site/public/favicon.svg +4 -0
- data/site/scripts/gen-sample-data.mjs +154 -0
- data/site/src/components/AvailabilityMatrix.astro +61 -0
- data/site/src/components/CalibratedLeaderboard.vue +134 -0
- data/site/src/components/CitationBox.vue +50 -0
- data/site/src/components/DashboardConsole.vue +193 -0
- data/site/src/components/FeaturesTable.astro +97 -0
- data/site/src/components/MemoryPanel.vue +44 -0
- data/site/src/components/OpsChart.vue +135 -0
- data/site/src/config.ts +18 -0
- data/site/src/layouts/Layout.astro +85 -0
- data/site/src/lib/channels.ts +24 -0
- data/site/src/lib/dashboard.ts +269 -0
- data/site/src/pages/index.astro +44 -0
- data/site/src/pages/library/[slug].astro +128 -0
- data/site/src/pages/methodology.astro +55 -0
- data/site/src/styles/global.css +103 -0
- data/site/tsconfig.json +5 -0
- metadata +58 -23
- data/.github/workflows/ci.yml +0 -74
- 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/<environment>.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 <env> <benchmark> <out></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
|
+
}
|
data/site/tsconfig.json
ADDED
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
data/.github/workflows/ci.yml
DELETED
|
@@ -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
|