env(name) { || ... }
click to toggle source
def env(name)
@env, old = name, @env
yield
ensure
@env = old
end
eval_gemfile(gemfile)
click to toggle source
def eval_gemfile(gemfile)
instance_eval(Bundler.read_file(gemfile.to_s), gemfile.to_s, 1)
rescue SyntaxError => e
bt = e.message.split("\n")[1..-1]
raise GemfileError, ["Gemfile syntax error:", *bt].join("\n")
end
gem(name, *args)
click to toggle source
def gem(name, *args)
if name.is_a?(Symbol)
raise GemfileError, %Q{You need to specify gem names as Strings. Use 'gem "#{name.to_s}"' instead.}
end
options = Hash === args.last ? args.pop : {}
version = args || [">= 0"]
_normalize_options(name, version, options)
dep = Dependency.new(name, version, options)
if current = @dependencies.find { |d| d.name == dep.name }
if current.requirement != dep.requirement
if current.type == :development
@dependencies.delete current
elsif dep.type == :development
return
else
raise DslError, "You cannot specify the same gem twice with different version requirements. " "You specified: #{current.name} (#{current.requirement}) and " "#{dep.name} (#{dep.requirement})"
end
end
if current.source != dep.source
if current.type == :development
@dependencies.delete current
elsif dep.type == :development
return
else
raise DslError, "You cannot specify the same gem twice coming from different sources. You " "specified that #{dep.name} (#{dep.requirement}) should come from " "#{current.source || 'an unspecified source'} and #{dep.source}"
end
end
end
@dependencies << dep
end
gemspec(opts = nil)
click to toggle source
def gemspec(opts = nil)
path = opts && opts[:path] || '.'
name = opts && opts[:name] || '{,*}'
development_group = opts && opts[:development_group] || :development
path = File.expand_path(path, Bundler.default_gemfile.dirname)
gemspecs = Dir[File.join(path, "#{name}.gemspec")]
case gemspecs.size
when 1
spec = Bundler.load_gemspec(gemspecs.first)
raise InvalidOption, "There was an error loading the gemspec at #{gemspecs.first}." unless spec
gem spec.name, :path => path
group(development_group) do
spec.development_dependencies.each do |dep|
gem dep.name, *(dep.requirement.as_list + [:type => :development])
end
end
when 0
raise InvalidOption, "There are no gemspecs at #{path}."
else
raise InvalidOption, "There are multiple gemspecs at #{path}. Please use the :name option to specify which one."
end
end
git(uri, options = {}, source_options = {}, &blk)
click to toggle source
def git(uri, options = {}, source_options = {}, &blk)
unless block_given?
msg = "You can no longer specify a git source by itself. Instead, \n" "either use the :git option on a gem, or specify the gems that \n" "bundler should find in the git source by passing a block to \n" "the git method, like: \n\n" " git 'git://github.com/rails/rails.git' do\n" " gem 'rails'\n" " end"
raise DeprecatedError, msg
end
source Source::Git.new(_normalize_hash(options).merge("uri" => uri)), source_options, &blk
end
group(*args) { || ... }
click to toggle source
def group(*args, &blk)
@groups.concat args
yield
ensure
args.each { @groups.pop }
end
method_missing(name, *args)
click to toggle source
def method_missing(name, *args)
location = caller[0].split(':')[0..1].join(':')
raise GemfileError, "Undefined local variable or method `#{name}' for Gemfile\n" " from #{location}"
end
path(path, options = {}, source_options = {}, &blk)
click to toggle source
def path(path, options = {}, source_options = {}, &blk)
source Source::Path.new(_normalize_hash(options).merge("path" => Pathname.new(path))), source_options, &blk
end
ruby(ruby_version, options = {})
click to toggle source
def ruby(ruby_version, options = {})
raise GemfileError, "Please define :engine_version" if options[:engine] && options[:engine_version].nil?
raise GemfileError, "Please define :engine" if options[:engine_version] && options[:engine].nil?
raise GemfileError, "ruby_version must match the :engine_version for MRI" if options[:engine] == "ruby" && options[:engine_version] && ruby_version != options[:engine_version]
@ruby_version = RubyVersion.new(ruby_version, options[:engine], options[:engine_version])
end
source(source, options = {}) { || ... }
click to toggle source
def source(source, options = {})
case source
when :gemcutter, :rubygems, :rubyforge then
@rubygems_source.add_remote "http://rubygems.org"
return
when String
@rubygems_source.add_remote source
return
else
@source = source
if options[:prepend]
@sources = [@source] | @sources
else
@sources = @sources | [@source]
end
yield if block_given?
return @source
end
ensure
@source = nil
end
to_definition(lockfile, unlock)
click to toggle source
def to_definition(lockfile, unlock)
@sources << @rubygems_source unless @sources.include?(@rubygems_source)
Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version)
end