ukiryu 0.1.6 → 0.2.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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ukiryu/cache.rb +6 -0
  3. data/lib/ukiryu/cache_registry.rb +64 -0
  4. data/lib/ukiryu/cli_commands/base_command.rb +6 -5
  5. data/lib/ukiryu/cli_commands/config_command.rb +7 -10
  6. data/lib/ukiryu/cli_commands/register_command.rb +27 -18
  7. data/lib/ukiryu/cli_commands/validate_command.rb +2 -2
  8. data/lib/ukiryu/command_builder.rb +83 -50
  9. data/lib/ukiryu/config.rb +13 -2
  10. data/lib/ukiryu/debug.rb +20 -9
  11. data/lib/ukiryu/definition/loader.rb +3 -3
  12. data/lib/ukiryu/errors.rb +37 -37
  13. data/lib/ukiryu/executable_locator.rb +40 -16
  14. data/lib/ukiryu/extractors/base_extractor.rb +2 -1
  15. data/lib/ukiryu/extractors/help_parser.rb +3 -0
  16. data/lib/ukiryu/logger.rb +51 -0
  17. data/lib/ukiryu/models/implementation_index.rb +2 -1
  18. data/lib/ukiryu/models/implementation_version.rb +18 -1
  19. data/lib/ukiryu/models/interface.rb +2 -1
  20. data/lib/ukiryu/models/run_environment.rb +0 -2
  21. data/lib/ukiryu/models/semantic_version.rb +174 -0
  22. data/lib/ukiryu/models/stage_metrics.rb +0 -1
  23. data/lib/ukiryu/register.rb +473 -232
  24. data/lib/ukiryu/shell/powershell.rb +209 -89
  25. data/lib/ukiryu/shell/sh.rb +4 -1
  26. data/lib/ukiryu/shell.rb +60 -2
  27. data/lib/ukiryu/tool/command_resolution.rb +2 -1
  28. data/lib/ukiryu/tool/executable_discovery.rb +14 -15
  29. data/lib/ukiryu/tool/loader.rb +543 -0
  30. data/lib/ukiryu/tool/version_detection.rb +1 -3
  31. data/lib/ukiryu/tool.rb +79 -87
  32. data/lib/ukiryu/tool_index.rb +127 -62
  33. data/lib/ukiryu/tools/base.rb +4 -2
  34. data/lib/ukiryu/type.rb +26 -15
  35. data/lib/ukiryu/version.rb +1 -1
  36. data/lib/ukiryu.rb +1 -1
  37. data/spec/fixtures/profiles/ghostscript_10.0.yaml +50 -0
  38. data/spec/fixtures/register/tools/ghostscript/default/10.0.yaml +6 -0
  39. data/spec/spec_helper.rb +10 -6
  40. data/spec/support/tool_helper.rb +2 -0
  41. data/spec/ukiryu/definition/loader_spec.rb +2 -2
  42. data/spec/ukiryu/executor_spec.rb +6 -3
  43. data/spec/ukiryu/models/execution_report_spec.rb +3 -2
  44. data/spec/ukiryu/models/semantic_version_spec.rb +284 -0
  45. data/spec/ukiryu/shell/powershell_integration_spec.rb +165 -0
  46. data/spec/ukiryu/shell/powershell_real_command_spec.rb +143 -0
  47. data/spec/ukiryu/shell/powershell_spec.rb +286 -51
  48. data/spec/ukiryu/tool/loader_spec.rb +148 -0
  49. data/spec/ukiryu/tool_index_spec.rb +110 -18
  50. data/spec/ukiryu/tools/ghostscript_spec.rb +242 -0
  51. data/spec/ukiryu/tools/imagemagick_spec.rb +2 -1
  52. data/spec/ukiryu/tools/inkscape_spec.rb +4 -2
  53. metadata +14 -2
  54. data/lib/ukiryu/register_auto_manager.rb +0 -342
@@ -66,18 +66,17 @@ RSpec.describe Ukiryu::ToolIndex do
66
66
 
