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 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.kind_of?(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? and not source_set then Gem::Requirement.default elsif source_set then Gem::Requirement.source_set else Gem::Requirement.create requirements end return unless gem_platforms 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 then 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) then 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 reference ||= 'master' 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 options # :nodoc:
def gem_platforms 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 platform if engines = ENGINE_MAP[platform_name] then 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 then if requires = options.delete(:require) then @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? "/" "git://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).untaint, @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 and not engine_version return true if @installing unless RUBY_VERSION == version then message = "Your Ruby version is #{RUBY_VERSION}, " + "but your #{gem_deps_file} requires #{version}" raise Gem::RubyVersionMismatch, message end if engine and engine != Gem.ruby_engine then message = "Your ruby engine is #{Gem.ruby_engine}, " + "but your #{gem_deps_file} requires #{engine}" raise Gem::RubyVersionMismatch, message end if engine_version then my_engine_version = Object.const_get "#{Gem.ruby_engine.upcase}_VERSION" if engine_version != my_engine_version then message = "Your ruby engine version is #{Gem.ruby_engine} #{my_engine_version}, " + "but your #{gem_deps_file} requires #{engine} #{engine_version}" raise Gem::RubyVersionMismatch, message end end return true end
def source url
def source url Gem.sources.clear if @default_sources @default_sources = false Gem.sources << url end