Skip to content

Commit f6c1bd0

Browse files
Don't fail tests if the user has a ruby version installed already
1 parent aec4cf0 commit f6c1bd0

File tree

2 files changed

+52
-45
lines changed

2 files changed

+52
-45
lines changed

lib/argument_parser.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,8 @@ def parse(argv)
5353
name = name.shellsplit.first
5454
end
5555
version, *options = version.shellsplit
56-
rubies_dir = ENV["RUBIES_DIR"] || "#{ENV["HOME"]}/.rubies"
57-
unless executable = ["/opt/rubies/#{version}/bin/ruby", "#{rubies_dir}/#{version}/bin/ruby"].find { |path| File.executable?(path) }
58-
abort "Cannot find '#{version}' in /opt/rubies or #{rubies_dir}"
59-
end
56+
executable = find_chruby_ruby(version)
57+
abort "Cannot find '#{version}' in chruby paths" unless executable
6058
args.executables[name] = [executable, *options]
6159
end
6260
end
@@ -170,6 +168,15 @@ def parse(argv)
170168

171169
private
172170

171+
def find_chruby_ruby(version)
172+
rubies_dir = ENV["RUBIES_DIR"] || "#{ENV["HOME"]}/.rubies"
173+
chruby_search_paths(version, rubies_dir).find { |path| File.executable?(path) }
174+
end
175+
176+
def chruby_search_paths(version, rubies_dir)
177+
["/opt/rubies/#{version}/bin/ruby", "#{rubies_dir}/#{version}/bin/ruby"]
178+
end
179+
173180
def have_yjit?(ruby)
174181
ruby_version = `#{ruby} -v --yjit 2> #{File::NULL}`.strip
175182
ruby_version.downcase.include?("yjit")

test/argument_parser_test.rb

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,11 @@ def setup_mock_ruby(path)
103103
ruby_path = File.join(tmpdir, 'opt/rubies/3.2.0/bin/ruby')
104104
setup_mock_ruby(ruby_path)
105105

106-
File.stub :executable?, ->(path) {
107-
if path == "/opt/rubies/3.2.0/bin/ruby"
108-
File.exist?(ruby_path) && File.stat(ruby_path).executable?
109-
end
110-
} do
111-
parser = ArgumentParser.new
106+
parser = ArgumentParser.new
107+
parser.stub :chruby_search_paths, ->(version, rubies_dir) { [ruby_path] } do
112108
args = parser.parse(['--chruby=ruby-3.2.0::3.2.0'])
113109

114-
assert_equal '/opt/rubies/3.2.0/bin/ruby', args.executables['ruby-3.2.0'].first
110+
assert_equal ruby_path, args.executables['ruby-3.2.0'].first
115111
end
116112
end
117113
end
@@ -126,9 +122,11 @@ def setup_mock_ruby(path)
126122
ENV['HOME'] = tmpdir
127123

128124
parser = ArgumentParser.new
129-
args = parser.parse(['--chruby=my-ruby::3.3.0'])
125+
parser.stub :chruby_search_paths, ->(version, rd) { ["#{rd}/#{version}/bin/ruby"] } do
126+
args = parser.parse(['--chruby=my-ruby::3.3.0'])
130127

131-
assert_equal ruby_path, args.executables['my-ruby'].first
128+
assert_equal ruby_path, args.executables['my-ruby'].first
129+
end
132130
end
133131
end
134132

@@ -143,20 +141,11 @@ def setup_mock_ruby(path)
143141

144142
ENV['HOME'] = tmpdir
145143

146-
File.stub :executable?, ->(path) {
147-
case path
148-
when "/opt/rubies/3.2.0/bin/ruby"
149-
File.exist?(opt_ruby) && File.stat(opt_ruby).executable?
150-
when "#{tmpdir}/.rubies/3.2.0/bin/ruby"
151-
File.exist?(home_ruby) && File.stat(home_ruby).executable?
152-
else
153-
File.method(:executable?).super_method.call(path)
154-
end
155-
} do
156-
parser = ArgumentParser.new
144+
parser = ArgumentParser.new
145+
parser.stub :chruby_search_paths, ->(version, rd) { [opt_ruby, home_ruby] } do
157146
args = parser.parse(['--chruby=test::3.2.0'])
158147

159-
assert_equal '/opt/rubies/3.2.0/bin/ruby', args.executables['test'].first
148+
assert_equal opt_ruby, args.executables['test'].first
160149
end
161150
end
162151
end
@@ -171,9 +160,11 @@ def setup_mock_ruby(path)
171160
ENV['RUBIES_DIR'] = custom_rubies
172161

