makit 0.0.157 → 0.0.158
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/README.md +41 -41
- data/exe/makit +5 -5
- data/lib/makit/apache.rb +28 -28
- data/lib/makit/auto.rb +48 -48
- data/lib/makit/azure/blob_storage.rb +257 -257
- data/lib/makit/azure/cli.rb +284 -284
- data/lib/makit/cli/base.rb +17 -17
- data/lib/makit/cli/build_commands.rb +500 -500
- data/lib/makit/cli/generators/base_generator.rb +74 -74
- data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
- data/lib/makit/cli/generators/generator_factory.rb +49 -49
- data/lib/makit/cli/generators/node_generator.rb +50 -50
- data/lib/makit/cli/generators/ruby_generator.rb +77 -77
- data/lib/makit/cli/generators/rust_generator.rb +50 -50
- data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
- data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
- data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
- data/lib/makit/cli/generators/templates/ruby/gemspec.rb +41 -41
- data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
- data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
- data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
- data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
- data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
- data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
- data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
- data/lib/makit/cli/main.rb +78 -78
- data/lib/makit/cli/pipeline_commands.rb +311 -311
- data/lib/makit/cli/project_commands.rb +868 -868
- data/lib/makit/cli/repository_commands.rb +661 -661
- data/lib/makit/cli/strategy_commands.rb +207 -207
- data/lib/makit/cli/utility_commands.rb +521 -521
- data/lib/makit/commands/factory.rb +359 -359
- data/lib/makit/commands/middleware/base.rb +73 -73
- data/lib/makit/commands/middleware/cache.rb +248 -248
- data/lib/makit/commands/middleware/command_logger.rb +312 -312
- data/lib/makit/commands/middleware/validator.rb +269 -269
- data/lib/makit/commands/request.rb +316 -316
- data/lib/makit/commands/result.rb +323 -323
- data/lib/makit/commands/runner.rb +386 -386
- data/lib/makit/commands/strategies/base.rb +171 -171
- data/lib/makit/commands/strategies/child_process.rb +162 -162
- data/lib/makit/commands/strategies/factory.rb +136 -136
- data/lib/makit/commands/strategies/synchronous.rb +139 -139
- data/lib/makit/commands.rb +50 -50
- data/lib/makit/configuration/dotnet_project.rb +48 -48
- data/lib/makit/configuration/gitlab_helper.rb +61 -61
- data/lib/makit/configuration/project.rb +292 -292
- data/lib/makit/configuration/rakefile_helper.rb +43 -43
- data/lib/makit/configuration/step.rb +34 -34
- data/lib/makit/configuration/timeout.rb +74 -74
- data/lib/makit/configuration.rb +21 -21
- data/lib/makit/content/default_gitignore.rb +7 -7
- data/lib/makit/content/default_gitignore.txt +225 -225
- data/lib/makit/content/default_rakefile.rb +13 -13
- data/lib/makit/content/gem_rakefile.rb +16 -16
- data/lib/makit/context.rb +1 -1
- data/lib/makit/data.rb +49 -49
- data/lib/makit/directories.rb +170 -170
- data/lib/makit/directory.rb +262 -262
- data/lib/makit/docs/files.rb +89 -89
- data/lib/makit/docs/rake.rb +102 -102
- data/lib/makit/dotnet/cli.rb +69 -69
- data/lib/makit/dotnet/project.rb +217 -217
- data/lib/makit/dotnet/solution.rb +38 -38
- data/lib/makit/dotnet/solution_classlib.rb +239 -239
- data/lib/makit/dotnet/solution_console.rb +264 -264
- data/lib/makit/dotnet/solution_maui.rb +354 -354
- data/lib/makit/dotnet/solution_wasm.rb +275 -275
- data/lib/makit/dotnet/solution_wpf.rb +304 -304
- data/lib/makit/dotnet.rb +102 -102
- data/lib/makit/email.rb +90 -90
- data/lib/makit/environment.rb +142 -142
- data/lib/makit/examples/runner.rb +370 -370
- data/lib/makit/exceptions.rb +45 -45
- data/lib/makit/fileinfo.rb +32 -32
- data/lib/makit/files.rb +43 -43
- data/lib/makit/gems.rb +40 -40
- data/lib/makit/git/cli.rb +78 -54
- data/lib/makit/git/repository.rb +100 -100
- data/lib/makit/git.rb +104 -104
- data/lib/makit/gitlab/pipeline.rb +857 -857
- data/lib/makit/gitlab/pipeline_service_impl.rb +1535 -1535
- data/lib/makit/gitlab_runner.rb +59 -59
- data/lib/makit/humanize.rb +218 -218
- data/lib/makit/indexer.rb +47 -47
- data/lib/makit/io/filesystem.rb +111 -111
- data/lib/makit/io/filesystem_service_impl.rb +337 -337
- data/lib/makit/lint.rb +212 -212
- data/lib/makit/logging/configuration.rb +309 -309
- data/lib/makit/logging/format_registry.rb +84 -84
- data/lib/makit/logging/formatters/base.rb +39 -39
- data/lib/makit/logging/formatters/console_formatter.rb +140 -140
- data/lib/makit/logging/formatters/json_formatter.rb +65 -65
- data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
- data/lib/makit/logging/formatters/text_formatter.rb +64 -64
- data/lib/makit/logging/log_request.rb +119 -119
- data/lib/makit/logging/logger.rb +199 -199
- data/lib/makit/logging/sinks/base.rb +91 -91
- data/lib/makit/logging/sinks/console.rb +72 -72
- data/lib/makit/logging/sinks/file_sink.rb +92 -92
- data/lib/makit/logging/sinks/structured.rb +123 -123
- data/lib/makit/logging/sinks/unified_file_sink.rb +296 -296
- data/lib/makit/logging.rb +578 -578
- data/lib/makit/markdown.rb +75 -75
- data/lib/makit/mp/basic_object_mp.rb +17 -17
- data/lib/makit/mp/command_mp.rb +13 -13
- data/lib/makit/mp/command_request.mp.rb +17 -17
- data/lib/makit/mp/project_mp.rb +199 -199
- data/lib/makit/mp/string_mp.rb +205 -205
- data/lib/makit/nuget.rb +74 -74
- data/lib/makit/podman/podman.rb +458 -458
- data/lib/makit/podman/podman_service_impl.rb +1081 -1081
- data/lib/makit/port.rb +32 -32
- data/lib/makit/process.rb +377 -377
- data/lib/makit/protoc.rb +112 -112
- data/lib/makit/rake/cli.rb +196 -196
- data/lib/makit/rake/trace_controller.rb +174 -174
- data/lib/makit/rake.rb +81 -81
- data/lib/makit/ruby/cli.rb +185 -185
- data/lib/makit/ruby.rb +25 -25
- data/lib/makit/rubygems.rb +137 -0
- data/lib/makit/secrets/azure_key_vault.rb +322 -322
- data/lib/makit/secrets/azure_secrets.rb +183 -183
- data/lib/makit/secrets/local_secrets.rb +72 -72
- data/lib/makit/secrets/secrets_manager.rb +105 -105
- data/lib/makit/secrets.rb +16 -16
- data/lib/makit/serializer.rb +130 -130
- data/lib/makit/services/builder.rb +186 -186
- data/lib/makit/services/error_handler.rb +226 -226
- data/lib/makit/services/repository_manager.rb +367 -367
- data/lib/makit/services/validator.rb +112 -112
- data/lib/makit/setup/classlib.rb +101 -101
- data/lib/makit/setup/gem.rb +268 -268
- data/lib/makit/setup/pages.rb +11 -11
- data/lib/makit/setup/razorclasslib.rb +101 -101
- data/lib/makit/setup/runner.rb +54 -54
- data/lib/makit/setup.rb +5 -5
- data/lib/makit/show.rb +110 -110
- data/lib/makit/storage.rb +126 -126
- data/lib/makit/symbols.rb +175 -175
- data/lib/makit/task_info.rb +130 -130
- data/lib/makit/tasks/at_exit.rb +15 -15
- data/lib/makit/tasks/build.rb +22 -22
- data/lib/makit/tasks/bump.rb +7 -7
- data/lib/makit/tasks/clean.rb +13 -13
- data/lib/makit/tasks/configure.rb +10 -10
- data/lib/makit/tasks/format.rb +10 -10
- data/lib/makit/tasks/hook_manager.rb +443 -443
- data/lib/makit/tasks/info.rb +368 -368
- data/lib/makit/tasks/init.rb +49 -49
- data/lib/makit/tasks/integrate.rb +60 -56
- data/lib/makit/tasks/pull_incoming.rb +13 -13
- data/lib/makit/tasks/secrets.rb +7 -7
- data/lib/makit/tasks/setup.rb +16 -16
- data/lib/makit/tasks/sync.rb +14 -17
- data/lib/makit/tasks/tag.rb +27 -27
- data/lib/makit/tasks/task_monkey_patch.rb +81 -81
- data/lib/makit/tasks/test.rb +22 -22
- data/lib/makit/tasks/update.rb +18 -18
- data/lib/makit/tasks/version.rb +6 -6
- data/lib/makit/tasks.rb +24 -24
- data/lib/makit/test_cache.rb +239 -239
- data/lib/makit/tree.rb +37 -37
- data/lib/makit/v1/configuration/project_service_impl.rb +370 -370
- data/lib/makit/v1/git/git_repository_service_impl.rb +295 -295
- data/lib/makit/v1/makit.v1_pb.rb +35 -35
- data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
- data/lib/makit/v1/services/repository_manager_service_impl.rb +572 -572
- data/lib/makit/version.rb +661 -503
- data/lib/makit/version_util.rb +21 -21
- data/lib/makit/wix.rb +95 -95
- data/lib/makit/yaml.rb +29 -29
- data/lib/makit/zip.rb +17 -17
- data/lib/makit copy.rb +44 -44
- data/lib/makit.rb +115 -114
- metadata +3 -2
data/lib/makit/ruby/cli.rb
CHANGED
|
@@ -1,185 +1,185 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Makit
|
|
4
|
-
class Ruby
|
|
5
|
-
class CLI
|
|
6
|
-
# Get the current Ruby version using the 'ruby' CLI
|
|
7
|
-
def self.current_version
|
|
8
|
-
version_output = `ruby --version 2>/dev/null`.strip
|
|
9
|
-
raise "Ruby is not installed or not available in PATH" if version_output.empty?
|
|
10
|
-
|
|
11
|
-
# Extract version number from output like "ruby 3.2.0p123 (2023-01-01 revision abc123) [x86_64-darwin22]"
|
|
12
|
-
version_match = version_output.match(/ruby (\d+\.\d+\.\d+)/)
|
|
13
|
-
if version_match
|
|
14
|
-
version_match[1]
|
|
15
|
-
else
|
|
16
|
-
# Fallback: return the full version string if parsing fails
|
|
17
|
-
version_output
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Get detailed Ruby version information
|
|
22
|
-
def self.version_info
|
|
23
|
-
version_output = `ruby --version 2>/dev/null`.strip
|
|
24
|
-
raise "Ruby is not installed or not available in PATH" if version_output.empty?
|
|
25
|
-
|
|
26
|
-
{
|
|
27
|
-
full_version: version_output,
|
|
28
|
-
version: current_version,
|
|
29
|
-
patch_level: extract_patch_level(version_output),
|
|
30
|
-
release_date: extract_release_date(version_output),
|
|
31
|
-
platform: extract_platform(version_output),
|
|
32
|
-
}
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Check if Ruby is installed and available
|
|
36
|
-
def self.installed?
|
|
37
|
-
system("ruby --version > /dev/null 2>&1")
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Get the Ruby executable path
|
|
41
|
-
def self.executable_path
|
|
42
|
-
`which ruby 2>/dev/null`.strip
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Get Ruby configuration information
|
|
46
|
-
def self.config
|
|
47
|
-
return {} unless installed?
|
|
48
|
-
|
|
49
|
-
config_output = `ruby -e "puts RbConfig::CONFIG" 2>/dev/null`
|
|
50
|
-
return {} if config_output.empty?
|
|
51
|
-
|
|
52
|
-
config = {}
|
|
53
|
-
config_output.lines.each do |line|
|
|
54
|
-
key, value = line.strip.split("=", 2)
|
|
55
|
-
config[key] = value if key && value
|
|
56
|
-
end
|
|
57
|
-
config
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# Get Ruby platform information
|
|
61
|
-
def self.platform
|
|
62
|
-
return nil unless installed?
|
|
63
|
-
|
|
64
|
-
`ruby -e "puts RUBY_PLATFORM" 2>/dev/null`.strip
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# Get Ruby engine information
|
|
68
|
-
def self.engine
|
|
69
|
-
return nil unless installed?
|
|
70
|
-
|
|
71
|
-
engine_info = `ruby -e "puts RUBY_ENGINE" 2>/dev/null`.strip
|
|
72
|
-
engine_version = `ruby -e "puts RUBY_ENGINE_VERSION" 2>/dev/null`.strip
|
|
73
|
-
|
|
74
|
-
{
|
|
75
|
-
name: engine_info,
|
|
76
|
-
version: engine_version,
|
|
77
|
-
}
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# Get Ruby installation directory
|
|
81
|
-
def self.installation_dir
|
|
82
|
-
return nil unless installed?
|
|
83
|
-
|
|
84
|
-
`ruby -e "puts RbConfig::CONFIG['prefix']" 2>/dev/null`.strip
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Get Ruby library directories
|
|
88
|
-
def self.library_dirs
|
|
89
|
-
return [] unless installed?
|
|
90
|
-
|
|
91
|
-
lib_dirs = `ruby -e "puts RbConfig::CONFIG['libdir']" 2>/dev/null`.strip
|
|
92
|
-
arch_lib_dirs = `ruby -e "puts RbConfig::CONFIG['archdir']" 2>/dev/null`.strip
|
|
93
|
-
|
|
94
|
-
[lib_dirs, arch_lib_dirs].compact.uniq
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
# Get Ruby gem directories
|
|
98
|
-
def self.gem_dirs
|
|
99
|
-
return [] unless installed?
|
|
100
|
-
|
|
101
|
-
gem_dirs_output = `ruby -e "puts Gem.path" 2>/dev/null`
|
|
102
|
-
return [] if gem_dirs_output.empty?
|
|
103
|
-
|
|
104
|
-
gem_dirs_output.strip.split("\n")
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# Get Ruby load path
|
|
108
|
-
def self.load_path
|
|
109
|
-
return [] unless installed?
|
|
110
|
-
|
|
111
|
-
load_path_output = `ruby -e "puts $LOAD_PATH" 2>/dev/null`
|
|
112
|
-
return [] if load_path_output.empty?
|
|
113
|
-
|
|
114
|
-
load_path_output.strip.split("\n")
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# Check if a specific Ruby version is available
|
|
118
|
-
def self.version_available?(version)
|
|
119
|
-
return false unless installed?
|
|
120
|
-
|
|
121
|
-
current = current_version
|
|
122
|
-
case version
|
|
123
|
-
when /^(\d+)\.(\d+)\.(\d+)$/
|
|
124
|
-
major = ::Regexp.last_match(1).to_i
|
|
125
|
-
minor = ::Regexp.last_match(2).to_i
|
|
126
|
-
patch = ::Regexp.last_match(3).to_i
|
|
127
|
-
current_major, current_minor, current_patch = current.split(".").map(&:to_i)
|
|
128
|
-
|
|
129
|
-
if major != current_major
|
|
130
|
-
major == current_major
|
|
131
|
-
elsif minor != current_minor
|
|
132
|
-
minor == current_minor
|
|
133
|
-
else
|
|
134
|
-
patch == current_patch
|
|
135
|
-
end
|
|
136
|
-
when /^(\d+)\.(\d+)$/
|
|
137
|
-
major = ::Regexp.last_match(1).to_i
|
|
138
|
-
minor = ::Regexp.last_match(2).to_i
|
|
139
|
-
current_major, current_minor = current.split(".").map(&:to_i)
|
|
140
|
-
major == current_major && minor == current_minor
|
|
141
|
-
when /^(\d+)$/
|
|
142
|
-
major = ::Regexp.last_match(1).to_i
|
|
143
|
-
current_major = current.split(".").first.to_i
|
|
144
|
-
major == current_major
|
|
145
|
-
else
|
|
146
|
-
false
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
# Get Ruby environment summary
|
|
151
|
-
def self.environment_summary
|
|
152
|
-
return { error: "Ruby is not installed" } unless installed?
|
|
153
|
-
|
|
154
|
-
{
|
|
155
|
-
version: current_version,
|
|
156
|
-
full_version: version_info[:full_version],
|
|
157
|
-
platform: platform,
|
|
158
|
-
engine: engine,
|
|
159
|
-
executable_path: executable_path,
|
|
160
|
-
installation_dir: installation_dir,
|
|
161
|
-
gem_dirs: gem_dirs,
|
|
162
|
-
library_dirs: library_dirs,
|
|
163
|
-
}
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
# Extract patch level from version string
|
|
167
|
-
def self.extract_patch_level(version_string)
|
|
168
|
-
match = version_string.match(/p(\d+)/)
|
|
169
|
-
match ? match[1] : nil
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
# Extract release date from version string
|
|
173
|
-
def self.extract_release_date(version_string)
|
|
174
|
-
match = version_string.match(/\((\d{4}-\d{2}-\d{2})/)
|
|
175
|
-
match ? match[1] : nil
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
# Extract platform from version string
|
|
179
|
-
def self.extract_platform(version_string)
|
|
180
|
-
match = version_string.match(/\[([^\]]+)\]/)
|
|
181
|
-
match ? match[1] : nil
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Makit
|
|
4
|
+
class Ruby
|
|
5
|
+
class CLI
|
|
6
|
+
# Get the current Ruby version using the 'ruby' CLI
|
|
7
|
+
def self.current_version
|
|
8
|
+
version_output = `ruby --version 2>/dev/null`.strip
|
|
9
|
+
raise "Ruby is not installed or not available in PATH" if version_output.empty?
|
|
10
|
+
|
|
11
|
+
# Extract version number from output like "ruby 3.2.0p123 (2023-01-01 revision abc123) [x86_64-darwin22]"
|
|
12
|
+
version_match = version_output.match(/ruby (\d+\.\d+\.\d+)/)
|
|
13
|
+
if version_match
|
|
14
|
+
version_match[1]
|
|
15
|
+
else
|
|
16
|
+
# Fallback: return the full version string if parsing fails
|
|
17
|
+
version_output
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Get detailed Ruby version information
|
|
22
|
+
def self.version_info
|
|
23
|
+
version_output = `ruby --version 2>/dev/null`.strip
|
|
24
|
+
raise "Ruby is not installed or not available in PATH" if version_output.empty?
|
|
25
|
+
|
|
26
|
+
{
|
|
27
|
+
full_version: version_output,
|
|
28
|
+
version: current_version,
|
|
29
|
+
patch_level: extract_patch_level(version_output),
|
|
30
|
+
release_date: extract_release_date(version_output),
|
|
31
|
+
platform: extract_platform(version_output),
|
|
32
|
+
}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Check if Ruby is installed and available
|
|
36
|
+
def self.installed?
|
|
37
|
+
system("ruby --version > /dev/null 2>&1")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Get the Ruby executable path
|
|
41
|
+
def self.executable_path
|
|
42
|
+
`which ruby 2>/dev/null`.strip
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Get Ruby configuration information
|
|
46
|
+
def self.config
|
|
47
|
+
return {} unless installed?
|
|
48
|
+
|
|
49
|
+
config_output = `ruby -e "puts RbConfig::CONFIG" 2>/dev/null`
|
|
50
|
+
return {} if config_output.empty?
|
|
51
|
+
|
|
52
|
+
config = {}
|
|
53
|
+
config_output.lines.each do |line|
|
|
54
|
+
key, value = line.strip.split("=", 2)
|
|
55
|
+
config[key] = value if key && value
|
|
56
|
+
end
|
|
57
|
+
config
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Get Ruby platform information
|
|
61
|
+
def self.platform
|
|
62
|
+
return nil unless installed?
|
|
63
|
+
|
|
64
|
+
`ruby -e "puts RUBY_PLATFORM" 2>/dev/null`.strip
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Get Ruby engine information
|
|
68
|
+
def self.engine
|
|
69
|
+
return nil unless installed?
|
|
70
|
+
|
|
71
|
+
engine_info = `ruby -e "puts RUBY_ENGINE" 2>/dev/null`.strip
|
|
72
|
+
engine_version = `ruby -e "puts RUBY_ENGINE_VERSION" 2>/dev/null`.strip
|
|
73
|
+
|
|
74
|
+
{
|
|
75
|
+
name: engine_info,
|
|
76
|
+
version: engine_version,
|
|
77
|
+
}
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Get Ruby installation directory
|
|
81
|
+
def self.installation_dir
|
|
82
|
+
return nil unless installed?
|
|
83
|
+
|
|
84
|
+
`ruby -e "puts RbConfig::CONFIG['prefix']" 2>/dev/null`.strip
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Get Ruby library directories
|
|
88
|
+
def self.library_dirs
|
|
89
|
+
return [] unless installed?
|
|
90
|
+
|
|
91
|
+
lib_dirs = `ruby -e "puts RbConfig::CONFIG['libdir']" 2>/dev/null`.strip
|
|
92
|
+
arch_lib_dirs = `ruby -e "puts RbConfig::CONFIG['archdir']" 2>/dev/null`.strip
|
|
93
|
+
|
|
94
|
+
[lib_dirs, arch_lib_dirs].compact.uniq
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Get Ruby gem directories
|
|
98
|
+
def self.gem_dirs
|
|
99
|
+
return [] unless installed?
|
|
100
|
+
|
|
101
|
+
gem_dirs_output = `ruby -e "puts Gem.path" 2>/dev/null`
|
|
102
|
+
return [] if gem_dirs_output.empty?
|
|
103
|
+
|
|
104
|
+
gem_dirs_output.strip.split("\n")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Get Ruby load path
|
|
108
|
+
def self.load_path
|
|
109
|
+
return [] unless installed?
|
|
110
|
+
|
|
111
|
+
load_path_output = `ruby -e "puts $LOAD_PATH" 2>/dev/null`
|
|
112
|
+
return [] if load_path_output.empty?
|
|
113
|
+
|
|
114
|
+
load_path_output.strip.split("\n")
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Check if a specific Ruby version is available
|
|
118
|
+
def self.version_available?(version)
|
|
119
|
+
return false unless installed?
|
|
120
|
+
|
|
121
|
+
current = current_version
|
|
122
|
+
case version
|
|
123
|
+
when /^(\d+)\.(\d+)\.(\d+)$/
|
|
124
|
+
major = ::Regexp.last_match(1).to_i
|
|
125
|
+
minor = ::Regexp.last_match(2).to_i
|
|
126
|
+
patch = ::Regexp.last_match(3).to_i
|
|
127
|
+
current_major, current_minor, current_patch = current.split(".").map(&:to_i)
|
|
128
|
+
|
|
129
|
+
if major != current_major
|
|
130
|
+
major == current_major
|
|
131
|
+
elsif minor != current_minor
|
|
132
|
+
minor == current_minor
|
|
133
|
+
else
|
|
134
|
+
patch == current_patch
|
|
135
|
+
end
|
|
136
|
+
when /^(\d+)\.(\d+)$/
|
|
137
|
+
major = ::Regexp.last_match(1).to_i
|
|
138
|
+
minor = ::Regexp.last_match(2).to_i
|
|
139
|
+
current_major, current_minor = current.split(".").map(&:to_i)
|
|
140
|
+
major == current_major && minor == current_minor
|
|
141
|
+
when /^(\d+)$/
|
|
142
|
+
major = ::Regexp.last_match(1).to_i
|
|
143
|
+
current_major = current.split(".").first.to_i
|
|
144
|
+
major == current_major
|
|
145
|
+
else
|
|
146
|
+
false
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Get Ruby environment summary
|
|
151
|
+
def self.environment_summary
|
|
152
|
+
return { error: "Ruby is not installed" } unless installed?
|
|
153
|
+
|
|
154
|
+
{
|
|
155
|
+
version: current_version,
|
|
156
|
+
full_version: version_info[:full_version],
|
|
157
|
+
platform: platform,
|
|
158
|
+
engine: engine,
|
|
159
|
+
executable_path: executable_path,
|
|
160
|
+
installation_dir: installation_dir,
|
|
161
|
+
gem_dirs: gem_dirs,
|
|
162
|
+
library_dirs: library_dirs,
|
|
163
|
+
}
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Extract patch level from version string
|
|
167
|
+
def self.extract_patch_level(version_string)
|
|
168
|
+
match = version_string.match(/p(\d+)/)
|
|
169
|
+
match ? match[1] : nil
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Extract release date from version string
|
|
173
|
+
def self.extract_release_date(version_string)
|
|
174
|
+
match = version_string.match(/\((\d{4}-\d{2}-\d{2})/)
|
|
175
|
+
match ? match[1] : nil
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Extract platform from version string
|
|
179
|
+
def self.extract_platform(version_string)
|
|
180
|
+
match = version_string.match(/\[([^\]]+)\]/)
|
|
181
|
+
match ? match[1] : nil
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
data/lib/makit/ruby.rb
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "ruby/cli"
|
|
4
|
-
|
|
5
|
-
module Makit
|
|
6
|
-
class Ruby
|
|
7
|
-
# Main Ruby module for Makit
|
|
8
|
-
# Provides Ruby-related functionality and utilities
|
|
9
|
-
|
|
10
|
-
# Get current Ruby version (convenience method)
|
|
11
|
-
def self.version
|
|
12
|
-
CLI.current_version
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Check if Ruby is installed (convenience method)
|
|
16
|
-
def self.installed?
|
|
17
|
-
CLI.installed?
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# Get Ruby environment information (convenience method)
|
|
21
|
-
def self.info
|
|
22
|
-
CLI.environment_summary
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "ruby/cli"
|
|
4
|
+
|
|
5
|
+
module Makit
|
|
6
|
+
class Ruby
|
|
7
|
+
# Main Ruby module for Makit
|
|
8
|
+
# Provides Ruby-related functionality and utilities
|
|
9
|
+
|
|
10
|
+
# Get current Ruby version (convenience method)
|
|
11
|
+
def self.version
|
|
12
|
+
CLI.current_version
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Check if Ruby is installed (convenience method)
|
|
16
|
+
def self.installed?
|
|
17
|
+
CLI.installed?
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Get Ruby environment information (convenience method)
|
|
21
|
+
def self.info
|
|
22
|
+
CLI.environment_summary
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
require "yaml"
|
|
5
|
+
require "colorize"
|
|
6
|
+
require_relative "secrets"
|
|
7
|
+
|
|
8
|
+
module Makit
|
|
9
|
+
# RubyGems operations helper module
|
|
10
|
+
# Provides centralized RubyGems functionality, starting with credential management
|
|
11
|
+
module RubyGems
|
|
12
|
+
# Retrieves RubyGems API key from secrets management system or credentials file
|
|
13
|
+
# Priority: 1) Secrets (RUBYGEMS_API_KEY or rubygems_api_key), 2) ~/.gem/credentials file
|
|
14
|
+
# @return [String, nil] API key if found, nil otherwise
|
|
15
|
+
def self.get_api_key
|
|
16
|
+
# Priority 1: Check secrets management system
|
|
17
|
+
begin
|
|
18
|
+
secrets = Makit::Secrets.new
|
|
19
|
+
api_key = secrets.get("RUBYGEMS_API_KEY") || secrets.get("rubygems_api_key")
|
|
20
|
+
return api_key if api_key && !api_key.empty?
|
|
21
|
+
rescue StandardError => e
|
|
22
|
+
# Secrets backend may be unavailable (network error, auth failure, etc.)
|
|
23
|
+
# Fall back to credentials file with warning
|
|
24
|
+
credentials_file = File.expand_path("~/.gem/credentials")
|
|
25
|
+
if File.exist?(credentials_file)
|
|
26
|
+
warn " Warning: Secrets backend unavailable (#{e.class.name}), falling back to ~/.gem/credentials".colorize(:yellow)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Priority 2: Check ~/.gem/credentials file
|
|
31
|
+
credentials_file = File.expand_path("~/.gem/credentials")
|
|
32
|
+
if File.exist?(credentials_file)
|
|
33
|
+
begin
|
|
34
|
+
credentials = YAML.load_file(credentials_file)
|
|
35
|
+
api_key = credentials[:rubygems_api_key] if credentials && credentials[:rubygems_api_key]
|
|
36
|
+
return api_key if api_key && !api_key.empty?
|
|
37
|
+
rescue StandardError => e
|
|
38
|
+
# Credentials file may be malformed
|
|
39
|
+
# Will be handled by error messages
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Validates API key format (basic validation)
|
|
47
|
+
# Checks: non-empty, length >= 20, valid characters (alphanumeric, hyphens, underscores)
|
|
48
|
+
# @param api_key [String, nil] The API key to validate
|
|
49
|
+
# @return [Boolean] true if valid, false otherwise
|
|
50
|
+
def self.validate_api_key_format(api_key)
|
|
51
|
+
return false if api_key.nil? || api_key.strip.empty?
|
|
52
|
+
return false if api_key.length < 20
|
|
53
|
+
return false unless api_key.match?(/\A[a-zA-Z0-9_-]+\z/)
|
|
54
|
+
true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Syncs API key from secrets to ~/.gem/credentials file
|
|
58
|
+
# Only updates if file doesn't exist or API key is different
|
|
59
|
+
# Sets file permissions to 600 (owner read/write only) for security
|
|
60
|
+
# @param api_key [String] The API key to sync
|
|
61
|
+
# @return [void]
|
|
62
|
+
def self.sync_credentials_from_secrets(api_key)
|
|
63
|
+
return if api_key.nil? || api_key.empty?
|
|
64
|
+
|
|
65
|
+
credentials_file = File.expand_path("~/.gem/credentials")
|
|
66
|
+
|
|
67
|
+
# Check if file exists and has same API key
|
|
68
|
+
if File.exist?(credentials_file)
|
|
69
|
+
begin
|
|
70
|
+
require "yaml"
|
|
71
|
+
existing_credentials = YAML.load_file(credentials_file)
|
|
72
|
+
existing_key = existing_credentials[:rubygems_api_key] if existing_credentials
|
|
73
|
+
return if existing_key == api_key # No update needed
|
|
74
|
+
rescue StandardError
|
|
75
|
+
# File may be malformed, proceed with update
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Create or update credentials file
|
|
80
|
+
credentials_dir = File.dirname(credentials_file)
|
|
81
|
+
FileUtils.mkdir_p(credentials_dir) unless Dir.exist?(credentials_dir)
|
|
82
|
+
|
|
83
|
+
credentials_content = { rubygems_api_key: api_key }.to_yaml
|
|
84
|
+
File.write(credentials_file, credentials_content)
|
|
85
|
+
File.chmod(0o600, credentials_file) # rw------- (owner read/write only)
|
|
86
|
+
|
|
87
|
+
puts " Updated ~/.gem/credentials from secrets".colorize(:green)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Generates context-aware credential setup instructions
|
|
91
|
+
# Prioritizes methods based on detected configuration (Azure Key Vault, LocalSecrets, or neither)
|
|
92
|
+
# @return [String] Formatted error message with setup instructions
|
|
93
|
+
def self.credential_setup_instructions
|
|
94
|
+
methods = []
|
|
95
|
+
|
|
96
|
+
# Detect configuration and prioritize
|
|
97
|
+
azure_configured = ENV["AZURE_SERVICE_PRINCIPAL_APP_ID"] && !ENV["AZURE_SERVICE_PRINCIPAL_APP_ID"].empty? &&
|
|
98
|
+
ENV["AZURE_KEYVAULT_NAME"] && !ENV["AZURE_KEYVAULT_NAME"].empty?
|
|
99
|
+
|
|
100
|
+
if azure_configured
|
|
101
|
+
methods << "1. Using Azure Key Vault (recommended for your setup):"
|
|
102
|
+
methods << " az login"
|
|
103
|
+
methods << " az keyvault secret set \\"
|
|
104
|
+
methods << " --vault-name '#{ENV["AZURE_KEYVAULT_NAME"]}' \\"
|
|
105
|
+
methods << " --name RUBYGEMS_API_KEY \\"
|
|
106
|
+
methods << " --value 'your-api-key-here'"
|
|
107
|
+
methods << ""
|
|
108
|
+
methods << " For full Azure Key Vault setup, see: docs/azure-keyvault-permissions.md"
|
|
109
|
+
methods << ""
|
|
110
|
+
methods << "2. Using Local Secrets:"
|
|
111
|
+
methods << " rake secrets # Check current secrets"
|
|
112
|
+
methods << " # Edit ~/.makit/secrets.json and add:"
|
|
113
|
+
methods << " # \"RUBYGEMS_API_KEY\": \"your-api-key-here\""
|
|
114
|
+
else
|
|
115
|
+
methods << "1. Using Secrets Management (recommended):"
|
|
116
|
+
methods << " rake secrets # Check current secrets"
|
|
117
|
+
methods << " # Edit ~/.makit/secrets.json and add:"
|
|
118
|
+
methods << " # \"RUBYGEMS_API_KEY\": \"your-api-key-here\""
|
|
119
|
+
methods << ""
|
|
120
|
+
methods << " For Azure Key Vault setup, see: docs/azure-keyvault-permissions.md"
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
methods << ""
|
|
124
|
+
methods << "3. Using gem signin:"
|
|
125
|
+
methods << " gem signin"
|
|
126
|
+
methods << " Follow the prompts to enter your RubyGems username and password."
|
|
127
|
+
methods << ""
|
|
128
|
+
methods << "4. Manual credentials file:"
|
|
129
|
+
methods << " a. Get your API key from: https://rubygems.org/api_keys"
|
|
130
|
+
methods << " b. Create ~/.gem/credentials with the following content:"
|
|
131
|
+
methods << " :rubygems_api_key: YOUR_API_KEY_HERE"
|
|
132
|
+
|
|
133
|
+
"Error: RubyGems credentials not found\n\nTo set up credentials, choose one of the following methods:\n\n#{methods.join("\n")}\n\nFor detailed instructions, see: docs/RUBYGEMS_PUBLISHING.md"
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|