serialbench 0.1.1 → 0.1.3

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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/benchmark.yml +273 -220
  3. data/.github/workflows/rake.yml +26 -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 +14 -1
  9. data/README.adoc +292 -1118
  10. data/Rakefile +0 -55
  11. data/config/benchmarks/full.yml +29 -0
  12. data/config/benchmarks/short.yml +26 -0
  13. data/config/environments/asdf-ruby-3.2.yml +8 -0
  14. data/config/environments/asdf-ruby-3.3.yml +8 -0
  15. data/config/environments/docker-ruby-3.0.yml +9 -0
  16. data/config/environments/docker-ruby-3.1.yml +9 -0
  17. data/config/environments/docker-ruby-3.2.yml +9 -0
  18. data/config/environments/docker-ruby-3.3.yml +9 -0
  19. data/config/environments/docker-ruby-3.4.yml +9 -0
  20. data/data/schemas/result.yml +29 -0
  21. data/docker/Dockerfile.alpine +33 -0
  22. data/docker/{Dockerfile.benchmark → Dockerfile.ubuntu} +4 -3
  23. data/docker/README.md +2 -2
  24. data/docs/PLATFORM_VALIDATION_FIX.md +79 -0
  25. data/docs/SYCK_YAML_FIX.md +91 -0
  26. data/docs/WEBSITE_COMPLETION_PLAN.md +440 -0
  27. data/docs/WINDOWS_LIBXML_FIX.md +136 -0
  28. data/docs/WINDOWS_SETUP.md +122 -0
  29. data/exe/serialbench +1 -1
  30. data/lib/serialbench/benchmark_runner.rb +261 -423
  31. data/lib/serialbench/cli/base_cli.rb +51 -0
  32. data/lib/serialbench/cli/benchmark_cli.rb +453 -0
  33. data/lib/serialbench/cli/environment_cli.rb +181 -0
  34. data/lib/serialbench/cli/resultset_cli.rb +261 -0
  35. data/lib/serialbench/cli/ruby_build_cli.rb +225 -0
  36. data/lib/serialbench/cli/validate_cli.rb +88 -0
  37. data/lib/serialbench/cli.rb +61 -600
  38. data/lib/serialbench/config_manager.rb +129 -0
  39. data/lib/serialbench/models/benchmark_config.rb +75 -0
  40. data/lib/serialbench/models/benchmark_result.rb +81 -0
  41. data/lib/serialbench/models/environment_config.rb +72 -0
  42. data/lib/serialbench/models/platform.rb +111 -0
  43. data/lib/serialbench/models/result.rb +80 -0
  44. data/lib/serialbench/models/result_set.rb +79 -0
  45. data/lib/serialbench/models/result_store.rb +108 -0
  46. data/lib/serialbench/models.rb +54 -0
  47. data/lib/serialbench/ruby_build_manager.rb +149 -0
  48. data/lib/serialbench/runners/asdf_runner.rb +296 -0
  49. data/lib/serialbench/runners/base.rb +32 -0
  50. data/lib/serialbench/runners/docker_runner.rb +140 -0
  51. data/lib/serialbench/runners/local_runner.rb +71 -0
  52. data/lib/serialbench/serializers/base_serializer.rb +9 -17
  53. data/lib/serialbench/serializers/json/base_json_serializer.rb +4 -4
  54. data/lib/serialbench/serializers/json/json_serializer.rb +0 -2
  55. data/lib/serialbench/serializers/json/oj_serializer.rb +0 -2
  56. data/lib/serialbench/serializers/json/rapidjson_serializer.rb +1 -1
  57. data/lib/serialbench/serializers/json/yajl_serializer.rb +0 -2
  58. data/lib/serialbench/serializers/toml/base_toml_serializer.rb +5 -5
  59. data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +1 -3
  60. data/lib/serialbench/serializers/toml/tomlib_serializer.rb +1 -3
  61. data/lib/serialbench/serializers/toml/tomlrb_serializer.rb +56 -0
  62. data/lib/serialbench/serializers/xml/base_xml_serializer.rb +4 -9
  63. data/lib/serialbench/serializers/xml/libxml_serializer.rb +4 -10
  64. data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +2 -4
  65. data/lib/serialbench/serializers/xml/oga_serializer.rb +4 -10
  66. data/lib/serialbench/serializers/xml/ox_serializer.rb +2 -4
  67. data/lib/serialbench/serializers/xml/rexml_serializer.rb +3 -5
  68. data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +5 -1
  69. data/lib/serialbench/serializers/yaml/psych_serializer.rb +1 -1
  70. data/lib/serialbench/serializers/yaml/syck_serializer.rb +60 -23
  71. data/lib/serialbench/serializers.rb +23 -6
  72. data/lib/serialbench/site_generator.rb +283 -0
  73. data/lib/serialbench/templates/assets/css/benchmark_report.css +535 -0
  74. data/lib/serialbench/templates/assets/css/format_based.css +474 -0
  75. data/lib/serialbench/templates/assets/css/themes.css +589 -0
  76. data/lib/serialbench/templates/assets/js/chart_helpers.js +411 -0
  77. data/lib/serialbench/templates/assets/js/dashboard.js +795 -0
  78. data/lib/serialbench/templates/assets/js/navigation.js +142 -0
  79. data/lib/serialbench/templates/base.liquid +49 -0
  80. data/lib/serialbench/templates/format_based.liquid +507 -0
  81. data/lib/serialbench/templates/partials/chart_section.liquid +4 -0
  82. data/lib/serialbench/version.rb +1 -1
  83. data/lib/serialbench/yaml_validator.rb +36 -0
  84. data/lib/serialbench.rb +2 -31
  85. data/serialbench.gemspec +15 -3
  86. metadata +106 -25
  87. data/.github/workflows/ci.yml +0 -74
  88. data/.github/workflows/docker.yml +0 -246
  89. data/config/ci.yml +0 -22
  90. data/config/full.yml +0 -30
  91. data/docker/run-benchmarks.sh +0 -356
  92. data/lib/serialbench/chart_generator.rb +0 -821
  93. data/lib/serialbench/result_formatter.rb +0 -182
  94. data/lib/serialbench/result_merger.rb +0 -1201
  95. data/lib/serialbench/serializers/xml/base_parser.rb +0 -69
  96. data/lib/serialbench/serializers/xml/libxml_parser.rb +0 -98
  97. data/lib/serialbench/serializers/xml/nokogiri_parser.rb +0 -111
  98. data/lib/serialbench/serializers/xml/oga_parser.rb +0 -85
  99. data/lib/serialbench/serializers/xml/ox_parser.rb +0 -64
  100. data/lib/serialbench/serializers/xml/rexml_parser.rb +0 -129