67
67
  describe '#find_by_interface' do
68
68
  context 'when register path is nil and default is also nil' do
69
- it 'returns nil' do
70
- # Temporarily clear the default register path
71
- original_path = Ukiryu::Register.default_register_path
72
- Ukiryu::Register.default_register_path = nil
73
-
74
- index = described_class.new(register_path: nil)
69
+ it 'returns nil when register cannot be found' do
70
+ # This test verifies behavior when no register is available
71
+ # In the new architecture, Register will always try to discover a register
72
+ # So this test now verifies that when explicitly given a nonexistent path,
73
+ # the find_by_interface returns nil
74
+
75
+ # Create an index with an explicit nonexistent path
76
+ index = described_class.new(register_path: '/nonexistent/register/path')
75
77
  metadata = index.find_by_interface(:ping)
76
78
 
77
79
  expect(metadata).to be_nil
78
-
79
- # Restore the default register path
80
- Ukiryu::Register.default_register_path = original_path
81
80
  end
82
81
  end
83
82
 
@@ -93,18 +92,12 @@ RSpec.describe Ukiryu::ToolIndex do
93
92
 
94
93
  describe '#all_tools' do
95
94
  context 'when register path is nil and default is also nil' do
96
- it 'returns empty hash' do
97
- # Temporarily clear the default register path
98
- original_path = Ukiryu::Register.default_register_path
99
- Ukiryu::Register.default_register_path = nil
100
-
101
- index = described_class.new(register_path: nil)
95
+ it 'returns empty hash when register cannot be found' do
96
+ # Create an index with an explicit nonexistent path
97
+ index = described_class.new(register_path: '/nonexistent/register/path')
102
98
  tools = index.all_tools
103
99
 
104
100
  expect(tools).to eq({})
105
-
106
- # Restore the default register path
107
- Ukiryu::Register.default_register_path = original_path
108
101
  end
109
102
  end
110
103
 
@@ -165,4 +158,103 @@ RSpec.describe Ukiryu::ToolIndex do
165
158
  expect(index.instance_variable_get(:@interface_to_tools)).to eq(old_interface_to_tools)
166
159
  end
167
160
  end
