ukiryu 0.1.0 → 0.1.1

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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docs.yml +63 -0
  3. data/.github/workflows/links.yml +99 -0
  4. data/.github/workflows/rake.yml +19 -0
  5. data/.github/workflows/release.yml +27 -0
  6. data/.gitignore +18 -4
  7. data/.rubocop.yml +1 -0
  8. data/.rubocop_todo.yml +213 -0
  9. data/Gemfile +12 -8
  10. data/README.adoc +613 -0
  11. data/Rakefile +2 -2
  12. data/docs/assets/logo.svg +1 -0
  13. data/exe/ukiryu +11 -0
  14. data/lib/ukiryu/action/base.rb +77 -0
  15. data/lib/ukiryu/cache.rb +199 -0
  16. data/lib/ukiryu/cli.rb +133 -307
  17. data/lib/ukiryu/cli_commands/base_command.rb +155 -0
  18. data/lib/ukiryu/cli_commands/commands_command.rb +120 -0
  19. data/lib/ukiryu/cli_commands/commands_command.rb.fixed +40 -0
  20. data/lib/ukiryu/cli_commands/config_command.rb +249 -0
  21. data/lib/ukiryu/cli_commands/describe_command.rb +326 -0
  22. data/lib/ukiryu/cli_commands/describe_command.rb.fixed +254 -0
  23. data/lib/ukiryu/cli_commands/exec_inline_command.rb.fixed +180 -0
  24. data/lib/ukiryu/cli_commands/extract_command.rb +84 -0
  25. data/lib/ukiryu/cli_commands/info_command.rb +156 -0
  26. data/lib/ukiryu/cli_commands/list_command.rb +70 -0
  27. data/lib/ukiryu/cli_commands/opts_command.rb +106 -0
  28. data/lib/ukiryu/cli_commands/opts_command.rb.fixed +105 -0
  29. data/lib/ukiryu/cli_commands/response_formatter.rb +240 -0
  30. data/lib/ukiryu/cli_commands/run_command.rb +375 -0
  31. data/lib/ukiryu/cli_commands/run_file_command.rb +215 -0
  32. data/lib/ukiryu/cli_commands/system_command.rb +90 -0
  33. data/lib/ukiryu/cli_commands/validate_command.rb +87 -0
  34. data/lib/ukiryu/cli_commands/version_command.rb +16 -0
  35. data/lib/ukiryu/cli_commands/which_command.rb +166 -0
  36. data/lib/ukiryu/command_builder.rb +205 -0
  37. data/lib/ukiryu/config/env_provider.rb +64 -0
  38. data/lib/ukiryu/config/env_schema.rb +63 -0
  39. data/lib/ukiryu/config/override_resolver.rb +68 -0
  40. data/lib/ukiryu/config/type_converter.rb +59 -0
  41. data/lib/ukiryu/config.rb +249 -0
  42. data/lib/ukiryu/errors.rb +3 -0
  43. data/lib/ukiryu/executable_locator.rb +114 -0
  44. data/lib/ukiryu/execution/command_info.rb +64 -0
  45. data/lib/ukiryu/execution/metadata.rb +97 -0
  46. data/lib/ukiryu/execution/output.rb +144 -0
  47. data/lib/ukiryu/execution/result.rb +194 -0
  48. data/lib/ukiryu/execution.rb +15 -0
  49. data/lib/ukiryu/execution_context.rb +251 -0
  50. data/lib/ukiryu/executor.rb +76 -493
  51. data/lib/ukiryu/extractors/base_extractor.rb +63 -0
  52. data/lib/ukiryu/extractors/extractor.rb +150 -0
  53. data/lib/ukiryu/extractors/help_parser.rb +188 -0
  54. data/lib/ukiryu/extractors/native_extractor.rb +47 -0
  55. data/lib/ukiryu/io.rb +196 -0
  56. data/lib/ukiryu/logger.rb +544 -0
  57. data/lib/ukiryu/models/argument.rb +28 -0
  58. data/lib/ukiryu/models/argument_definition.rb +119 -0
  59. data/lib/ukiryu/models/arguments.rb +113 -0
  60. data/lib/ukiryu/models/command_definition.rb +176 -0
  61. data/lib/ukiryu/models/command_info.rb +37 -0
  62. data/lib/ukiryu/models/components.rb +107 -0
  63. data/lib/ukiryu/models/env_var_definition.rb +30 -0
  64. data/lib/ukiryu/models/error_response.rb +41 -0
  65. data/lib/ukiryu/models/execution_metadata.rb +31 -0
  66. data/lib/ukiryu/models/execution_report.rb +236 -0
  67. data/lib/ukiryu/models/exit_codes.rb +74 -0
  68. data/lib/ukiryu/models/flag_definition.rb +67 -0
  69. data/lib/ukiryu/models/option_definition.rb +102 -0
  70. data/lib/ukiryu/models/output_info.rb +25 -0
  71. data/lib/ukiryu/models/platform_profile.rb +153 -0
  72. data/lib/ukiryu/models/routing.rb +211 -0
  73. data/lib/ukiryu/models/search_paths.rb +39 -0
  74. data/lib/ukiryu/models/success_response.rb +85 -0
  75. data/lib/ukiryu/models/tool_definition.rb +145 -0
  76. data/lib/ukiryu/models/tool_metadata.rb +82 -0
  77. data/lib/ukiryu/models/validation_result.rb +80 -0
  78. data/lib/ukiryu/models/version_compatibility.rb +152 -0
  79. data/lib/ukiryu/models/version_detection.rb +39 -0
  80. data/lib/ukiryu/models.rb +23 -0
  81. data/lib/ukiryu/options/base.rb +95 -0
  82. data/lib/ukiryu/options_builder/formatter.rb +87 -0
  83. data/lib/ukiryu/options_builder/validator.rb +43 -0
  84. data/lib/ukiryu/options_builder.rb +311 -0
  85. data/lib/ukiryu/platform.rb +6 -6
  86. data/lib/ukiryu/registry.rb +143 -183
  87. data/lib/ukiryu/response/base.rb +217 -0
  88. data/lib/ukiryu/runtime.rb +179 -0
  89. data/lib/ukiryu/schema_validator.rb +8 -10
  90. data/lib/ukiryu/shell/bash.rb +3 -3
  91. data/lib/ukiryu/shell/cmd.rb +4 -4
  92. data/lib/ukiryu/shell/fish.rb +1 -1
  93. data/lib/ukiryu/shell/powershell.rb +3 -3
  94. data/lib/ukiryu/shell/sh.rb +1 -1
  95. data/lib/ukiryu/shell/zsh.rb +1 -1
  96. data/lib/ukiryu/shell.rb +146 -39
  97. data/lib/ukiryu/thor_ext.rb +208 -0
  98. data/lib/ukiryu/tool.rb +649 -258
  99. data/lib/ukiryu/tool_index.rb +224 -0
  100. data/lib/ukiryu/tools/base.rb +381 -0
  101. data/lib/ukiryu/tools/class_generator.rb +132 -0
  102. data/lib/ukiryu/tools/executable_finder.rb +29 -0
  103. data/lib/ukiryu/tools/generator.rb +154 -0
  104. data/lib/ukiryu/tools.rb +109 -0
  105. data/lib/ukiryu/type.rb +28 -43
  106. data/lib/ukiryu/validation/constraints.rb +281 -0
  107. data/lib/ukiryu/validation/validator.rb +188 -0
  108. data/lib/ukiryu/validation.rb +21 -0
  109. data/lib/ukiryu/version.rb +1 -1
  110. data/lib/ukiryu/version_detector.rb +51 -0
  111. data/lib/ukiryu.rb +31 -15
  112. data/ukiryu-proposal.md +2952 -0
  113. data/ukiryu.gemspec +18 -14
  114. metadata +137 -5
  115. data/.github/workflows/test.yml +0 -143