@@ -0,0 +1,4 @@
1
+ <div class="chart-container">
2
+ <h4>{{ chart.title }}</h4>
3
+ <canvas id="{{ chart.id }}" width="400" height="300"></canvas>
4
+ </div>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Serialbench
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.3'
5
5
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json-schema'
4
+ require 'yaml'
5
+
6
+ module Serialbench
7
+ # Validates YAML files against YAML Schema definitions
8
+ class YamlValidator
9
+ SCHEMA_DIR = File.join(__dir__, '..', '..', 'data', 'schemas')
10
+
11
+ class << self
12
+ def validate(file_path, schema_name)
13
+ unless File.exist?(file_path)
14
+ raise ArgumentError, "File not found: #{file_path}"
15
+ end
16
+
17
+ data = YAML.load_file(file_path)
18
+ schema_path = File.join(SCHEMA_DIR, "#{schema_name}.yml")
19
+
20
+ unless File.exist?(schema_path)
21
+ raise ArgumentError, "Schema not found: #{schema_path}"
22
+ end
23
+
24
+ schema = YAML.load_file(schema_path)
25
+
26
+ # Validate without strict schema checking (allow additional properties)
27
+ JSON::Validator.validate!(schema, data, strict: false)
28
+
29
+ true
30
+ rescue JSON::Schema::ValidationError => e
31
+ puts "❌ Validation failed: #{e.message}"
32
+ false
33
+ end
34
+ end
35
+ end
36
+ end
data/lib/serialbench.rb CHANGED
@@ -3,40 +3,11 @@
3
3
  require_relative 'serialbench/version'
4
4
  require_relative 'serialbench/serializers'
5
5
  require_relative 'serialbench/benchmark_runner'
