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.
- checksums.yaml +4 -4
- data/.github/workflows/benchmark.yml +273 -220
- data/.github/workflows/rake.yml +26 -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 +14 -1
- data/README.adoc +292 -1118
- data/Rakefile +0 -55
- data/config/benchmarks/full.yml +29 -0
- data/config/benchmarks/short.yml +26 -0
- data/config/environments/asdf-ruby-3.2.yml +8 -0
- data/config/environments/asdf-ruby-3.3.yml +8 -0
- data/config/environments/docker-ruby-3.0.yml +9 -0
- data/config/environments/docker-ruby-3.1.yml +9 -0
- data/config/environments/docker-ruby-3.2.yml +9 -0
- data/config/environments/docker-ruby-3.3.yml +9 -0
- data/config/environments/docker-ruby-3.4.yml +9 -0
- data/data/schemas/result.yml +29 -0
- data/docker/Dockerfile.alpine +33 -0
- data/docker/{Dockerfile.benchmark → Dockerfile.ubuntu} +4 -3
- data/docker/README.md +2 -2
- 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/exe/serialbench +1 -1
- data/lib/serialbench/benchmark_runner.rb +261 -423
- data/lib/serialbench/cli/base_cli.rb +51 -0
- data/lib/serialbench/cli/benchmark_cli.rb +453 -0
- data/lib/serialbench/cli/environment_cli.rb +181 -0
- data/lib/serialbench/cli/resultset_cli.rb +261 -0
- data/lib/serialbench/cli/ruby_build_cli.rb +225 -0
- data/lib/serialbench/cli/validate_cli.rb +88 -0
- data/lib/serialbench/cli.rb +61 -600
- data/lib/serialbench/config_manager.rb +129 -0
- data/lib/serialbench/models/benchmark_config.rb +75 -0
- data/lib/serialbench/models/benchmark_result.rb +81 -0
- data/lib/serialbench/models/environment_config.rb +72 -0
- data/lib/serialbench/models/platform.rb +111 -0
- data/lib/serialbench/models/result.rb +80 -0
- data/lib/serialbench/models/result_set.rb +79 -0
- data/lib/serialbench/models/result_store.rb +108 -0
- data/lib/serialbench/models.rb +54 -0
- data/lib/serialbench/ruby_build_manager.rb +149 -0
- data/lib/serialbench/runners/asdf_runner.rb +296 -0
- data/lib/serialbench/runners/base.rb +32 -0
- data/lib/serialbench/runners/docker_runner.rb +140 -0
- data/lib/serialbench/runners/local_runner.rb +71 -0
- data/lib/serialbench/serializers/base_serializer.rb +9 -17
- data/lib/serialbench/serializers/json/base_json_serializer.rb +4 -4
- data/lib/serialbench/serializers/json/json_serializer.rb +0 -2
- data/lib/serialbench/serializers/json/oj_serializer.rb +0 -2
- data/lib/serialbench/serializers/json/rapidjson_serializer.rb +1 -1
- data/lib/serialbench/serializers/json/yajl_serializer.rb +0 -2
- data/lib/serialbench/serializers/toml/base_toml_serializer.rb +5 -5
- data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +1 -3
- data/lib/serialbench/serializers/toml/tomlib_serializer.rb +1 -3
- data/lib/serialbench/serializers/toml/tomlrb_serializer.rb +56 -0
- data/lib/serialbench/serializers/xml/base_xml_serializer.rb +4 -9
- data/lib/serialbench/serializers/xml/libxml_serializer.rb +4 -10
- data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +2 -4
- data/lib/serialbench/serializers/xml/oga_serializer.rb +4 -10
- data/lib/serialbench/serializers/xml/ox_serializer.rb +2 -4
- data/lib/serialbench/serializers/xml/rexml_serializer.rb +3 -5
- data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +5 -1
- data/lib/serialbench/serializers/yaml/psych_serializer.rb +1 -1
- data/lib/serialbench/serializers/yaml/syck_serializer.rb +60 -23
- data/lib/serialbench/serializers.rb +23 -6
- data/lib/serialbench/site_generator.rb +283 -0
- data/lib/serialbench/templates/assets/css/benchmark_report.css +535 -0
- data/lib/serialbench/templates/assets/css/format_based.css +474 -0
- data/lib/serialbench/templates/assets/css/themes.css +589 -0
- data/lib/serialbench/templates/assets/js/chart_helpers.js +411 -0
- data/lib/serialbench/templates/assets/js/dashboard.js +795 -0
- data/lib/serialbench/templates/assets/js/navigation.js +142 -0
- data/lib/serialbench/templates/base.liquid +49 -0
- data/lib/serialbench/templates/format_based.liquid +507 -0
- data/lib/serialbench/templates/partials/chart_section.liquid +4 -0
- data/lib/serialbench/version.rb +1 -1
- data/lib/serialbench/yaml_validator.rb +36 -0
- data/lib/serialbench.rb +2 -31
- data/serialbench.gemspec +15 -3
- metadata +106 -25
- data/.github/workflows/ci.yml +0 -74
- data/.github/workflows/docker.yml +0 -246
- data/config/ci.yml +0 -22
- data/config/full.yml +0 -30
- data/docker/run-benchmarks.sh +0 -356
- data/lib/serialbench/chart_generator.rb +0 -821
- data/lib/serialbench/result_formatter.rb +0 -182
- data/lib/serialbench/result_merger.rb +0 -1201
- data/lib/serialbench/serializers/xml/base_parser.rb +0 -69
- data/lib/serialbench/serializers/xml/libxml_parser.rb +0 -98
- data/lib/serialbench/serializers/xml/nokogiri_parser.rb +0 -111
- data/lib/serialbench/serializers/xml/oga_parser.rb +0 -85
- data/lib/serialbench/serializers/xml/ox_parser.rb +0 -64
- data/lib/serialbench/serializers/xml/rexml_parser.rb +0 -129
data/lib/serialbench/version.rb
CHANGED
|
@@ -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.
|
|
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-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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/
|
|
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/
|
|
241
|
-
- config/
|
|
242
|
-
-
|
|
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
|
-
-
|
|
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/
|
|
252
|
-
- lib/serialbench/
|
|
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/
|
|
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:
|
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
|
|
@@ -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
|