data/ukiryu.gemspec CHANGED
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "lib/ukiryu/version"
3
+ require_relative 'lib/ukiryu/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "ukiryu"
6
+ spec.name = 'ukiryu'
7
7
  spec.version = Ukiryu::VERSION
8
- spec.authors = ["Ribose Inc."]
9
- spec.email = ["open.source@ribose.com"]
8
+ spec.authors = ['Ribose Inc.']
9
+ spec.email = ['open.source@ribose.com']
10
10
 
11
- spec.summary = "Platform-adaptive command execution framework"
11
+ spec.summary = 'Platform-adaptive command execution framework'
12
12
  spec.description = <<~DESCRIPTION
13
13
  Ukiryu is a Ruby framework for creating robust, cross-platform wrappers
14
14
  around external command-line tools through declarative YAML profiles.
@@ -16,18 +16,22 @@ Gem::Specification.new do |spec|
16
16
  shell detection, and platform profiles.
17
17
  DESCRIPTION
18
18
 
19
- spec.homepage = "https://github.com/riboseinc/ukiryu"
20
- spec.license = "BSD-2-Clause"
19
+ spec.homepage = 'https://github.com/riboseinc/ukiryu'
20
+ spec.license = 'BSD-2-Clause'
21
21
 
22
- spec.bindir = "exe"
23
- spec.executables = []
24
- spec.require_paths = ["lib"]
22
+ spec.bindir = 'exe'
23
+ spec.executables = ['ukiryu']
24
+ spec.require_paths = ['lib']
25
25
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
- f.match(%r{^(bin|spec)/})
26
+ f.match(%r{^spec/})
27
27
  end