161
+
162
+ describe '#select_latest_version_by_content' do
163
+ # Make private method accessible
164
+ before { Ukiryu::ToolIndex.send(:public, :select_latest_version_by_content) }
165
+
166
+ let(:temp_dir) { Dir.mktmpdir('ukiryu_version_test') }
167
+
168
+ after do
169
+ FileUtils.rm_rf(temp_dir)
170
+ end
171
+
172
+ it 'selects version from YAML content, not filename' do
173
+ # Create two files where filename and content version are SWAPPED
174
+ # File named "9.5.yaml" but contains version: '10.0'
175
+ # File named "10.0.yaml" but contains version: '9.5'
176
+ file_nine = File.join(temp_dir, '9.5.yaml')
177
+ file_ten = File.join(temp_dir, '10.0.yaml')
178
+
179
+ File.write(file_nine, "---\nversion: '10.0'\nname: test\n")
180
+ File.write(file_ten, "---\nversion: '9.5'\nname: test\n")
181
+
182
+ index = described_class.new(register_path: '/dummy')
183
+ result = index.select_latest_version_by_content([file_nine, file_ten])
184
+
185
+ # Should return content of file with version 10.0 (file_nine),
186
+ # NOT the file named "10.0.yaml" (file_ten)
187
+ expect(result).to include("version: '10.0'")
188
+ end
189
+
190
+ it 'selects the file with highest version from content' do
191
+ file1 = File.join(temp_dir, '1.0.yaml')
192
+ file2 = File.join(temp_dir, '2.0.yaml')
193
+ file3 = File.join(temp_dir, '3.0.yaml')
194
+
195
+ File.write(file1, "---\nversion: '1.0'\nname: test\n")
196
+ File.write(file2, "---\nversion: '2.0'\nname: test\n")
197
+ File.write(file3, "---\nversion: '3.0'\nname: test\n")
198
+
199
+ index = described_class.new(register_path: '/dummy')
200
+ result = index.select_latest_version_by_content([file1, file2, file3])
201
+
202
+ expect(result).to include("version: '3.0'")
203
+ end
204
+
205
+ it 'handles Ghostscript 10.0 vs 9.5 case correctly' do
206
+ # This is the real-world case that caused the bug
207
+ file_ten = File.join(temp_dir, '10.0.yaml')
208
+ file_nine = File.join(temp_dir, '9.5.yaml')
209
+
210
+ File.write(file_ten, "---\nversion: '10.0'\nname: ghostscript\nimplements: ghostscript/1.0\n")
211
+ File.write(file_nine, "---\nversion: '9.5'\nname: ghostscript\nimplements: ghostscript/1.0\n")
212
+
213
+ index = described_class.new(register_path: '/dummy')
214
+ result = index.select_latest_version_by_content([file_nine, file_ten])
215
+
216
+ expect(result).to include("version: '10.0'")
217
+ end
218
+
219
+ it 'returns nil for empty file list' do
220
+ index = described_class.new(register_path: '/dummy')
221
+ expect(index.select_latest_version_by_content([])).to be_nil
222
+ end
223
+
224
+ it 'returns content of single file' do
225
+ file = File.join(temp_dir, '1.0.yaml')
226
+ File.write(file, "---\nversion: '1.0'\nname: test\n")
227
+
228
+ index = described_class.new(register_path: '/dummy')
229
+ result = index.select_latest_version_by_content([file])
230
+
231
+ expect(result).to include("version: '1.0'")
232
+ end
233
+
234
+ it 'skips files without version field' do
235
+ file_with_version = File.join(temp_dir, 'with_version.yaml')
236
+ file_without_version = File.join(temp_dir, 'no_version.yaml')
237
+
238
+ File.write(file_with_version, "---\nversion: '2.0'\nname: test\n")
239
+ File.write(file_without_version, "---\nname: test\n") # No version field
240
+
241
+ index = described_class.new(register_path: '/dummy')
242
+ result = index.select_latest_version_by_content([file_with_version, file_without_version])
243
+
244
+ expect(result).to include("version: '2.0'")
245
+ end
246
+
247
+ it 'skips files that cannot be parsed' do
248
+ valid_file = File.join(temp_dir, 'valid.yaml')
249
+ invalid_file = File.join(temp_dir, 'invalid.yaml')
250
+
251
+ File.write(valid_file, "---\nversion: '1.0'\nname: test\n")
252
+ File.write(invalid_file, 'this is not valid yaml [[')
253
+
254
+ index = described_class.new(register_path: '/dummy')
255
+ result = index.select_latest_version_by_content([valid_file, invalid_file])
256
+
257
+ expect(result).to include("version: '1.0'")
258
+ end
259
+ end
168
260
  end
