mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* lib/rubygems: Update to RubyGems HEAD(5c3b6f3).
Fixed #1156, #1142, #1115, #1142, #1139 on rubygems/rubygems * test/rubygems: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49511 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									69be362030
								
							
						
					
					
						commit
						c3546c76c8
					
				
					 20 changed files with 1391 additions and 1263 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,9 @@
 | 
			
		|||
Thu Feb  5 22:42:34 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>
 | 
			
		||||
 | 
			
		||||
	* lib/rubygems:  Update to RubyGems HEAD(5c3b6f3).
 | 
			
		||||
	  Fixed #1156, #1142, #1115, #1142, #1139 on rubygems/rubygems
 | 
			
		||||
	* test/rubygems:  ditto.
 | 
			
		||||
 | 
			
		||||
Thu Feb  5 13:41:01 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* vm_eval.c (send_internal), vm_insnhelper.c (vm_call_opt_send):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -144,7 +144,7 @@ class Gem::BasicSpecification
 | 
			
		|||
        File.join full_gem_path, path
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      full_paths.unshift extension_dir unless @extensions.nil? || @extensions.empty?
 | 
			
		||||
      full_paths << extension_dir unless @extensions.nil? || @extensions.empty?
 | 
			
		||||
 | 
			
		||||
      full_paths
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,8 +61,10 @@ class Gem::Commands::OpenCommand < Gem::Command
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def open_editor path
 | 
			
		||||
    Dir.chdir(path) do
 | 
			
		||||
      system(*@editor.split(/\s+/) + [path])
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def spec_for name
 | 
			
		||||
    spec = Gem::Specification.find_all_by_name(name, @version).last
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -681,7 +681,7 @@ TEXT
 | 
			
		|||
  # return the stub script text used to launch the true Ruby script
 | 
			
		||||
 | 
			
		||||
  def windows_stub_script(bindir, bin_file_name)
 | 
			
		||||
    ruby = Gem.ruby.chomp('"').tr(File::SEPARATOR, "\\")
 | 
			
		||||
    ruby = Gem.ruby.gsub(/^\"|\"$/, "").tr(File::SEPARATOR, "\\")
 | 
			
		||||
    return <<-TEXT
 | 
			
		||||
@ECHO OFF
 | 
			
		||||
IF NOT "%~f0" == "~f0" GOTO :WinNT
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -116,7 +116,7 @@ class Gem::RequestSet
 | 
			
		|||
    if dep = @dependency_names[name] then
 | 
			
		||||
      dep.requirement.concat reqs
 | 
			
		||||
    else
 | 
			
		||||
      dep = Gem::Dependency.new name, reqs
 | 
			
		||||
      dep = Gem::Dependency.new name, *reqs
 | 
			
		||||
      @dependency_names[name] = dep
 | 
			
		||||
      @dependencies << dep
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -275,8 +275,13 @@ class Gem::RequestSet
 | 
			
		|||
 | 
			
		||||
    @git_set.root_dir = @install_dir
 | 
			
		||||
 | 
			
		||||
    lockfile = Gem::RequestSet::Lockfile.new self, path
 | 
			
		||||
    lockfile.parse
 | 
			
		||||
    lock_file = "#{File.expand_path(path)}.lock"
 | 
			
		||||
    begin
 | 
			
		||||
      tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file lock_file
 | 
			
		||||
      parser = tokenizer.make_parser self, []
 | 
			
		||||
      parser.parse
 | 
			
		||||
    rescue Errno::ENOENT
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    gf = Gem::RequestSet::GemDependencyAPI.new self, path
 | 
			
		||||
    gf.installing = installing
 | 
			
		||||
| 
						 | 
				
			
			@ -411,3 +416,4 @@ end
 | 
			
		|||
 | 
			
		||||
require 'rubygems/request_set/gem_dependency_api'
 | 
			
		||||
require 'rubygems/request_set/lockfile'
 | 
			
		||||
require 'rubygems/request_set/lockfile/tokenizer'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,9 @@
 | 
			
		|||
require 'strscan'
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
# Parses a gem.deps.rb.lock file and constructs a LockSet containing the
 | 
			
		||||
# dependencies found inside.  If the lock file is missing no LockSet is
 | 
			
		||||
# constructed.
 | 
			
		||||
 | 
			
		||||
class Gem::RequestSet::Lockfile
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Raised when a lockfile cannot be parsed
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +34,6 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
      @path   = path
 | 
			
		||||
      super "#{message} (at line #{line} column #{column})"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
| 
						 | 
				
			
			@ -57,11 +53,7 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
 | 
			
		||||
    @gem_deps_file.untaint unless gem_deps_file.tainted?
 | 
			
		||||
 | 
			
		||||
    @current_token  = nil
 | 
			
		||||
    @line           = 0
 | 
			
		||||
    @line_pos       = 0
 | 
			
		||||
    @platforms      = []
 | 
			
		||||
    @tokens         = []
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def add_DEPENDENCIES out # :nodoc:
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +72,7 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
          [name, requirement_string]
 | 
			
		||||
        end
 | 
			
		||||
      else
 | 
			
		||||
        @requests.sort_by { |r| r.name }.map do |request|
 | 
			
		||||
        requests.sort_by { |r| r.name }.map do |request|
 | 
			
		||||
          spec        = request.spec
 | 
			
		||||
          name        = request.name
 | 
			
		||||
          requirement = request.request.dependency.requirement
 | 
			
		||||
| 
						 | 
				
			
			@ -106,10 +98,10 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
    out << nil
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def add_GEM out # :nodoc:
 | 
			
		||||
    return if @spec_groups.empty?
 | 
			
		||||
  def add_GEM out, spec_groups # :nodoc:
 | 
			
		||||
    return if spec_groups.empty?
 | 
			
		||||
 | 
			
		||||
    source_groups = @spec_groups.values.flatten.group_by do |request|
 | 
			
		||||
    source_groups = spec_groups.values.flatten.group_by do |request|
 | 
			
		||||
      request.spec.source.uri
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -136,9 +128,8 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def add_GIT out
 | 
			
		||||
    return unless git_requests =
 | 
			
		||||
      @spec_groups.delete(Gem::Resolver::GitSpecification)
 | 
			
		||||
  def add_GIT out, git_requests
 | 
			
		||||
    return if git_requests.empty?
 | 
			
		||||
 | 
			
		||||
    by_repository_revision = git_requests.group_by do |request|
 | 
			
		||||
      source = request.spec.source
 | 
			
		||||
| 
						 | 
				
			
			@ -179,9 +170,8 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def add_PATH out # :nodoc:
 | 
			
		||||
    return unless path_requests =
 | 
			
		||||
      @spec_groups.delete(Gem::Resolver::VendorSpecification)
 | 
			
		||||
  def add_PATH out, path_requests # :nodoc:
 | 
			
		||||
    return if path_requests.empty?
 | 
			
		||||
 | 
			
		||||
    out << "PATH"
 | 
			
		||||
    path_requests.each do |request|
 | 
			
		||||
| 
						 | 
				
			
			@ -198,7 +188,7 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
  def add_PLATFORMS out # :nodoc:
 | 
			
		||||
    out << "PLATFORMS"
 | 
			
		||||
 | 
			
		||||
    platforms = @requests.map { |request| request.spec.platform }.uniq
 | 
			
		||||
    platforms = requests.map { |request| request.spec.platform }.uniq
 | 
			
		||||
 | 
			
		||||
    platforms = platforms.sort_by { |platform| platform.to_s }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -209,319 +199,8 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
    out << nil
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Gets the next token for a Lockfile
 | 
			
		||||
 | 
			
		||||
  def get expected_types = nil, expected_value = nil # :nodoc:
 | 
			
		||||
    @current_token = @tokens.shift
 | 
			
		||||
 | 
			
		||||
    type, value, column, line = @current_token
 | 
			
		||||
 | 
			
		||||
    if expected_types and not Array(expected_types).include? type then
 | 
			
		||||
      unget
 | 
			
		||||
 | 
			
		||||
      message = "unexpected token [#{type.inspect}, #{value.inspect}], " +
 | 
			
		||||
                "expected #{expected_types.inspect}"
 | 
			
		||||
 | 
			
		||||
      raise ParseError.new message, column, line, "#{@gem_deps_file}.lock"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if expected_value and expected_value != value then
 | 
			
		||||
      unget
 | 
			
		||||
 | 
			
		||||
      message = "unexpected token [#{type.inspect}, #{value.inspect}], " +
 | 
			
		||||
                "expected [#{expected_types.inspect}, " +
 | 
			
		||||
                "#{expected_value.inspect}]"
 | 
			
		||||
 | 
			
		||||
      raise ParseError.new message, column, line, "#{@gem_deps_file}.lock"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @current_token
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse # :nodoc:
 | 
			
		||||
    tokenize
 | 
			
		||||
 | 
			
		||||
    until @tokens.empty? do
 | 
			
		||||
      type, data, column, line = get
 | 
			
		||||
 | 
			
		||||
      case type
 | 
			
		||||
      when :section then
 | 
			
		||||
        skip :newline
 | 
			
		||||
 | 
			
		||||
        case data
 | 
			
		||||
        when 'DEPENDENCIES' then
 | 
			
		||||
          parse_DEPENDENCIES
 | 
			
		||||
        when 'GIT' then
 | 
			
		||||
          parse_GIT
 | 
			
		||||
        when 'GEM' then
 | 
			
		||||
          parse_GEM
 | 
			
		||||
        when 'PATH' then
 | 
			
		||||
          parse_PATH
 | 
			
		||||
        when 'PLATFORMS' then
 | 
			
		||||
          parse_PLATFORMS
 | 
			
		||||
        else
 | 
			
		||||
          type, = get until @tokens.empty? or peek.first == :section
 | 
			
		||||
        end
 | 
			
		||||
      else
 | 
			
		||||
        raise "BUG: unhandled token #{type} (#{data.inspect}) at line #{line} column #{column}"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_DEPENDENCIES # :nodoc:
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, = get :text
 | 
			
		||||
 | 
			
		||||
      requirements = []
 | 
			
		||||
 | 
			
		||||
      case peek[0]
 | 
			
		||||
      when :bang then
 | 
			
		||||
        get :bang
 | 
			
		||||
 | 
			
		||||
        requirements << pinned_requirement(name)
 | 
			
		||||
      when :l_paren then
 | 
			
		||||
        get :l_paren
 | 
			
		||||
 | 
			
		||||
        loop do
 | 
			
		||||
          _, op,      = get :requirement
 | 
			
		||||
          _, version, = get :text
 | 
			
		||||
 | 
			
		||||
          requirements << "#{op} #{version}"
 | 
			
		||||
 | 
			
		||||
          break unless peek[0] == :comma
 | 
			
		||||
 | 
			
		||||
          get :comma
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        get :r_paren
 | 
			
		||||
 | 
			
		||||
        if peek[0] == :bang then
 | 
			
		||||
          requirements.clear
 | 
			
		||||
          requirements << pinned_requirement(name)
 | 
			
		||||
 | 
			
		||||
          get :bang
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @set.gem name, *requirements
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_GEM # :nodoc:
 | 
			
		||||
    sources = []
 | 
			
		||||
 | 
			
		||||
    while [:entry, 'remote'] == peek.first(2) do
 | 
			
		||||
      get :entry, 'remote'
 | 
			
		||||
      _, data, = get :text
 | 
			
		||||
      skip :newline
 | 
			
		||||
 | 
			
		||||
      sources << Gem::Source.new(data)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    sources << Gem::Source.new(Gem::DEFAULT_HOST) if sources.empty?
 | 
			
		||||
 | 
			
		||||
    get :entry, 'specs'
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    set = Gem::Resolver::LockSet.new sources
 | 
			
		||||
    last_specs = nil
 | 
			
		||||
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, column, = get :text
 | 
			
		||||
 | 
			
		||||
      case peek[0]
 | 
			
		||||
      when :newline then
 | 
			
		||||
        last_specs.each do |spec|
 | 
			
		||||
          spec.add_dependency Gem::Dependency.new name if column == 6
 | 
			
		||||
        end
 | 
			
		||||
      when :l_paren then
 | 
			
		||||
        get :l_paren
 | 
			
		||||
 | 
			
		||||
        type, data, = get [:text, :requirement]
 | 
			
		||||
 | 
			
		||||
        if type == :text and column == 4 then
 | 
			
		||||
          version, platform = data.split '-', 2
 | 
			
		||||
 | 
			
		||||
          platform =
 | 
			
		||||
            platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY
 | 
			
		||||
 | 
			
		||||
          last_specs = set.add name, version, platform
 | 
			
		||||
        else
 | 
			
		||||
          dependency = parse_dependency name, data
 | 
			
		||||
 | 
			
		||||
          last_specs.each do |spec|
 | 
			
		||||
            spec.add_dependency dependency
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        get :r_paren
 | 
			
		||||
      else
 | 
			
		||||
        raise "BUG: unknown token #{peek}"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @set.sets << set
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_GIT # :nodoc:
 | 
			
		||||
    get :entry, 'remote'
 | 
			
		||||
    _, repository, = get :text
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    get :entry, 'revision'
 | 
			
		||||
    _, revision, = get :text
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    type, value = peek.first 2
 | 
			
		||||
    if type == :entry and %w[branch ref tag].include? value then
 | 
			
		||||
      get
 | 
			
		||||
      get :text
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    get :entry, 'specs'
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    set = Gem::Resolver::GitSet.new
 | 
			
		||||
    set.root_dir = @set.install_dir
 | 
			
		||||
 | 
			
		||||
    last_spec = nil
 | 
			
		||||
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, column, = get :text
 | 
			
		||||
 | 
			
		||||
      case peek[0]
 | 
			
		||||
      when :newline then
 | 
			
		||||
        last_spec.add_dependency Gem::Dependency.new name if column == 6
 | 
			
		||||
      when :l_paren then
 | 
			
		||||
        get :l_paren
 | 
			
		||||
 | 
			
		||||
        type, data, = get [:text, :requirement]
 | 
			
		||||
 | 
			
		||||
        if type == :text and column == 4 then
 | 
			
		||||
          last_spec = set.add_git_spec name, data, repository, revision, true
 | 
			
		||||
        else
 | 
			
		||||
          dependency = parse_dependency name, data
 | 
			
		||||
 | 
			
		||||
          last_spec.add_dependency dependency
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        get :r_paren
 | 
			
		||||
      else
 | 
			
		||||
        raise "BUG: unknown token #{peek}"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @set.sets << set
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_PATH # :nodoc:
 | 
			
		||||
    get :entry, 'remote'
 | 
			
		||||
    _, directory, = get :text
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    get :entry, 'specs'
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    set = Gem::Resolver::VendorSet.new
 | 
			
		||||
    last_spec = nil
 | 
			
		||||
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, column, = get :text
 | 
			
		||||
 | 
			
		||||
      case peek[0]
 | 
			
		||||
      when :newline then
 | 
			
		||||
        last_spec.add_dependency Gem::Dependency.new name if column == 6
 | 
			
		||||
      when :l_paren then
 | 
			
		||||
        get :l_paren
 | 
			
		||||
 | 
			
		||||
        type, data, = get [:text, :requirement]
 | 
			
		||||
 | 
			
		||||
        if type == :text and column == 4 then
 | 
			
		||||
          last_spec = set.add_vendor_gem name, directory
 | 
			
		||||
        else
 | 
			
		||||
          dependency = parse_dependency name, data
 | 
			
		||||
 | 
			
		||||
          last_spec.dependencies << dependency
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        get :r_paren
 | 
			
		||||
      else
 | 
			
		||||
        raise "BUG: unknown token #{peek}"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @set.sets << set
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_PLATFORMS # :nodoc:
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, = get :text
 | 
			
		||||
 | 
			
		||||
      @platforms << name
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Parses the requirements following the dependency +name+ and the +op+ for
 | 
			
		||||
  # the first token of the requirements and returns a Gem::Dependency object.
 | 
			
		||||
 | 
			
		||||
  def parse_dependency name, op # :nodoc:
 | 
			
		||||
    return Gem::Dependency.new name, op unless peek[0] == :text
 | 
			
		||||
 | 
			
		||||
    _, version, = get :text
 | 
			
		||||
 | 
			
		||||
    requirements = ["#{op} #{version}"]
 | 
			
		||||
 | 
			
		||||
    while peek[0] == :comma do
 | 
			
		||||
      get :comma
 | 
			
		||||
      _, op,      = get :requirement
 | 
			
		||||
      _, version, = get :text
 | 
			
		||||
 | 
			
		||||
      requirements << "#{op} #{version}"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Gem::Dependency.new name, requirements
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Peeks at the next token for Lockfile
 | 
			
		||||
 | 
			
		||||
  def peek # :nodoc:
 | 
			
		||||
    @tokens.first || [:EOF]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pinned_requirement name # :nodoc:
 | 
			
		||||
    spec = @set.sets.select { |set|
 | 
			
		||||
      Gem::Resolver::GitSet    === set or
 | 
			
		||||
        Gem::Resolver::VendorSet === set
 | 
			
		||||
    }.map { |set|
 | 
			
		||||
      set.specs[name]
 | 
			
		||||
    }.compact.first
 | 
			
		||||
 | 
			
		||||
    spec.version
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def skip type # :nodoc:
 | 
			
		||||
    get while not @tokens.empty? and peek.first == type
 | 
			
		||||
  def spec_groups
 | 
			
		||||
    requests.group_by { |request| request.spec.class }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
| 
						 | 
				
			
			@ -532,17 +211,13 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
 | 
			
		||||
    out = []
 | 
			
		||||
 | 
			
		||||
    @requests = @set.sorted_requests
 | 
			
		||||
    groups = spec_groups
 | 
			
		||||
 | 
			
		||||
    @spec_groups = @requests.group_by do |request|
 | 
			
		||||
      request.spec.class
 | 
			
		||||
    end
 | 
			
		||||
    add_PATH out, groups.delete(Gem::Resolver::VendorSpecification) { [] }
 | 
			
		||||
 | 
			
		||||
    add_PATH out
 | 
			
		||||
    add_GIT out, groups.delete(Gem::Resolver::GitSpecification) { [] }
 | 
			
		||||
 | 
			
		||||
    add_GIT out
 | 
			
		||||
 | 
			
		||||
    add_GEM out
 | 
			
		||||
    add_GEM out, groups
 | 
			
		||||
 | 
			
		||||
    add_PLATFORMS out
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -551,90 +226,6 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
    out.join "\n"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Calculates the column (by byte) and the line of the current token based on
 | 
			
		||||
  # +byte_offset+.
 | 
			
		||||
 | 
			
		||||
  def token_pos byte_offset # :nodoc:
 | 
			
		||||
    [byte_offset - @line_pos, @line]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Converts a lock file into an Array of tokens.  If the lock file is missing
 | 
			
		||||
  # an empty Array is returned.
 | 
			
		||||
 | 
			
		||||
  def tokenize # :nodoc:
 | 
			
		||||
    @line     = 0
 | 
			
		||||
    @line_pos = 0
 | 
			
		||||
 | 
			
		||||
    @platforms     = []
 | 
			
		||||
    @tokens        = []
 | 
			
		||||
    @current_token = nil
 | 
			
		||||
 | 
			
		||||
    lock_file = "#{@gem_deps_file}.lock"
 | 
			
		||||
 | 
			
		||||
    @input = File.read lock_file
 | 
			
		||||
    s      = StringScanner.new @input
 | 
			
		||||
 | 
			
		||||
    until s.eos? do
 | 
			
		||||
      pos = s.pos
 | 
			
		||||
 | 
			
		||||
      pos = s.pos if leading_whitespace = s.scan(/ +/)
 | 
			
		||||
 | 
			
		||||
      if s.scan(/[<|=>]{7}/) then
 | 
			
		||||
        message = "your #{lock_file} contains merge conflict markers"
 | 
			
		||||
        column, line = token_pos pos
 | 
			
		||||
 | 
			
		||||
        raise ParseError.new message, column, line, lock_file
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @tokens <<
 | 
			
		||||
        case
 | 
			
		||||
        when s.scan(/\r?\n/) then
 | 
			
		||||
          token = [:newline, nil, *token_pos(pos)]
 | 
			
		||||
          @line_pos = s.pos
 | 
			
		||||
          @line += 1
 | 
			
		||||
          token
 | 
			
		||||
        when s.scan(/[A-Z]+/) then
 | 
			
		||||
          if leading_whitespace then
 | 
			
		||||
            text = s.matched
 | 
			
		||||
            text += s.scan(/[^\s)]*/).to_s # in case of no match
 | 
			
		||||
            [:text, text, *token_pos(pos)]
 | 
			
		||||
          else
 | 
			
		||||
            [:section, s.matched, *token_pos(pos)]
 | 
			
		||||
          end
 | 
			
		||||
        when s.scan(/([a-z]+):\s/) then
 | 
			
		||||
          s.pos -= 1 # rewind for possible newline
 | 
			
		||||
          [:entry, s[1], *token_pos(pos)]
 | 
			
		||||
        when s.scan(/\(/) then
 | 
			
		||||
          [:l_paren, nil, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/\)/) then
 | 
			
		||||
          [:r_paren, nil, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/<=|>=|=|~>|<|>|!=/) then
 | 
			
		||||
          [:requirement, s.matched, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/,/) then
 | 
			
		||||
          [:comma, nil, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/!/) then
 | 
			
		||||
          [:bang, nil, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/[^\s),!]*/) then
 | 
			
		||||
          [:text, s.matched, *token_pos(pos)]
 | 
			
		||||
        else
 | 
			
		||||
          raise "BUG: can't create token for: #{s.string[s.pos..-1].inspect}"
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @tokens
 | 
			
		||||
  rescue Errno::ENOENT
 | 
			
		||||
    @tokens
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Ungets the last token retrieved by #get
 | 
			
		||||
 | 
			
		||||
  def unget # :nodoc:
 | 
			
		||||
    @tokens.unshift @current_token
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Writes the lock file alongside the gem dependencies file
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -646,5 +237,11 @@ class Gem::RequestSet::Lockfile
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def requests
 | 
			
		||||
    @set.sorted_requests
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
require 'rubygems/request_set/lockfile/tokenizer'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										334
									
								
								lib/rubygems/request_set/lockfile/parser.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										334
									
								
								lib/rubygems/request_set/lockfile/parser.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,334 @@
 | 
			
		|||
