Module: Bundler

Defined in:
lib/bundler.rb,
lib/bundler/ui.rb,
lib/bundler/cli.rb,
lib/bundler/dsl.rb,
lib/bundler/graph.rb,
lib/bundler/index.rb,
lib/bundler/source.rb,
lib/bundler/runtime.rb,
lib/bundler/version.rb,
lib/bundler/resolver.rb,
lib/bundler/settings.rb,
lib/bundler/spec_set.rb,
lib/bundler/installer.rb,
lib/bundler/definition.rb,
lib/bundler/dependency.rb,
lib/bundler/deployment.rb,
lib/bundler/gem_helper.rb,
lib/bundler/environment.rb,
lib/bundler/rubygems_ext.rb,
lib/bundler/gem_installer.rb,
lib/bundler/shared_helpers.rb,
lib/bundler/lockfile_parser.rb,
lib/bundler/lazy_specification.rb,
lib/bundler/remote_specification.rb,
lib/bundler/rubygems_integration.rb

Defined Under Namespace

Modules: GemHelpers, MatchPlatform, SharedHelpers, Source Classes: BundlerError, CLI, Definition, DepProxy, Dependency, Deployment, DeprecatedError, Dsl, DslError, Environment, GemHelper, GemInstaller, GemNotFound, GemfileError, GemfileNotFound, GemspecError, GitError, Graph, GraphNode, Index, InstallError, Installer, InvalidOption, InvalidSpecSet, LazySpecification, LockfileParser, PathError, ProductionError, RemoteSpecification, Resolver, RubygemsIntegration, Runtime, Settings, SpecSet, UI, VersionConflict

Constant Summary collapse

ORIGINAL_ENV =
ENV.to_hash
WINDOWS =
RbConfig::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw)!
FREEBSD =
RbConfig::CONFIG["host_os"] =~ /bsd/
NULL =
WINDOWS ? "NUL" : "/dev/null"
VERSION =

We’re doing this because we might write tests that deal with other versions of bundler and we are unsure how to handle this better.

"1.0.21.1"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.bundle_pathObject



91
92
93
# File 'lib/bundler.rb', line 91

def bundle_path
  @bundle_path ||= Pathname.new(settings.path).expand_path(root)
end

.rubygemsObject (readonly)

Returns the value of attribute rubygems.



347
348
349
# File 'lib/bundler/rubygems_integration.rb', line 347

def rubygems
  @rubygems
end

.uiObject



87
88
89
# File 'lib/bundler.rb', line 87

def ui
  @ui ||= UI.new
end

Class Method Details

.app_cacheObject



176
177
178
# File 'lib/bundler.rb', line 176

def app_cache
  root.join("vendor/cache")
end

.app_config_pathObject



170
171
172
173
174
# File 'lib/bundler.rb', line 170

def app_config_path
  ENV['BUNDLE_APP_CONFIG'] ?
    Pathname.new(ENV['BUNDLE_APP_CONFIG']).expand_path(root) :
    root.join('.bundle')
end

.bin_pathObject



95
96
97
98
99
100
101
102
# File 'lib/bundler.rb', line 95

def bin_path
  @bin_path ||= begin
    path = settings[:bin] || "bin"
    path = Pathname.new(path).expand_path(root)
    FileUtils.mkdir_p(path)
    Pathname.new(path).expand_path
  end
end

.cacheObject



162
163
164
# File 'lib/bundler.rb', line 162

def cache
  bundle_path.join("cache/bundler")
end

.configureObject



80
81
82
83
84
85
# File 'lib/bundler.rb', line 80

def configure
  @configured ||= begin
    configure_gem_home_and_path
    true
  end
end

.default_gemfileObject



196
197
198
# File 'lib/bundler.rb', line 196

def default_gemfile
  SharedHelpers.default_gemfile
end

.default_lockfileObject



200
201
202
# File 'lib/bundler.rb', line 200

def default_lockfile
  SharedHelpers.default_lockfile
end

.definition(unlock = nil) ⇒ Object



133
134
135
136
137
138
139
140
# File 'lib/bundler.rb', line 133

def definition(unlock = nil)
  @definition = nil if unlock
  @definition ||= begin
    configure
    upgrade_lockfile
    Definition.build(default_gemfile, default_lockfile, unlock)
  end
end

.environmentObject



129
130
131
# File 'lib/bundler.rb', line 129

def environment
  Bundler::Environment.new(root, definition)
end

.homeObject



150
151
152
# File 'lib/bundler.rb', line 150