@@ -0,0 +1,242 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe 'Ghostscript Tool Profile' do
6
+ include ToolHelper
7
+
8
+ before(:each) do
9
+ @temp_dir = create_temp_dir
10
+ end
11
+
12
+ after(:each) do
13
+ # Clean up temp directory
14
+ FileUtils.rm_rf(@temp_dir) if @temp_dir && Dir.exist?(@temp_dir)
15
+ end
16
+
17
+ # Create a simple EPS file for testing
18
+ # @param path [String] the path to create the EPS file at
19
+ def create_test_eps(path)
20
+ eps_content = <<~EPS
21
+ %!PS-Adobe-3.0 EPSF-3.0
22
+ %%BoundingBox: 0 0 100 100
23
+ %%EndComments
24
+ newpath
25
+ 0 0 moveto
26
+ 100 0 lineto
27
+ 100 100 lineto
28
+ 0 100 lineto
29
+ closepath
30
+ 0 setgray
31
+ fill
32
+ showpage
33
+ %%EOF
34
+ EPS
35
+ File.write(path, eps_content)
36
+ path
37
+ end
38
+
39
+ describe 'tool availability' do
40
+ it 'detects Ghostscript on the system' do
41
+ skip_unless_tool_available(:ghostscript)
42
+
43
+ tool = get_tool(:ghostscript)
44
+ expect(tool.available?).to be true
45
+ # Ghostscript executable names vary by platform
46
+ # Unix: gs, ghostscript
47
+ # Windows: gswin64c, gswin32c
48
+ expect(tool.executable).to match(/gs|ghostscript/i)
49
+ end
50
+ end
51
+
52
+ describe 'convert command' do
53
+ before(:each) { skip_unless_tool_available(:ghostscript) }
54
+
55
+ it 'converts EPS to PDF with -sDEVICE=pdfwrite' do
56
+ input = File.join(@temp_dir, 'input.eps')
57
+ output = File.join(@temp_dir, 'output.pdf')
58
+
59
+ create_test_eps(input)
60
+
61
+ tool = get_tool(:ghostscript)
62
+ result = tool.execute(:convert,
63
+ execution_timeout: 60,
64
+ inputs: [input],
65
+ device: :pdfwrite,
66
+ output: output,
67
+ batch: true,
68
+ no_pause: true,
69
+ quiet: true)
70
+
71
+ expect(result.success?).to be true
72
+ expect(result.exit_code).to eq(0)
73
+ expect(File.exist?(output)).to be true
74
+ # PDF should be at least 100 bytes (minimal valid PDF)
75
+ expect(File.size(output)).to be > 100
76
+ end
77
+
78
+ it 'handles -sDEVICE=pdfwrite style arguments correctly on all shells' do
79
+ # This test specifically verifies that the -sDEVICE=pdfwrite argument
80
+ # is preserved correctly on ALL shells, including PowerShell.
81
+ #
82
+ # On Windows PowerShell, arguments starting with - can be stripped by
83
+ # PowerShell's parameter binder. This test ensures the fix works by
84
+ # verifying the command succeeds and produces valid output.
85
+ input = File.join(@temp_dir, 'test.eps')
86
+ output = File.join(@temp_dir, 'test.pdf')
87
+
88
+ create_test_eps(input)
89
+
90
+ tool = get_tool(:ghostscript)
91
+
92
+ # Execute the command - if the -sDEVICE prefix was stripped,
93
+ # Ghostscript would fail with an error about unknown device
94
+ result = tool.execute(:convert,
95
+ execution_timeout: 60,
96
+ inputs: [input],
97
+ device: :pdfwrite,
98
+ output: output,
99
+ batch: true,
100
+ no_pause: true,
101
+ quiet: true)
102
+
103
+ expect(result.success?).to be true
104
+ expect(File.exist?(output)).to be true
105
+ expect(File.size(output)).to be > 100
106
+ end
107
+
108
+ it 'converts with EPS crop option' do
109
+ input = File.join(@temp_dir, 'cropped.eps')
110
+ output = File.join(@temp_dir, 'cropped.pdf')
111
+
112
+ create_test_eps(input)
113
+
114
+ tool = get_tool(:ghostscript)
115
+ result = tool.execute(:convert,
116
+ execution_timeout: 60,
117
+ inputs: [input],
118
+ device: :pdfwrite,
119
+ output: output,
120
+ batch: true,
121
+ no_pause: true,
122
+ quiet: true,
123
+ eps_crop: true)
124
+
125
+ expect(result.success?).to be true
126
+ expect(File.exist?(output)).to be true
127
+ end
128
+
129
+ it 'handles multiple dash-prefixed options correctly' do
130
+ # Test multiple options that start with dashes
131
+ # All should be preserved on all shells including PowerShell
132
+ input = File.join(@temp_dir, 'multi.eps')
133
+ output = File.join(@temp_dir, 'multi.pdf')
134
+
135
+ create_test_eps(input)
136
+
137
+ tool = get_tool(:ghostscript)
138
+
139
+ result = tool.execute(:convert,
140
+ execution_timeout: 60,
141
+ inputs: [input],
142
+ device: :pdfwrite,
143
+ output: output,
144
+ batch: true,
145
+ no_pause: true,
146
+ quiet: true,
147
+ safer: true)
148
+
149
+ expect(result.success?).to be true
150
+ expect(File.exist?(output)).to be true
151
+ end
152
+
153
+ it 'handles path with spaces' do
154
+ # Create subdirectory with space in name
155
+ subdir = File.join(@temp_dir, 'sub dir')
156
+ Dir.mkdir(subdir)
157
+ input = File.join(subdir, 'space test.eps')
158
+ output = File.join(subdir, 'space test.pdf')
159
+
160
+ create_test_eps(input)
161
+
162
+ tool = get_tool(:ghostscript)
163
+ result = tool.execute(:convert,
164
+ execution_timeout: 60,
165
+ inputs: [input],
166
+ device: :pdfwrite,
167
+ output: output,
168
+ batch: true,
169
+ no_pause: true,
170
+ quiet: true)
171
+
172
+ expect(result.success?).to be true
173
+ expect(File.exist?(output)).to be true
174
+ end
175
+ end
176
+
177
+ describe 'PowerShell-specific argument handling' do
178
+ # These tests verify the fix for PowerShell parameter binding
179
+ # which was stripping the -sDEVICE prefix from arguments
180
+ #
181
+ # PowerShell Core (pwsh) is cross-platform and available on Windows, macOS, and Linux.
182
+ # These tests can run on any platform with PowerShell and Ghostscript installed.
183
+ #
184
+ # BUG FIX: PowerShell was not quoting dash-prefixed arguments,
185
+ # causing PowerShell's parameter binder to strip the prefix.
186
+ # Example: -sDEVICE=pdfwrite became =pdfwrite
187
+ # See: lib/ukiryu/shell/powershell.rb
188
+
189
+ before(:each) do
190
+ skip_unless_tool_available(:ghostscript)
191
+ # Skip if PowerShell is not available on this system
192
+ skip 'PowerShell (pwsh) is not available' unless system('which pwsh > /dev/null 2>&1')
193
+ end
194
+
195
+ it 'preserves -sDEVICE=pdfwrite when forced to PowerShell shell' do
196
+ # Set test shell to PowerShell
197
+ original_test_shell = ENV['UKIRYU_TEST_SHELL']
198
+ ENV['UKIRYU_TEST_SHELL'] = 'powershell'
199
+
200
+ # Use the fixture register which has PowerShell in the shells list
201
+ fixture_register = File.expand_path('../../fixtures/register', __dir__)
202
+
203
+ begin
204
+ # Clear shell and tool caches to force reload with PowerShell
205
+ Ukiryu::Shell.reset
206
+ Ukiryu::Tool.clear_cache
207
+
208
+ # Set register path programmatically
209
+ Ukiryu::Register.default_register_path = fixture_register
210
+
211
+ input = File.join(@temp_dir, 'ps_test.eps')
212
+ output = File.join(@temp_dir, 'ps_test.pdf')
213
+
214
+ create_test_eps(input)
215
+
216
+ tool = Ukiryu::Tool.get('ghostscript')
217
+
218
+ # Verify PowerShell is being used
219
+ expect(Ukiryu::Shell.detect).to eq(:powershell)
220
+
221
+ result = tool.execute(:convert,
222
+ execution_timeout: 60,
223
+ inputs: [input],
224
+ device: :pdfwrite,
225
+ output: output,
226
+ batch: true,
227
+ no_pause: true,
228
+ quiet: true)
229
+
230
+ expect(result.success?).to be true
231
+ expect(File.exist?(output)).to be true
232
+ expect(File.size(output)).to be > 100
233
+ ensure
234
+ # Restore original environment
235
+ ENV['UKIRYU_TEST_SHELL'] = original_test_shell if original_test_shell
236
+ ENV.delete('UKIRYU_TEST_SHELL') unless original_test_shell
237
+ Ukiryu::Shell.reset
238
+ Ukiryu::Tool.clear_cache
239
+ end
240
+ end
241
+ end
242
+ end
@@ -112,7 +112,8 @@ RSpec.describe 'ImageMagick Tool Profile' do
112
112
  create_test_image(input)