class Gem::RequestSet::Lockfile::Parser
 | 
			
		||||
  ###
 | 
			
		||||
  # Parses lockfiles
 | 
			
		||||
 | 
			
		||||
  def initialize tokenizer, set, platforms, filename = nil
 | 
			
		||||
    @tokens    = tokenizer
 | 
			
		||||
    @filename  = filename
 | 
			
		||||
    @set       = set
 | 
			
		||||
    @platforms = platforms
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse
 | 
			
		||||
    until @tokens.empty? do
 | 
			
		||||
      type, data, column, line = get
 | 
			
		||||
 | 
			
		||||
      case type
 | 
			
		||||
      when :section then
 | 
			
		||||
        @tokens.skip :newline
 | 
			
		||||
 | 
			
		||||
        case data
 | 
			
		||||
        when 'DEPENDENCIES' then
 | 
			
		||||
          parse_DEPENDENCIES
 | 
			
		||||
        when 'GIT' then
 | 
			
		||||
          parse_GIT
 | 
			
		||||
        when 'GEM' then
 | 
			
		||||
          parse_GEM
 | 
			
		||||
        when 'PATH' then
 | 
			
		||||
          parse_PATH
 | 
			
		||||
        when 'PLATFORMS' then
 | 
			
		||||
          parse_PLATFORMS
 | 
			
		||||
        else
 | 
			
		||||
          type, = get until @tokens.empty? or peek.first == :section
 | 
			
		||||
        end
 | 
			
		||||
      else
 | 
			
		||||
        raise "BUG: unhandled token #{type} (#{data.inspect}) at line #{line} column #{column}"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Gets the next token for a Lockfile
 | 
			
		||||
 | 
			
		||||
  def get expected_types = nil, expected_value = nil # :nodoc:
 | 
			
		||||
    current_token = @tokens.shift
 | 
			
		||||
 | 
			
		||||
    type, value, column, line = current_token
 | 
			
		||||
 | 
			
		||||
    if expected_types and not Array(expected_types).include? type then
 | 
			
		||||
      unget current_token
 | 
			
		||||
 | 
			
		||||
      message = "unexpected token [#{type.inspect}, #{value.inspect}], " +
 | 
			
		||||
                "expected #{expected_types.inspect}"
 | 
			
		||||
 | 
			
		||||
      raise Gem::RequestSet::Lockfile::ParseError.new message, column, line, @filename
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if expected_value and expected_value != value then
 | 
			
		||||
      unget current_token
 | 
			
		||||
 | 
			
		||||
      message = "unexpected token [#{type.inspect}, #{value.inspect}], " +
 | 
			
		||||
                "expected [#{expected_types.inspect}, " +
 | 
			
		||||
                "#{expected_value.inspect}]"
 | 
			
		||||
 | 
			
		||||
      raise Gem::RequestSet::Lockfile::ParseError.new message, column, line, @filename
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    current_token
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_DEPENDENCIES # :nodoc:
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, = get :text
 | 
			
		||||
 | 
			
		||||
      requirements = []
 | 
			
		||||
 | 
			
		||||
      case peek[0]
 | 
			
		||||
      when :bang then
 | 
			
		||||
        get :bang
 | 
			
		||||
 | 
			
		||||
        requirements << pinned_requirement(name)
 | 
			
		||||
      when :l_paren then
 | 
			
		||||
        get :l_paren
 | 
			
		||||
 | 
			
		||||
        loop do
 | 
			
		||||
          _, op,      = get :requirement
 | 
			
		||||
          _, version, = get :text
 | 
			
		||||
 | 
			
		||||
          requirements << "#{op} #{version}"
 | 
			
		||||
 | 
			
		||||
          break unless peek[0] == :comma
 | 
			
		||||
 | 
			
		||||
          get :comma
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        get :r_paren
 | 
			
		||||
 | 
			
		||||
        if peek[0] == :bang then
 | 
			
		||||
          requirements.clear
 | 
			
		||||
          requirements << pinned_requirement(name)
 | 
			
		||||
 | 
			
		||||
          get :bang
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @set.gem name, *requirements
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_GEM # :nodoc:
 | 
			
		||||
    sources = []
 | 
			
		||||
 | 
			
		||||
    while [:entry, 'remote'] == peek.first(2) do
 | 
			
		||||
      get :entry, 'remote'
 | 
			
		||||
      _, data, = get :text
 | 
			
		||||
      skip :newline
 | 
			
		||||
 | 
			
		||||
      sources << Gem::Source.new(data)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    sources << Gem::Source.new(Gem::DEFAULT_HOST) if sources.empty?
 | 
			
		||||
 | 
			
		||||
    get :entry, 'specs'
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    set = Gem::Resolver::LockSet.new sources
 | 
			
		||||
    last_specs = nil
 | 
			
		||||
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, column, = get :text
 | 
			
		||||
 | 
			
		||||
      case peek[0]
 | 
			
		||||
      when :newline then
 | 
			
		||||
        last_specs.each do |spec|
 | 
			
		||||
          spec.add_dependency Gem::Dependency.new name if column == 6
 | 
			
		||||
        end
 | 
			
		||||
      when :l_paren then
 | 
			
		||||
        get :l_paren
 | 
			
		||||
 | 
			
		||||
        type, data, = get [:text, :requirement]
 | 
			
		||||
 | 
			
		||||
        if type == :text and column == 4 then
 | 
			
		||||
          version, platform = data.split '-', 2
 | 
			
		||||
 | 
			
		||||
          platform =
 | 
			
		||||
            platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY
 | 
			
		||||
 | 
			
		||||
          last_specs = set.add name, version, platform
 | 
			
		||||
        else
 | 
			
		||||
          dependency = parse_dependency name, data
 | 
			
		||||
 | 
			
		||||
          last_specs.each do |spec|
 | 
			
		||||
            spec.add_dependency dependency
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        get :r_paren
 | 
			
		||||
      else
 | 
			
		||||
        raise "BUG: unknown token #{peek}"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @set.sets << set
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_GIT # :nodoc:
 | 
			
		||||
    get :entry, 'remote'
 | 
			
		||||
    _, repository, = get :text
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    get :entry, 'revision'
 | 
			
		||||
    _, revision, = get :text
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    type, value = peek.first 2
 | 
			
		||||
    if type == :entry and %w[branch ref tag].include? value then
 | 
			
		||||
      get
 | 
			
		||||
      get :text
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    get :entry, 'specs'
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    set = Gem::Resolver::GitSet.new
 | 
			
		||||
    set.root_dir = @set.install_dir
 | 
			
		||||
 | 
			
		||||
    last_spec = nil
 | 
			
		||||
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, column, = get :text
 | 
			
		||||
 | 
			
		||||
      case peek[0]
 | 
			
		||||
      when :newline then
 | 
			
		||||
        last_spec.add_dependency Gem::Dependency.new name if column == 6
 | 
			
		||||
      when :l_paren then
 | 
			
		||||
        get :l_paren
 | 
			
		||||
 | 
			
		||||
        type, data, = get [:text, :requirement]
 | 
			
		||||
 | 
			
		||||
        if type == :text and column == 4 then
 | 
			
		||||
          last_spec = set.add_git_spec name, data, repository, revision, true
 | 
			
		||||
        else
 | 
			
		||||
          dependency = parse_dependency name, data
 | 
			
		||||
 | 
			
		||||
          last_spec.add_dependency dependency
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        get :r_paren
 | 
			
		||||
      else
 | 
			
		||||
        raise "BUG: unknown token #{peek}"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @set.sets << set
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_PATH # :nodoc:
 | 
			
		||||
    get :entry, 'remote'
 | 
			
		||||
    _, directory, = get :text
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    get :entry, 'specs'
 | 
			
		||||
 | 
			
		||||
    skip :newline
 | 
			
		||||
 | 
			
		||||
    set = Gem::Resolver::VendorSet.new
 | 
			
		||||
    last_spec = nil
 | 
			
		||||
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, column, = get :text
 | 
			
		||||
 | 
			
		||||
      case peek[0]
 | 
			
		||||
      when :newline then
 | 
			
		||||
        last_spec.add_dependency Gem::Dependency.new name if column == 6
 | 
			
		||||
      when :l_paren then
 | 
			
		||||
        get :l_paren
 | 
			
		||||
 | 
			
		||||
        type, data, = get [:text, :requirement]
 | 
			
		||||
 | 
			
		||||
        if type == :text and column == 4 then
 | 
			
		||||
          last_spec = set.add_vendor_gem name, directory
 | 
			
		||||
        else
 | 
			
		||||
          dependency = parse_dependency name, data
 | 
			
		||||
 | 
			
		||||
          last_spec.dependencies << dependency
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        get :r_paren
 | 
			
		||||
      else
 | 
			
		||||
        raise "BUG: unknown token #{peek}"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @set.sets << set
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_PLATFORMS # :nodoc:
 | 
			
		||||
    while not @tokens.empty? and :text == peek.first do
 | 
			
		||||
      _, name, = get :text
 | 
			
		||||
 | 
			
		||||
      @platforms << name
 | 
			
		||||
 | 
			
		||||
      skip :newline
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Parses the requirements following the dependency +name+ and the +op+ for
 | 
			
		||||
  # the first token of the requirements and returns a Gem::Dependency object.
 | 
			
		||||
 | 
			
		||||
  def parse_dependency name, op # :nodoc:
 | 
			
		||||
    return Gem::Dependency.new name, op unless peek[0] == :text
 | 
			
		||||
 | 
			
		||||
    _, version, = get :text
 | 
			
		||||
 | 
			
		||||
    requirements = ["#{op} #{version}"]
 | 
			
		||||
 | 
			
		||||
    while peek[0] == :comma do
 | 
			
		||||
      get :comma
 | 
			
		||||
      _, op,      = get :requirement
 | 
			
		||||
      _, version, = get :text
 | 
			
		||||
 | 
			
		||||
      requirements << "#{op} #{version}"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Gem::Dependency.new name, requirements
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def skip type # :nodoc:
 | 
			
		||||
    @tokens.skip type
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Peeks at the next token for Lockfile
 | 
			
		||||
 | 
			
		||||
  def peek # :nodoc:
 | 
			
		||||
    @tokens.peek
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def pinned_requirement name # :nodoc:
 | 
			
		||||
    spec = @set.sets.select { |set|
 | 
			
		||||
      Gem::Resolver::GitSet    === set or
 | 
			
		||||
        Gem::Resolver::VendorSet === set
 | 
			
		||||
    }.map { |set|
 | 
			
		||||
      set.specs[name]
 | 
			
		||||
    }.compact.first
 | 
			
		||||
 | 
			
		||||
    spec.version
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Ungets the last token retrieved by #get
 | 
			
		||||
 | 
			
		||||
  def unget token # :nodoc:
 | 
			
		||||
    @tokens.unshift token
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										108
									
								
								lib/rubygems/request_set/lockfile/tokenizer.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								lib/rubygems/request_set/lockfile/tokenizer.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,108 @@
 | 
			
		|||