28
28
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
29
- spec.required_ruby_version = ">= 2.7.0"
29
+ spec.required_ruby_version = '>= 2.7.0'
30
30
 
31
- # Ukiryu has zero dependencies for core functionality (Ruby stdlib only)
32
- # json-schema is only needed for registry validation (optional)
31
+ # Core dependencies
32
+ spec.add_dependency 'lutaml-model', '~> 0.7'
33
+ spec.add_dependency 'thor', '~> 1.0'
34
+
35
+ # Optional runtime dependency for YAML schema validation
36
+ spec.add_dependency 'json-schema', '~> 4.0'
33
37
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ukiryu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-01-21 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2026-01-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lutaml-model
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json-schema
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.0'
13
55
  description: |
14
56
  Ukiryu is a Ruby framework for creating robust, cross-platform wrappers
15
57
  around external command-line tools through declarative YAML profiles.
@@ -17,22 +59,100 @@ description: |
17
59
  shell detection, and platform profiles.
18
60
  email:
19
61
  - open.source@ribose.com
20
- executables: []
62
+ executables:
63
+ - ukiryu
21
64
  extensions: []
22
65
  extra_rdoc_files: []
23
66
  files:
24
- - ".github/workflows/test.yml"
67
+ - ".github/workflows/docs.yml"
68
+ - ".github/workflows/links.yml"
69
+ - ".github/workflows/rake.yml"
70
+ - ".github/workflows/release.yml"
25
71
  - ".gitignore"
26
72
  - ".gitmodules"
73
+ - ".rubocop.yml"
74
+ - ".rubocop_todo.yml"
27
75
  - Gemfile
28
76
  - README.adoc
29
77
  - Rakefile
78
+ - docs/assets/logo.svg
79
+ - exe/ukiryu
30
80
  - lib/ukiryu.rb
81
+ - lib/ukiryu/action/base.rb
82
+ - lib/ukiryu/cache.rb
31
83
  - lib/ukiryu/cli.rb
84
+ - lib/ukiryu/cli_commands/base_command.rb
85
+ - lib/ukiryu/cli_commands/commands_command.rb
86
+ - lib/ukiryu/cli_commands/commands_command.rb.fixed
87
+ - lib/ukiryu/cli_commands/config_command.rb
88
+ - lib/ukiryu/cli_commands/describe_command.rb
89
+ - lib/ukiryu/cli_commands/describe_command.rb.fixed
90
+ - lib/ukiryu/cli_commands/exec_inline_command.rb.fixed
91
+ - lib/ukiryu/cli_commands/extract_command.rb
92
+ - lib/ukiryu/cli_commands/info_command.rb
93
+ - lib/ukiryu/cli_commands/list_command.rb
94
+ - lib/ukiryu/cli_commands/opts_command.rb
95
+ - lib/ukiryu/cli_commands/opts_command.rb.fixed
96
+ - lib/ukiryu/cli_commands/response_formatter.rb
97
+ - lib/ukiryu/cli_commands/run_command.rb
98
+ - lib/ukiryu/cli_commands/run_file_command.rb
99
+ - lib/ukiryu/cli_commands/system_command.rb
100
+ - lib/ukiryu/cli_commands/validate_command.rb
101
+ - lib/ukiryu/cli_commands/version_command.rb
102
+ - lib/ukiryu/cli_commands/which_command.rb
103
+ - lib/ukiryu/command_builder.rb
104
+ - lib/ukiryu/config.rb
105
+ - lib/ukiryu/config/env_provider.rb
106
+ - lib/ukiryu/config/env_schema.rb
107
+ - lib/ukiryu/config/override_resolver.rb
108
+ - lib/ukiryu/config/type_converter.rb
32
109
  - lib/ukiryu/errors.rb
110
+ - lib/ukiryu/executable_locator.rb
111
+ - lib/ukiryu/execution.rb
112
+ - lib/ukiryu/execution/command_info.rb
113
+ - lib/ukiryu/execution/metadata.rb
114
+ - lib/ukiryu/execution/output.rb
115
+ - lib/ukiryu/execution/result.rb
116
+ - lib/ukiryu/execution_context.rb
33
117
  - lib/ukiryu/executor.rb