113
113
 
114
114
  tool = get_tool(:imagemagick)
115
- result = tool.execute(:convert, execution_timeout: 30, inputs: [input], output: output, resize: '75x75', quality: 85, strip: true)
115
+ result = tool.execute(:convert, execution_timeout: 30, inputs: [input], output: output, resize: '75x75',
116
+ quality: 85, strip: true)
116
117
 
117
118
  expect(result.success?).to be true
118
119
  expect(File.exist?(output)).to be true
@@ -14,7 +14,7 @@ RSpec.describe 'Inkscape Tool Profile' do
14
14
 
15
15
  describe 'tool availability' do
16
16
  it 'detects Inkscape on the system' do
17
- skip_unless_tool_available(:inkscape)
17
+ raise 'Inkscape is not available on this system - tests must not skip, Inkscape must be installed' unless tool_available?(:inkscape)
18
18
 
19
19
  tool = get_tool(:inkscape)
20
20
  expect(tool.available?).to be true
@@ -24,7 +24,9 @@ RSpec.describe 'Inkscape Tool Profile' do
24
24
  end
25
25
 
26
26
  describe 'export command' do
27
- before(:each) { skip_unless_tool_available(:inkscape) }
27
+ before(:each) do
28
+ raise 'Inkscape is not available on this system - tests must not skip, Inkscape must be installed' unless tool_available?(:inkscape)
29
+ end
28
30
 