def home
  bundle_path.join("bundler")
end

.install_pathObject



154
155
156
# File 'lib/bundler.rb', line 154

def install_path
  home.join("gems")
end

.loadObject



125
126
127
# File 'lib/bundler.rb', line 125

def load
  @load ||= Runtime.new(root, definition)
end

.load_gemspec(file) ⇒ Object



231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/bundler.rb', line 231

def load_gemspec(file)
  path = Pathname.new(file)
  # Eval the gemspec from its parent directory
  Dir.chdir(path.dirname.to_s) do
    contents = File.read(path.basename.to_s)
    begin
      Gem::Specification.from_yaml(contents)
      # Raises ArgumentError if the file is not valid YAML
    rescue ArgumentError, SyntaxError, Gem::EndOfYAMLException, Gem::Exception
      begin
        eval(contents, TOPLEVEL_BINDING, path.expand_path.to_s)
      rescue LoadError => e
        original_line = e.backtrace.find { |line| line.include?(path.to_s) }
        msg  = "There was a LoadError while evaluating #{path.basename}:\n  #{e.message}"
        msg << " from\n  #{original_line}" if original_line
        msg << "\n"

        if RUBY_VERSION >= "1.9.0"
          msg << "\nDoes it try to require a relative path? That doesn't work in Ruby 1.9."
        end

        raise GemspecError, msg
      end
    end
  end
end

.mkdir_p(path) ⇒ Object



215
216
217
218
219
220
221
# File 'lib/bundler.rb', line 215

def mkdir_p(path)
  if requires_sudo?
    sudo "mkdir -p '#{path}'" unless File.exist?(path)
  else
    FileUtils.mkdir_p(path)
  end
end

.read_file(file) ⇒ Object



227
228
229
# File 'lib/bundler.rb', line 227

def read_file(file)
  File.open(file, "rb") { |f| f.read }
end

.require(*groups) ⇒ Object



121
122
123
# File 'lib/bundler.rb', line 121

def require(*groups)
  setup(*groups).require(*groups)
end

.requires_sudo?Boolean

Returns:

  • (Boolean)


204
205
206
207
208
209
210
211
212
213
# File 'lib/bundler.rb', line 204

def requires_sudo?
  return @requires_sudo if defined?(@checked_for_sudo) && @checked_for_sudo

  path = bundle_path
  path = path.parent until path.exist?
  sudo_present = !(`which sudo` rescue '').empty?

  @checked_for_sudo = true
  @requires_sudo = settings.allow_sudo? && !File.writable?(path) && sudo_present
end

.rootObject



166
167
168
# File 'lib/bundler.rb', line 166

def root
  default_gemfile.dirname.expand_path
end

.ruby_scopeObject



142
143
144
# File 'lib/bundler.rb', line 142

def ruby_scope
  "#{Bundler.rubygems.ruby_engine}/#{Gem::ConfigMap[:ruby_version]}"
end

.settingsObject



184
185
186
# File 'lib/bundler.rb', line 184

def settings
  @settings ||= Settings.new(app_config_path)
end

.setup(*groups) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/bundler.rb', line 104

def setup(*groups)
  # Just return if all groups are already loaded
  return @setup if defined?(@setup)

  if groups.empty?
    # Load all groups, but only once
    @setup = load.setup
  else
    @completed_groups ||= []
    # Figure out which groups haven't been loaded yet
    unloaded = groups - @completed_groups
    # Record groups that are now loaded
    @completed_groups = groups
    unloaded.any? ? load.setup(*groups) : load
  end
end

.specs_pathObject



158
159
160
# File 'lib/bundler.rb', line 158

def specs_path
  bundle_path.join("specifications")
end

.sudo(str) ⇒ Object



223
224
225
# File 'lib/bundler.rb', line 223

def sudo(str)
  `sudo -p 'Enter your password to install the bundled RubyGems to your system: ' #{str}`
end

.tmpObject



180
181
182
# File 'lib/bundler.rb', line 180

def tmp
  user_bundle_path.join("tmp", Process.pid.to_s)
end

.user_bundle_pathObject



146
147
148
# File 'lib/bundler.rb', line 146

def user_bundle_path
  Pathname.new(Bundler.rubygems.user_home).join(".bundler")
end

.with_clean_envObject



188
189
190
191
192
193
194
# File 'lib/bundler.rb', line 188

def with_clean_env
  bundled_env = ENV.to_hash
  ENV.replace(ORIGINAL_ENV)
  yield
ensure
  ENV.replace(bundled_env.to_hash)
end