6
- require_relative 'serialbench/result_merger'
7
6
  require_relative 'serialbench/cli'
8
- require_relative 'serialbench/result_formatter'
9
- require_relative 'serialbench/chart_generator'
10
7
  require_relative 'serialbench/memory_profiler'
8
+ require_relative 'serialbench/models'
9
+ require_relative 'serialbench/site_generator'
11
10
 
12
11
  module Serialbench
13
12
  class Error < StandardError; end
14
-
15
- # Supported serialization formats
16
- FORMATS = %i[xml json toml].freeze
17
-
18
- def self.run_benchmarks(formats: FORMATS, options: {})
19
- runner = BenchmarkRunner.new(formats: formats, **options)
20
- runner.run_all_benchmarks
21
- end
22
-
23
- def self.available_serializers(format = nil)
24
- runner = BenchmarkRunner.new
25
- if format
26
- runner.serializers_for_format(format)
27
- else
28
- runner.all_serializers
29
- end
30
- end
31
-
32
- def self.generate_reports(results)
33
- result_merger = Serialbench::ResultMerger.new
34
- result_merger.generate_all_reports(results)
35
- end
36
-
37
- def self.generate_reports_from_data(data_file)
38
- require 'json'
39
- data = JSON.parse(File.read(data_file), symbolize_names: true)
40
- generate_reports(data)
41
- end
42
13
  end
data/serialbench.gemspec CHANGED
@@ -26,24 +26,32 @@ Gem::Specification.new do |spec|
26
26
  spec.files = all_files_in_git
27
27
  .reject { |f| f.match(%r{\A(?:spec|features|bin|\.)/}) }
28
28
 
29
+ # Ensure data directory is included
30
+ spec.files += Dir['data/**/*'].select { |f| File.file?(f) }
31
+
29
32
  spec.bindir = 'exe'
30
33
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
34
  spec.require_paths = ['lib']
32
35
 
33
36
  # Runtime dependencies
34
37
  spec.add_dependency 'benchmark-ips'
38
+ spec.add_dependency 'lutaml-model'
35
39
  spec.add_dependency 'memory_profiler'
40
+ spec.add_dependency 'octokit', '~> 8.0'
36
41
  spec.add_dependency 'thor'
37
42
 
38
43
  # Reporting dependencies
39
44
  spec.add_dependency 'csv' # Required from Ruby 3.4+
45
+ spec.add_dependency 'liquid' # Template engine for HTML reports
40
46
 
41
47
  # XML serializers
42
- spec.add_dependency 'rexml' # needed for Ruby 3.4+
43
- spec.add_dependency 'libxml-ruby'
44
- spec.add_dependency 'nokogiri'
45
48
  spec.add_dependency 'oga'
46
49
  spec.add_dependency 'ox'
50
+ spec.add_dependency 'rexml' # needed for Ruby 3.4+
51
+
52
+ # Note: nokogiri and libxml-ruby are defined in Gemfile with platform
53
+ # conditionals to properly exclude them on Windows ARM where libxml2
54
+ # compilation fails
47
55
 
48
56
  # JSON serializers
49
57
  spec.add_dependency 'oj'
@@ -56,4 +64,8 @@ Gem::Specification.new do |spec|
56
64
  # TOML serializers
57
65
  spec.add_dependency 'tomlib'
58
66
  spec.add_dependency 'toml-rb'
67
+ spec.add_dependency 'tomlrb'
68
+
69
+ # YAML validation
70
+ spec.add_dependency 'json-schema'
59
71
  end
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.1
4
+ version: 0.1.3
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-07 00:00:00.000000000 Z
11
+ date: 2025-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: memory_profiler
28
+ name: lutaml-model
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: thor
42
+ name: memory_profiler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,21 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: csv
56
+ name: octokit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '8.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '8.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: thor
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -67,7 +81,7 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rexml
84
+ name: csv
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
@@ -81,7 +95,7 @@ dependencies:
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: libxml-ruby
98
+ name: liquid
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ">="
@@ -95,7 +109,7 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: nokogiri
112
+ name: oga
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - ">="
@@ -109,7 +123,7 @@ dependencies:
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
- name: oga
126
+ name: ox
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - ">="
@@ -123,7 +137,7 @@ dependencies:
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
- name: ox
140
+ name: rexml
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - ">="
@@ -220,6 +234,34 @@ dependencies:
220
234
  - - ">="
