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