118
+ - lib/ukiryu/extractors/base_extractor.rb
119
+ - lib/ukiryu/extractors/extractor.rb
120
+ - lib/ukiryu/extractors/help_parser.rb
121
+ - lib/ukiryu/extractors/native_extractor.rb
122
+ - lib/ukiryu/io.rb
123
+ - lib/ukiryu/logger.rb
124
+ - lib/ukiryu/models.rb
125
+ - lib/ukiryu/models/argument.rb
126
+ - lib/ukiryu/models/argument_definition.rb
127
+ - lib/ukiryu/models/arguments.rb
128
+ - lib/ukiryu/models/command_definition.rb
129
+ - lib/ukiryu/models/command_info.rb
130
+ - lib/ukiryu/models/components.rb
131
+ - lib/ukiryu/models/env_var_definition.rb
132
+ - lib/ukiryu/models/error_response.rb
133
+ - lib/ukiryu/models/execution_metadata.rb
134
+ - lib/ukiryu/models/execution_report.rb
135
+ - lib/ukiryu/models/exit_codes.rb
136
+ - lib/ukiryu/models/flag_definition.rb
137
+ - lib/ukiryu/models/option_definition.rb
138
+ - lib/ukiryu/models/output_info.rb
139
+ - lib/ukiryu/models/platform_profile.rb
140
+ - lib/ukiryu/models/routing.rb
141
+ - lib/ukiryu/models/search_paths.rb
142
+ - lib/ukiryu/models/success_response.rb
143
+ - lib/ukiryu/models/tool_definition.rb
144
+ - lib/ukiryu/models/tool_metadata.rb
145
+ - lib/ukiryu/models/validation_result.rb
146
+ - lib/ukiryu/models/version_compatibility.rb
147
+ - lib/ukiryu/models/version_detection.rb
148
+ - lib/ukiryu/options/base.rb
149
+ - lib/ukiryu/options_builder.rb
150
+ - lib/ukiryu/options_builder/formatter.rb
151
+ - lib/ukiryu/options_builder/validator.rb
34
152
  - lib/ukiryu/platform.rb
35
153
  - lib/ukiryu/registry.rb
154
+ - lib/ukiryu/response/base.rb
155
+ - lib/ukiryu/runtime.rb
36
156
  - lib/ukiryu/schema_validator.rb
37
157
  - lib/ukiryu/shell.rb
38
158
  - lib/ukiryu/shell/base.rb
@@ -42,9 +162,21 @@ files:
42
162
  - lib/ukiryu/shell/powershell.rb
43
163
  - lib/ukiryu/shell/sh.rb
44
164
  - lib/ukiryu/shell/zsh.rb
165
+ - lib/ukiryu/thor_ext.rb
45
166
  - lib/ukiryu/tool.rb
167
+ - lib/ukiryu/tool_index.rb
168
+ - lib/ukiryu/tools.rb
169
+ - lib/ukiryu/tools/base.rb
170
+ - lib/ukiryu/tools/class_generator.rb
171
+ - lib/ukiryu/tools/executable_finder.rb
172
+ - lib/ukiryu/tools/generator.rb
46
173
  - lib/ukiryu/type.rb
174
+ - lib/ukiryu/validation.rb
175
+ - lib/ukiryu/validation/constraints.rb
176
+ - lib/ukiryu/validation/validator.rb
47
177
  - lib/ukiryu/version.rb
178
+ - lib/ukiryu/version_detector.rb
179
+ - ukiryu-proposal.md
48
180
  - ukiryu.gemspec
49
181
  homepage: https://github.com/riboseinc/ukiryu
50
182
  licenses:
@@ -1,143 +0,0 @@
1
- name: Test Tool Profiles
2
-
3
- on:
4
- push:
5
- branches: [ main, master, develop ]
6
- pull_request:
7
- branches: [ main, master, develop ]
8
-
9
- jobs:
10
- test:
11
- name: Test on ${{ matrix.os }}
12
- runs-on: ${{ matrix.os }}
13
- strategy:
14
- fail-fast: false
15
- matrix:
16
- os: [ubuntu-latest, macos-latest]
17
- ruby: ['3.3']
18
-
19
- steps:
20
- - name: Checkout code
21
- uses: actions/checkout@v4
22
-
23
- - name: Set up Ruby
24
- uses: ruby/setup-ruby@v1
25
- with:
26
- ruby-version: ${{ matrix.ruby }}
27
- bundler-cache: true
28
- working-directory: ./ukiryu
29
-
30
- - name: Install system dependencies (Ubuntu)
31
- if: matrix.os == 'ubuntu-latest'
32
- run: |
33
- sudo apt-get update
34
- sudo apt-get install -y imagemagick ffmpeg ghostscript
35
-
36
- - name: Install system dependencies (macOS)
37
- if: matrix.os == 'macos-latest'
38
- run: |
39
- brew install imagemagick ffmpeg ghostscript
40
-
41
- - name: Show installed tool versions
42
- run: |
43
- echo "=== Installed Tool Versions ==="
44
- echo -n "ImageMagick: " && magick -version | head -1 || echo "Not installed"
45
- echo -n "FFmpeg: " && ffmpeg -version | head -1 || echo "Not installed"
46
- echo -n "Ghostscript: " && gs --version || echo "Not installed"
47
- echo -n "Pandoc: " && pandoc --version | head -1 || echo "Not installed"
48
- echo -n "jpegoptim: " && jpegoptim --version 2>&1 | head -1 || echo "Not installed"
49
- echo -n "optipng: " && optipng -v 2>&1 | head -1 || echo "Not installed"
50
-
51
- - name: Run tests
52
- working-directory: ./ukiryu
53
- run: bundle exec rspec --format documentation
54
-
55
- - name: Run all tests with coverage
56
- working-directory: ./ukiryu
57
- run: bundle exec rspec
58
-
59
- schema-validation:
60
- name: Validate Tool Profiles Schema
61
- runs-on: ubuntu-latest
62
-
63
- steps:
64
- - name: Checkout code
65
- uses: actions/checkout@v4
66
-
67
- - name: Set up Ruby
68
- uses: ruby/setup-ruby@v1
69
- with:
70
- ruby-version: '3.3'
71
- bundler-cache: true
72
- working-directory: ./ukiryu
73
-
74
- - name: Validate all tool profiles
75
- working-directory: ./ukiryu
76
- run: |
77
- ruby -r ./lib/ukiryu.rb -r ./lib/ukiryu/schema_validator.rb <<-'RUBY'
78
- require 'yaml'
79
- require 'json-schema'
80
-
81
- schema_path = File.expand_path('../../schema/tool-profile.schema.yaml', __dir__)
82
- schema = JSON::Schema.parse(File.read(schema_path))
83
-
84
- # Find all tool profiles
85
- profiles = Dir.glob('../../register/tools/**/*.yaml').sort
86
-
87
- puts "Validating #{profiles.count} tool profiles..."
88
- errors = []
89
-
90
- profiles.each do |profile_path|
91
- profile_name = profile_path.sub('../../register/tools/', '')
92
- begin
93
- profile = YAML.safe_load(File.read(profile_path))
94
- schema.validate(profile)
95
- puts " ✓ #{profile_name}"
96
- rescue => e
97
- errors << "#{profile_name}: #{e.message}"
98
- puts " ✗ #{profile_name}: #{e.message}"
99
- end
100
- end
101
-
102
- if errors.any?
103
- puts "\n#{errors.count} validation errors:"
104
- errors.each { |err| puts " - #{err}" }
105
- exit 1
106
- end
107
-
108
- puts "\n✓ All #{profiles.count} tool profiles are valid!"
109
- RUBY
110
-
111
- # Optional: Test on Windows with native Windows tools
112
- test-windows:
113
- name: Test on Windows
114
- runs-on: windows-latest
115
- if: github.event_name == 'push' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'test-windows'))
116
-
117
- steps:
118
- - name: Checkout code
119
- uses: actions/checkout@v4
120
-
121
- - name: Set up Ruby
122
- uses: ruby/setup-ruby@v1
123
- with:
124
- ruby-version: '3.3'
125
- bundler-cache: true
126
- working-directory: ./ukiryu
127
-
128
- - name: Install Chocolatey packages
129
- run: |
130
- choco install imagemagick ffmpeg ghostscript -y
131
-
132
- - name: Show installed tool versions
133
- shell: pwsh
134
- run: |
135
- Write-Host "=== Installed Tool Versions ==="
136
- Write-Host "ImageMagick: $(magick -version | Select-Object -First 1)"
137
- Write-Host "FFmpeg: $(ffmpeg -version | Select-Object -First 1)"
138
- Write-Host "Ghostscript: $(gs --version)"
139
-
140
- - name: Run tests (skip unavailable tools)
141
- working-directory: ./ukiryu
142
- run: bundle exec rspec --format documentation
143
- continue-on-error: true