221
235
  - !ruby/object:Gem::Version
222
236
  version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: tomlrb
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :runtime
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: json-schema
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ type: :runtime
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
223
265
  description: A benchmarking suite for comparing performance of various serialization
224
266
  libraries in Ruby, including XML, JSON, and TOML parsers/generators.
225
267
  email:
@@ -230,26 +272,59 @@ extensions: []
230
272
  extra_rdoc_files: []
231
273
  files:
232
274
  - ".github/workflows/benchmark.yml"
233
- - ".github/workflows/ci.yml"
234
- - ".github/workflows/docker.yml"
275
+ - ".github/workflows/rake.yml"
235
276
  - ".github/workflows/release.yml"
277
+ - ".github/workflows/windows-debug.yml"
278
+ - ".gitignore"
236
279
  - ".rspec"
280
+ - ".rubocop.yml"
281
+ - ".rubocop_todo.yml"
237
282
  - Gemfile
238
283
  - README.adoc
239
284
  - Rakefile
240
- - config/ci.yml
241
- - config/full.yml
242
- - docker/Dockerfile.benchmark
285
+ - config/benchmarks/full.yml
286
+ - config/benchmarks/short.yml
287
+ - config/environments/asdf-ruby-3.2.yml
288
+ - config/environments/asdf-ruby-3.3.yml
289
+ - config/environments/docker-ruby-3.0.yml
290
+ - config/environments/docker-ruby-3.1.yml
291
+ - config/environments/docker-ruby-3.2.yml
292
+ - config/environments/docker-ruby-3.3.yml
293
+ - config/environments/docker-ruby-3.4.yml
294
+ - data/schemas/result.yml
295
+ - docker/Dockerfile.alpine
296
+ - docker/Dockerfile.ubuntu
243
297
  - docker/README.md
244
- - docker/run-benchmarks.sh
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
245
303
  - exe/serialbench
246
304
  - lib/serialbench.rb
247
305
  - lib/serialbench/benchmark_runner.rb
248
- - lib/serialbench/chart_generator.rb
249
306
  - lib/serialbench/cli.rb
307
+ - lib/serialbench/cli/base_cli.rb
308
+ - lib/serialbench/cli/benchmark_cli.rb
309
+ - lib/serialbench/cli/environment_cli.rb
310
+ - lib/serialbench/cli/resultset_cli.rb
311
+ - lib/serialbench/cli/ruby_build_cli.rb
312
+ - lib/serialbench/cli/validate_cli.rb
313
+ - lib/serialbench/config_manager.rb
250
314
  - lib/serialbench/memory_profiler.rb
251
- - lib/serialbench/result_formatter.rb
252
- - lib/serialbench/result_merger.rb
315
+ - lib/serialbench/models.rb
316
+ - lib/serialbench/models/benchmark_config.rb
317
+ - lib/serialbench/models/benchmark_result.rb
318
+ - lib/serialbench/models/environment_config.rb
319
+ - lib/serialbench/models/platform.rb
320
+ - lib/serialbench/models/result.rb
321
+ - lib/serialbench/models/result_set.rb
322
+ - lib/serialbench/models/result_store.rb
323
+ - lib/serialbench/ruby_build_manager.rb
324
+ - lib/serialbench/runners/asdf_runner.rb
325
+ - lib/serialbench/runners/base.rb
326
+ - lib/serialbench/runners/docker_runner.rb
327
+ - lib/serialbench/runners/local_runner.rb
253
328
  - lib/serialbench/serializers.rb
254
329
  - lib/serialbench/serializers/base_serializer.rb
255
330
  - lib/serialbench/serializers/json/base_json_serializer.rb
@@ -260,22 +335,28 @@ files:
260
335
  - lib/serialbench/serializers/toml/base_toml_serializer.rb
261
336
  - lib/serialbench/serializers/toml/toml_rb_serializer.rb
262
337
  - lib/serialbench/serializers/toml/tomlib_serializer.rb
263
- - lib/serialbench/serializers/xml/base_parser.rb
338
+ - lib/serialbench/serializers/toml/tomlrb_serializer.rb
264
339
  - lib/serialbench/serializers/xml/base_xml_serializer.rb
