class Bundler::Dsl
def self.evaluate(file, bundle, environment)
def self.evaluate(file, bundle, environment) builder = new(bundle, environment) builder.instance_eval(File.read(file.to_s), file.to_s, 1) environment end
def _combine_except(except)
def _combine_except(except) return @except unless except except = Array(except).compact.uniq.map { |o| o.to_s } except |= @except if @except except end
def _combine_only(only)
def _combine_only(only) return @only unless only only = Array(only).compact.uniq.map { |o| o.to_s } only &= @only if @only only end
def _find_directory_source(path)
def _find_directory_source(path) if @directory return @directory, Pathname.new(path || '') end path = @bundle.gemfile.dirname.join(path) @directory_sources.each do |s| if s.location.expand_path.to_s < path.expand_path.to_s return s, path.relative_path_from(s.location) end end nil end
def _handle_git_option(name, version, options)
def _handle_git_option(name, version, options) git = options[:git].to_s ref = options[:ref] || options[:tag] branch = options[:branch] if source = @git || @git_sources[git] if ref && source.ref != ref raise GitSourceError, "'#{git}' already specified with ref: #{source.ref}" elsif branch && source.branch != branch raise GitSourceError, "'#{git}' already specified with branch: #{source.branch}" end source.required_specs << name source.add_spec(Pathname.new(options[:path] || '.'), name, version) if _version?(version) source else git(git, :ref => ref, :branch => branch) do _handle_git_option(name, version, options) end end end
def _handle_vendored_option(name, version, options)
def _handle_vendored_option(name, version, options) dir, path = _find_directory_source(options[:path]) if dir dir.required_specs << name dir.add_spec(path, name, version) if _version?(version) dir else directory options[:path] do _handle_vendored_option(name, version, {}) end end end
def _version?(version)
def _version?(version) version && Gem::Version.new(version) rescue false end
def bin_path(path)
def bin_path(path) @bundle.bindir = Pathname.new(path) end
def bundle_path(path)
def bundle_path(path) @bundle.path = Pathname.new(path) end
def clear_sources
def clear_sources @environment.clear_sources end
def directory(path, options = {})
def directory(path, options = {}) raise DirectorySourceError, "cannot nest calls to directory or git" if @directory || @git @directory = DirectorySource.new(@bundle, options.merge(:location => path)) @directory_sources << @directory @environment.add_priority_source(@directory) retval = yield if block_given? @directory = nil retval end
def disable_rubygems
def disable_rubygems @environment.rubygems = false end
def disable_system_gems
def disable_system_gems @environment.system_gems = false end
def except(*env)
def except(*env) old, @except = @except, _combine_except(env) yield @except = old end
def gem(name, *args)
def gem(name, *args) options = args.last.is_a?(Hash) ? args.pop : {} version = args.last keys = :vendored_at, :path, :only, :except, :git, :path, :bundle, :require_as, :tag, :branch, :ref unless (invalid = options.keys - keys).empty? raise InvalidKey, "Only #{keys.join(", ")} are valid options to #gem. You used #{invalid.join(", ")}" end if path = options.delete(:vendored_at) options[:path] = path warn "The :vendored_at option is deprecated. Use :path instead.\nFrom #{caller[0]}" end options[:only] = _combine_only(options[:only] || options["only"]) options[:except] = _combine_except(options[:except] || options["except"]) dep = Dependency.new(name, options.merge(:version => version)) if options.key?(:bundle) && !options[:bundle] dep.source = SystemGemSource.new(@bundle) elsif @git || options[:git] dep.source = _handle_git_option(name, version, options) elsif @directory || options[:path] dep.source = _handle_vendored_option(name, version, options) end @environment.dependencies << dep end
def git(uri, options = {})
def git(uri, options = {}) raise DirectorySourceError, "cannot nest calls to directory or git" if @directory || @git @git = GitSource.new(@bundle, options.merge(:uri => uri)) @git_sources[uri] = @git @environment.add_priority_source(@git) retval = yield if block_given? @git = nil retval end
def initialize(bundle, environment)
def initialize(bundle, environment) @bundle = bundle @environment = environment @directory_sources = [] @git_sources = {} @only, @except, @directory, @git = nil, nil, nil, nil end
def only(*env)
def only(*env) old, @only = @only, _combine_only(env) yield @only = old end
def source(source)
def source(source) source = GemSource.new(@bundle, :uri => source) unless @environment.sources.include?(source) @environment.add_source(source) end end