require 'strscan'
 | 
			
		||||
require 'rubygems/request_set/lockfile/parser'
 | 
			
		||||
 | 
			
		||||
class Gem::RequestSet::Lockfile::Tokenizer
 | 
			
		||||
  def self.from_file file
 | 
			
		||||
    new File.read(file), file
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def initialize input, filename = nil, line = 0, pos = 0
 | 
			
		||||
    @line     = line
 | 
			
		||||
    @line_pos = pos
 | 
			
		||||
    @tokens   = []
 | 
			
		||||
    @filename = filename
 | 
			
		||||
    tokenize input
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def make_parser set, platforms
 | 
			
		||||
    Gem::RequestSet::Lockfile::Parser.new self, set, platforms, @filename
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def to_a
 | 
			
		||||
    @tokens
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def skip type
 | 
			
		||||
    @tokens.shift while not @tokens.empty? and peek.first == type
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Calculates the column (by byte) and the line of the current token based on
 | 
			
		||||
  # +byte_offset+.
 | 
			
		||||
 | 
			
		||||
  def token_pos byte_offset # :nodoc:
 | 
			
		||||
    [byte_offset - @line_pos, @line]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def empty?
 | 
			
		||||
    @tokens.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def unshift token
 | 
			
		||||
    @tokens.unshift token
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def next_token
 | 
			
		||||
    @tokens.shift
 | 
			
		||||
  end
 | 
			
		||||
  alias :shift :next_token
 | 
			
		||||
 | 
			
		||||
  def peek
 | 
			
		||||
    @tokens.first || [:EOF]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def tokenize input
 | 
			
		||||
    s = StringScanner.new input
 | 
			
		||||
 | 
			
		||||
    until s.eos? do
 | 
			
		||||
      pos = s.pos
 | 
			
		||||
 | 
			
		||||
      pos = s.pos if leading_whitespace = s.scan(/ +/)
 | 
			
		||||
 | 
			
		||||
      if s.scan(/[<|=>]{7}/) then
 | 
			
		||||
        message = "your #{@filename} contains merge conflict markers"
 | 
			
		||||
        column, line = token_pos pos
 | 
			
		||||
 | 
			
		||||
        raise Gem::RequestSet::Lockfile::ParseError.new message, column, line, @filename
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @tokens <<
 | 
			
		||||
        case
 | 
			
		||||
        when s.scan(/\r?\n/) then
 | 
			
		||||
          token = [:newline, nil, *token_pos(pos)]
 | 
			
		||||
          @line_pos = s.pos
 | 
			
		||||
          @line += 1
 | 
			
		||||
          token
 | 
			
		||||
        when s.scan(/[A-Z]+/) then
 | 
			
		||||
          if leading_whitespace then
 | 
			
		||||
            text = s.matched
 | 
			
		||||
            text += s.scan(/[^\s)]*/).to_s # in case of no match
 | 
			
		||||
            [:text, text, *token_pos(pos)]
 | 
			
		||||
          else
 | 
			
		||||
            [:section, s.matched, *token_pos(pos)]
 | 
			
		||||
          end
 | 
			
		||||
        when s.scan(/([a-z]+):\s/) then
 | 
			
		||||
          s.pos -= 1 # rewind for possible newline
 | 
			
		||||
          [:entry, s[1], *token_pos(pos)]
 | 
			
		||||
        when s.scan(/\(/) then
 | 
			
		||||
          [:l_paren, nil, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/\)/) then
 | 
			
		||||
          [:r_paren, nil, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/<=|>=|=|~>|<|>|!=/) then
 | 
			
		||||
          [:requirement, s.matched, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/,/) then
 | 
			
		||||
          [:comma, nil, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/!/) then
 | 
			
		||||
          [:bang, nil, *token_pos(pos)]
 | 
			
		||||
        when s.scan(/[^\s),!]*/) then
 | 
			
		||||
          [:text, s.matched, *token_pos(pos)]
 | 
			
		||||
        else
 | 
			
		||||
          raise "BUG: can't create token for: #{s.string[s.pos..-1].inspect}"
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @tokens
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -171,7 +171,7 @@ class Gem::Requirement
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def hash # :nodoc:
 | 
			
		||||
    requirements.hash
 | 
			
		||||
    requirements.sort.hash
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def marshal_dump # :nodoc:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1028,8 +1028,8 @@ class Gem::Specification < Gem::BasicSpecification
 | 
			
		|||
    file = file.dup.untaint
 | 
			
		||||
    return unless File.file?(file)
 | 
			
		||||
 | 
			
		||||
    spec = LOAD_CACHE[file]
 | 
			
		||||
    return spec if spec
 | 
			
		||||
    _spec = LOAD_CACHE[file]
 | 
			
		||||
    return _spec if _spec
 | 
			
		||||
 | 
			
		||||
    code = if defined? Encoding
 | 
			
		||||
             File.read file, :mode => 'r:UTF-8:-'
 | 
			
		||||
