Module: Gem::MiniGems::ScriptHelper

Defined in:
lib/minigems/script_helper.rb

Instance Method Summary collapse

Instance Method Details

#adapt_executables_for(gemspec) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/minigems/script_helper.rb', line 58

def adapt_executables_for(gemspec)
  gemspec.executables.each do |executable|
    next if executable == 'minigem' # better not modify minigem itself
    if File.exists?(wrapper_path = File.join(Gem.bindir, executable))
      wrapper_code = interpolate_wrapper(gemspec.name, executable)
      begin
        if File.open(wrapper_path, 'w') { |f| f.write(wrapper_code) }
          puts "Adapted #{wrapper_path} to use minigems instead of rubygems."
        else
          puts "Failed to adapt #{wrapper_path} - maybe you need sudo permissions?"
        end
      rescue Errno::EACCES => e
        puts "Failed to adapt #{wrapper_path} - maybe you need sudo permissions?"
      end  
    end
  end
end

#ensure_in_load_path!(force = false) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/minigems/script_helper.rb', line 94

def ensure_in_load_path!(force = false)
  install_path = File.join(Gem::ConfigMap[:sitelibdir], 'minigems.rb')
  if force || !File.exists?(install_path)
    if File.exists?(source_path = File.join(minigems_path, 'lib', 'minigems.rb'))
      begin
        minigems_code = File.read(source_path)
        placeholder = "FULL_RUBYGEMS_METHODS = []"
        replacement = "FULL_RUBYGEMS_METHODS = %w[\n      "
        replacement << (Gem.methods - Object.methods).sort.join("\n      ")
        replacement << "\n    ]"
        File.open(install_path, 'w') do |f|
          f.write minigems_code.sub(placeholder, replacement)
        end
        minigems_dir = File.join(minigems_path, 'lib', 'minigems')
        FileUtils.cp_r(minigems_dir, Gem::ConfigMap[:sitelibdir])
        puts "Installed minigems at #{install_path}"
      rescue Errno::EACCES
        puts "Could not install minigems at #{install_path} (try sudo)"
      end
    end
  end
end

#interpolate_wrapper(gem_name, executable_name, mode = 'minigems') ⇒ Object



130
131
132
133
134
135
136
# File 'lib/minigems/script_helper.rb', line 130

def interpolate_wrapper(gem_name, executable_name, mode = 'minigems')
  @template_code ||= File.read(File.join(minigems_path, 'lib', 'minigems', 'executable_wrapper'))        
  vars = { 'GEM_NAME' => gem_name, 'EXECUTABLE_NAME' => executable_name }
  vars['SHEBANG'] = "#!/usr/bin/env " + Gem::ConfigMap[:ruby_install_name]
  vars['GEM_MODE'] = mode
  vars.inject(@template_code) { |str,(k,v)| str.gsub(k,v) }
end

#minigems_pathObject



48
49
50
51
52
53
54
55
56
# File 'lib/minigems/script_helper.rb', line 48

def minigems_path
  @minigems_path ||= begin
    if (gem_spec = Gem.source_index.find_name('minigems').sort_by { |g| g.version }.last)
      gem_spec.full_gem_path
    else
      raise "Minigems gem not found!"
    end
  end
end

#remove_minigems!Object



117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/minigems/script_helper.rb', line 117

def remove_minigems!
  minigems_dir = File.join(Gem::ConfigMap[:sitelibdir], 'minigems')
  if File.exists?(install_path = File.join(Gem::ConfigMap[:sitelibdir], 'minigems.rb'))
    if FileUtils.rm(install_path) && FileUtils.rm_rf(minigems_dir)
      puts "Succesfully removed #{install_path}"
      return
    end
  end
rescue => e
  puts e.message
  puts "Could not remove #{install_path} (try sudo)"
end

#revert_executables_for(gemspec) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/minigems/script_helper.rb', line 76

def revert_executables_for(gemspec)
  gemspec.executables.each do |executable|
    next if executable == 'minigem' # better not modify minigem itself
    if File.exists?(wrapper_path = File.join(Gem.bindir, executable))
      wrapper_code = interpolate_wrapper(gemspec.name, executable, 'rubygems')
      begin
        if File.open(wrapper_path, 'w') { |f| f.write(wrapper_code) }
          puts "Reverted #{wrapper_path} to use rubygems instead of minigems."
        else
          puts "Failed to revert #{wrapper_path} - maybe you need sudo permissions?"
        end
      rescue Errno::EACCES => e
        puts "Failed to revert #{wrapper_path} - maybe you need sudo permissions?"
      end
    end
  end      
end