serialbench 0.1.1 → 0.1.2

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 +13 -5
  3. data/.github/workflows/docker.yml +35 -9
  4. data/.github/workflows/rake.yml +15 -0
  5. data/Gemfile +2 -1
  6. data/README.adoc +267 -1129
  7. data/Rakefile +0 -55
  8. data/config/benchmarks/full.yml +29 -0
  9. data/config/benchmarks/short.yml +26 -0
  10. data/config/environments/asdf-ruby-3.2.yml +8 -0
  11. data/config/environments/asdf-ruby-3.3.yml +8 -0
  12. data/config/environments/docker-ruby-3.0.yml +9 -0
  13. data/config/environments/docker-ruby-3.1.yml +9 -0
  14. data/config/environments/docker-ruby-3.2.yml +9 -0
  15. data/config/environments/docker-ruby-3.3.yml +9 -0
  16. data/config/environments/docker-ruby-3.4.yml +9 -0
  17. data/docker/Dockerfile.alpine +33 -0
  18. data/docker/{Dockerfile.benchmark → Dockerfile.ubuntu} +4 -3
  19. data/docker/README.md +2 -2
  20. data/exe/serialbench +1 -1
  21. data/lib/serialbench/benchmark_runner.rb +261 -423
  22. data/lib/serialbench/cli/base_cli.rb +51 -0
  23. data/lib/serialbench/cli/benchmark_cli.rb +380 -0
  24. data/lib/serialbench/cli/environment_cli.rb +181 -0
  25. data/lib/serialbench/cli/resultset_cli.rb +215 -0
  26. data/lib/serialbench/cli/ruby_build_cli.rb +238 -0
  27. data/lib/serialbench/cli.rb +58 -601
  28. data/lib/serialbench/config_manager.rb +140 -0
  29. data/lib/serialbench/models/benchmark_config.rb +63 -0
  30. data/lib/serialbench/models/benchmark_result.rb +45 -0
  31. data/lib/serialbench/models/environment_config.rb +71 -0
  32. data/lib/serialbench/models/platform.rb +59 -0
  33. data/lib/serialbench/models/result.rb +53 -0
  34. data/lib/serialbench/models/result_set.rb +71 -0
  35. data/lib/serialbench/models/result_store.rb +108 -0
  36. data/lib/serialbench/models.rb +54 -0
  37. data/lib/serialbench/ruby_build_manager.rb +153 -0
  38. data/lib/serialbench/runners/asdf_runner.rb +296 -0
  39. data/lib/serialbench/runners/base.rb +32 -0
  40. data/lib/serialbench/runners/docker_runner.rb +142 -0
  41. data/lib/serialbench/serializers/base_serializer.rb +8 -16
  42. data/lib/serialbench/serializers/json/base_json_serializer.rb +4 -4
  43. data/lib/serialbench/serializers/json/json_serializer.rb +0 -2
  44. data/lib/serialbench/serializers/json/oj_serializer.rb +0 -2
  45. data/lib/serialbench/serializers/json/yajl_serializer.rb +0 -2
  46. data/lib/serialbench/serializers/toml/base_toml_serializer.rb +5 -3
  47. data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +0 -2
  48. data/lib/serialbench/serializers/toml/tomlib_serializer.rb +0 -2
  49. data/lib/serialbench/serializers/toml/tomlrb_serializer.rb +56 -0
  50. data/lib/serialbench/serializers/xml/base_xml_serializer.rb +4 -9
  51. data/lib/serialbench/serializers/xml/libxml_serializer.rb +0 -2
  52. data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +0 -2
  53. data/lib/serialbench/serializers/xml/oga_serializer.rb +0 -2
  54. data/lib/serialbench/serializers/xml/ox_serializer.rb +0 -2
  55. data/lib/serialbench/serializers/xml/rexml_serializer.rb +0 -2
  56. data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +5 -1
  57. data/lib/serialbench/serializers/yaml/syck_serializer.rb +59 -22
  58. data/lib/serialbench/serializers.rb +23 -6
  59. data/lib/serialbench/site_generator.rb +105 -0
  60. data/lib/serialbench/templates/assets/css/benchmark_report.css +535 -0
  61. data/lib/serialbench/templates/assets/css/format_based.css +526 -0
  62. data/lib/serialbench/templates/assets/css/themes.css +588 -0
  63. data/lib/serialbench/templates/assets/js/chart_helpers.js +381 -0
  64. data/lib/serialbench/templates/assets/js/dashboard.js +796 -0
  65. data/lib/serialbench/templates/assets/js/navigation.js +142 -0
  66. data/lib/serialbench/templates/base.liquid +49 -0
  67. data/lib/serialbench/templates/format_based.liquid +279 -0
  68. data/lib/serialbench/templates/partials/chart_section.liquid +4 -0
  69. data/lib/serialbench/version.rb +1 -1
  70. data/lib/serialbench.rb +2 -31
  71. data/serialbench.gemspec +4 -1
  72. metadata +86 -16
  73. data/config/ci.yml +0 -22
  74. data/config/full.yml +0 -30
  75. data/docker/run-benchmarks.sh +0 -356
  76. data/lib/serialbench/chart_generator.rb +0 -821
  77. data/lib/serialbench/result_formatter.rb +0 -182
  78. data/lib/serialbench/result_merger.rb +0 -1201
  79. data/lib/serialbench/serializers/xml/base_parser.rb +0 -69
  80. data/lib/serialbench/serializers/xml/libxml_parser.rb +0 -98
  81. data/lib/serialbench/serializers/xml/nokogiri_parser.rb +0 -111
  82. data/lib/serialbench/serializers/xml/oga_parser.rb +0 -85
  83. data/lib/serialbench/serializers/xml/ox_parser.rb +0 -64
  84. data/lib/serialbench/serializers/xml/rexml_parser.rb +0 -129