29
31
  it 'exports SVG to PNG' do
30
32
  input = File.join(@temp_dir, 'input.svg')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ukiryu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
@@ -129,6 +129,7 @@ files:
129
129
  - lib/ukiryu.rb
130
130
  - lib/ukiryu/action/base.rb
131
131
  - lib/ukiryu/cache.rb
132
+ - lib/ukiryu/cache_registry.rb
132
133
  - lib/ukiryu/cli.rb
133
134
  - lib/ukiryu/cli_commands.rb
134
135
  - lib/ukiryu/cli_commands/base_command.rb
@@ -215,6 +216,7 @@ files:
215
216
  - lib/ukiryu/models/platform_profile.rb
216
217
  - lib/ukiryu/models/routing.rb
217
218
  - lib/ukiryu/models/run_environment.rb
219
+ - lib/ukiryu/models/semantic_version.rb
218
220
  - lib/ukiryu/models/stage_metrics.rb
219
221
  - lib/ukiryu/models/success_response.rb
220
222
  - lib/ukiryu/models/tool_definition.rb
@@ -229,7 +231,6 @@ files:
229
231
  - lib/ukiryu/options_builder/validator.rb
230
232
  - lib/ukiryu/platform.rb
231
233
  - lib/ukiryu/register.rb
232
- - lib/ukiryu/register_auto_manager.rb
233
234
  - lib/ukiryu/response/base.rb
234
235
  - lib/ukiryu/runtime.rb
235
236
  - lib/ukiryu/schema_validator.rb
@@ -254,6 +255,7 @@ files:
254
255
  - lib/ukiryu/tool.rb
255
256
  - lib/ukiryu/tool/command_resolution.rb
256
257
  - lib/ukiryu/tool/executable_discovery.rb
258
+ - lib/ukiryu/tool/loader.rb
257
259
  - lib/ukiryu/tool/version_detection.rb
258
260
  - lib/ukiryu/tool_cache.rb
259
261
  - lib/ukiryu/tool_finder.rb
@@ -379,6 +381,7 @@ files:
379
381
  - spec/ukiryu/models/execution_report_spec.rb
380
382
  - spec/ukiryu/models/exit_codes_spec.rb