265
- - lib/serialbench/serializers/xml/libxml_parser.rb
266
340
  - lib/serialbench/serializers/xml/libxml_serializer.rb
267
- - lib/serialbench/serializers/xml/nokogiri_parser.rb
268
341
  - lib/serialbench/serializers/xml/nokogiri_serializer.rb
269
- - lib/serialbench/serializers/xml/oga_parser.rb
270
342
  - lib/serialbench/serializers/xml/oga_serializer.rb
271
- - lib/serialbench/serializers/xml/ox_parser.rb
272
343
  - lib/serialbench/serializers/xml/ox_serializer.rb
273
- - lib/serialbench/serializers/xml/rexml_parser.rb
274
344
  - lib/serialbench/serializers/xml/rexml_serializer.rb
275
345
  - lib/serialbench/serializers/yaml/base_yaml_serializer.rb
276
346
  - lib/serialbench/serializers/yaml/psych_serializer.rb
277
347
  - lib/serialbench/serializers/yaml/syck_serializer.rb
348
+ - lib/serialbench/site_generator.rb
349
+ - lib/serialbench/templates/assets/css/benchmark_report.css
350
+ - lib/serialbench/templates/assets/css/format_based.css
351
+ - lib/serialbench/templates/assets/css/themes.css
352
+ - lib/serialbench/templates/assets/js/chart_helpers.js
353
+ - lib/serialbench/templates/assets/js/dashboard.js
354
+ - lib/serialbench/templates/assets/js/navigation.js
355
+ - lib/serialbench/templates/base.liquid
356
+ - lib/serialbench/templates/format_based.liquid
357
+ - lib/serialbench/templates/partials/chart_section.liquid
278
358
  - lib/serialbench/version.rb
359
+ - lib/serialbench/yaml_validator.rb
279
360
  - serialbench.gemspec
280
361
  homepage: https://github.com/metanorma/serialbench
281
362
  licenses:
