Class: Bundle::Patch::GemfileEditor

Inherits:
Object
  • Object
show all
Defined in:
lib/bundle/patch/gemfile_editor.rb

Constant Summary collapse

GEMFILE_PATH =
"Gemfile"
LOCKFILE_PATH =
"Gemfile.lock"
BACKUP_PATH =
"Gemfile.bak"

Class Method Summary collapse

Class Method Details

.gem_declared_in_gemfile?(name, lines) ⇒ Boolean



43
44
45
# File 'lib/bundle/patch/gemfile_editor.rb', line 43

def self.gem_declared_in_gemfile?(name, lines)
  lines.any? { |line| line.match?(/^\s*gem\s+['"]#{name}['"]/) }
end

.gem_declared_in_lockfile?(name) ⇒ Boolean



47
48
49
50
# File 'lib/bundle/patch/gemfile_editor.rb', line 47

def self.gem_declared_in_lockfile?(name)
  return false unless File.exist?(LOCKFILE_PATH)
  File.read(LOCKFILE_PATH).include?("\n    #{name} ")
end

.update!(patchable_gems) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/bundle/patch/gemfile_editor.rb', line 10

def self.update!(patchable_gems)
  unless File.exist?(GEMFILE_PATH)
    abort "❌ No Gemfile found in the current directory."
  end

  puts "📝 Backing up Gemfile to #{BACKUP_PATH}..."
  File.write(BACKUP_PATH, File.read(GEMFILE_PATH))

  lines = File.readlines(GEMFILE_PATH)
  updated_lines = lines.dup

  patchable_gems.each do |gem_info|
    name = gem_info["name"]
    version = gem_info["required_version"]

    in_gemfile = gem_declared_in_gemfile?(name, lines)
    in_lockfile = gem_declared_in_lockfile?(name)

    if in_gemfile
      puts "🔧 Updating existing gem: #{name} → '#{version}'"
      updated_lines = update_version_in_lines(updated_lines, name, version)
    elsif in_lockfile
      puts "➕ Adding dependency gem: #{name} → '#{version}'"
      updated_lines << "gem \"#{name}\", \"#{version}\"\n"
    else
      puts "⚠️  Skipping #{name} — not found in Gemfile or Gemfile.lock."
    end
  end

  File.write(GEMFILE_PATH, updated_lines.join)
  puts "✅ Gemfile updated!"
end

.update_version_in_lines(lines, name, version) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
# File 'lib/bundle/patch/gemfile_editor.rb', line 52

def self.update_version_in_lines(lines, name, version)
  lines.map do |line|
    if line.match?(/^\s*gem\s+['"]#{name}['"]/)
      parts = line.strip.split(",").map(&:strip)
      gem_declaration = parts[0]
      "#{gem_declaration}, '#{version}'\n"
    else
      line
    end
  end
end