@@ -0,0 +1,535 @@
1
+ /* Serialbench Report Styles - Modern Pastel Theme */
2
+ :root {
3
+ --primary-color: #6b73ff;
4
+ --secondary-color: #9c88ff;
5
+ --accent-color: #ff8a95;
6
+ --success-color: #4ecdc4;
7
+ --warning-color: #ffd93d;
8
+ --background-color: #fefefe;
9
+ --text-color: #2d3748;
10
+ --border-color: #e2e8f0;
11
+ --light-bg: #f7fafc;
12
+ --card-bg: #ffffff;
13
+ --gradient-primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
14
+ --gradient-secondary: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
15
+ --gradient-accent: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%);
16
+ --shadow-soft: 0 4px 20px rgba(0, 0, 0, 0.08);
17
+ --shadow-medium: 0 8px 30px rgba(0, 0, 0, 0.12);
18
+ --border-radius: 16px;
19
+ --border-radius-small: 12px;
20
+ }
21
+
22
+ * {
23
+ margin: 0;
24
+ padding: 0;
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ body {
29
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Inter', sans-serif;
30
+ line-height: 1.7;
31
+ color: var(--text-color);
32
+ background: var(--gradient-secondary);
33
+ min-height: 100vh;
34
+ }
35
+
36
+ .container {
37
+ max-width: 1200px;
38
+ margin: 0 auto;
39
+ padding: 20px;
40
+ }
41
+
42
+ header {
43
+ text-align: center;
44
+ margin-bottom: 40px;
45
+ padding: 50px 30px;
46
+ background: var(--gradient-primary);
47
+ color: white;
48
+ border-radius: var(--border-radius);
49
+ box-shadow: var(--shadow-medium);
50
+ position: relative;
51
+ overflow: hidden;
52
+ }
53
+
54
+ header::before {
55
+ content: '';
56
+ position: absolute;
57
+ top: 0;
58
+ left: 0;
59
+ right: 0;
60
+ bottom: 0;
61
+ background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="grain" width="100" height="100" patternUnits="userSpaceOnUse"><circle cx="25" cy="25" r="1" fill="white" opacity="0.1"/><circle cx="75" cy="75" r="1" fill="white" opacity="0.1"/><circle cx="50" cy="10" r="0.5" fill="white" opacity="0.15"/><circle cx="20" cy="80" r="0.5" fill="white" opacity="0.15"/><circle cx="80" cy="30" r="0.5" fill="white" opacity="0.15"/></pattern></defs><rect width="100" height="100" fill="url(%23grain)"/></svg>');
62
+ pointer-events: none;
63
+ }
64
+
65
+ header > * {
66
+ position: relative;
67
+ z-index: 1;
68
+ }
69
+
70
+ header h1 {
71
+ font-size: 3em;
72
+ margin-bottom: 15px;
73
+ font-weight: 700;
74
+ letter-spacing: -0.02em;
75
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
76
+ }
77
+
78
+ .subtitle {
79
+ font-size: 1.3em;
80
+ opacity: 0.95;
81
+ margin-bottom: 25px;
82
+ font-weight: 300;
83
+ letter-spacing: 0.01em;
84
+ }
85
+
86
+ .metadata {
87
+ display: flex;
88
+ justify-content: center;
89
+ gap: 40px;
90
+ flex-wrap: wrap;
91
+ font-size: 0.95em;
92
+ font-weight: 400;
93
+ }
94
+
95
+ .metadata p {
96
+ background: rgba(255, 255, 255, 0.15);
97
+ padding: 8px 16px;
98
+ border-radius: var(--border-radius-small);
99
+ backdrop-filter: blur(10px);
100
+ border: 1px solid rgba(255, 255, 255, 0.2);
101
+ }
102
+
103
+ .benchmark-nav {
104
+ display: flex;
105
+ justify-content: center;
106
+ gap: 10px;
107
+ margin-bottom: 40px;
108
+ flex-wrap: wrap;
109
+ }
110
+
111
+ .nav-btn {
112
+ padding: 14px 28px;
113
+ border: none;
114
+ background: var(--card-bg);
115
+ color: var(--text-color);
116
+ border-radius: 30px;
117
+ cursor: pointer;
118
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
119
+ font-weight: 600;
120
+ font-size: 0.95em;
121
+ box-shadow: var(--shadow-soft);
122
+ border: 2px solid transparent;
123
+ position: relative;
124
+ overflow: hidden;
125
+ }
126
+
127
+ .nav-btn::before {
128
+ content: '';
129
+ position: absolute;
130
+ top: 0;
131
+ left: -100%;
132
+ width: 100%;
133
+ height: 100%;
134
+ background: var(--gradient-accent);
135
+ transition: left 0.3s ease;
136
+ z-index: 0;
137
+ }
138
+
139
+ .nav-btn:hover {
140
+ transform: translateY(-3px);
141
+ box-shadow: var(--shadow-medium);
142
+ border-color: var(--secondary-color);
143
+ }
144
+
145
+ .nav-btn:hover::before {
146
+ left: 0;
147
+ }
148
+
149
+ .nav-btn > * {
150
+ position: relative;
151
+ z-index: 1;
152
+ }
153
+
154
+ .nav-btn.active {
155
+ background: var(--gradient-primary);
156
+ color: white;
157
+ transform: translateY(-2px);
158
+ box-shadow: var(--shadow-medium);
159
+ }
160
+
161
+ .nav-btn.active::before {
162
+ display: none;
163
+ }
164
+
165
+ .section {
166
+ background: var(--card-bg);
167
+ border-radius: var(--border-radius);
168
+ padding: 40px;
169
+ box-shadow: var(--shadow-soft);
170
+ border: 1px solid var(--border-color);
171
+ backdrop-filter: blur(10px);
172
+ }
173
+
174
+ .section.hidden {
175
+ display: none;
176
+ }
177
+
178
+ .section.active {
179
+ display: block;
180
+ }
181
+
182
+ /* Hidden utility class for new templates */
183
+ .hidden {
184
+ display: none !important;
185
+ }
186
+
187
+ .section h2 {
188
+ color: var(--primary-color);
189
+ margin-bottom: 35px;
190
+ font-size: 2.2em;
191
+ font-weight: 700;
192
+ position: relative;
193
+ padding-bottom: 15px;
194
+ }
195
+
196
+ .section h2::after {
197
+ content: '';
198
+ position: absolute;
199
+ bottom: 0;
200
+ left: 0;
201
+ width: 60px;
202
+ height: 4px;
203
+ background: var(--gradient-primary);
204
+ border-radius: 2px;
205
+ }
206
+
207
+ .section h3 {
208
+ color: var(--primary-color);
209
+ margin: 35px 0 25px 0;
210
+ font-size: 1.6em;
211
+ font-weight: 600;
212
+ position: relative;
213
+ padding-left: 20px;
214
+ }
215
+
216
+ .section h3::before {
217
+ content: '';
218
+ position: absolute;
219
+ left: 0;
220
+ top: 50%;
221
+ transform: translateY(-50%);
222
+ width: 4px;
223
+ height: 24px;
224
+ background: var(--gradient-accent);
225
+ border-radius: 2px;
226
+ }
227
+
228
+ .charts-grid {
229
+ display: grid;
230
+ grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
231
+ gap: 30px;
232
+ margin-bottom: 40px;
233
+ }
234
+
235
+ .chart-container {
236
+ background: var(--card-bg);
237
+ padding: 25px;
238
+ border-radius: var(--border-radius-small);
239
+ border: 1px solid var(--border-color);
240
+ box-shadow: var(--shadow-soft);
241
+ transition: all 0.3s ease;
242
+ position: relative;
243
+ overflow: hidden;
244
+ }
245
+
246
+ .chart-container::before {
247
+ content: '';
248
+ position: absolute;
249
+ top: 0;
250
+ left: 0;
251
+ right: 0;
252
+ height: 3px;
253
+ background: var(--gradient-accent);
254
+ }
255
+
256
+ .chart-container:hover {
257
+ transform: translateY(-2px);
258
+ box-shadow: var(--shadow-medium);
259
+ }
260
+
261
+ .chart-container h4 {
262
+ text-align: center;
263
+ margin-bottom: 20px;
264
+ color: var(--primary-color);
265
+ font-size: 1.2em;
266
+ font-weight: 600;
267
+ letter-spacing: 0.01em;
268
+ }
269
+
270
+ .summary-grid {
271
+ display: grid;
272
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
273
+ gap: 30px;
274
+ }
275
+
276
+ .summary-card {
277
+ background: var(--card-bg);
278
+ padding: 30px;
279
+ border-radius: var(--border-radius-small);
280
+ border: 1px solid var(--border-color);
281
+ box-shadow: var(--shadow-soft);
282
+ transition: all 0.3s ease;
283
+ position: relative;
284
+ overflow: hidden;
285
+ }
286
+
287
+ .summary-card::before {
288
+ content: '';
289
+ position: absolute;
290
+ top: 0;
291
+ left: 0;
292
+ right: 0;
293
+ height: 3px;
294
+ background: var(--gradient-primary);
295
+ }
296
+
297
+ .summary-card:hover {
298
+ transform: translateY(-2px);
299
+ box-shadow: var(--shadow-medium);
300
+ }
301
+
302
+ .summary-card h3 {
303
+ color: var(--primary-color);
304
+ margin-bottom: 20px;
305
+ font-size: 1.4em;
306
+ font-weight: 600;
307
+ }
308
+
309
+ .summary-card ul {
310
+ list-style: none;
311
+ padding-left: 0;
312
+ }
313
+
314
+ .summary-card li {
315
+ padding: 12px 0;
316
+ border-bottom: 1px solid var(--border-color);
317
+ transition: all 0.2s ease;
318
+ position: relative;
319
+ padding-left: 20px;
320
+ }
321
+
322
+ .summary-card li::before {
323
+ content: '▸';
324
+ position: absolute;
325
+ left: 0;
326
+ color: var(--secondary-color);
327
+ font-weight: bold;
328
+ }
329
+
330
+ .summary-card li:hover {
331
+ padding-left: 25px;
332
+ color: var(--primary-color);
333
+ }
334
+
335
+ .summary-card li:last-child {
336
+ border-bottom: none;
337
+ }
338
+
339
+ .environments-grid {
340
+ display: grid;
341
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
342
+ gap: 20px;
343
+ }
344
+
345
+ .environment-card {
346
+ background: var(--card-bg);
347
+ padding: 25px;
348
+ border-radius: var(--border-radius-small);
349
+ border: 1px solid var(--border-color);
350
+ box-shadow: var(--shadow-soft);
351
+ transition: all 0.3s ease;
352
+ position: relative;
353
+ overflow: hidden;
354
+ }
355
+
356
+ .environment-card::before {
357
+ content: '';
358
+ position: absolute;
359
+ top: 0;
360
+ left: 0;
361
+ right: 0;
362
+ height: 3px;
363
+ background: var(--gradient-secondary);
364
+ }
365
+
366
+ .environment-card:hover {
367
+ transform: translateY(-2px);
368
+ box-shadow: var(--shadow-medium);
369
+ }
370
+
371
+ .environment-card h3 {
372
+ color: var(--primary-color);
373
+ margin-bottom: 18px;
374
+ font-size: 1.3em;
375
+ font-weight: 600;
376
+ }
377
+
378
+ .environment-card p {
379
+ margin-bottom: 8px;
380
+ color: #6c757d;
381
+ }
382
+
383
+ .serializer-versions {
384
+ margin-top: 15px;
385
+ }
386
+
387
+ .serializer-versions h4 {
388
+ color: var(--primary-color);
389
+ margin-bottom: 12px;
390
+ font-size: 1.1em;
391
+ font-weight: 600;
392
+ }
393
+
394
+ .serializer-versions ul {
395
+ list-style: none;
396
+ padding-left: 0;
397
+ }
398
+
399
+ .serializer-versions li {
400
+ padding: 6px 0;
401
+ color: var(--text-color);
402
+ font-size: 0.95em;
403
+ transition: color 0.2s ease;
404
+ }
405
+
406
+ .serializer-versions li:hover {
407
+ color: var(--primary-color);
408
+ }
409
+
410
+ @media (max-width: 768px) {
411
+ .container {
412
+ padding: 15px;
413
+ }
414
+
415
+ header {
416
+ padding: 30px 20px;
417
+ margin-bottom: 30px;
418
+ }
419
+
420
+ header h1 {
421
+ font-size: 2.2em;
422
+ }
423
+
424
+ .metadata {
425
+ flex-direction: column;
426
+ gap: 15px;
427
+ }
428
+
429
+ .metadata p {
430
+ padding: 10px 20px;
431
+ }
432
+
433
+ .benchmark-nav {
434
+ gap: 8px;
435
+ }
436
+
437
+ .nav-btn {
438
+ padding: 12px 20px;
439
+ font-size: 0.9em;
440
+ }
441
+
442
+ .section {
443
+ padding: 25px;
444
+ }
445
+
446
+ .section h2 {
447
+ font-size: 1.8em;
448
+ }
449
+
450
+ .section h3 {
451
+ font-size: 1.4em;
452
+ margin: 25px 0 20px 0;
453
+ }
454
+
455
+ .charts-grid {
456
+ grid-template-columns: 1fr;
457
+ gap: 20px;
458
+ }
459
+
460
+ .chart-container {
461
+ padding: 20px;
462
+ }
463
+
464
+ .summary-grid {
465
+ grid-template-columns: 1fr;
466
+ gap: 20px;
467
+ }
468
+
469
+ .environments-grid {
470
+ grid-template-columns: 1fr;
471
+ }
472
+ }
473
+
474
+ /* Additional modern enhancements */
475
+ .charts-grid {
476
+ gap: 25px;
477
+ }
478
+
479
+ .summary-grid {
480
+ gap: 25px;
481
+ }
482
+
483
+ .environments-grid {
484
+ gap: 25px;
485
+ }
486
+
487
+ /* Smooth scrolling */
488
+ html {
489
+ scroll-behavior: smooth;
490
+ }
491
+
492
+ /* Focus styles for accessibility */
493
+ .nav-btn:focus {
494
+ outline: 2px solid var(--primary-color);
495
+ outline-offset: 2px;
496
+ }
497
+
498
+ /* Loading animation for charts */
499
+ @keyframes fadeInUp {
500
+ from {
501
+ opacity: 0;
502
+ transform: translateY(20px);
503
+ }
504
+ to {
505
+ opacity: 1;
506
+ transform: translateY(0);
507
+ }
508
+ }
509
+
510
+ .chart-container {
511
+ animation: fadeInUp 0.6s ease-out;
512
+ }
513
+
514
+ .summary-card {
515
+ animation: fadeInUp 0.6s ease-out;
516
+ }
517
+
518
+ .environment-card {
519
+ animation: fadeInUp 0.6s ease-out;
520
+ }
521
+
522
+ /* Stagger animation delays */
523
+ .chart-container:nth-child(1) { animation-delay: 0.1s; }
524
+ .chart-container:nth-child(2) { animation-delay: 0.2s; }
525
+ .chart-container:nth-child(3) { animation-delay: 0.3s; }
526
+ .chart-container:nth-child(4) { animation-delay: 0.4s; }
527
+
528
+ .summary-card:nth-child(1) { animation-delay: 0.1s; }
529
+ .summary-card:nth-child(2) { animation-delay: 0.2s; }
530
+
531
+ .environment-card:nth-child(1) { animation-delay: 0.1s; }
532
+ .environment-card:nth-child(2) { animation-delay: 0.2s; }
533
+ .environment-card:nth-child(3) { animation-delay: 0.3s; }
534
+ .environment-card:nth-child(4) { animation-delay: 0.4s; }
535
+ .environment-card:nth-child(5) { animation-delay: 0.5s; }