| 
						 | 
				
			
			@ -1040,15 +1040,15 @@ class Gem::Specification < Gem::BasicSpecification
 | 
			
		|||
    code.untaint
 | 
			
		||||
 | 
			
		||||
    begin
 | 
			
		||||
      spec = eval code, binding, file
 | 
			
		||||
      _spec = eval code, binding, file
 | 
			
		||||
 | 
			
		||||
      if Gem::Specification === spec
 | 
			
		||||
        spec.loaded_from = File.expand_path file.to_s
 | 
			
		||||
        LOAD_CACHE[file] = spec
 | 
			
		||||
        return spec
 | 
			
		||||
      if Gem::Specification === _spec
 | 
			
		||||
        _spec.loaded_from = File.expand_path file.to_s
 | 
			
		||||
        LOAD_CACHE[file] = _spec
 | 
			
		||||
        return _spec
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      warn "[#{file}] isn't a Gem::Specification (#{spec.class} instead)."
 | 
			
		||||
      warn "[#{file}] isn't a Gem::Specification (#{_spec.class} instead)."
 | 
			
		||||
    rescue SignalException, SystemExit
 | 
			
		||||
      raise
 | 
			
		||||
    rescue SyntaxError, Exception => e
 | 
			
		||||
| 
						 | 
				
			
			@ -1350,7 +1350,7 @@ class Gem::Specification < Gem::BasicSpecification
 | 
			
		|||
                   end
 | 
			
		||||
 | 
			
		||||
    unless dependency.respond_to?(:name) &&
 | 
			
		||||
           dependency.respond_to?(:version_requirements)
 | 
			
		||||
           dependency.respond_to?(:requirement)
 | 
			
		||||
      dependency = Gem::Dependency.new(dependency.to_s, requirements, type)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1427,4 +1427,6 @@ Also, a list:
 | 
			
		|||
end
 | 
			
		||||
 | 
			
		||||
require 'rubygems/test_utilities'
 | 
			
		||||
 | 
			
		||||
ENV['GEM_HOME'] = Dir.mktmpdir "home"
 | 
			
		||||
ENV['GEM_PATH'] = Dir.mktmpdir "path"
 | 
			
		||||
Gem.clear_paths
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -396,10 +396,6 @@ class Gem::StreamUI
 | 
			
		|||
  # Return a progress reporter object chosen from the current verbosity.
 | 
			
		||||
 | 
			
		||||
  def progress_reporter(*args)
 | 
			
		||||
    if self.kind_of?(Gem::SilentUI)
 | 
			
		||||
      return SilentProgressReporter.new(@outs, *args)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    case Gem.configuration.verbose
 | 
			
		||||
    when nil, false
 | 
			
		||||
      SilentProgressReporter.new(@outs, *args)
 | 
			
		||||