@@ -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
@@ -1,246 +0,0 @@
1
- name: docker
2
-
3
- on:
4
- push:
5
- branches: [ main, master ]
6
- pull_request:
7
- branches: [ main, master ]
8
- schedule:
9
- # Build Docker images weekly on Saturdays at 1 AM UTC
10
- - cron: '0 1 * * 6'
11
- workflow_dispatch:
12
- # Allow manual triggering
13
-
14
- permissions:
15
- contents: read
16
- packages: write
17
-
18
- env:
19
- REGISTRY: ghcr.io
20
- IMAGE_NAME: ${{ github.repository }}/serialbench
21
-
22
- jobs:
23
- setup:
24
- runs-on: ubuntu-latest
25
- outputs:
26
- ruby-versions: ${{ steps.set-matrix.outputs.ruby-versions }}
27
- should-build: ${{ steps.check-changes.outputs.should-build }}
28
- steps:
29
- - name: Checkout repository
30
- uses: actions/checkout@v4
31
- with:
32
- fetch-depth: 2
33
-
34
- - name: Set Ruby version matrix
35
- id: set-matrix
36
- run: |
37
- echo 'ruby-versions=["3.1", "3.2", "3.3", "3.4"]' >> $GITHUB_OUTPUT
38
-
39
- - name: Check if Docker build is needed
40
- id: check-changes
41
- run: |
42
- # Always build on workflow_dispatch or schedule
43
- if [ "${{ github.event_name }}" == "workflow_dispatch" ] || [ "${{ github.event_name }}" == "schedule" ]; then
44
- echo "should-build=true" >> $GITHUB_OUTPUT
45
- echo "Manual or scheduled build triggered"
46
- exit 0
47
- fi
48
-
49
- # Check if code has changed since last commit
50
- if git diff --name-only HEAD~1 | grep -E '\.(rb|gemspec|yml|yaml)$|Gemfile|Dockerfile' > /dev/null; then
51
- echo "should-build=true" >> $GITHUB_OUTPUT
52
- echo "Code changes detected, will build new Docker images"
53
- else
54
- echo "should-build=false" >> $GITHUB_OUTPUT
55
- echo "No relevant code changes, skipping Docker build"
56
- fi
57
-
58
- build-docker-images:
59
- runs-on: ubuntu-latest
60
- needs: setup
61
- if: needs.setup.outputs.should-build == 'true'
62
- strategy:
63
- matrix:
64
- ruby-version: ${{ fromJson(needs.setup.outputs.ruby-versions) }}
65
- fail-fast: false
66
-
67
- steps:
68
- - name: Checkout repository
69
- uses: actions/checkout@v4
70
-
71
- - name: Set up Docker Buildx
72
- uses: docker/setup-buildx-action@v3
73
-
74
- - name: Log in to Container Registry
75
- uses: docker/login-action@v3
76
- with:
77
- registry: ${{ env.REGISTRY }}
78
- username: ${{ github.actor }}
79
- password: ${{ secrets.GITHUB_TOKEN }}
80
-
81
- - name: Extract metadata
82
- id: meta
83
- uses: docker/metadata-action@v5
84
- with:
85
- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
86
- tags: |
87
- type=ref,event=branch,suffix=-ruby-${{ matrix.ruby-version }}
88
- type=ref,event=pr,suffix=-ruby-${{ matrix.ruby-version }}
89
- type=sha,suffix=-ruby-${{ matrix.ruby-version }}
90
- type=raw,value=latest,suffix=-ruby-${{ matrix.ruby-version }},enable={{is_default_branch}}
91
-
92
- - name: Build and push Docker image
93
- uses: docker/build-push-action@v5
94
- with:
95
- context: .
96
- file: docker/Dockerfile.benchmark
97
- build-args: |
98
- RUBY_VERSION=${{ matrix.ruby-version }}
99
- push: true
100
- tags: ${{ steps.meta.outputs.tags }}
101
- labels: ${{ steps.meta.outputs.labels }}
102
- cache-from: type=gha
103
- cache-to: type=gha,mode=max
104
- platforms: linux/amd64,linux/arm64
105
-
106
- - name: Test Docker image
107
- run: |
108
- # Test that the image works correctly
109
- docker run --rm ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-ruby-${{ matrix.ruby-version }} \
110
- bundle exec serialbench list
111
-
112
- - name: Run basic functionality test
113
- run: |
114
- # Create a temporary results directory
115
- mkdir -p test-results
116
-
117
- # Run a quick benchmark test
118
- docker run --rm \
119
- -v $(pwd)/test-results:/app/results \
120
- ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-ruby-${{ matrix.ruby-version }} \
121
- bundle exec serialbench benchmark \
122
- --formats json \
123
- --iterations 1 \
124
- --warmup 0 \
125
- --output-dir /app/results
126
-
127
- # Verify results were generated
128
- ls -la test-results/
129
-
130
- # Clean up
131
- rm -rf test-results
132
-
133
- test-docker-images:
134
- runs-on: ubuntu-latest
135
- needs: [setup, build-docker-images]
136
- if: needs.setup.outputs.should-build == 'true'
137
- strategy:
138
- matrix:
139
- ruby-version: ${{ fromJson(needs.setup.outputs.ruby-versions) }}
140
- fail-fast: false
141
-
142
- steps:
143
- - name: Checkout repository
144
- uses: actions/checkout@v4
145
-
146
- - name: Set up Docker Buildx
147
- uses: docker/setup-buildx-action@v3
148
-
149
- - name: Log in to Container Registry
150
- uses: docker/login-action@v3
151
- with:
152
- registry: ${{ env.REGISTRY }}
153
- username: ${{ github.actor }}
154
- password: ${{ secrets.GITHUB_TOKEN }}
155
-
156
- - name: Pull Docker image
157
- run: |
158
- docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-ruby-${{ matrix.ruby-version }}
159
-
160
- - name: Test serializer availability
161
- run: |
162
- echo "Testing Ruby ${{ matrix.ruby-version }} container..."
163
- docker run --rm ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-ruby-${{ matrix.ruby-version }} \
164
- bundle exec ruby -e "
165
- require 'serialbench'
166
- puts 'Available serializers:'
167
- Serialbench::Serializers.available.each do |s|
168
- serializer = s.new
169
- puts \" #{serializer.format}: #{serializer.name} v#{serializer.version}\"
170
- end
171
- "
172
-
173
- - name: Run comprehensive tests
174
- run: |
175
- docker run --rm ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-ruby-${{ matrix.ruby-version }} \
176
- bundle exec rspec --format progress
177
-
178
- - name: Test benchmark execution
179
- run: |
180
- mkdir -p docker-test-results
181
-
182
- # Run a comprehensive but quick benchmark
183
- docker run --rm \
184
- -v $(pwd)/docker-test-results:/app/results \
185
- ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}-ruby-${{ matrix.ruby-version }} \
186
- bundle exec serialbench benchmark \
187
- --formats xml json yaml toml \
188
- --iterations 2 \
189
- --warmup 1 \
190
- --output-dir /app/results
191
-
192
- # Verify all expected files were created
193
- echo "Generated files:"
194
- find docker-test-results -type f -name "*.json" -o -name "*.html" -o -name "*.csv"
195
-
196
- # Clean up
197
- rm -rf docker-test-results
198
-
199
- cleanup:
200
- runs-on: ubuntu-latest
201
- needs: [setup, build-docker-images, test-docker-images]
202
- if: always() && github.event_name != 'pull_request'
203
- steps:
204
- - name: Log in to Container Registry
205
- uses: docker/login-action@v3
206
- with:
207
- registry: ${{ env.REGISTRY }}
208
- username: ${{ github.actor }}
209
- password: ${{ secrets.GITHUB_TOKEN }}
210
-
211
- - name: Clean up old Docker images
212
- run: |
213
- echo "Docker image cleanup would be implemented here"
214
- # Note: Actual cleanup requires additional GitHub API calls
215
- # For now, we rely on GitHub's automatic cleanup policies
216
- echo "Current images are tagged and will be managed by GitHub's retention policies"
217
-
218
- summary:
219
- runs-on: ubuntu-latest
220
- needs: [setup, build-docker-images, test-docker-images]
221
- if: always()
222
- steps:
223
- - name: Build Summary
224
- run: |
225
- echo "## Docker Build Summary" >> $GITHUB_STEP_SUMMARY
226
- echo "" >> $GITHUB_STEP_SUMMARY
227
- echo "**Build Status**: ${{ needs.build-docker-images.result }}" >> $GITHUB_STEP_SUMMARY
228
- echo "**Test Status**: ${{ needs.test-docker-images.result }}" >> $GITHUB_STEP_SUMMARY
229
- echo "**Should Build**: ${{ needs.setup.outputs.should-build }}" >> $GITHUB_STEP_SUMMARY
230
- echo "" >> $GITHUB_STEP_SUMMARY
231
- echo "### Available Images" >> $GITHUB_STEP_SUMMARY
232
- echo "" >> $GITHUB_STEP_SUMMARY
233
- echo "| Ruby Version | Image Tag |" >> $GITHUB_STEP_SUMMARY
234
- echo "|--------------|-----------|" >> $GITHUB_STEP_SUMMARY
235
- echo "| 3.1 | \`ghcr.io/metanorma/serialbench:main-ruby-3.1\` |" >> $GITHUB_STEP_SUMMARY
236
- echo "| 3.2 | \`ghcr.io/metanorma/serialbench:main-ruby-3.2\` |" >> $GITHUB_STEP_SUMMARY
237
- echo "| 3.3 | \`ghcr.io/metanorma/serialbench:main-ruby-3.3\` |" >> $GITHUB_STEP_SUMMARY
238
- echo "| 3.4 | \`ghcr.io/metanorma/serialbench:main-ruby-3.4\` |" >> $GITHUB_STEP_SUMMARY
239
- echo "" >> $GITHUB_STEP_SUMMARY
240
- echo "### Usage" >> $GITHUB_STEP_SUMMARY
241
- echo "" >> $GITHUB_STEP_SUMMARY
242
- echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
243
- echo "# Pull and run latest Ruby 3.3 container" >> $GITHUB_STEP_SUMMARY
244
- echo "docker pull ghcr.io/metanorma/serialbench:main-ruby-3.3" >> $GITHUB_STEP_SUMMARY
245
- echo "docker run --rm -v \$(pwd)/results:/app/results ghcr.io/metanorma/serialbench:main-ruby-3.3" >> $GITHUB_STEP_SUMMARY
246
- echo "\`\`\`" >> $GITHUB_STEP_SUMMARY