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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/benchmark.yml +0 -24
  3. data/.github/workflows/rake.yml +15 -18
  4. data/Gemfile +1 -1
  5. data/config/benchmarks/full-json.yml +2 -2
  6. data/config/benchmarks/full-toml.yml +2 -2
  7. data/config/benchmarks/full-xml.yml +2 -2
  8. data/config/benchmarks/full-yaml.yml +2 -2
  9. data/config/benchmarks/full.yml +2 -2
  10. data/config/benchmarks/short.yml +2 -2
  11. data/lib/serialbench/benchmark_runner.rb +21 -296
  12. data/lib/serialbench/cli/benchmark_cli.rb +8 -81
  13. data/lib/serialbench/cli.rb +0 -5
  14. data/lib/serialbench/models/benchmark_config.rb +1 -1
  15. data/lib/serialbench/models/result_store.rb +0 -38
  16. data/lib/serialbench/models.rb +0 -5
  17. data/lib/serialbench/serializers/base_serializer.rb +0 -4
  18. data/lib/serialbench/serializers/json/base_json_serializer.rb +8 -20
  19. data/lib/serialbench/serializers/json/json_serializer.rb +0 -16
  20. data/lib/serialbench/serializers/json/oj_serializer.rb +2 -17
  21. data/lib/serialbench/serializers/json/yajl_serializer.rb +2 -2
  22. data/lib/serialbench/serializers/toml/base_toml_serializer.rb +8 -29
  23. data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +0 -16
  24. data/lib/serialbench/serializers/toml/tomlib_serializer.rb +0 -4
  25. data/lib/serialbench/serializers/toml/tomlrb_serializer.rb +2 -18
  26. data/lib/serialbench/serializers/xml/base_xml_serializer.rb +4 -16
  27. data/lib/serialbench/serializers/xml/leptris_serializer.rb +1 -5
  28. data/lib/serialbench/serializers/xml/libxml_serializer.rb +4 -9
  29. data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +3 -3
  30. data/lib/serialbench/serializers/xml/oga_serializer.rb +3 -5
  31. data/lib/serialbench/serializers/xml/ox_serializer.rb +2 -2
  32. data/lib/serialbench/serializers/xml/rexml_serializer.rb +5 -12
  33. data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +1 -9
  34. data/lib/serialbench/serializers/yaml/syck_serializer.rb +0 -8
  35. data/lib/serialbench/test_data.rb +315 -0
  36. data/lib/serialbench/version.rb +1 -1
  37. data/lib/serialbench.rb +2 -1
  38. data/serialbench.gemspec +1 -2
  39. metadata +6 -23
  40. data/.github/workflows/windows-debug.yml +0 -171
  41. data/lib/serialbench/cli/resultset_cli.rb +0 -301
  42. data/lib/serialbench/models/result_set.rb +0 -79
  43. 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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Serialbench
4
- VERSION = '0.3.1'
4
+ VERSION = '0.5.0'
5
5
  end
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/metanorma/serialbench'
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.3.1
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/site_generator.rb
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/metanorma/serialbench
340
+ homepage: https://github.com/serialbench/serialbench
358
341
  licenses:
359
342
  - BSD-2-Clause
360
343
  metadata:
361
- homepage_uri: https://github.com/metanorma/serialbench
362
- source_code_uri: https://github.com/metanorma/serialbench
363
- bug_tracker_uri: https://github.com/metanorma/serialbench/issues
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