Module: Bundler::RubyDsl

Included in:
Dsl
Defined in:
lib/bundler/ruby_dsl.rb

Instance Method Summary collapse

Instance Method Details

#normalize_ruby_file(filename) ⇒ Object

Support the various file formats found in .ruby-version files.

3.2.2
ruby-3.2.2

Also supports .tool-versions files for asdf. Lines not starting with “ruby” are ignored.

ruby 2.5.1 # comment is ignored
ruby   2.5.1# close comment and extra spaces doesn't confuse

Intentionally does not support ‘3.2.1@gemset` since rvm recommends using .ruby-gemset instead

Loads the file relative to the dirname of the Gemfile itself.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/bundler/ruby_dsl.rb', line 43

def normalize_ruby_file(filename)
  file_content = Bundler.read_file(gemfile.dirname.join(filename))
  # match "ruby-3.2.2", ruby = "3.2.2" or "ruby   3.2.2" capturing version string up to the first space or comment
  if /^                    # Start of line
     ruby                  # Literal "ruby"
     [\s-]*                # Optional whitespace or hyphens (for "ruby-3.2.2" format)
     (?:=\s*)?             # Optional equals sign with whitespace (for ruby = "3.2.2" format)
     "?                    # Optional opening quote
     (                     # Start capturing group
       [^\s#"]+            # One or more chars that aren't spaces, #, or quotes
     )                     # End capturing group
     "?                    # Optional closing quote
     /x.match(file_content)
    $1
  else
    file_content.strip
  end
end

#ruby(*ruby_version) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/bundler/ruby_dsl.rb', line 5

def ruby(*ruby_version)
  options = ruby_version.pop if ruby_version.last.is_a?(Hash)
  ruby_version.flatten!

  if options
    patchlevel = options[:patchlevel]
    engine = options[:engine]
    engine_version = options[:engine_version]

    raise GemfileError, "Please define :engine_version" if engine && engine_version.nil?
    raise GemfileError, "Please define :engine" if engine_version && engine.nil?

    if options[:file]
      raise GemfileError, "Do not pass version argument when using :file option" unless ruby_version.empty?
      ruby_version << normalize_ruby_file(options[:file])
    end

    if engine == "ruby" && engine_version && ruby_version != Array(engine_version)
      raise GemfileEvalError, "ruby_version must match the :engine_version for MRI"
    end
  end

  @ruby_version = RubyVersion.new(ruby_version, patchlevel, engine, engine_version)
end