173162
parser = ArgumentParser.new
174-
args = parser.parse(['--chruby=custom::3.4.0'])
163+
parser.stub :chruby_search_paths, ->(version, rd) { ["#{rd}/#{version}/bin/ruby"] } do
164+
args = parser.parse(['--chruby=custom::3.4.0'])
175165

176-
assert_equal ruby_path, args.executables['custom'].first
166+
assert_equal ruby_path, args.executables['custom'].first
167+
end
177168
end
178169
end
179170

@@ -183,10 +174,11 @@ def setup_mock_ruby(path)
183174
ENV['HOME'] = tmpdir
184175

185176
parser = ArgumentParser.new
186-
187-
assert_raises(SystemExit) do
188-
capture_io do
189-
parser.parse(['--chruby=nonexistent::nonexistent-version-999'])
177+
parser.stub :chruby_search_paths, ->(version, rd) { ["#{rd}/#{version}/bin/ruby"] } do
178+
assert_raises(SystemExit) do
179+
capture_io do
180+
parser.parse(['--chruby=nonexistent::nonexistent-version-999'])
181+
end
190182
end
191183
end
192184
end
@@ -202,10 +194,12 @@ def setup_mock_ruby(path)
202194
ENV['HOME'] = tmpdir
203195

204196
parser = ArgumentParser.new
205-
args = parser.parse(['--chruby=yjit::3.2.0 --yjit'])
197+
parser.stub :chruby_search_paths, ->(version, rd) { ["#{rd}/#{version}/bin/ruby"] } do
198+
args = parser.parse(['--chruby=yjit::3.2.0 --yjit'])
206199

207-
assert_equal ruby_path, args.executables['yjit'].first
208-
assert_equal '--yjit', args.executables['yjit'].last
200+
assert_equal ruby_path, args.executables['yjit'].first
201+
assert_equal '--yjit', args.executables['yjit'].last
202+
end
209203
end
210204
end
211205

@@ -219,10 +213,12 @@ def setup_mock_ruby(path)
219213
ENV['HOME'] = tmpdir
220214

221215
parser = ArgumentParser.new
222-
args = parser.parse(['--chruby=3.2.0 --yjit'])
216+
parser.stub :chruby_search_paths, ->(version, rd) { ["#{rd}/#{version}/bin/ruby"] } do
217+
args = parser.parse(['--chruby=3.2.0 --yjit'])
223218

224-
assert args.executables.key?('3.2.0')
225-
assert_equal ruby_path, args.executables['3.2.0'].first
219+
assert args.executables.key?('3.2.0')
220+
assert_equal ruby_path, args.executables['3.2.0'].first
221+
end
226222
end
227223
end
228224

@@ -238,12 +234,14 @@ def setup_mock_ruby(path)
238234
ENV['HOME'] = tmpdir
239235

240236
parser = ArgumentParser.new
241-
args = parser.parse(['--chruby=ruby32::3.2.0;ruby33::3.3.0 --yjit'])
237+
parser.stub :chruby_search_paths, ->(version, rd) { ["#{rd}/#{version}/bin/ruby"] } do
238+
args = parser.parse(['--chruby=ruby32::3.2.0;ruby33::3.3.0 --yjit'])
242239

243-
assert_equal 2, args.executables.size
244-
assert_equal ruby_path_32, args.executables['ruby32'].first
245-
assert_equal ruby_path_33, args.executables['ruby33'].first
246-
assert_equal '--yjit', args.executables['ruby33'].last
240+
assert_equal 2, args.executables.size
241+
assert_equal ruby_path_32, args.executables['ruby32'].first
242+
assert_equal ruby_path_33, args.executables['ruby33'].first
243+
assert_equal '--yjit', args.executables['ruby33'].last
244+
end
247245
end
248246
end
249247
end
@@ -589,10 +587,12 @@ def setup_mock_ruby(path)
589587
parser = ArgumentParser.new(ruby_executable: mock_ruby)
590588

591589
parser.stub :have_yjit?, true do
592-
args = parser.parse(['--chruby=test::3.2.0'])
590+
parser.stub :chruby_search_paths, ->(version, rd) { ["#{rd}/#{version}/bin/ruby"] } do
591+
args = parser.parse(['--chruby=test::3.2.0'])
593592

594-
assert_equal 1, args.executables.size
595-
assert_equal ruby_path, args.executables['test'].first
593+
assert_equal 1, args.executables.size
594+
assert_equal ruby_path, args.executables['test'].first
595+
end
596596
end
597597
end
598598
end

0 commit comments

Comments
 (0)