381
383
  - spec/ukiryu/models/routing_spec.rb
384
+ - spec/ukiryu/models/semantic_version_spec.rb
382
385
  - spec/ukiryu/models/version_compatibility_spec.rb
383
386
  - spec/ukiryu/profiles_smoke_spec.rb
384
387
  - spec/ukiryu/schema_validator_spec.rb
@@ -386,6 +389,8 @@ files:
386
389
  - spec/ukiryu/shell/cmd_spec.rb
387
390
  - spec/ukiryu/shell/dash_spec.rb
388
391
  - spec/ukiryu/shell/fish_spec.rb
392
+ - spec/ukiryu/shell/powershell_integration_spec.rb
393
+ - spec/ukiryu/shell/powershell_real_command_spec.rb
389
394
  - spec/ukiryu/shell/powershell_spec.rb
390
395
  - spec/ukiryu/shell/sh_spec.rb
391
396
  - spec/ukiryu/shell/tcsh_spec.rb
@@ -394,10 +399,12 @@ files:
394
399
  - spec/ukiryu/shell_spec.rb
395
400
  - spec/ukiryu/tool/from_definition_spec.rb
396
401
  - spec/ukiryu/tool/from_file_spec.rb
402
+ - spec/ukiryu/tool/loader_spec.rb
397
403
  - spec/ukiryu/tool_direct_loading_spec.rb
398
404
  - spec/ukiryu/tool_index_spec.rb
399
405
  - spec/ukiryu/tool_metadata_spec.rb
400
406
  - spec/ukiryu/tool_stdin_spec.rb
407
+ - spec/ukiryu/tools/ghostscript_spec.rb
401
408
  - spec/ukiryu/tools/imagemagick_spec.rb
402
409
  - spec/ukiryu/tools/inkscape_spec.rb
403
410
  - spec/ukiryu/version_scheme_resolver_spec.rb
@@ -531,6 +538,7 @@ test_files:
531
538
  - spec/ukiryu/models/execution_report_spec.rb
532
539
  - spec/ukiryu/models/exit_codes_spec.rb
533
540
  - spec/ukiryu/models/routing_spec.rb
541
+ - spec/ukiryu/models/semantic_version_spec.rb
534
542
  - spec/ukiryu/models/version_compatibility_spec.rb
535
543
  - spec/ukiryu/profiles_smoke_spec.rb
536
544
  - spec/ukiryu/schema_validator_spec.rb
@@ -538,6 +546,8 @@ test_files:
538
546
  - spec/ukiryu/shell/cmd_spec.rb
539
547
  - spec/ukiryu/shell/dash_spec.rb
540
548
  - spec/ukiryu/shell/fish_spec.rb
549
+ - spec/ukiryu/shell/powershell_integration_spec.rb
550
+ - spec/ukiryu/shell/powershell_real_command_spec.rb
541
551
  - spec/ukiryu/shell/powershell_spec.rb
542
552
  - spec/ukiryu/shell/sh_spec.rb
543
553
  - spec/ukiryu/shell/tcsh_spec.rb
@@ -546,10 +556,12 @@ test_files:
546
556
  - spec/ukiryu/shell_spec.rb
547
557
  - spec/ukiryu/tool/from_definition_spec.rb
548
558
  - spec/ukiryu/tool/from_file_spec.rb
559
+ - spec/ukiryu/tool/loader_spec.rb
549
560
  - spec/ukiryu/tool_direct_loading_spec.rb
550
561
  - spec/ukiryu/tool_index_spec.rb
551
562
  - spec/ukiryu/tool_metadata_spec.rb
552
563
  - spec/ukiryu/tool_stdin_spec.rb
564
+ - spec/ukiryu/tools/ghostscript_spec.rb
553
565
  - spec/ukiryu/tools/imagemagick_spec.rb
554
566
  - spec/ukiryu/tools/inkscape_spec.rb
555
567
  - spec/ukiryu/version_scheme_resolver_spec.rb