serialbench 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/benchmark.yml +0 -24
- data/.github/workflows/rake.yml +15 -18
- data/Gemfile +1 -1
- data/config/benchmarks/full-json.yml +2 -2
- data/config/benchmarks/full-toml.yml +2 -2
- data/config/benchmarks/full-xml.yml +2 -2
- data/config/benchmarks/full-yaml.yml +2 -2
- data/config/benchmarks/full.yml +2 -2
- data/config/benchmarks/short.yml +2 -2
- data/lib/serialbench/benchmark_runner.rb +21 -296
- data/lib/serialbench/cli/benchmark_cli.rb +8 -81
- data/lib/serialbench/cli.rb +0 -5
- data/lib/serialbench/models/benchmark_config.rb +1 -1
- data/lib/serialbench/models/result_store.rb +0 -38
- data/lib/serialbench/models.rb +0 -5
- data/lib/serialbench/serializers/base_serializer.rb +0 -4
- data/lib/serialbench/serializers/json/base_json_serializer.rb +8 -20
- data/lib/serialbench/serializers/json/json_serializer.rb +0 -16
- data/lib/serialbench/serializers/json/oj_serializer.rb +2 -17
- data/lib/serialbench/serializers/json/yajl_serializer.rb +2 -2
- data/lib/serialbench/serializers/toml/base_toml_serializer.rb +8 -29
- data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +0 -16
- data/lib/serialbench/serializers/toml/tomlib_serializer.rb +0 -4
- data/lib/serialbench/serializers/toml/tomlrb_serializer.rb +2 -18
- data/lib/serialbench/serializers/xml/base_xml_serializer.rb +4 -16
- data/lib/serialbench/serializers/xml/leptris_serializer.rb +1 -5
- data/lib/serialbench/serializers/xml/libxml_serializer.rb +4 -9
- data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +3 -3
- data/lib/serialbench/serializers/xml/oga_serializer.rb +3 -5
- data/lib/serialbench/serializers/xml/ox_serializer.rb +2 -2
- data/lib/serialbench/serializers/xml/rexml_serializer.rb +5 -12
- data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +1 -9
- data/lib/serialbench/serializers/yaml/syck_serializer.rb +0 -8
- data/lib/serialbench/test_data.rb +315 -0
- data/lib/serialbench/version.rb +1 -1
- data/lib/serialbench.rb +2 -1
- data/serialbench.gemspec +1 -2
- metadata +6 -23
- data/.github/workflows/windows-debug.yml +0 -171
- data/lib/serialbench/cli/resultset_cli.rb +0 -301
- data/lib/serialbench/models/result_set.rb +0 -79
- data/lib/serialbench/site_generator.rb +0 -337
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Serialbench
|
|
4
|
+
# Fixture documents for every format x size the benchmark engine measures.
|
|
5
|
+
class TestData
|
|
6
|
+
def self.load(config)
|
|
7
|
+
new(config).load
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def initialize(config)
|
|
11
|
+
@config = config
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def load
|
|
15
|
+
@config.data_sizes.each_with_object({}) do |size, data|
|
|
16
|
+
data[size] = @config.formats.each_with_object({}) do |format, formats|
|
|
17
|
+
formats[format] = fixture_file(size, format) || generate("#{size}.#{format}")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def fixture_file(size, format)
|
|
25
|
+
path = "test_data/#{size}.#{format}"
|
|
26
|
+
File.read(path) if File.exist?(path)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def generate(key)
|
|
30
|
+
case key
|
|
31
|
+
when 'small.xml' then generate_small_xml
|
|
32
|
+
when 'medium.xml' then generate_medium_xml
|
|
33
|
+
when 'large.xml' then generate_large_xml
|
|
34
|
+
when 'small.json' then generate_small_json
|
|
35
|
+
when 'medium.json' then generate_medium_json
|
|
36
|
+
when 'large.json' then generate_large_json
|
|
37
|
+
when 'small.yaml' then generate_small_yaml
|
|
38
|
+
when 'medium.yaml' then generate_medium_yaml
|
|
39
|
+
when 'large.yaml' then generate_large_yaml
|
|
40
|
+
when 'small.toml' then generate_small_toml
|
|
41
|
+
when 'medium.toml' then generate_medium_toml
|
|
42
|
+
when 'large.toml' then generate_large_toml
|
|
43
|
+
else raise ArgumentError, "no test data generator for #{key}"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Shared data structure generators
|
|
48
|
+
def small_test_data_structure
|
|
49
|
+
{
|
|
50
|
+
config: {
|
|
51
|
+
database: {
|
|
52
|
+
host: 'localhost',
|
|
53
|
+
port: 5432,
|
|
54
|
+
name: 'myapp',
|
|
55
|
+
user: 'admin',
|
|
56
|
+
password: 'secret'
|
|
57
|
+
},
|
|
58
|
+
cache: {
|
|
59
|
+
enabled: true,
|
|
60
|
+
ttl: 3600
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def medium_test_data_structure
|
|
67
|
+
{
|
|
68
|
+
users: (1..1000).map do |i|
|
|
69
|
+
{
|
|
70
|
+
id: i,
|
|
71
|
+
name: "User #{i}",
|
|
72
|
+
email: "user#{i}@example.com",
|
|
73
|
+
created_at: "2023-01-#{(i % 28) + 1}T10:00:00Z",
|
|
74
|
+
profile: {
|
|
75
|
+
age: 20 + (i % 50),
|
|
76
|
+
city: "City #{i % 100}",
|
|
77
|
+
preferences: {
|
|
78
|
+
theme: i.even? ? 'dark' : 'light',
|
|
79
|
+
notifications: (i % 3).zero?
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
end
|
|
84
|
+
}
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def large_test_data_structure
|
|
88
|
+
{
|
|
89
|
+
dataset: {
|
|
90
|
+
header: {
|
|
91
|
+
created: '2023-01-01T00:00:00Z',
|
|
92
|
+
count: 10_000,
|
|
93
|
+
format: 'data'
|
|
94
|
+
},
|
|
95
|
+
records: (1..10_000).map do |i|
|
|
96
|
+
{
|
|
97
|
+
id: i,
|
|
98
|
+
timestamp: "2023-01-01T#{format('%02d', i % 24)}:#{format('%02d', i % 60)}:#{format('%02d', i % 60)}Z",
|
|
99
|
+
data: {
|
|
100
|
+
field1: "Value #{i}",
|
|
101
|
+
field2: i * 2,
|
|
102
|
+
field3: (i % 100).zero? ? 'special' : 'normal',
|
|
103
|
+
nested: [
|
|
104
|
+
"Item #{i}-1",
|
|
105
|
+
"Item #{i}-2",
|
|
106
|
+
"Item #{i}-3"
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
metadata: {
|
|
110
|
+
source: 'generator',
|
|
111
|
+
version: '1.0',
|
|
112
|
+
checksum: i.to_s(16)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
end
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# XML test data generators
|
|
121
|
+
def generate_small_xml
|
|
122
|
+
data = small_test_data_structure
|
|
123
|
+
<<~XML
|
|
124
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
125
|
+
<config>
|
|
126
|
+
<database>
|
|
127
|
+
<host>#{data[:config][:database][:host]}</host>
|
|
128
|
+
<port>#{data[:config][:database][:port]}</port>
|
|
129
|
+
<name>#{data[:config][:database][:name]}</name>
|
|
130
|
+
<user>#{data[:config][:database][:user]}</user>
|
|
131
|
+
<password>#{data[:config][:database][:password]}</password>
|
|
132
|
+
</database>
|
|
133
|
+
<cache>
|
|
134
|
+
<enabled>#{data[:config][:cache][:enabled]}</enabled>
|
|
135
|
+
<ttl>#{data[:config][:cache][:ttl]}</ttl>
|
|
136
|
+
</cache>
|
|
137
|
+
</config>
|
|
138
|
+
XML
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def generate_medium_xml
|
|
142
|
+
data = medium_test_data_structure
|
|
143
|
+
users = data[:users].map do |user|
|
|
144
|
+
<<~USER
|
|
145
|
+
<user id="#{user[:id]}">
|
|
146
|
+
<name>#{user[:name]}</name>
|
|
147
|
+
<email>#{user[:email]}</email>
|
|
148
|
+
<created_at>#{user[:created_at]}</created_at>
|
|
149
|
+
<profile>
|
|
150
|
+
<age>#{user[:profile][:age]}</age>
|
|
151
|
+
<city>#{user[:profile][:city]}</city>
|
|
152
|
+
<preferences>
|
|
153
|
+
<theme>#{user[:profile][:preferences][:theme]}</theme>
|
|
154
|
+
<notifications>#{user[:profile][:preferences][:notifications]}</notifications>
|
|
155
|
+
</preferences>
|
|
156
|
+
</profile>
|
|
157
|
+
</user>
|
|
158
|
+
USER
|
|
159
|
+
end.join
|
|
160
|
+
|
|
161
|
+
<<~XML
|
|
162
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
163
|
+
<users>
|
|
164
|
+
#{users}
|
|
165
|
+
</users>
|
|
166
|
+
XML
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def generate_large_xml
|
|
170
|
+
data = large_test_data_structure
|
|
171
|
+
records = data[:dataset][:records].map do |record|
|
|
172
|
+
nested_items = record[:data][:nested].map { |item| " <item>#{item}</item>" }.join("\n")
|
|
173
|
+
<<~RECORD
|
|
174
|
+
<record id="#{record[:id]}">
|
|
175
|
+
<timestamp>#{record[:timestamp]}</timestamp>
|
|
176
|
+
<data>
|
|
177
|
+
<field1>#{record[:data][:field1]}</field1>
|
|
178
|
+
<field2>#{record[:data][:field2]}</field2>
|
|
179
|
+
<field3>#{record[:data][:field3]}</field3>
|
|
180
|
+
<nested>
|
|
181
|
+
#{nested_items}
|
|
182
|
+
</nested>
|
|
183
|
+
</data>
|
|
184
|
+
<metadata>
|
|
185
|
+
<source>#{record[:metadata][:source]}</source>
|
|
186
|
+
<version>#{record[:metadata][:version]}</version>
|
|
187
|
+
<checksum>#{record[:metadata][:checksum]}</checksum>
|
|
188
|
+
</metadata>
|
|
189
|
+
</record>
|
|
190
|
+
RECORD
|
|
191
|
+
end.join
|
|
192
|
+
|
|
193
|
+
<<~XML
|
|
194
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
195
|
+
<dataset>
|
|
196
|
+
<header>
|
|
197
|
+
<created>#{data[:dataset][:header][:created]}</created>
|
|
198
|
+
<count>#{data[:dataset][:header][:count]}</count>
|
|
199
|
+
<format>xml</format>
|
|
200
|
+
</header>
|
|
201
|
+
<records>
|
|
202
|
+
#{records}
|
|
203
|
+
</records>
|
|
204
|
+
</dataset>
|
|
205
|
+
XML
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# JSON test data generators
|
|
209
|
+
def generate_small_json
|
|
210
|
+
JSON.generate(small_test_data_structure)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def generate_medium_json
|
|
214
|
+
JSON.generate(medium_test_data_structure)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def generate_large_json
|
|
218
|
+
data = large_test_data_structure
|
|
219
|
+
data[:dataset][:header][:format] = 'json'
|
|
220
|
+
JSON.generate(data)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
# YAML test data generators
|
|
224
|
+
def generate_small_yaml
|
|
225
|
+
small_test_data_structure.to_yaml
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def generate_medium_yaml
|
|
229
|
+
medium_test_data_structure.to_yaml
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def generate_large_yaml
|
|
233
|
+
data = large_test_data_structure
|
|
234
|
+
data[:dataset][:header][:format] = 'yaml'
|
|
235
|
+
data.to_yaml
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# TOML test data generators
|
|
239
|
+
def generate_small_toml
|
|
240
|
+
data = small_test_data_structure
|
|
241
|
+
<<~TOML
|
|
242
|
+
[config]
|
|
243
|
+
|
|
244
|
+
[config.database]
|
|
245
|
+
host = "#{data[:config][:database][:host]}"
|
|
246
|
+
port = #{data[:config][:database][:port]}
|
|
247
|
+
name = "#{data[:config][:database][:name]}"
|
|
248
|
+
user = "#{data[:config][:database][:user]}"
|
|
249
|
+
password = "#{data[:config][:database][:password]}"
|
|
250
|
+
|
|
251
|
+
[config.cache]
|
|
252
|
+
enabled = #{data[:config][:cache][:enabled]}
|
|
253
|
+
ttl = #{data[:config][:cache][:ttl]}
|
|
254
|
+
TOML
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def generate_medium_toml
|
|
258
|
+
data = medium_test_data_structure
|
|
259
|
+
# Use smaller dataset for TOML due to verbosity
|
|
260
|
+
users = data[:users].first(100)
|
|
261
|
+
users.map do |user|
|
|
262
|
+
<<~USER
|
|
263
|
+
[[users]]
|
|
264
|
+
id = #{user[:id]}
|
|
265
|
+
name = "#{user[:name]}"
|
|
266
|
+
email = "#{user[:email]}"
|
|
267
|
+
created_at = "#{user[:created_at]}"
|
|
268
|
+
|
|
269
|
+
[users.profile]
|
|
270
|
+
age = #{user[:profile][:age]}
|
|
271
|
+
city = "#{user[:profile][:city]}"
|
|
272
|
+
|
|
273
|
+
[users.profile.preferences]
|
|
274
|
+
theme = "#{user[:profile][:preferences][:theme]}"
|
|
275
|
+
notifications = #{user[:profile][:preferences][:notifications]}
|
|
276
|
+
USER
|
|
277
|
+
end.join("\n")
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
def generate_large_toml
|
|
281
|
+
data = large_test_data_structure
|
|
282
|
+
# Use smaller dataset for TOML due to verbosity
|
|
283
|
+
records = data[:dataset][:records].first(1000)
|
|
284
|
+
records_toml = records.map do |record|
|
|
285
|
+
<<~RECORD
|
|
286
|
+
[[dataset.records]]
|
|
287
|
+
id = #{record[:id]}
|
|
288
|
+
timestamp = "#{record[:timestamp]}"
|
|
289
|
+
|
|
290
|
+
[dataset.records.data]
|
|
291
|
+
field1 = "#{record[:data][:field1]}"
|
|
292
|
+
field2 = #{record[:data][:field2]}
|
|
293
|
+
field3 = "#{record[:data][:field3]}"
|
|
294
|
+
nested = #{record[:data][:nested].inspect}
|
|
295
|
+
|
|
296
|
+
[dataset.records.metadata]
|
|
297
|
+
source = "#{record[:metadata][:source]}"
|
|
298
|
+
version = "#{record[:metadata][:version]}"
|
|
299
|
+
checksum = "#{record[:metadata][:checksum]}"
|
|
300
|
+
RECORD
|
|
301
|
+
end.join("\n")
|
|
302
|
+
|
|
303
|
+
<<~TOML
|
|
304
|
+
[dataset]
|
|
305
|
+
|
|
306
|
+
[dataset.header]
|
|
307
|
+
created = "#{data[:dataset][:header][:created]}"
|
|
308
|
+
count = #{records.length}
|
|
309
|
+
format = "toml"
|
|
310
|
+
|
|
311
|
+
#{records_toml}
|
|
312
|
+
TOML
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
end
|
data/lib/serialbench/version.rb
CHANGED
data/lib/serialbench.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative 'serialbench/version'
|
|
4
|
-
require_relative 'serialbench/site_generator'
|
|
5
4
|
require_relative 'serialbench/serializers'
|
|
6
5
|
require_relative 'serialbench/benchmark_runner'
|
|
7
6
|
require_relative 'serialbench/cli'
|
|
@@ -9,5 +8,7 @@ require_relative 'serialbench/memory_profiler'
|
|
|
9
8
|
require_relative 'serialbench/models'
|
|
10
9
|
|
|
11
10
|
module Serialbench
|
|
11
|
+
autoload :TestData, 'serialbench/test_data'
|
|
12
|
+
|
|
12
13
|
class Error < StandardError; end
|
|
13
14
|
end
|
data/serialbench.gemspec
CHANGED
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
|
|
|
14
14
|
|
|
15
15
|
spec.summary = 'Comprehensive serialization benchmarking tool for Ruby'
|
|
16
16
|
spec.description = 'A benchmarking suite for comparing performance of various serialization libraries in Ruby, including XML, JSON, and TOML parsers/generators.'
|
|
17
|
-
spec.homepage = 'https://github.com/
|
|
17
|
+
spec.homepage = 'https://github.com/serialbench/serialbench'
|
|
18
18
|
spec.license = 'BSD-2-Clause'
|
|
19
19
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
|
|
20
20
|
|
|
@@ -42,7 +42,6 @@ Gem::Specification.new do |spec|
|
|
|
42
42
|
|
|
43
43
|
# Reporting dependencies
|
|
44
44
|
spec.add_dependency 'csv' # Required from Ruby 3.4+
|
|
45
|
-
spec.add_dependency 'liquid' # Template engine for HTML reports
|
|
46
45
|
|
|
47
46
|
# XML serializers
|
|
48
47
|
spec.add_dependency 'oga'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: serialbench
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose
|
|
@@ -93,20 +93,6 @@ dependencies:
|
|
|
93
93
|
- - ">="
|
|
94
94
|
- !ruby/object:Gem::Version
|
|
95
95
|
version: '0'
|
|
96
|
-
- !ruby/object:Gem::Dependency
|
|
97
|
-
name: liquid
|
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
|
99
|
-
requirements:
|
|
100
|
-
- - ">="
|
|
101
|
-
- !ruby/object:Gem::Version
|
|
102
|
-
version: '0'
|
|
103
|
-
type: :runtime
|
|
104
|
-
prerelease: false
|
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
-
requirements:
|
|
107
|
-
- - ">="
|
|
108
|
-
- !ruby/object:Gem::Version
|
|
109
|
-
version: '0'
|
|
110
96
|
- !ruby/object:Gem::Dependency
|
|
111
97
|
name: oga
|
|
112
98
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -274,7 +260,6 @@ files:
|
|
|
274
260
|
- ".github/workflows/benchmark.yml"
|
|
275
261
|
- ".github/workflows/rake.yml"
|
|
276
262
|
- ".github/workflows/release.yml"
|
|
277
|
-
- ".github/workflows/windows-debug.yml"
|
|
278
263
|
- ".gitignore"
|
|
279
264
|
- ".rspec"
|
|
280
265
|
- ".rubocop.yml"
|
|
@@ -311,7 +296,6 @@ files:
|
|
|
311
296
|
- lib/serialbench/cli/base_cli.rb
|
|
312
297
|
- lib/serialbench/cli/benchmark_cli.rb
|
|
313
298
|
- lib/serialbench/cli/environment_cli.rb
|
|
314
|
-
- lib/serialbench/cli/resultset_cli.rb
|
|
315
299
|
- lib/serialbench/cli/ruby_build_cli.rb
|
|
316
300
|
- lib/serialbench/cli/validate_cli.rb
|
|
317
301
|
- lib/serialbench/config_manager.rb
|
|
@@ -322,7 +306,6 @@ files:
|
|
|
322
306
|
- lib/serialbench/models/environment_config.rb
|
|
323
307
|
- lib/serialbench/models/platform.rb
|
|
324
308
|
- lib/serialbench/models/result.rb
|
|
325
|
-
- lib/serialbench/models/result_set.rb
|
|
326
309
|
- lib/serialbench/models/result_store.rb
|
|
327
310
|
- lib/serialbench/ruby_build_manager.rb
|
|
328
311
|
- lib/serialbench/runners/asdf_runner.rb
|
|
@@ -350,17 +333,17 @@ files:
|
|
|
350
333
|
- lib/serialbench/serializers/yaml/base_yaml_serializer.rb
|
|
351
334
|
- lib/serialbench/serializers/yaml/psych_serializer.rb
|
|
352
335
|
- lib/serialbench/serializers/yaml/syck_serializer.rb
|
|
353
|
-
- lib/serialbench/
|
|
336
|
+
- lib/serialbench/test_data.rb
|
|
354
337
|
- lib/serialbench/version.rb
|
|
355
338
|
- lib/serialbench/yaml_validator.rb
|
|
356
339
|
- serialbench.gemspec
|
|
357
|
-
homepage: https://github.com/
|
|
340
|
+
homepage: https://github.com/serialbench/serialbench
|
|
358
341
|
licenses:
|
|
359
342
|
- BSD-2-Clause
|
|
360
343
|
metadata:
|
|
361
|
-
homepage_uri: https://github.com/
|
|
362
|
-
source_code_uri: https://github.com/
|
|
363
|
-
bug_tracker_uri: https://github.com/
|
|
344
|
+
homepage_uri: https://github.com/serialbench/serialbench
|
|
345
|
+
source_code_uri: https://github.com/serialbench/serialbench
|
|
346
|
+
bug_tracker_uri: https://github.com/serialbench/serialbench/issues
|
|
364
347
|
rdoc_options: []
|
|
365
348
|
require_paths:
|
|
366
349
|
- lib
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
name: Windows Debug
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [ master, main ]
|
|
6
|
-
paths:
|
|
7
|
-
- '.github/workflows/windows-debug.yml'
|
|
8
|
-
pull_request:
|
|
9
|
-
paths:
|
|
10
|
-
- '.github/workflows/windows-debug.yml'
|
|
11
|
-
workflow_dispatch:
|
|
12
|
-
|
|
13
|
-
jobs:
|
|
14
|
-
test-libxml2-install:
|
|
15
|
-
runs-on: windows-latest
|
|
16
|
-
strategy:
|
|
17
|
-
fail-fast: false
|
|
18
|
-
matrix:
|
|
19
|
-
ruby: ['3.1', '3.4']
|
|
20
|
-
method: ['vcpkg', 'msys2', 'direct']
|
|
21
|
-
|
|
22
|
-
name: Test ${{ matrix.method }} on Ruby ${{ matrix.ruby }}
|
|
23
|
-
|
|
24
|
-
steps:
|
|
25
|
-
- uses: actions/checkout@v4
|
|
26
|
-
|
|
27
|
-
- name: Set up Ruby
|
|
28
|
-
uses: ruby/setup-ruby@v1
|
|
29
|
-
with:
|
|
30
|
-
ruby-version: ${{ matrix.ruby }}
|
|
31
|
-
|
|
32
|
-
- name: Install via vcpkg
|
|
33
|
-
if: matrix.method == 'vcpkg'
|
|
34
|
-
shell: powershell
|
|
35
|
-
run: |
|
|
36
|
-
Write-Host "Installing libxml2 via vcpkg..."
|
|
37
|
-
vcpkg install libxml2:x64-windows
|
|
38
|
-
vcpkg integrate install
|
|
39
|
-
|
|
40
|
-
# Find the libxml2 installation
|
|
41
|
-
$vcpkgRoot = "C:\vcpkg"
|
|
42
|
-
$libxml2Path = Join-Path $vcpkgRoot "installed\x64-windows"
|
|
43
|
-
|
|
44
|
-
Write-Host "libxml2 installed at: $libxml2Path"
|
|
45
|
-
|
|
46
|
-
# Set environment variables
|
|
47
|
-
echo "LIBXML2_INCLUDE=$libxml2Path\include" >> $env:GITHUB_ENV
|
|
48
|
-
echo "LIBXML2_LIB=$libxml2Path\lib" >> $env:GITHUB_ENV
|
|
49
|
-
echo "PKG_CONFIG_PATH=$libxml2Path\lib\pkgconfig" >> $env:GITHUB_ENV
|
|
50
|
-
|
|
51
|
-
# Add to PATH
|
|
52
|
-
$currentPath = [Environment]::GetEnvironmentVariable("PATH", "Process")
|
|
53
|
-
$newPath = "$libxml2Path\bin;$currentPath"
|
|
54
|
-
echo "$newPath" >> $env:GITHUB_PATH
|
|
55
|
-
|
|
56
|
-
# Verify installation
|
|
57
|
-
Get-ChildItem -Path $libxml2Path -Recurse | Where-Object { $_.Name -like "*libxml*" } | Select-Object FullName
|
|
58
|
-
|
|
59
|
-
- name: Install via msys2
|
|
60
|
-
if: matrix.method == 'msys2'
|
|
61
|
-
shell: powershell
|
|
62
|
-
run: |
|
|
63
|
-
Write-Host "Installing libxml2 via msys2..."
|
|
64
|
-
choco install -y msys2
|
|
65
|
-
|
|
66
|
-
# Initialize msys2 and install libxml2
|
|
67
|
-
C:\tools\msys64\usr\bin\bash -lc "pacman -Syu --noconfirm"
|
|
68
|
-
C:\tools\msys64\usr\bin\bash -lc "pacman -S --noconfirm mingw-w64-x86_64-libxml2 mingw-w64-x86_64-pkg-config"
|
|
69
|
-
|
|
70
|
-
# Set environment variables
|
|
71
|
-
$msys2Root = "C:\tools\msys64\mingw64"
|
|
72
|
-
echo "LIBXML2_INCLUDE=$msys2Root\include\libxml2" >> $env:GITHUB_ENV
|
|
73
|
-
echo "LIBXML2_LIB=$msys2Root\lib" >> $env:GITHUB_ENV
|
|
74
|
-
echo "PKG_CONFIG_PATH=$msys2Root\lib\pkgconfig" >> $env:GITHUB_ENV
|
|
75
|
-
|
|
76
|
-
# Add to PATH
|
|
77
|
-
echo "$msys2Root\bin" >> $env:GITHUB_PATH
|
|
78
|
-
|
|
79
|
-
# Verify installation
|
|
80
|
-
Get-ChildItem -Path $msys2Root -Recurse | Where-Object { $_.Name -like "*libxml*" } | Select-Object FullName
|
|
81
|
-
|
|
82
|
-
- name: Install via direct download
|
|
83
|
-
if: matrix.method == 'direct'
|
|
84
|
-
shell: powershell
|
|
85
|
-
run: |
|
|
86
|
-
Write-Host "Installing libxml2 via direct download..."
|
|
87
|
-
|
|
88
|
-
# Download pre-built binaries from gnome.org
|
|
89
|
-
$downloadDir = "$env:TEMP\libxml2"
|
|
90
|
-
New-Item -ItemType Directory -Force -Path $downloadDir
|
|
91
|
-
|
|
92
|
-
# Download libxml2 and dependencies
|
|
93
|
-
$libxml2Url = "https://download.gnome.org/binaries/win64/libxml2/2.9/libxml2-2.9.14-x64_dll.zip"
|
|
94
|
-
$zlibUrl = "https://download.gnome.org/binaries/win64/dependencies/zlib-1.2.13-x64_dll.zip"
|
|
95
|
-
$iconvUrl = "https://download.gnome.org/binaries/win64/dependencies/libiconv-1.17-x64_dll.zip"
|
|
96
|
-
|
|
97
|
-
Invoke-WebRequest -Uri $libxml2Url -OutFile "$downloadDir\libxml2.zip"
|
|
98
|
-
Invoke-WebRequest -Uri $zlibUrl -OutFile "$downloadDir\zlib.zip"
|
|
99
|
-
Invoke-WebRequest -Uri $iconvUrl -OutFile "$downloadDir\iconv.zip"
|
|
100
|
-
|
|
101
|
-
# Extract archives
|
|
102
|
-
Expand-Archive -Path "$downloadDir\libxml2.zip" -DestinationPath "C:\libxml2" -Force
|
|
103
|
-
Expand-Archive -Path "$downloadDir\zlib.zip" -DestinationPath "C:\libxml2" -Force
|
|
104
|
-
Expand-Archive -Path "$downloadDir\iconv.zip" -DestinationPath "C:\libxml2" -Force
|
|
105
|
-
|
|
106
|
-
# Set environment variables
|
|
107
|
-
echo "LIBXML2_INCLUDE=C:\libxml2\include" >> $env:GITHUB_ENV
|
|
108
|
-
echo "LIBXML2_LIB=C:\libxml2\lib" >> $env:GITHUB_ENV
|
|
109
|
-
|
|
110
|
-
# Add to PATH
|
|
111
|
-
echo "C:\libxml2\bin" >> $env:GITHUB_PATH
|
|
112
|
-
|
|
113
|
-
# Verify installation
|
|
114
|
-
Get-ChildItem -Path "C:\libxml2" -Recurse | Where-Object { $_.Name -like "*libxml*" } | Select-Object FullName
|
|
115
|
-
|
|
116
|
-
- name: Verify pkg-config
|
|
117
|
-
shell: powershell
|
|
118
|
-
run: |
|
|
119
|
-
Write-Host "Checking for pkg-config..."
|
|
120
|
-
try {
|
|
121
|
-
$pkgConfigPath = Get-Command pkg-config -ErrorAction Stop
|
|
122
|
-
Write-Host "pkg-config found at: $($pkgConfigPath.Source)"
|
|
123
|
-
pkg-config --version
|
|
124
|
-
} catch {
|
|
125
|
-
Write-Host "pkg-config not found, installing pkgconfiglite..."
|
|
126
|
-
choco install -y pkgconfiglite
|
|
127
|
-
pkg-config --version
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
# Try to find libxml2 via pkg-config
|
|
131
|
-
Write-Host "`nSearching for libxml-2.0.pc..."
|
|
132
|
-
if ($env:PKG_CONFIG_PATH) {
|
|
133
|
-
Write-Host "PKG_CONFIG_PATH: $env:PKG_CONFIG_PATH"
|
|
134
|
-
pkg-config --list-all | Select-String libxml
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
- name: Install bundler
|
|
138
|
-
run: gem install bundler
|
|
139
|
-
|
|
140
|
-
- name: Try to install libxml-ruby gem
|
|
141
|
-
shell: powershell
|
|
142
|
-
continue-on-error: true
|
|
143
|
-
run: |
|
|
144
|
-
Write-Host "Attempting to install libxml-ruby..."
|
|
145
|
-
|
|
146
|
-
# Set additional environment variables for gem installation
|
|
147
|
-
if ($env:LIBXML2_INCLUDE) {
|
|
148
|
-
$env:CFLAGS = "-I$env:LIBXML2_INCLUDE"
|
|
149
|
-
$env:CPPFLAGS = "-I$env:LIBXML2_INCLUDE"
|
|
150
|
-
}
|
|
151
|
-
if ($env:LIBXML2_LIB) {
|
|
152
|
-
$env:LDFLAGS = "-L$env:LIBXML2_LIB"
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
gem install libxml-ruby --verbose
|
|
156
|
-
|
|
157
|
-
- name: Report results
|
|
158
|
-
if: always()
|
|
159
|
-
shell: powershell
|
|
160
|
-
run: |
|
|
161
|
-
Write-Host "`n=== Installation Method: ${{ matrix.method }} ==="
|
|
162
|
-
Write-Host "Ruby Version: ${{ matrix.ruby }}"
|
|
163
|
-
Write-Host "`nEnvironment Variables:"
|
|
164
|
-
Write-Host "LIBXML2_INCLUDE: $env:LIBXML2_INCLUDE"
|
|
165
|
-
Write-Host "LIBXML2_LIB: $env:LIBXML2_LIB"
|
|
166
|
-
Write-Host "PKG_CONFIG_PATH: $env:PKG_CONFIG_PATH"
|
|
167
|
-
Write-Host "`nPATH:"
|
|
168
|
-
$env:PATH -split ';' | ForEach-Object { Write-Host " $_" }
|
|
169
|
-
|
|
170
|
-
Write-Host "`nChecking for libxml2 files..."
|
|
171
|
-
Get-ChildItem C:\ -Recurse -ErrorAction SilentlyContinue -Include libxml2.dll,libxml2.lib,xml2-config.h 2>$null | Select-Object FullName
|