class Gem::RequestSet::GemDependencyAPI
def add_dependencies(groups, dependencies) # :nodoc:
def add_dependencies(groups, dependencies) # :nodoc: return unless (groups & @without_groups).empty? dependencies.each do |dep| @set.gem dep.name, *dep.requirement.as_list end end
def find_gemspec(name, path) # :nodoc:
def find_gemspec(name, path) # :nodoc: glob = File.join path, "#{name}.gemspec" spec_files = Dir[glob] case spec_files.length when 1 then spec_file = spec_files.first spec = Gem::Specification.load spec_file return spec if spec raise ArgumentError, "invalid gemspec #{spec_file}" when 0 then raise ArgumentError, "no gemspecs found at #{Dir.pwd}" else raise ArgumentError, "found multiple gemspecs at #{Dir.pwd}, " \ "use the name: option to specify the one you want" end end
def gem(name, *requirements)
def gem(name, *requirements) options = requirements.pop if requirements.last.is_a?(Hash) options ||= {} options[:git] = @current_repository if @current_repository source_set = false source_set ||= gem_path name, options source_set ||= gem_git name, options source_set ||= gem_git_source name, options source_set ||= gem_source name, options duplicate = @dependencies.include? name @dependencies[name] = if requirements.empty? && !source_set Gem::Requirement.default elsif source_set Gem::Requirement.source_set else Gem::Requirement.create requirements end return unless gem_platforms name, options groups = gem_group name, options return unless (groups & @without_groups).empty? pin_gem_source name, :default unless source_set gem_requires name, options if duplicate warn <<-WARNING m dependencies file #{@path} requires #{name} more than once. WARNING end @set.gem name, *requirements end
def gem_deps_file # :nodoc:
def gem_deps_file # :nodoc: File.basename @path end
def gem_git(name, options) # :nodoc:
def gem_git(name, options) # :nodoc: if gist = options.delete(:gist) options[:git] = "https://gist.github.com/#{gist}.git" end return unless repository = options.delete(:git) pin_gem_source name, :git, repository reference = gem_git_reference options submodules = options.delete :submodules @git_set.add_git_gem name, repository, reference, submodules true end
def gem_git_reference(options) # :nodoc:
def gem_git_reference(options) # :nodoc: ref = options.delete :ref branch = options.delete :branch tag = options.delete :tag reference = nil reference ||= ref reference ||= branch reference ||= tag if ref && branch warn <<-WARNING m dependencies file #{@path} includes git reference for both ref and branch but only ref is used. WARNING end if (ref || branch) && tag warn <<-WARNING m dependencies file #{@path} includes git reference for both ref/branch and tag but only ref/branch is used. WARNING end reference end
def gem_git_source(name, options) # :nodoc:
def gem_git_source(name, options) # :nodoc: return unless git_source = (@git_sources.keys & options.keys).last source_callback = @git_sources[git_source] source_param = options.delete git_source git_url = source_callback.call source_param options[:git] = git_url gem_git name, options true end
def gem_group(name, options) # :nodoc:
def gem_group(name, options) # :nodoc: g = options.delete :group all_groups = g ? Array(g) : [] groups = options.delete :groups all_groups |= groups if groups all_groups |= @current_groups if @current_groups all_groups end
def gem_path(name, options) # :nodoc:
def gem_path(name, options) # :nodoc: return unless directory = options.delete(:path) pin_gem_source name, :path, directory @vendor_set.add_vendor_gem name, directory true end
def gem_platforms(name, options) # :nodoc:
def gem_platforms(name, options) # :nodoc: platform_names = Array(options.delete(:platform)) platform_names.concat Array(options.delete(:platforms)) platform_names.concat @current_platforms if @current_platforms return true if platform_names.empty? platform_names.any? do |platform_name| raise ArgumentError, "unknown platform #{platform_name.inspect}" unless platform = PLATFORM_MAP[platform_name] next false unless Gem::Platform.match_gem? platform, name if engines = ENGINE_MAP[platform_name] next false unless engines.include? Gem.ruby_engine end case WINDOWS[platform_name] when :only then next false unless Gem.win_platform? when :never then next false if Gem.win_platform? end VERSION_MAP[platform_name].satisfied_by? Gem.ruby_version end end
def gem_requires(name, options) # :nodoc:
def gem_requires(name, options) # :nodoc: if options.include? :require if requires = options.delete(:require) @requires[name].concat Array requires end else @requires[name] << name end raise ArgumentError, "Unhandled gem options #{options.inspect}" unless options.empty? end
def gem_source(name, options) # :nodoc:
def gem_source(name, options) # :nodoc: return unless source = options.delete(:source) pin_gem_source name, :source, source @source_set.add_source_gem name, source true end
def gemspec(options = {})
def gemspec(options = {}) name = options.delete(:name) || "{,*}" path = options.delete(:path) || "." development_group = options.delete(:development_group) || :development spec = find_gemspec name, path groups = gem_group spec.name, {} self_dep = Gem::Dependency.new spec.name, spec.version add_dependencies groups, [self_dep] add_dependencies groups, spec.runtime_dependencies @dependencies[spec.name] = Gem::Requirement.source_set spec.dependencies.each do |dep| @dependencies[dep.name] = dep.requirement end groups << development_group add_dependencies groups, spec.development_dependencies @vendor_set.add_vendor_gem spec.name, path gem_requires spec.name, options end
def git(repository)
def git(repository) @current_repository = repository yield ensure @current_repository = nil end
def git_source(name, &callback)
def git_source(name, &callback) @git_sources[name] = callback end
def group(*groups)
def group(*groups) @current_groups = groups yield ensure @current_groups = nil end
def initialize(set, path)
def initialize(set, path) @set = set @path = path @current_groups = nil @current_platforms = nil @current_repository = nil @dependencies = {} @default_sources = true @git_set = @set.git_set @git_sources = {} @installing = false @requires = Hash.new {|h, name| h[name] = [] } @vendor_set = @set.vendor_set @source_set = @set.source_set @gem_sources = {} @without_groups = [] git_source :github do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include? "/" "https://github.com/#{repo_name}.git" end git_source :bitbucket do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include? "/" user, = repo_name.split "/", 2 "https://#{user}@bitbucket.org/#{repo_name}.git" end end
def installing=(installing) # :nodoc:
def installing=(installing) # :nodoc: @installing = installing end
def load
def load instance_eval File.read(@path), @path, 1 self end
def pin_gem_source(name, type = :default, source = nil)
def pin_gem_source(name, type = :default, source = nil) source_description = case type when :default then "(default)" when :path then "path: #{source}" when :git then "git: #{source}" when :source then "source: #{source}" else "(unknown)" end raise ArgumentError, "duplicate source #{source_description} for gem #{name}" if @gem_sources.fetch(name, source) != source @gem_sources[name] = source end
def platform(*platforms)
def platform(*platforms) @current_platforms = platforms yield ensure @current_platforms = nil end
def ruby(version, options = {})
def ruby(version, options = {}) engine = options[:engine] engine_version = options[:engine_version] raise ArgumentError, "You must specify engine_version along with the Ruby engine" if engine && !engine_version return true if @installing unless version == RUBY_VERSION message = "Your Ruby version is #{RUBY_VERSION}, " \ "but your #{gem_deps_file} requires #{version}" raise Gem::RubyVersionMismatch, message end if engine && engine != Gem.ruby_engine message = "Your Ruby engine is #{Gem.ruby_engine}, " \ "but your #{gem_deps_file} requires #{engine}" raise Gem::RubyVersionMismatch, message end if engine_version if engine_version != RUBY_ENGINE_VERSION message = "Your Ruby engine version is #{Gem.ruby_engine} #{RUBY_ENGINE_VERSION}, " \ "but your #{gem_deps_file} requires #{engine} #{engine_version}" raise Gem::RubyVersionMismatch, message end end true end
def source(url)
def source(url) Gem.sources.clear if @default_sources @default_sources = false Gem.sources << url end