зеркало из https://github.com/github/ruby.git
471 строка
7.7 KiB
Ruby
471 строка
7.7 KiB
Ruby
# frozen_string_literal: true
|
|
require 'rubygems/test_case'
|
|
require 'rubygems/request_set'
|
|
require 'rubygems/request_set/lockfile'
|
|
|
|
class TestGemRequestSetLockfile < Gem::TestCase
|
|
|
|
def setup
|
|
super
|
|
|
|
Gem::RemoteFetcher.fetcher = @fetcher = Gem::FakeFetcher.new
|
|
|
|
util_set_arch 'i686-darwin8.10.1'
|
|
|
|
@set = Gem::RequestSet.new
|
|
|
|
@git_set = Gem::Resolver::GitSet.new
|
|
@vendor_set = Gem::Resolver::VendorSet.new
|
|
|
|
@set.instance_variable_set :@git_set, @git_set
|
|
@set.instance_variable_set :@vendor_set, @vendor_set
|
|
|
|
@gem_deps_file = 'gem.deps.rb'
|
|
|
|
end
|
|
|
|
def lockfile
|
|
Gem::RequestSet::Lockfile.build @set, @gem_deps_file
|
|
end
|
|
|
|
def write_lockfile lockfile
|
|
@lock_file = File.expand_path "#{@gem_deps_file}.lock"
|
|
|
|
open @lock_file, 'w' do |io|
|
|
io.write lockfile
|
|
end
|
|
end
|
|
|
|
def test_add_DEPENDENCIES
|
|
spec_fetcher do |fetcher|
|
|
fetcher.spec 'a', 2 do |s|
|
|
s.add_development_dependency 'b'
|
|
end
|
|
end
|
|
|
|
@set.gem 'a'
|
|
@set.resolve
|
|
|
|
out = []
|
|
|
|
lockfile.add_DEPENDENCIES out
|
|
|
|
expected = [
|
|
'DEPENDENCIES',
|
|
' a',
|
|
nil
|
|
]
|
|
|
|
assert_equal expected, out
|
|
end
|
|
|
|
def test_add_DEPENDENCIES_from_gem_deps
|
|
spec_fetcher do |fetcher|
|
|
fetcher.spec 'a', 2 do |s|
|
|
s.add_development_dependency 'b'
|
|
end
|
|
end
|
|
|
|
dependencies = { 'a' => Gem::Requirement.new('~> 2.0') }
|
|
|
|
@set.gem 'a'
|
|
@set.resolve
|
|
@lockfile =
|
|
Gem::RequestSet::Lockfile.new @set, @gem_deps_file, dependencies
|
|
|
|
out = []
|
|
|
|
@lockfile.add_DEPENDENCIES out
|
|
|
|
expected = [
|
|
'DEPENDENCIES',
|
|
' a (~> 2.0)',
|
|
nil
|
|
]
|
|
|
|
assert_equal expected, out
|
|
end
|
|
|
|
def test_add_GEM
|
|
spec_fetcher do |fetcher|
|
|
fetcher.spec 'a', 2 do |s|
|
|
s.add_dependency 'b'
|
|
s.add_development_dependency 'c'
|
|
end
|
|
|
|
fetcher.spec 'b', 2
|
|
|
|
fetcher.spec 'bundler', 1
|
|
end
|
|
|
|
@set.gem 'a'
|
|
@set.gem 'bundler'
|
|
@set.resolve
|
|
|
|
out = []
|
|
|
|
lockfile.add_GEM out, lockfile.spec_groups
|
|
|
|
expected = [
|
|
'GEM',
|
|
' remote: http://gems.example.com/',
|
|
' specs:',
|
|
' a (2)',
|
|
' b',
|
|
' b (2)',
|
|
nil
|
|
]
|
|
|
|
assert_equal expected, out
|
|
end
|
|
|
|
def test_add_PLATFORMS
|
|
spec_fetcher do |fetcher|
|
|
fetcher.spec 'a', 2 do |s|
|
|
s.add_dependency 'b'
|
|
end
|
|
|
|
fetcher.spec 'b', 2 do |s|
|
|
s.platform = Gem::Platform::CURRENT
|
|
end
|
|
end
|
|
|
|
@set.gem 'a'
|
|
@set.resolve
|
|
|
|
out = []
|
|
|
|
lockfile.add_PLATFORMS out
|
|
|
|
expected = [
|
|
'PLATFORMS',
|
|
' ruby',
|
|
' x86-darwin-8',
|
|
nil
|
|
]
|
|
|
|
assert_equal expected, out
|
|
end
|
|
|
|
def test_relative_path_from
|
|
path = lockfile.relative_path_from '/foo', '/foo/bar'
|
|
|
|
assert_equal File.expand_path('/foo'), path
|
|
|
|
path = lockfile.relative_path_from '/foo', '/foo'
|
|
|
|
assert_equal '.', path
|
|
end
|
|
|
|
def test_to_s_gem
|
|
spec_fetcher do |fetcher|
|
|
fetcher.spec 'a', 2
|
|
end
|
|
|
|
@set.gem 'a'
|
|
|
|
expected = <<-LOCKFILE
|
|
GEM
|
|
remote: #{@gem_repo}
|
|
specs:
|
|
a (2)
|
|
|
|
PLATFORMS
|
|
#{Gem::Platform::RUBY}
|
|
|
|
DEPENDENCIES
|
|
a
|
|
LOCKFILE
|
|
|
|
assert_equal expected, lockfile.to_s
|
|
end
|
|
|
|
def test_to_s_gem_dependency
|
|
spec_fetcher do |fetcher|
|
|
fetcher.spec 'a', 2, 'c' => '>= 0', 'b' => '>= 0'
|
|
fetcher.spec 'b', 2
|
|
fetcher.spec 'c', 2
|
|
end
|
|
|
|
@set.gem 'a'
|
|
|
|
expected = <<-LOCKFILE
|
|
GEM
|
|
remote: #{@gem_repo}
|
|
specs:
|
|
a (2)
|
|
b
|
|
c
|
|
b (2)
|
|
c (2)
|
|
|
|
PLATFORMS
|
|
#{Gem::Platform::RUBY}
|
|
|
|
DEPENDENCIES
|
|
a
|
|
b
|
|
c
|
|
LOCKFILE
|
|
|
|
assert_equal expected, lockfile.to_s
|
|
end
|
|
|
|
def test_to_s_gem_dependency_non_default
|
|
spec_fetcher do |fetcher|
|
|
fetcher.spec 'a', 2, 'b' => '>= 1'
|
|
fetcher.spec 'b', 2
|
|
end
|
|
|
|
@set.gem 'b'
|
|
@set.gem 'a'
|
|
|
|
expected = <<-LOCKFILE
|
|
GEM
|
|
remote: #{@gem_repo}
|
|
specs:
|
|
a (2)
|
|
b (>= 1)
|
|
b (2)
|
|
|
|
PLATFORMS
|
|
#{Gem::Platform::RUBY}
|
|
|
|
DEPENDENCIES
|
|
a
|
|
b
|
|
LOCKFILE
|
|
|
|
assert_equal expected, lockfile.to_s
|
|
end
|
|
|
|
def test_to_s_gem_dependency_requirement
|
|
spec_fetcher do |fetcher|
|
|
fetcher.spec 'a', 2, 'b' => '>= 0'
|
|
fetcher.spec 'b', 2
|
|
end
|
|
|
|
@set.gem 'a', '>= 1'
|
|
|
|
expected = <<-LOCKFILE
|
|
GEM
|
|
remote: #{@gem_repo}
|
|
specs:
|
|
a (2)
|
|
b
|
|
b (2)
|
|
|
|
PLATFORMS
|
|
#{Gem::Platform::RUBY}
|
|
|
|
DEPENDENCIES
|
|
a (>= 1)
|
|
b
|
|
LOCKFILE
|
|
|
|
assert_equal expected, lockfile.to_s
|
|
end
|
|
|
|
def test_to_s_gem_path
|
|
name, version, directory = vendor_gem
|
|
|
|
@vendor_set.add_vendor_gem name, directory
|
|
|
|
@set.gem 'a'
|
|
|
|
expected = <<-LOCKFILE
|
|
PATH
|
|
remote: #{directory}
|
|
specs:
|
|
#{name} (#{version})
|
|
|
|
PLATFORMS
|
|
#{Gem::Platform::RUBY}
|
|
|
|
DEPENDENCIES
|
|
a!
|
|
LOCKFILE
|
|
|
|
assert_equal expected, lockfile.to_s
|
|
end
|
|
|
|
def test_to_s_gem_path_absolute
|
|
name, version, directory = vendor_gem
|
|
|
|
@vendor_set.add_vendor_gem name, File.expand_path(directory)
|
|
|
|
@set.gem 'a'
|
|
|
|
expected = <<-LOCKFILE
|
|
PATH
|
|
remote: #{directory}
|
|
specs:
|
|
#{name} (#{version})
|
|
|
|
PLATFORMS
|
|
#{Gem::Platform::RUBY}
|
|
|
|
DEPENDENCIES
|
|
a!
|
|
LOCKFILE
|
|
|
|
assert_equal expected, lockfile.to_s
|
|
end
|
|
|
|
def test_to_s_gem_platform
|
|
spec_fetcher do |fetcher|
|
|
fetcher.spec 'a', 2 do |spec|
|
|
spec.platform = Gem::Platform.local
|
|
end
|
|
end
|
|
|
|
@set.gem 'a'
|
|
|
|
expected = <<-LOCKFILE
|
|
GEM
|
|
remote: #{@gem_repo}
|
|
specs:
|
|
a (2-#{Gem::Platform.local})
|
|
|
|
PLATFORMS
|
|
#{Gem::Platform.local}
|
|
|
|
DEPENDENCIES
|
|
a
|
|
LOCKFILE
|
|
|
|
assert_equal expected, lockfile.to_s
|
|
end
|
|
|
|
def test_to_s_gem_source
|
|
spec_fetcher do |fetcher|
|
|
fetcher.download 'a', 2
|
|
end
|
|
|
|
spec_fetcher 'http://other.example/' do |fetcher|
|
|
fetcher.download 'b', 2
|
|
end
|
|
|
|
Gem.sources << 'http://other.example/'
|
|
|
|
@set.gem 'a'
|
|
@set.gem 'b'
|
|
|
|
expected = <<-LOCKFILE
|
|
GEM
|
|
remote: #{@gem_repo}
|
|
specs:
|
|
a (2)
|
|
|
|
GEM
|
|
remote: http://other.example/
|
|
specs:
|
|
b (2)
|
|
|
|
PLATFORMS
|
|
#{Gem::Platform::RUBY}
|
|
|
|
DEPENDENCIES
|
|
a
|
|
b
|
|
LOCKFILE
|
|
|
|
assert_equal expected, lockfile.to_s
|
|
end
|
|
|
|
def test_to_s_git
|
|
_, _, repository, = git_gem
|
|
|
|
head = nil
|
|
|
|
Dir.chdir repository do
|
|
FileUtils.mkdir 'b'
|
|
|
|
Dir.chdir 'b' do
|
|
b = Gem::Specification.new 'b', 1 do |s|
|
|
s.add_dependency 'a', '~> 1.0'
|
|
s.add_dependency 'c', '~> 1.0'
|
|
end
|
|
|
|
open 'b.gemspec', 'w' do |io|
|
|
io.write b.to_ruby
|
|
end
|
|
|
|
system @git, 'add', 'b.gemspec'
|
|
system @git, 'commit', '--quiet', '-m', 'add b/b.gemspec'
|
|
end
|
|
|
|
FileUtils.mkdir 'c'
|
|
|
|
Dir.chdir 'c' do
|
|
c = Gem::Specification.new 'c', 1
|
|
|
|
open 'c.gemspec', 'w' do |io|
|
|
io.write c.to_ruby
|
|
end
|
|
|
|
system @git, 'add', 'c.gemspec'
|
|
system @git, 'commit', '--quiet', '-m', 'add c/c.gemspec'
|
|
end
|
|
|
|
head = `#{@git} rev-parse HEAD`.strip
|
|
end
|
|
|
|
@git_set.add_git_gem 'a', repository, 'HEAD', true
|
|
@git_set.add_git_gem 'b', repository, 'HEAD', true
|
|
@git_set.add_git_gem 'c', repository, 'HEAD', true
|
|
|
|
@set.gem 'b'
|
|
|
|
expected = <<-LOCKFILE
|
|
GIT
|
|
remote: #{repository}
|
|
revision: #{head}
|
|
specs:
|
|
a (1)
|
|
b (1)
|
|
a (~> 1.0)
|
|
c (~> 1.0)
|
|
c (1)
|
|
|
|
PLATFORMS
|
|
ruby
|
|
|
|
DEPENDENCIES
|
|
a!
|
|
b!
|
|
c!
|
|
LOCKFILE
|
|
|
|
assert_equal expected, lockfile.to_s
|
|
end
|
|
|
|
def test_write
|
|
lockfile.write
|
|
|
|
gem_deps_lock_file = "#{@gem_deps_file}.lock"
|
|
|
|
assert_path_exists gem_deps_lock_file
|
|
|
|
refute_empty File.read gem_deps_lock_file
|
|
end
|
|
|
|
def test_write_error
|
|
@set.gem 'nonexistent'
|
|
|
|
gem_deps_lock_file = "#{@gem_deps_file}.lock"
|
|
|
|
open gem_deps_lock_file, 'w' do |io|
|
|
io.write 'hello'
|
|
end
|
|
|
|
assert_raises Gem::UnsatisfiableDependencyError do
|
|
lockfile.write
|
|
end
|
|
|
|
assert_path_exists gem_deps_lock_file
|
|
|
|
assert_equal 'hello', File.read(gem_deps_lock_file)
|
|
end
|
|
end
|