| 
						 | 
				
			
			@ -533,10 +529,6 @@ class Gem::StreamUI
 | 
			
		|||
  # Return a download reporter object chosen from the current verbosity
 | 
			
		||||
 | 
			
		||||
  def download_reporter(*args)
 | 
			
		||||
    if self.kind_of?(Gem::SilentUI)
 | 
			
		||||
      return SilentDownloadReporter.new(@outs, *args)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    case Gem.configuration.verbose
 | 
			
		||||
    when nil, false
 | 
			
		||||
      SilentDownloadReporter.new(@outs, *args)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,18 +15,24 @@ class TestGemCommandsOpenCommand < Gem::TestCase
 | 
			
		|||
    end
 | 
			
		||||
    write_file File.join(*%W[gems #{spec.full_name} lib #{name}.rb])
 | 
			
		||||
    write_file File.join(*%W[gems #{spec.full_name} Rakefile])
 | 
			
		||||
    spec
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute
 | 
			
		||||
    @cmd.options[:args] = %w[foo]
 | 
			
		||||
    @cmd.options[:editor] = "#{Gem.ruby} -e0 --"
 | 
			
		||||
 | 
			
		||||
    gem 'foo'
 | 
			
		||||
    spec = gem 'foo'
 | 
			
		||||
    mock = MiniTest::Mock.new
 | 
			
		||||
    mock.expect(:call, true, [spec.full_gem_path])
 | 
			
		||||
 | 
			
		||||
    Dir.stub(:chdir, mock) do
 | 
			
		||||
      use_ui @ui do
 | 
			
		||||
        @cmd.execute
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert mock.verify
 | 
			
		||||
    assert_equal "", @ui.error
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,6 +50,25 @@ class TestGemRequestSetGemDependencyAPI < Gem::TestCase
 | 
			
		|||
      Gem.instance_variables.include? :@ruby_version
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_gempspec_with_multiple_runtime_deps
 | 
			
		||||
    gda = Class.new(@GDA) do
 | 
			
		||||
      # implement find_gemspec so we don't need one on the FS
 | 
			
		||||
      def find_gemspec name, path
 | 
			
		||||
        Gem::Specification.new do |s|
 | 
			
		||||
          s.name = 'foo'
 | 
			
		||||
          s.version = '1.0'
 | 
			
		||||
          s.add_runtime_dependency 'bar', '>= 1.6.0', '< 1.6.4'
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    instance = gda.new @set, __FILE__
 | 
			
		||||
    instance.gemspec
 | 
			
		||||
    assert_equal %w{ foo bar }.sort, @set.dependencies.map(&:name).sort
 | 
			
		||||
    bar = @set.dependencies.find { |d| d.name == 'bar' }
 | 
			
		||||
    assert_equal [[">=", Gem::Version.create('1.6.0')],
 | 
			
		||||
                  ["<", Gem::Version.create('1.6.4')]], bar.requirement.requirements
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_gemspec_without_group
 | 
			
		||||
    @gda.send :add_dependencies, [:development], [dep('a', '= 1')]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,12 +24,6 @@ class TestGemRequestSetLockfile < Gem::TestCase
 | 
			
		|||
    @lockfile = Gem::RequestSet::Lockfile.new @set, @gem_deps_file
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def write_gem_deps gem_deps
 | 
			
		||||
    open @gem_deps_file, 'w' do |io|
 | 
			
		||||
      io.write gem_deps
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def write_lockfile lockfile
 | 
			
		||||
    @lock_file = File.expand_path "#{@gem_deps_file}.lock"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -47,7 +41,6 @@ class TestGemRequestSetLockfile < Gem::TestCase
 | 
			
		|||
 | 
			
		||||
    @set.gem 'a'
 | 
			
		||||
    @set.resolve
 | 
			
		||||
    @lockfile.instance_variable_set :@requests, @set.sorted_requests
 | 
			
		||||
 | 
			
		||||
    out = []
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +68,6 @@ class TestGemRequestSetLockfile < Gem::TestCase
 | 
			
		|||
    @set.resolve
 | 
			
		||||
    @lockfile =
 | 
			
		||||
      Gem::RequestSet::Lockfile.new @set, @gem_deps_file, dependencies
 | 
			
		||||
    @lockfile.instance_variable_set :@requests, @set.sorted_requests
 | 
			
		||||
 | 
			
		||||
    out = []
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -105,17 +97,10 @@ class TestGemRequestSetLockfile < Gem::TestCase
 | 
			
		|||
    @set.gem 'a'
 | 
			
		||||
    @set.gem 'bundler'
 | 
			
		||||
    @set.resolve
 | 
			
		||||
    @lockfile.instance_variable_set :@requests, @set.sorted_requests
 | 
			
		||||
 | 
			
		||||
    spec_groups = @set.sorted_requests.group_by do |request|
 | 
			
		||||
      request.spec.class
 | 
			
		||||
    end
 | 
			
		||||
    @lockfile.instance_variable_set :@spec_groups, spec_groups
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    out = []
 | 
			
		||||
 | 
			
		||||
    @lockfile.add_GEM out
 | 
			
		||||
    @lockfile.add_GEM out, @lockfile.spec_groups
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      'GEM',
 | 
			
		||||
| 
						 | 
				
			
			@ -143,7 +128,6 @@ class TestGemRequestSetLockfile < Gem::TestCase
 | 
			
		|||
 | 
			
		||||
    @set.gem 'a'
 | 
			
		||||
    @set.resolve
 | 
			
		||||
    @lockfile.instance_variable_set :@requests, @set.sorted_requests
 | 
			
		||||
 | 
			
		||||
    out = []
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -159,518 +143,6 @@ class TestGemRequestSetLockfile < Gem::TestCase
 | 
			
		|||
    assert_equal expected, out
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_get
 | 
			
		||||
    @lockfile.instance_variable_set :@tokens, [:token]
 | 
			
		||||
 | 
			
		||||
    assert_equal :token, @lockfile.get
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_get_type_mismatch
 | 
			
		||||
    @lockfile.instance_variable_set :@tokens, [[:section, 'x', 5, 1]]
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      @lockfile.get :text
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expected =
 | 
			
		||||
      'unexpected token [:section, "x"], expected :text (at line 1 column 5)'
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, e.message
 | 
			
		||||
 | 
			
		||||
    assert_equal 1, e.line
 | 
			
		||||
    assert_equal 5, e.column
 | 
			
		||||
    assert_equal File.expand_path("#{@gem_deps_file}.lock"), e.path
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_get_type_multiple
 | 
			
		||||
    @lockfile.instance_variable_set :@tokens, [[:section, 'x', 5, 1]]
 | 
			
		||||
 | 
			
		||||
    assert @lockfile.get [:text, :section]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_get_type_value_mismatch
 | 
			
		||||
    @lockfile.instance_variable_set :@tokens, [[:section, 'x', 5, 1]]
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      @lockfile.get :section, 'y'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expected =
 | 
			
		||||
      'unexpected token [:section, "x"], expected [:section, "y"] (at line 1 column 5)'
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, e.message
 | 
			
		||||
 | 
			
		||||
    assert_equal 1, e.line
 | 
			
		||||
    assert_equal 5, e.column
 | 
			
		||||
    assert_equal File.expand_path("#{@gem_deps_file}.lock"), e.path
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse
 | 
			
		||||
    write_lockfile <<-LOCKFILE.strip
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    assert_equal [Gem::Platform::RUBY], @lockfile.platforms
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'could not find a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2], lockfile_set.specs.map { |tuple| tuple.full_name }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_dependencies
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a (>= 1, <= 2)
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '>= 1', '<= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    assert_equal [Gem::Platform::RUBY], @lockfile.platforms
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'could not find a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2], lockfile_set.specs.map { |tuple| tuple.full_name }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_DEPENDENCIES_git
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://git.example/josevalim/rails-footnotes.git
 | 
			
		||||
  revision: 3a6ac1971e91d822f057650cc5916ebfcbd6ee37
 | 
			
		||||
  specs:
 | 
			
		||||
    rails-footnotes (3.7.9)
 | 
			
		||||
      rails (>= 3.0.0)
 | 
			
		||||
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://git.example/svenfuchs/i18n-active_record.git
 | 
			
		||||
  revision: 55507cf59f8f2173d38e07e18df0e90d25b1f0f6
 | 
			
		||||
  specs:
 | 
			
		||||
    i18n-active_record (0.0.2)
 | 
			
		||||
      i18n (>= 0.5.0)
 | 
			
		||||
 | 
			
		||||
GEM
 | 
			
		||||
  remote: http://gems.example/
 | 
			
		||||
  specs:
 | 
			
		||||
    i18n (0.6.9)
 | 
			
		||||
    rails (4.0.0)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  ruby
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  i18n-active_record!
 | 
			
		||||
  rails-footnotes!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      dep('i18n-active_record', '= 0.0.2'),
 | 
			
		||||
      dep('rails-footnotes',    '= 3.7.9'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @set.dependencies
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_DEPENDENCIES_git_version
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://github.com/progrium/ruby-jwt.git
 | 
			
		||||
  revision: 8d74770c6cd92ea234b428b5d0c1f18306a4f41c
 | 
			
		||||
  specs:
 | 
			
		||||
    jwt (1.1)
 | 
			
		||||
 | 
			
		||||
GEM
 | 
			
		||||
  remote: http://gems.example/
 | 
			
		||||
  specs:
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  ruby
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  jwt (= 1.1)!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      dep('jwt', '= 1.1'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @set.dependencies
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GEM
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  ruby
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '>= 0')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'found a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2], lockfile_set.specs.map { |s| s.full_name }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GEM_remote_multiple
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: https://gems.example/
 | 
			
		||||
  remote: https://other.example/
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  ruby
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '>= 0')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'found a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2 a-2], lockfile_set.specs.map { |s| s.full_name }
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[https://gems.example/ https://other.example/],
 | 
			
		||||
                 lockfile_set.specs.map { |s| s.source.uri.to_s }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GIT
 | 
			
		||||
    @set.instance_variable_set :@install_dir, 'install_dir'
 | 
			
		||||
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://example/a.git
 | 
			
		||||
  revision: master
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (>= 3)
 | 
			
		||||
      c
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'fount a LockSet'
 | 
			
		||||
 | 
			
		||||
    git_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::GitSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert git_set, 'could not find a GitSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2], git_set.specs.values.map { |s| s.full_name }
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('b', '>= 3'), dep('c')],
 | 
			
		||||
                 git_set.specs.values.first.dependencies
 | 
			
		||||
 | 
			
		||||
    expected = {
 | 
			
		||||
      'a' => %w[git://example/a.git master],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, git_set.repositories
 | 
			
		||||
    assert_equal 'install_dir', git_set.root_dir
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GIT_branch
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://example/a.git
 | 
			
		||||
  revision: 1234abc
 | 
			
		||||
  branch: 0-9-12-stable
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (>= 3)
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'fount a LockSet'
 | 
			
		||||
 | 
			
		||||
    git_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::GitSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert git_set, 'could not find a GitSet'
 | 
			
		||||
 | 
			
		||||
    expected = {
 | 
			
		||||
      'a' => %w[git://example/a.git 1234abc],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, git_set.repositories
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GIT_ref
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://example/a.git
 | 
			
		||||
  revision: 1234abc
 | 
			
		||||
  ref: 1234abc
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (>= 3)
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'fount a LockSet'
 | 
			
		||||
 | 
			
		||||
    git_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::GitSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert git_set, 'could not find a GitSet'
 | 
			
		||||
 | 
			
		||||
    expected = {
 | 
			
		||||
      'a' => %w[git://example/a.git 1234abc],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, git_set.repositories
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GIT_tag
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://example/a.git
 | 
			
		||||
  revision: 1234abc
 | 
			
		||||
  tag: v0.9.12
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (>= 3)
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'fount a LockSet'
 | 
			
		||||
 | 
			
		||||
    git_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::GitSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert git_set, 'could not find a GitSet'
 | 
			
		||||
 | 
			
		||||
    expected = {
 | 
			
		||||
      'a' => %w[git://example/a.git 1234abc],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, git_set.repositories
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_PATH
 | 
			
		||||
    _, _, directory = vendor_gem
 | 
			
		||||
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
PATH
 | 
			
		||||
  remote: #{directory}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (1)
 | 
			
		||||
      b (2)
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 1')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'found a LockSet'
 | 
			
		||||
 | 
			
		||||
    vendor_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::VendorSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert vendor_set, 'could not find a VendorSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-1], vendor_set.specs.values.map { |s| s.full_name }
 | 
			
		||||
 | 
			
		||||
    spec = vendor_set.load_spec 'a', nil, nil, nil
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('b', '= 2')], spec.dependencies
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_dependency
 | 
			
		||||
    write_lockfile ' 1)'
 | 
			
		||||
 | 
			
		||||
    @lockfile.tokenize
 | 
			
		||||
 | 
			
		||||
    parsed = @lockfile.parse_dependency 'a', '='
 | 
			
		||||
 | 
			
		||||
    assert_equal dep('a', '= 1'), parsed
 | 
			
		||||
 | 
			
		||||
    write_lockfile ')'
 | 
			
		||||
 | 
			
		||||
    @lockfile.tokenize
 | 
			
		||||
 | 
			
		||||
    parsed = @lockfile.parse_dependency 'a', '2'
 | 
			
		||||
 | 
			
		||||
    assert_equal dep('a', '= 2'), parsed
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_gem_specs_dependency
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (= 3)
 | 
			
		||||
      c (~> 4)
 | 
			
		||||
      d
 | 
			
		||||
      e (~> 5.0, >= 5.0.1)
 | 
			
		||||
    b (3-x86_64-linux)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    assert_equal [Gem::Platform::RUBY], @lockfile.platforms
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'could not find a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2 b-3], lockfile_set.specs.map { |tuple| tuple.full_name }
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      Gem::Platform::RUBY,
 | 
			
		||||
      Gem::Platform.new('x86_64-linux'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, lockfile_set.specs.map { |tuple| tuple.platform }
 | 
			
		||||
 | 
			
		||||
    spec = lockfile_set.specs.first
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      dep('b', '= 3'),
 | 
			
		||||
      dep('c', '~> 4'),
 | 
			
		||||
      dep('d'),
 | 
			
		||||
      dep('e', '~> 5.0', '>= 5.0.1'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, spec.dependencies
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_missing
 | 
			
		||||
    @lockfile.parse
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_peek
 | 
			
		||||
    @lockfile.instance_variable_set :@tokens, [:token]
 | 
			
		||||
 | 
			
		||||
    assert_equal :token, @lockfile.peek
 | 
			
		||||
 | 
			
		||||
    assert_equal :token, @lockfile.get
 | 
			
		||||
 | 
			
		||||
    assert_equal [:EOF], @lockfile.peek
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_relative_path_from
 | 
			
		||||
    path = @lockfile.relative_path_from '/foo', '/foo/bar'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -681,276 +153,6 @@ DEPENDENCIES
 | 
			
		|||
    assert_equal '.', path
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_skip
 | 
			
		||||
    tokens = [[:token]]
 | 
			
		||||
 | 
			
		||||
    @lockfile.instance_variable_set :@tokens, tokens
 | 
			
		||||
 | 
			
		||||
    @lockfile.skip :token
 | 
			
		||||
 | 
			
		||||
    assert_empty tokens
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_token_pos
 | 
			
		||||
    assert_equal [5, 0], @lockfile.token_pos(5)
 | 
			
		||||
 | 
			
		||||
    @lockfile.instance_variable_set :@line_pos, 2
 | 
			
		||||
    @lockfile.instance_variable_set :@line, 1
 | 
			
		||||
 | 
			
		||||
    assert_equal [3, 1], @lockfile.token_pos(5)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (= 2)
 | 
			
		||||
      c (!= 3)
 | 
			
		||||
      d (> 4)
 | 
			
		||||
      e (< 5)
 | 
			
		||||
      f (>= 6)
 | 
			
		||||
      g (<= 7)
 | 
			
		||||
      h (~> 8)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      [:section,     'GEM',                0,  0],
 | 
			
		||||
      [:newline,     nil,                  3,  0],
 | 
			
		||||
 | 
			
		||||
      [:entry,       'remote',             2,  1],
 | 
			
		||||
      [:text,        @gem_repo,           10,  1],
 | 
			
		||||
      [:newline,     nil,                 34,  1],
 | 
			
		||||
 | 
			
		||||
      [:entry,       'specs',              2,  2],
 | 
			
		||||
      [:newline,     nil,                  8,  2],
 | 
			
		||||
 | 
			
		||||
      [:text,        'a',                  4,  3],
 | 
			
		||||
      [:l_paren,     nil,                  6,  3],
 | 
			
		||||
      [:text,        '2',                  7,  3],
 | 
			
		||||
      [:r_paren,     nil,                  8,  3],
 | 
			
		||||
      [:newline,     nil,                  9,  3],
 | 
			
		||||
 | 
			
		||||
      [:text,        'b',                  6,  4],
 | 
			
		||||
      [:l_paren,     nil,                  8,  4],
 | 
			
		||||
      [:requirement, '=',                  9,  4],
 | 
			
		||||
      [:text,        '2',                 11,  4],
 | 
			
		||||
      [:r_paren,     nil,                 12,  4],
 | 
			
		||||
      [:newline,     nil,                 13,  4],
 | 
			
		||||
 | 
			
		||||
      [:text,        'c',                  6,  5],
 | 
			
		||||
      [:l_paren,     nil,                  8,  5],
 | 
			
		||||
      [:requirement, '!=',                 9,  5],
 | 
			
		||||
      [:text,        '3',                 12,  5],
 | 
			
		||||
      [:r_paren,     nil,                 13,  5],
 | 
			
		||||
      [:newline,     nil,                 14,  5],
 | 
			
		||||
 | 
			
		||||
      [:text,        'd',                  6,  6],
 | 
			
		||||
      [:l_paren,     nil,                  8,  6],
 | 
			
		||||
      [:requirement, '>',                  9,  6],
 | 
			
		||||
      [:text,        '4',                 11,  6],
 | 
			
		||||
      [:r_paren,     nil,                 12,  6],
 | 
			
		||||
      [:newline,     nil,                 13,  6],
 | 
			
		||||
 | 
			
		||||
      [:text,        'e',                  6,  7],
 | 
			
		||||
      [:l_paren,     nil,                  8,  7],
 | 
			
		||||
      [:requirement, '<',                  9,  7],
 | 
			
		||||
      [:text,        '5',                 11,  7],
 | 
			
		||||
      [:r_paren,     nil,                 12,  7],
 | 
			
		||||
      [:newline,     nil,                 13,  7],
 | 
			
		||||
 | 
			
		||||
      [:text,        'f',                  6,  8],
 | 
			
		||||
      [:l_paren,     nil,                  8,  8],
 | 
			
		||||
      [:requirement, '>=',                 9,  8],
 | 
			
		||||
      [:text,        '6',                 12,  8],
 | 
			
		||||
      [:r_paren,     nil,                 13,  8],
 | 
			
		||||
      [:newline,     nil,                 14,  8],
 | 
			
		||||
 | 
			
		||||
      [:text,        'g',                  6,  9],
 | 
			
		||||
      [:l_paren,     nil,                  8,  9],
 | 
			
		||||
      [:requirement, '<=',                 9,  9],
 | 
			
		||||
      [:text,        '7',                 12,  9],
 | 
			
		||||
      [:r_paren,     nil,                 13,  9],
 | 
			
		||||
      [:newline,     nil,                 14,  9],
 | 
			
		||||
 | 
			
		||||
      [:text,        'h',                  6, 10],
 | 
			
		||||
      [:l_paren,     nil,                  8, 10],
 | 
			
		||||
      [:requirement, '~>',                 9, 10],
 | 
			
		||||
      [:text,        '8',                 12, 10],
 | 
			
		||||
      [:r_paren,     nil,                 13, 10],
 | 
			
		||||
      [:newline,     nil,                 14, 10],
 | 
			
		||||
 | 
			
		||||
      [:newline,     nil,                  0, 11],
 | 
			
		||||
 | 
			
		||||
      [:section,     'PLATFORMS',          0, 12],
 | 
			
		||||
      [:newline,     nil,                  9, 12],
 | 
			
		||||
 | 
			
		||||
      [:text,        Gem::Platform::RUBY,  2, 13],
 | 
			
		||||
      [:newline,     nil,                  6, 13],
 | 
			
		||||
 | 
			
		||||
      [:newline,     nil,                  0, 14],
 | 
			
		||||
 | 
			
		||||
      [:section,     'DEPENDENCIES',       0, 15],
 | 
			
		||||
      [:newline,     nil,                 12, 15],
 | 
			
		||||
 | 
			
		||||
      [:text,        'a',                  2, 16],
 | 
			
		||||
      [:newline,     nil,                  3, 16],
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @lockfile.tokenize
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize_capitals
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    Ab (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  Ab
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      [:section, 'GEM',                0, 0],
 | 
			
		||||
      [:newline, nil,                  3, 0],
 | 
			
		||||
      [:entry,   'remote',             2, 1],
 | 
			
		||||
      [:text,    @gem_repo,           10, 1],
 | 
			
		||||
      [:newline, nil,                 34, 1],
 | 
			
		||||
      [:entry,   'specs',              2, 2],
 | 
			
		||||
      [:newline, nil,                  8, 2],
 | 
			
		||||
      [:text,    'Ab',                 4, 3],
 | 
			
		||||
      [:l_paren, nil,                  7, 3],
 | 
			
		||||
      [:text,    '2',                  8, 3],
 | 
			
		||||
      [:r_paren, nil,                  9, 3],
 | 
			
		||||
      [:newline, nil,                 10, 3],
 | 
			
		||||
      [:newline, nil,                  0, 4],
 | 
			
		||||
      [:section, 'PLATFORMS',          0, 5],
 | 
			
		||||
      [:newline, nil,                  9, 5],
 | 
			
		||||
      [:text,    Gem::Platform::RUBY,  2, 6],
 | 
			
		||||
      [:newline, nil,                  6, 6],
 | 
			
		||||
      [:newline, nil,                  0, 7],
 | 
			
		||||
      [:section, 'DEPENDENCIES',       0, 8],
 | 
			
		||||
      [:newline, nil,                 12, 8],
 | 
			
		||||
      [:text,    'Ab',                 2, 9],
 | 
			
		||||
      [:newline, nil,                  4, 9],
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @lockfile.tokenize
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize_conflict_markers
 | 
			
		||||
    write_lockfile '<<<<<<<'
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      @lockfile.tokenize
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal "your #{@lock_file} contains merge conflict markers (at line 0 column 0)",
 | 
			
		||||
                 e.message
 | 
			
		||||
 | 
			
		||||
    write_lockfile '|||||||'
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      @lockfile.tokenize
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal "your #{@lock_file} contains merge conflict markers (at line 0 column 0)",
 | 
			
		||||
                 e.message
 | 
			
		||||
 | 
			
		||||
    write_lockfile '======='
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      @lockfile.tokenize
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal "your #{@lock_file} contains merge conflict markers (at line 0 column 0)",
 | 
			
		||||
                 e.message
 | 
			
		||||
 | 
			
		||||
    write_lockfile '>>>>>>>'
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      @lockfile.tokenize
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal "your #{@lock_file} contains merge conflict markers (at line 0 column 0)",
 | 
			
		||||
                 e.message
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize_git
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      [:section, 'DEPENDENCIES',  0,  0],
 | 
			
		||||
      [:newline, nil,            12,  0],
 | 
			
		||||
 | 
			
		||||
      [:text,    'a',             2,  1],
 | 
			
		||||
      [:bang,    nil,             3,  1],
 | 
			
		||||
      [:newline, nil,             4,  1],
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @lockfile.tokenize
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize_missing
 | 
			
		||||
    tokens = @lockfile.tokenize
 | 
			
		||||
 | 
			
		||||
    assert_empty tokens
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize_multiple
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (~> 3.0, >= 3.0.1)
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      [:section,     'GEM',      0,  0],
 | 
			
		||||
      [:newline,     nil,        3,  0],
 | 
			
		||||
 | 
			
		||||
      [:entry,       'remote',   2,  1],
 | 
			
		||||
      [:text,        @gem_repo, 10,  1],
 | 
			
		||||
      [:newline,     nil,       34,  1],
 | 
			
		||||
 | 
			
		||||
      [:entry,       'specs',    2,  2],
 | 
			
		||||
      [:newline,     nil,        8,  2],
 | 
			
		||||
 | 
			
		||||
      [:text,        'a',        4,  3],
 | 
			
		||||
      [:l_paren,     nil,        6,  3],
 | 
			
		||||
      [:text,        '2',        7,  3],
 | 
			
		||||
      [:r_paren,     nil,        8,  3],
 | 
			
		||||
      [:newline,     nil,        9,  3],
 | 
			
		||||
 | 
			
		||||
      [:text,        'b',        6,  4],
 | 
			
		||||
      [:l_paren,     nil,        8,  4],
 | 
			
		||||
      [:requirement, '~>',       9,  4],
 | 
			
		||||
      [:text,        '3.0',     12,  4],
 | 
			
		||||
      [:comma,       nil,       15,  4],
 | 
			
		||||
      [:requirement, '>=',      17,  4],
 | 
			
		||||
      [:text,        '3.0.1',   20,  4],
 | 
			
		||||
      [:r_paren,     nil,       25,  4],
 | 
			
		||||
      [:newline,     nil,       26,  4],
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @lockfile.tokenize
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_to_s_gem
 | 
			
		||||
    spec_fetcher do |fetcher|
 | 
			
		||||
      fetcher.spec 'a', 2
 | 
			
		||||
| 
						 | 
				
			
			@ -1236,14 +438,6 @@ DEPENDENCIES
 | 
			
		|||
    assert_equal expected, @lockfile.to_s
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_unget
 | 
			
		||||
    @lockfile.instance_variable_set :@current_token, :token
 | 
			
		||||
 | 
			
		||||
    @lockfile.unget
 | 
			
		||||
 | 
			
		||||
    assert_equal :token, @lockfile.get
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_write
 | 
			
		||||
    @lockfile.write
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1271,6 +465,4 @@ DEPENDENCIES
 | 
			
		|||
 | 
			
		||||
    assert_equal 'hello', File.read(gem_deps_lock_file)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										543
									
								
								test/rubygems/test_gem_request_set_lockfile_parser.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										543
									
								
								test/rubygems/test_gem_request_set_lockfile_parser.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,543 @@
 | 
			
		|||
require 'rubygems/test_case'
 | 
			
		||||
require 'rubygems/request_set'
 | 
			
		||||
require 'rubygems/request_set/lockfile'
 | 
			
		||||
require 'rubygems/request_set/lockfile/tokenizer'
 | 
			
		||||
require 'rubygems/request_set/lockfile/parser'
 | 
			
		||||
 | 
			
		||||
class TestGemRequestSetLockfileParser < Gem::TestCase
 | 
			
		||||
  def setup
 | 
			
		||||
    super
 | 
			
		||||
    @gem_deps_file = 'gem.deps.rb'
 | 
			
		||||
    @lock_file = File.expand_path "#{@gem_deps_file}.lock"
 | 
			
		||||
    @set = Gem::RequestSet.new
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_get
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "\n"
 | 
			
		||||
    parser = tokenizer.make_parser nil, nil
 | 
			
		||||
 | 
			
		||||
    assert_equal :newline, parser.get.first
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_get_type_mismatch
 | 
			
		||||
    filename = File.expand_path("#{@gem_deps_file}.lock")
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "foo", filename, 1, 0
 | 
			
		||||
    parser = tokenizer.make_parser nil, nil
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      parser.get :section
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expected =
 | 
			
		||||
      'unexpected token [:text, "foo"], expected :section (at line 1 column 0)'
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, e.message
 | 
			
		||||
 | 
			
		||||
    assert_equal 1, e.line
 | 
			
		||||
    assert_equal 0, e.column
 | 
			
		||||
    assert_equal filename, e.path
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_get_type_multiple
 | 
			
		||||
    filename = File.expand_path("#{@gem_deps_file}.lock")
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "x", filename, 1
 | 
			
		||||
    parser = tokenizer.make_parser nil, nil
 | 
			
		||||
 | 
			
		||||
    assert parser.get [:text, :section]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_get_type_value_mismatch
 | 
			
		||||
    filename = File.expand_path("#{@gem_deps_file}.lock")
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "x", filename, 1
 | 
			
		||||
    parser = tokenizer.make_parser nil, nil
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      parser.get :text, 'y'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expected =
 | 
			
		||||
      'unexpected token [:text, "x"], expected [:text, "y"] (at line 1 column 0)'
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, e.message
 | 
			
		||||
 | 
			
		||||
    assert_equal 1, e.line
 | 
			
		||||
    assert_equal 0, e.column
 | 
			
		||||
    assert_equal File.expand_path("#{@gem_deps_file}.lock"), e.path
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  def test_parse
 | 
			
		||||
    write_lockfile <<-LOCKFILE.strip
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    platforms = []
 | 
			
		||||
    parse_lockfile @set, platforms
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    assert_equal [Gem::Platform::RUBY], platforms
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'could not find a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2], lockfile_set.specs.map { |tuple| tuple.full_name }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_dependencies
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a (>= 1, <= 2)
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    platforms = []
 | 
			
		||||
    parse_lockfile @set, platforms
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '>= 1', '<= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    assert_equal [Gem::Platform::RUBY], platforms
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'could not find a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2], lockfile_set.specs.map { |tuple| tuple.full_name }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_DEPENDENCIES_git
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://git.example/josevalim/rails-footnotes.git
 | 
			
		||||
  revision: 3a6ac1971e91d822f057650cc5916ebfcbd6ee37
 | 
			
		||||
  specs:
 | 
			
		||||
    rails-footnotes (3.7.9)
 | 
			
		||||
      rails (>= 3.0.0)
 | 
			
		||||
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://git.example/svenfuchs/i18n-active_record.git
 | 
			
		||||
  revision: 55507cf59f8f2173d38e07e18df0e90d25b1f0f6
 | 
			
		||||
  specs:
 | 
			
		||||
    i18n-active_record (0.0.2)
 | 
			
		||||
      i18n (>= 0.5.0)
 | 
			
		||||
 | 
			
		||||
GEM
 | 
			
		||||
  remote: http://gems.example/
 | 
			
		||||
  specs:
 | 
			
		||||
    i18n (0.6.9)
 | 
			
		||||
    rails (4.0.0)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  ruby
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  i18n-active_record!
 | 
			
		||||
  rails-footnotes!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    parse_lockfile @set, []
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      dep('i18n-active_record', '= 0.0.2'),
 | 
			
		||||
      dep('rails-footnotes',    '= 3.7.9'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @set.dependencies
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_DEPENDENCIES_git_version
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://github.com/progrium/ruby-jwt.git
 | 
			
		||||
  revision: 8d74770c6cd92ea234b428b5d0c1f18306a4f41c
 | 
			
		||||
  specs:
 | 
			
		||||
    jwt (1.1)
 | 
			
		||||
 | 
			
		||||
GEM
 | 
			
		||||
  remote: http://gems.example/
 | 
			
		||||
  specs:
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  ruby
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  jwt (= 1.1)!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    parse_lockfile @set, []
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      dep('jwt', '= 1.1'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @set.dependencies
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GEM
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  ruby
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    parse_lockfile @set, []
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '>= 0')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'found a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2], lockfile_set.specs.map { |s| s.full_name }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GEM_remote_multiple
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: https://gems.example/
 | 
			
		||||
  remote: https://other.example/
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  ruby
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    parse_lockfile @set, []
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '>= 0')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'found a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2 a-2], lockfile_set.specs.map { |s| s.full_name }
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[https://gems.example/ https://other.example/],
 | 
			
		||||
                 lockfile_set.specs.map { |s| s.source.uri.to_s }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GIT
 | 
			
		||||
    @set.instance_variable_set :@install_dir, 'install_dir'
 | 
			
		||||
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://example/a.git
 | 
			
		||||
  revision: master
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (>= 3)
 | 
			
		||||
      c
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    parse_lockfile @set, []
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'fount a LockSet'
 | 
			
		||||
 | 
			
		||||
    git_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::GitSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert git_set, 'could not find a GitSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2], git_set.specs.values.map { |s| s.full_name }
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('b', '>= 3'), dep('c')],
 | 
			
		||||
                 git_set.specs.values.first.dependencies
 | 
			
		||||
 | 
			
		||||
    expected = {
 | 
			
		||||
      'a' => %w[git://example/a.git master],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, git_set.repositories
 | 
			
		||||
    assert_equal 'install_dir', git_set.root_dir
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GIT_branch
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://example/a.git
 | 
			
		||||
  revision: 1234abc
 | 
			
		||||
  branch: 0-9-12-stable
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (>= 3)
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    parse_lockfile @set, []
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'fount a LockSet'
 | 
			
		||||
 | 
			
		||||
    git_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::GitSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert git_set, 'could not find a GitSet'
 | 
			
		||||
 | 
			
		||||
    expected = {
 | 
			
		||||
      'a' => %w[git://example/a.git 1234abc],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, git_set.repositories
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GIT_ref
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://example/a.git
 | 
			
		||||
  revision: 1234abc
 | 
			
		||||
  ref: 1234abc
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (>= 3)
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    parse_lockfile @set, []
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'fount a LockSet'
 | 
			
		||||
 | 
			
		||||
    git_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::GitSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert git_set, 'could not find a GitSet'
 | 
			
		||||
 | 
			
		||||
    expected = {
 | 
			
		||||
      'a' => %w[git://example/a.git 1234abc],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, git_set.repositories
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_GIT_tag
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GIT
 | 
			
		||||
  remote: git://example/a.git
 | 
			
		||||
  revision: 1234abc
 | 
			
		||||
  tag: v0.9.12
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (>= 3)
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    parse_lockfile @set, []
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 2')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'fount a LockSet'
 | 
			
		||||
 | 
			
		||||
    git_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::GitSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert git_set, 'could not find a GitSet'
 | 
			
		||||
 | 
			
		||||
    expected = {
 | 
			
		||||
      'a' => %w[git://example/a.git 1234abc],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, git_set.repositories
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_PATH
 | 
			
		||||
    _, _, directory = vendor_gem
 | 
			
		||||
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
PATH
 | 
			
		||||
  remote: #{directory}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (1)
 | 
			
		||||
      b (2)
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    parse_lockfile @set, []
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a', '= 1')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set, 'found a LockSet'
 | 
			
		||||
 | 
			
		||||
    vendor_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::VendorSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert vendor_set, 'could not find a VendorSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-1], vendor_set.specs.values.map { |s| s.full_name }
 | 
			
		||||
 | 
			
		||||
    spec = vendor_set.load_spec 'a', nil, nil, nil
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('b', '= 2')], spec.dependencies
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_dependency
 | 
			
		||||
    write_lockfile ' 1)'
 | 
			
		||||
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file @lock_file
 | 
			
		||||
    parser = tokenizer.make_parser nil, nil
 | 
			
		||||
 | 
			
		||||
    parsed = parser.parse_dependency 'a', '='
 | 
			
		||||
 | 
			
		||||
    assert_equal dep('a', '= 1'), parsed
 | 
			
		||||
 | 
			
		||||
    write_lockfile ')'
 | 
			
		||||
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file @lock_file
 | 
			
		||||
    parser = tokenizer.make_parser nil, nil
 | 
			
		||||
 | 
			
		||||
    parsed = parser.parse_dependency 'a', '2'
 | 
			
		||||
 | 
			
		||||
    assert_equal dep('a', '= 2'), parsed
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_gem_specs_dependency
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (= 3)
 | 
			
		||||
      c (~> 4)
 | 
			
		||||
      d
 | 
			
		||||
      e (~> 5.0, >= 5.0.1)
 | 
			
		||||
    b (3-x86_64-linux)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    platforms = []
 | 
			
		||||
    parse_lockfile @set, platforms
 | 
			
		||||
 | 
			
		||||
    assert_equal [dep('a')], @set.dependencies
 | 
			
		||||
 | 
			
		||||
    assert_equal [Gem::Platform::RUBY], platforms
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert lockfile_set, 'could not find a LockSet'
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2 b-3], lockfile_set.specs.map { |tuple| tuple.full_name }
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      Gem::Platform::RUBY,
 | 
			
		||||
      Gem::Platform.new('x86_64-linux'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, lockfile_set.specs.map { |tuple| tuple.platform }
 | 
			
		||||
 | 
			
		||||
    spec = lockfile_set.specs.first
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      dep('b', '= 3'),
 | 
			
		||||
      dep('c', '~> 4'),
 | 
			
		||||
      dep('d'),
 | 
			
		||||
      dep('e', '~> 5.0', '>= 5.0.1'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, spec.dependencies
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_parse_missing
 | 
			
		||||
    assert_raises(Errno::ENOENT) do
 | 
			
		||||
      parse_lockfile @set, []
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    lockfile_set = @set.sets.find do |set|
 | 
			
		||||
      Gem::Resolver::LockSet === set
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    refute lockfile_set
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def write_lockfile lockfile
 | 
			
		||||
    open @lock_file, 'w' do |io|
 | 
			
		||||
      io.write lockfile
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_lockfile set, platforms
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file @lock_file
 | 
			
		||||
    parser = tokenizer.make_parser set, platforms
 | 
			
		||||
    parser.parse
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										305
									
								
								test/rubygems/test_gem_request_set_lockfile_tokenizer.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										305
									
								
								test/rubygems/test_gem_request_set_lockfile_tokenizer.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,305 @@
 | 
			
		|||
require 'rubygems/test_case'
 | 
			
		||||
require 'rubygems/request_set'
 | 
			
		||||
require 'rubygems/request_set/lockfile'
 | 
			
		||||
require 'rubygems/request_set/lockfile/tokenizer'
 | 
			
		||||
require 'rubygems/request_set/lockfile/parser'
 | 
			
		||||
 | 
			
		||||
class TestGemRequestSetLockfileTokenizer < Gem::TestCase
 | 
			
		||||
  def setup
 | 
			
		||||
    super
 | 
			
		||||
 | 
			
		||||
    @gem_deps_file = 'gem.deps.rb'
 | 
			
		||||
    @lock_file = File.expand_path "#{@gem_deps_file}.lock"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_peek
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "\n"
 | 
			
		||||
 | 
			
		||||
    assert_equal :newline, tokenizer.peek.first
 | 
			
		||||
 | 
			
		||||
    assert_equal :newline, tokenizer.next_token.first
 | 
			
		||||
 | 
			
		||||
    assert_equal [:EOF], tokenizer.peek
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_skip
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "\n"
 | 
			
		||||
 | 
			
		||||
    refute_predicate tokenizer, :empty?
 | 
			
		||||
 | 
			
		||||
    tokenizer.skip :newline
 | 
			
		||||
 | 
			
		||||
    assert_empty tokenizer
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_token_pos
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new ''
 | 
			
		||||
    assert_equal [5, 0], tokenizer.token_pos(5)
 | 
			
		||||
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new '', nil, 1, 2
 | 
			
		||||
    assert_equal [3, 1], tokenizer.token_pos(5)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (= 2)
 | 
			
		||||
      c (!= 3)
 | 
			
		||||
      d (> 4)
 | 
			
		||||
      e (< 5)
 | 
			
		||||
      f (>= 6)
 | 
			
		||||
      g (<= 7)
 | 
			
		||||
      h (~> 8)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      [:section,     'GEM',                0,  0],
 | 
			
		||||
      [:newline,     nil,                  3,  0],
 | 
			
		||||
 | 
			
		||||
      [:entry,       'remote',             2,  1],
 | 
			
		||||
      [:text,        @gem_repo,           10,  1],
 | 
			
		||||
      [:newline,     nil,                 34,  1],
 | 
			
		||||
 | 
			
		||||
      [:entry,       'specs',              2,  2],
 | 
			
		||||
      [:newline,     nil,                  8,  2],
 | 
			
		||||
 | 
			
		||||
      [:text,        'a',                  4,  3],
 | 
			
		||||
      [:l_paren,     nil,                  6,  3],
 | 
			
		||||
      [:text,        '2',                  7,  3],
 | 
			
		||||
      [:r_paren,     nil,                  8,  3],
 | 
			
		||||
      [:newline,     nil,                  9,  3],
 | 
			
		||||
 | 
			
		||||
      [:text,        'b',                  6,  4],
 | 
			
		||||
      [:l_paren,     nil,                  8,  4],
 | 
			
		||||
      [:requirement, '=',                  9,  4],
 | 
			
		||||
      [:text,        '2',                 11,  4],
 | 
			
		||||
      [:r_paren,     nil,                 12,  4],
 | 
			
		||||
      [:newline,     nil,                 13,  4],
 | 
			
		||||
 | 
			
		||||
      [:text,        'c',                  6,  5],
 | 
			
		||||
      [:l_paren,     nil,                  8,  5],
 | 
			
		||||
      [:requirement, '!=',                 9,  5],
 | 
			
		||||
      [:text,        '3',                 12,  5],
 | 
			
		||||
      [:r_paren,     nil,                 13,  5],
 | 
			
		||||
      [:newline,     nil,                 14,  5],
 | 
			
		||||
 | 
			
		||||
      [:text,        'd',                  6,  6],
 | 
			
		||||
      [:l_paren,     nil,                  8,  6],
 | 
			
		||||
      [:requirement, '>',                  9,  6],
 | 
			
		||||
      [:text,        '4',                 11,  6],
 | 
			
		||||
      [:r_paren,     nil,                 12,  6],
 | 
			
		||||
      [:newline,     nil,                 13,  6],
 | 
			
		||||
 | 
			
		||||
      [:text,        'e',                  6,  7],
 | 
			
		||||
      [:l_paren,     nil,                  8,  7],
 | 
			
		||||
      [:requirement, '<',                  9,  7],
 | 
			
		||||
      [:text,        '5',                 11,  7],
 | 
			
		||||
      [:r_paren,     nil,                 12,  7],
 | 
			
		||||
      [:newline,     nil,                 13,  7],
 | 
			
		||||
 | 
			
		||||
      [:text,        'f',                  6,  8],
 | 
			
		||||
      [:l_paren,     nil,                  8,  8],
 | 
			
		||||
      [:requirement, '>=',                 9,  8],
 | 
			
		||||
      [:text,        '6',                 12,  8],
 | 
			
		||||
      [:r_paren,     nil,                 13,  8],
 | 
			
		||||
      [:newline,     nil,                 14,  8],
 | 
			
		||||
 | 
			
		||||
      [:text,        'g',                  6,  9],
 | 
			
		||||
      [:l_paren,     nil,                  8,  9],
 | 
			
		||||
      [:requirement, '<=',                 9,  9],
 | 
			
		||||
      [:text,        '7',                 12,  9],
 | 
			
		||||
      [:r_paren,     nil,                 13,  9],
 | 
			
		||||
      [:newline,     nil,                 14,  9],
 | 
			
		||||
 | 
			
		||||
      [:text,        'h',                  6, 10],
 | 
			
		||||
      [:l_paren,     nil,                  8, 10],
 | 
			
		||||
      [:requirement, '~>',                 9, 10],
 | 
			
		||||
      [:text,        '8',                 12, 10],
 | 
			
		||||
      [:r_paren,     nil,                 13, 10],
 | 
			
		||||
      [:newline,     nil,                 14, 10],
 | 
			
		||||
 | 
			
		||||
      [:newline,     nil,                  0, 11],
 | 
			
		||||
 | 
			
		||||
      [:section,     'PLATFORMS',          0, 12],
 | 
			
		||||
      [:newline,     nil,                  9, 12],
 | 
			
		||||
 | 
			
		||||
      [:text,        Gem::Platform::RUBY,  2, 13],
 | 
			
		||||
      [:newline,     nil,                  6, 13],
 | 
			
		||||
 | 
			
		||||
      [:newline,     nil,                  0, 14],
 | 
			
		||||
 | 
			
		||||
      [:section,     'DEPENDENCIES',       0, 15],
 | 
			
		||||
      [:newline,     nil,                 12, 15],
 | 
			
		||||
 | 
			
		||||
      [:text,        'a',                  2, 16],
 | 
			
		||||
      [:newline,     nil,                  3, 16],
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, tokenize_lockfile
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize_capitals
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    Ab (2)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  #{Gem::Platform::RUBY}
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  Ab
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      [:section, 'GEM',                0, 0],
 | 
			
		||||
      [:newline, nil,                  3, 0],
 | 
			
		||||
      [:entry,   'remote',             2, 1],
 | 
			
		||||
      [:text,    @gem_repo,           10, 1],
 | 
			
		||||
      [:newline, nil,                 34, 1],
 | 
			
		||||
      [:entry,   'specs',              2, 2],
 | 
			
		||||
      [:newline, nil,                  8, 2],
 | 
			
		||||
      [:text,    'Ab',                 4, 3],
 | 
			
		||||
      [:l_paren, nil,                  7, 3],
 | 
			
		||||
      [:text,    '2',                  8, 3],
 | 
			
		||||
      [:r_paren, nil,                  9, 3],
 | 
			
		||||
      [:newline, nil,                 10, 3],
 | 
			
		||||
      [:newline, nil,                  0, 4],
 | 
			
		||||
      [:section, 'PLATFORMS',          0, 5],
 | 
			
		||||
      [:newline, nil,                  9, 5],
 | 
			
		||||
      [:text,    Gem::Platform::RUBY,  2, 6],
 | 
			
		||||
      [:newline, nil,                  6, 6],
 | 
			
		||||
      [:newline, nil,                  0, 7],
 | 
			
		||||
      [:section, 'DEPENDENCIES',       0, 8],
 | 
			
		||||
      [:newline, nil,                 12, 8],
 | 
			
		||||
      [:text,    'Ab',                 2, 9],
 | 
			
		||||
      [:newline, nil,                  4, 9],
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, tokenize_lockfile
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize_conflict_markers
 | 
			
		||||
    write_lockfile '<<<<<<<'
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      tokenize_lockfile
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal "your #{@lock_file} contains merge conflict markers (at line 0 column 0)",
 | 
			
		||||
                 e.message
 | 
			
		||||
 | 
			
		||||
    write_lockfile '|||||||'
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      tokenize_lockfile
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal "your #{@lock_file} contains merge conflict markers (at line 0 column 0)",
 | 
			
		||||
                 e.message
 | 
			
		||||
 | 
			
		||||
    write_lockfile '======='
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      tokenize_lockfile
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal "your #{@lock_file} contains merge conflict markers (at line 0 column 0)",
 | 
			
		||||
                 e.message
 | 
			
		||||
 | 
			
		||||
    write_lockfile '>>>>>>>'
 | 
			
		||||
 | 
			
		||||
    e = assert_raises Gem::RequestSet::Lockfile::ParseError do
 | 
			
		||||
      tokenize_lockfile
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal "your #{@lock_file} contains merge conflict markers (at line 0 column 0)",
 | 
			
		||||
                 e.message
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize_git
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
DEPENDENCIES
 | 
			
		||||
  a!
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      [:section, 'DEPENDENCIES',  0,  0],
 | 
			
		||||
      [:newline, nil,            12,  0],
 | 
			
		||||
 | 
			
		||||
      [:text,    'a',             2,  1],
 | 
			
		||||
      [:bang,    nil,             3,  1],
 | 
			
		||||
      [:newline, nil,             4,  1],
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, tokenize_lockfile
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_tokenize_multiple
 | 
			
		||||
    write_lockfile <<-LOCKFILE
 | 
			
		||||
GEM
 | 
			
		||||
  remote: #{@gem_repo}
 | 
			
		||||
  specs:
 | 
			
		||||
    a (2)
 | 
			
		||||
      b (~> 3.0, >= 3.0.1)
 | 
			
		||||
    LOCKFILE
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      [:section,     'GEM',      0,  0],
 | 
			
		||||
      [:newline,     nil,        3,  0],
 | 
			
		||||
 | 
			
		||||
      [:entry,       'remote',   2,  1],
 | 
			
		||||
      [:text,        @gem_repo, 10,  1],
 | 
			
		||||
      [:newline,     nil,       34,  1],
 | 
			
		||||
 | 
			
		||||
      [:entry,       'specs',    2,  2],
 | 
			
		||||
      [:newline,     nil,        8,  2],
 | 
			
		||||
 | 
			
		||||
      [:text,        'a',        4,  3],
 | 
			
		||||
      [:l_paren,     nil,        6,  3],
 | 
			
		||||
      [:text,        '2',        7,  3],
 | 
			
		||||
      [:r_paren,     nil,        8,  3],
 | 
			
		||||
      [:newline,     nil,        9,  3],
 | 
			
		||||
 | 
			
		||||
      [:text,        'b',        6,  4],
 | 
			
		||||
      [:l_paren,     nil,        8,  4],
 | 
			
		||||
      [:requirement, '~>',       9,  4],
 | 
			
		||||
      [:text,        '3.0',     12,  4],
 | 
			
		||||
      [:comma,       nil,       15,  4],
 | 
			
		||||
      [:requirement, '>=',      17,  4],
 | 
			
		||||
      [:text,        '3.0.1',   20,  4],
 | 
			
		||||
      [:r_paren,     nil,       25,  4],
 | 
			
		||||
      [:newline,     nil,       26,  4],
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, tokenize_lockfile
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_unget
 | 
			
		||||
    tokenizer = Gem::RequestSet::Lockfile::Tokenizer.new "\n"
 | 
			
		||||
    tokenizer.unshift :token
 | 
			
		||||
    parser = tokenizer.make_parser nil, nil
 | 
			
		||||
 | 
			
		||||
    assert_equal :token, parser.get
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def write_lockfile lockfile
 | 
			
		||||
    open @lock_file, 'w' do |io|
 | 
			
		||||
      io.write lockfile
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def tokenize_lockfile
 | 
			
		||||
    Gem::RequestSet::Lockfile::Tokenizer.from_file(@lock_file).to_a
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -347,6 +347,16 @@ class TestGemRequirement < Gem::TestCase
 | 
			
		|||
    refute_satisfied_by "1.0.0.1",     "= 1.0"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_hash_with_multiple_versions
 | 
			
		||||
    r1 = req('1.0', '2.0')
 | 
			
		||||
    r2 = req('2.0', '1.0')
 | 
			
		||||
    assert_equal r1.hash, r2.hash
 | 
			
		||||
 | 
			
		||||
    r1 = req('1.0', '2.0').tap { |r| r.concat(['3.0']) }
 | 
			
		||||
    r2 = req('3.0', '1.0').tap { |r| r.concat(['2.0']) }
 | 
			
		||||
    assert_equal r1.hash, r2.hash
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Assert that two requirements are equal. Handles Gem::Requirements,
 | 
			
		||||
  # strings, arrays, numbers, and versions.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1080,6 +1080,12 @@ dependencies: []
 | 
			
		|||
    assert_equal %w[true gem_name], gem.dependencies.map { |dep| dep.name }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_add_dependency_from_existing_dependency
 | 
			
		||||
    dep  = Gem::Dependency.new("existing_dep", Gem::Requirement.new('> 1'), :runtime)
 | 
			
		||||
    spec = Gem::Specification.new { |s| s.add_dependency dep }
 | 
			
		||||
    assert_equal dep, spec.dependencies.first
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_add_dependency_with_type_explicit
 | 
			
		||||
    gem = util_spec "awesome", "1.0" do |awesome|
 | 
			
		||||
      awesome.add_development_dependency "monkey"
 | 
			
		||||
| 
						 | 
				
			
			@ -1856,8 +1862,8 @@ dependencies: []
 | 
			
		|||
    @ext.require_paths = 'lib'
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      @ext.extension_dir,
 | 
			
		||||
      File.join(@gemhome, 'gems', @ext.original_name, 'lib'),
 | 
			
		||||
      @ext.extension_dir,
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @ext.full_require_paths
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,8 +65,8 @@ class TestStubSpecification < Gem::TestCase
 | 
			
		|||
    stub = stub_with_extension
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      stub.extension_dir,
 | 
			
		||||
      File.join(stub.full_gem_path, 'lib'),
 | 
			
		||||
      stub.extension_dir,
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, stub.full_require_paths
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue