Commit f88e26c1 authored by Eloy Duran's avatar Eloy Duran

[HEAD] Move logic from Specification to Installer/Downloader.

Closes #392.

Incidentally touched ALL THE FILES.
parent a24b4ba3
...@@ -6,8 +6,8 @@ require 'open-uri' ...@@ -6,8 +6,8 @@ require 'open-uri'
module Pod module Pod
class Dependency < Gem::Dependency class Dependency < Gem::Dependency
attr_reader :external_source, :bleeding attr_reader :external_source, :head
alias :bleeding? :bleeding alias :head? :head
attr_accessor :specification attr_accessor :specification
def initialize(*name_and_version_requirements, &block) def initialize(*name_and_version_requirements, &block)
...@@ -19,22 +19,28 @@ module Pod ...@@ -19,22 +19,28 @@ module Pod
elsif !name_and_version_requirements.empty? && block.nil? elsif !name_and_version_requirements.empty? && block.nil?
if name_and_version_requirements.last.is_a?(Hash) if name_and_version_requirements.last.is_a?(Hash)
@external_source = ExternalSources.from_params(name_and_version_requirements[0].split('/').first, name_and_version_requirements.pop) @external_source = ExternalSources.from_params(name_and_version_requirements[0].split('/').first, name_and_version_requirements.pop)
elsif name_and_version_requirements.last.is_a?(Symbol)
symbol = name_and_version_requirements.pop elsif (symbol = name_and_version_requirements.last).is_a?(Symbol) && symbol == :head
if symbol == :bleeding name_and_version_requirements.pop
@bleeding = true @head = true
else
raise Informative, "Unrecognized symbol `#{symbol}' for dependency `#{name_and_version_requirements[0]}'"
end
end end
super(*name_and_version_requirements) super(*name_and_version_requirements)
if head? && !latest_version?
raise Informative, "A `:head' dependency may not specify version requirements."
end
else else
raise Informative, "A dependency needs either a name and version requirements, " \ raise Informative, "A dependency needs either a name and version requirements, " \
"a source hash, or a block which defines a podspec." "a source hash, or a block which defines a podspec."
end end
end end
def latest_version?
versions = @version_requirements.requirements.map(&:last)
versions == [Gem::Version.new('0')]
end
def ==(other) def ==(other)
super && (@specification ? @specification == other.specification : @external_source == other.external_source) super && (@specification ? @specification == other.specification : @external_source == other.external_source)
end end
...@@ -76,9 +82,9 @@ module Pod ...@@ -76,9 +82,9 @@ module Pod
elsif @version_requirements != Gem::Requirement.default elsif @version_requirements != Gem::Requirement.default
version << @version_requirements.to_s version << @version_requirements.to_s
end end
result = @name result = @name.dup
result = result + " (#{version})" unless version.empty? result += " (#{version})" unless version.empty?
result = result + " [BLEEDING]" if bleeding? result += " [HEAD]" if head?
result result
end end
......
...@@ -23,7 +23,7 @@ module Pod ...@@ -23,7 +23,7 @@ module Pod
else else
download_head download_head
end end
removed_cached_repos_if_needed prune_cache
end end
def create_cache def create_cache
...@@ -33,7 +33,7 @@ module Pod ...@@ -33,7 +33,7 @@ module Pod
clone(url, cache_path) clone(url, cache_path)
end end
def removed_cached_repos_if_needed def prune_cache
return unless caches_dir.exist? return unless caches_dir.exist?
Dir.chdir(caches_dir) do Dir.chdir(caches_dir) do
repos = Pathname.new(caches_dir).children.select { |c| c.directory? }.sort_by(&:ctime) repos = Pathname.new(caches_dir).children.select { |c| c.directory? }.sort_by(&:ctime)
......
...@@ -48,18 +48,17 @@ module Pod ...@@ -48,18 +48,17 @@ module Pod
pods.each do |pod| pods.each do |pod|
unless config.silent? unless config.silent?
marker = config.verbose ? "\n-> ".green : '' marker = config.verbose ? "\n-> ".green : ''
if pod.top_specification.preferred_dependency if subspec_name = pod.top_specification.preferred_dependency
name = "#{pod.top_specification.name}/#{pod.top_specification.preferred_dependency} (#{pod.top_specification.version})" name = "#{pod.top_specification.name}/#{subspec_name} (#{pod.top_specification.version})"
name << "[BLEEDING]" if pod.top_specification.bleeding?
else else
name = pod.to_s name = pod.to_s
end end
name << " [HEAD]" if pod.top_specification.version.head?
puts marker << ( pod.exists? ? "Using #{name}" : "Installing #{name}".green ) puts marker << ( pod.exists? ? "Using #{name}" : "Installing #{name}".green )
end end
unless pod.exists? unless pod.exists?
downloader = Downloader.for_pod(pod) download_pod(pod)
downloader.download
# The docs need to be generated before cleaning because # The docs need to be generated before cleaning because
# the documentation is created for all the subspecs. # the documentation is created for all the subspecs.
generate_docs(pod) generate_docs(pod)
...@@ -68,6 +67,19 @@ module Pod ...@@ -68,6 +67,19 @@ module Pod
end end
end end
def download_pod(pod)
downloader = Downloader.for_pod(pod)
# Force the `bleeding edge' version if necessary.
if pod.top_specification.version.head?
if downloader.respond_to?(:download_head)
downloader.download_head
else
end
else
downloader.download
end
end
#TODO: move to generator ? #TODO: move to generator ?
def generate_docs(pod) def generate_docs(pod)
doc_generator = Generator::Documentation.new(pod) doc_generator = Generator::Documentation.new(pod)
......
...@@ -64,8 +64,9 @@ module Pod ...@@ -64,8 +64,9 @@ module Pod
spec = set.specification_by_name(dependency.name) spec = set.specification_by_name(dependency.name)
@loaded_specs << spec.name @loaded_specs << spec.name
@specs[spec.name] = spec @specs[spec.name] = spec
# Configure the specification
spec.activate_platform(target_definition.platform) spec.activate_platform(target_definition.platform)
spec.bleeding = dependency.bleeding? spec.version.head = dependency.head?
# And recursively load the dependencies of the spec. # And recursively load the dependencies of the spec.
find_dependency_specs(spec, spec.dependencies, target_definition) if spec.dependencies find_dependency_specs(spec, spec.dependencies, target_definition) if spec.dependencies
end end
......
...@@ -180,14 +180,6 @@ module Pod ...@@ -180,14 +180,6 @@ module Pod
@platform = Platform.new(*platform) @platform = Platform.new(*platform)
end end
# @!method bleeding
#
# @return [BOOL] returns wheter the specification is in bleeding mode.
#
attr_accessor :bleeding
alias_method :bleeding?, :bleeding
# If not platform is specified all the platforms are returned. # If not platform is specified all the platforms are returned.
def available_platforms def available_platforms
platform.nil? ? @define_for_platforms.map { |platform| Platform.new(platform, deployment_target(platform)) } : [ platform ] platform.nil? ? @define_for_platforms.map { |platform| Platform.new(platform, deployment_target(platform)) } : [ platform ]
...@@ -196,6 +188,7 @@ module Pod ...@@ -196,6 +188,7 @@ module Pod
### Top level attributes. These attributes represent the unique features of pod and can't be specified by subspecs. ### Top level attributes. These attributes represent the unique features of pod and can't be specified by subspecs.
top_attr_accessor :defined_in_file top_attr_accessor :defined_in_file
top_attr_accessor :source
top_attr_accessor :homepage top_attr_accessor :homepage
top_attr_accessor :summary top_attr_accessor :summary
top_attr_accessor :documentation top_attr_accessor :documentation
...@@ -205,23 +198,6 @@ module Pod ...@@ -205,23 +198,6 @@ module Pod
top_attr_reader :description, lambda { |instance, ivar| ivar || instance.summary } top_attr_reader :description, lambda { |instance, ivar| ivar || instance.summary }
top_attr_writer :description, lambda { |d| d.strip_heredoc } top_attr_writer :description, lambda { |d| d.strip_heredoc }
# @!method source
#
# @abstract
# Returns the source of the pod. If the specification is set in bleeding mode
# and the source is a git repository the head of master will be returned.
#
top_attr_writer :source
top_attr_reader :source, lambda { |instance, ivar|
if instance.bleeding?
raise Informative, 'Bleeding is supported only for git repos' unless ivar[:git]
{ :git => ivar[:git] }
else
ivar
end
}
# @!method license # @!method license
# #
# @abstract # @abstract
...@@ -374,15 +350,14 @@ module Pod ...@@ -374,15 +350,14 @@ module Pod
attr_reader :subspecs attr_reader :subspecs
def recursive_subspecs def recursive_subspecs
unless @recursive_subspecs @recursive_subspecs ||= begin
mapper = lambda do |spec| mapper = lambda do |spec|
spec.subspecs.map do |subspec| spec.subspecs.map do |subspec|
[subspec, *mapper.call(subspec)] [subspec, *mapper.call(subspec)]
end.flatten end.flatten
end end
@recursive_subspecs = mapper.call self mapper.call(self)
end end
@recursive_subspecs
end end
def subspec_by_name(name) def subspec_by_name(name)
...@@ -463,9 +438,7 @@ module Pod ...@@ -463,9 +438,7 @@ module Pod
end end
def to_s def to_s
result = "#{name} (#{version})" "#{name} (#{version})"
result << " [BLEEDING]" if bleeding?
result
end end
def inspect def inspect
......
...@@ -4,6 +4,8 @@ require 'rubygems/version' ...@@ -4,6 +4,8 @@ require 'rubygems/version'
module Pod module Pod
class Version < Gem::Version class Version < Gem::Version
attr_accessor :head
alias_method :head?, :head
end end
end end
require File.expand_path('../../spec_helper', __FILE__) require File.expand_path('../../spec_helper', __FILE__)
describe "Pod::Downloader" do module Pod
before do describe "Downloader" do
@pod = Pod::LocalPod.new(fixture_spec('banana-lib/BananaLib.podspec'), temporary_sandbox, Pod::Platform.ios) before do
end @pod = LocalPod.new(fixture_spec('banana-lib/BananaLib.podspec'), temporary_sandbox, Platform.ios)
end
describe "for Git" do describe "for Git" do
extend SpecHelper::TemporaryDirectory extend SpecHelper::TemporaryDirectory
it "check's out a specific commit" do it "check's out a specific commit" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :commit => 'fd56054' :git => fixture('banana-lib'), :commit => 'fd56054'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
downloader.download downloader.download
(@pod.root + 'README').read.strip.should == 'first commit' (@pod.root + 'README').read.strip.should == 'first commit'
end end
it "check's out a specific branch" do
@pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :branch => 'topicbranch'
)
downloader = Downloader.for_pod(@pod)
downloader.download
it "check's out a specific branch" do (@pod.root + 'README').read.strip.should == 'topicbranch'
@pod.top_specification.stubs(:source).returns( end
:git => fixture('banana-lib'), :branch => 'topicbranch'
it "check's out a specific tag" do
@pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :tag => 'v1.0'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
downloader.download downloader.download
(@pod.root + 'README').read.strip.should == 'topicbranch' (@pod.root + 'README').read.strip.should == 'v1.0'
end end
it "check's out a specific tag" do it "prepares the cache if it does not exits" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :tag => 'v1.0' :git => fixture('banana-lib'), :commit => 'fd56054'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
downloader.download downloader.cache_path.rmtree if downloader.cache_path.exist?
downloader.expects(:create_cache).once
downloader.stubs(:download_commit)
downloader.download
end
(@pod.root + 'README').read.strip.should == 'v1.0' it "removes the oldest repo if the caches is too big" do
end @pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :commit => 'fd56054'
)
original_chace_size = Downloader::Git::MAX_CACHE_SIZE
Downloader::Git.__send__(:remove_const,'MAX_CACHE_SIZE')
Downloader::Git::MAX_CACHE_SIZE = 0
downloader = Downloader.for_pod(@pod)
downloader.stubs(:cache_dir).returns(temporary_directory)
downloader.download
downloader.cache_path.should.not.exist?
Downloader::Git.__send__(:remove_const,'MAX_CACHE_SIZE')
Downloader::Git::MAX_CACHE_SIZE = original_chace_size
end
it "prepares the cache if it does not exits" do xit "raises if it can't find the url" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :commit => 'fd56054' :git => 'find_me_if_you_can'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
downloader.cache_path.rmtree if downloader.cache_path.exist? lambda { downloader.download }.should.raise Informative
downloader.expects(:create_cache).once end
downloader.stubs(:download_commit)
downloader.download
end
it "removes the oldest repo if the caches is too big" do it "raises if it can't find a commit" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :commit => 'fd56054' :git => fixture('banana-lib'), :commit => 'aaaaaa'
) )
original_chace_size = Pod::Downloader::Git::MAX_CACHE_SIZE downloader = Downloader.for_pod(@pod)
Pod::Downloader::Git.__send__(:remove_const,'MAX_CACHE_SIZE') lambda { downloader.download }.should.raise Informative
Pod::Downloader::Git::MAX_CACHE_SIZE = 0 end
downloader = Pod::Downloader.for_pod(@pod)
downloader.stubs(:cache_dir).returns(temporary_directory)
downloader.download
downloader.cache_path.should.not.exist?
Pod::Downloader::Git.__send__(:remove_const,'MAX_CACHE_SIZE')
Pod::Downloader::Git::MAX_CACHE_SIZE = original_chace_size
end
xit "raises if it can't find the url" do it "raises if it can't find a tag" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => 'find_me_if_you_can' :git => fixture('banana-lib'), :tag => 'aaaaaa'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
lambda { downloader.download }.should.raise Pod::Informative lambda { downloader.download }.should.raise Informative
end end
it "raises if it can't find a commit" do it "does not raise if it can find the reference" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :commit => 'aaaaaa' :git => fixture('banana-lib'), :commit => 'fd56054'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
lambda { downloader.download }.should.raise Pod::Informative lambda { downloader.download }.should.not.raise
end end
it "raises if it can't find a tag" do it "returns the cache directory as the clone url" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :tag => 'aaaaaa' :git => fixture('banana-lib'), :commit => 'fd56054'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
lambda { downloader.download }.should.raise Pod::Informative downloader.clone_url.to_s.should.match /Library\/Caches\/CocoaPods\/Git/
end end
it "does not raise if it can find the reference" do it "updates the cache if the HEAD is requested" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :commit => 'fd56054' :git => fixture('banana-lib')
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
lambda { downloader.download }.should.not.raise downloader.expects(:update_cache).once
end downloader.download
end
it "returns the cache directory as the clone url" do it "updates the cache if the ref is not available" do
@pod.top_specification.stubs(:source).returns( # create the origin repo and the cache
:git => fixture('banana-lib'), :commit => 'fd56054' tmp_repo_path = temporary_directory + 'banana-lib-source'
) `git clone #{fixture('banana-lib')} #{tmp_repo_path}`
downloader = Pod::Downloader.for_pod(@pod)
downloader.clone_url.to_s.should.match /Library\/Caches\/CocoaPods\/Git/
end
it "updates the cache if the HEAD is requested" do @pod.top_specification.stubs(:source).returns(
@pod.top_specification.stubs(:source).returns( :git => tmp_repo_path, :commit => 'fd56054'
:git => fixture('banana-lib') )
) downloader = Downloader.for_pod(@pod)
downloader = Pod::Downloader.for_pod(@pod) downloader.download
downloader.expects(:update_cache).once
downloader.download
end
it "updates the cache if the ref is not available" do # make a new commit in the origin
# create the origin repo and the cache commit = ''
tmp_repo_path = temporary_directory + 'banana-lib-source' Dir.chdir(tmp_repo_path) do
`git clone #{fixture('banana-lib')} #{tmp_repo_path}` `touch test.txt`
`git add test.txt`
@pod.top_specification.stubs(:source).returns( `git commit -m 'test'`
:git => tmp_repo_path, :commit => 'fd56054' commit = `git rev-parse HEAD`.chomp
) end
downloader = Pod::Downloader.for_pod(@pod)
downloader.download # require the new commit
pod = LocalPod.new(fixture_spec('banana-lib/BananaLib.podspec'), temporary_sandbox, Platform.ios)
# make a new commit in the origin pod.top_specification.stubs(:source).returns(
commit = '' :git => tmp_repo_path, :commit => commit
Dir.chdir(tmp_repo_path) do )
`touch test.txt` downloader = Downloader.for_pod(pod)
`git add test.txt` downloader.download
`git commit -m 'test'` (pod.root + 'test.txt').should.exist?
commit = `git rev-parse HEAD`.chomp end
end
# require the new commit
pod = Pod::LocalPod.new(fixture_spec('banana-lib/BananaLib.podspec'), temporary_sandbox, Pod::Platform.ios)
pod.top_specification.stubs(:source).returns(
:git => tmp_repo_path, :commit => commit
)
downloader = Pod::Downloader.for_pod(pod)
downloader.download
(pod.root + 'test.txt').should.exist?
end
it "doesn't updates cache the if the ref is available" do it "doesn't updates cache the if the ref is available" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => fixture('banana-lib'), :commit => 'fd56054' :git => fixture('banana-lib'), :commit => 'fd56054'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
downloader.download downloader.download
downloader.expects(:update_cache).never downloader.expects(:update_cache).never
downloader.download downloader.download
end
end end
end
describe "for GitHub repositories, with :download_only set to true" do describe "for GitHub repositories, with :download_only set to true" do
extend SpecHelper::TemporaryDirectory extend SpecHelper::TemporaryDirectory
it "downloads HEAD with no other options specified" do it "downloads HEAD with no other options specified" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => "git://github.com/lukeredpath/libPusher.git", :download_only => true :git => "git://github.com/lukeredpath/libPusher.git", :download_only => true
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download } VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download }
# deliberately keep this assertion as loose as possible for now # deliberately keep this assertion as loose as possible for now
(@pod.root + 'README.md').readlines[0].should =~ /libPusher/ (@pod.root + 'README.md').readlines[0].should =~ /libPusher/
end end
it "downloads a specific tag when specified" do it "downloads a specific tag when specified" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => "git://github.com/lukeredpath/libPusher.git", :tag => 'v1.1', :download_only => true :git => "git://github.com/lukeredpath/libPusher.git", :tag => 'v1.1', :download_only => true
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download } VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download }
# deliberately keep this assertion as loose as possible for now # deliberately keep this assertion as loose as possible for now
(@pod.root + 'libPusher.podspec').readlines.grep(/1.1/).should.not.be.empty (@pod.root + 'libPusher.podspec').readlines.grep(/1.1/).should.not.be.empty
end end
it "downloads a specific branch when specified" do it "downloads a specific branch when specified" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => "git://github.com/lukeredpath/libPusher.git", :branch => 'gh-pages', :download_only => true :git => "git://github.com/lukeredpath/libPusher.git", :branch => 'gh-pages', :download_only => true
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download } VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download }
# deliberately keep this assertion as loose as possible for now # deliberately keep this assertion as loose as possible for now
(@pod.root + 'index.html').readlines.grep(/libPusher Documentation/).should.not.be.empty (@pod.root + 'index.html').readlines.grep(/libPusher Documentation/).should.not.be.empty
end end
it "downloads a specific commit when specified" do it "downloads a specific commit when specified" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:git => "git://github.com/lukeredpath/libPusher.git", :commit => 'eca89998d5', :download_only => true :git => "git://github.com/lukeredpath/libPusher.git", :commit => 'eca89998d5', :download_only => true
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download } VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download }
# deliberately keep this assertion as loose as possible for now # deliberately keep this assertion as loose as possible for now
(@pod.root + 'README.md').readlines[0].should =~ /PusherTouch/ (@pod.root + 'README.md').readlines[0].should =~ /PusherTouch/
end
end end
end
describe "for Mercurial" do describe "for Mercurial" do
it "check's out a specific revision" do it "check's out a specific revision" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:hg => fixture('mercurial-repo'), :revision => '46198bb3af96' :hg => fixture('mercurial-repo'), :revision => '46198bb3af96'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
downloader.download downloader.download
(@pod.root + 'README').read.strip.should == 'first commit' (@pod.root + 'README').read.strip.should == 'first commit'
end
end end
end
describe "for Subversion" do describe "for Subversion" do
it "check's out a specific revision" do it "check's out a specific revision" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:svn => "file://#{fixture('subversion-repo')}", :revision => '1' :svn => "file://#{fixture('subversion-repo')}", :revision => '1'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
downloader.download downloader.download
(@pod.root + 'README').read.strip.should == 'first commit' (@pod.root + 'README').read.strip.should == 'first commit'
end end
it "check's out a specific tag" do it "check's out a specific tag" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:svn => "file://#{fixture('subversion-repo')}/tags/tag-1" :svn => "file://#{fixture('subversion-repo')}/tags/tag-1"
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
downloader.download downloader.download
(@pod.root + 'README').read.strip.should == 'tag 1' (@pod.root + 'README').read.strip.should == 'tag 1'
end
end end
end
describe "for Http" do describe "for Http" do
extend SpecHelper::TemporaryDirectory extend SpecHelper::TemporaryDirectory
it "download file and unzip it" do it "download file and unzip it" do
@pod.top_specification.stubs(:source).returns( @pod.top_specification.stubs(:source).returns(
:http => 'http://dl.google.com/googleadmobadssdk/googleadmobsearchadssdkios.zip' :http => 'http://dl.google.com/googleadmobadssdk/googleadmobsearchadssdkios.zip'
) )
downloader = Pod::Downloader.for_pod(@pod) downloader = Downloader.for_pod(@pod)
VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download } VCR.use_cassette('tarballs', :record => :new_episodes) { downloader.download }
(@pod.root + 'GoogleAdMobSearchAdsSDK/GADSearchRequest.h').should.exist (@pod.root + 'GoogleAdMobSearchAdsSDK/GADSearchRequest.h').should.exist
(@pod.root + 'GoogleAdMobSearchAdsSDK/GADSearchRequest.h').read.strip.should =~ /Google Search Ads iOS SDK/ (@pod.root + 'GoogleAdMobSearchAdsSDK/GADSearchRequest.h').read.strip.should =~ /Google Search Ads iOS SDK/
end
end end
end end
end end
require File.expand_path('../../spec_helper', __FILE__) require File.expand_path('../../spec_helper', __FILE__)
describe "Pod::Dependency" do module Pod
it "merges dependencies (taken from newer RubyGems version)" do describe Dependency do
dep1 = Pod::Dependency.new('bananas', '>= 1.8') it "merges dependencies (taken from newer RubyGems version)" do
dep2 = Pod::Dependency.new('bananas', '1.9') dep1 = Dependency.new('bananas', '>= 1.8')
dep1.merge(dep2).should == Pod::Dependency.new('bananas', '>= 1.8', '1.9') dep2 = Dependency.new('bananas', '1.9')
end dep1.merge(dep2).should == Dependency.new('bananas', '>= 1.8', '1.9')
end
it "returns the name of the dependency, or the name of the pod of which this is a subspec" do it "returns the name of the dependency, or the name of the pod of which this is a subspec" do
dep = Pod::Dependency.new('RestKit') dep = Dependency.new('RestKit')
dep.top_level_spec_name.should == 'RestKit' dep.top_level_spec_name.should == 'RestKit'
dep = Pod::Dependency.new('RestKit/Networking') dep = Dependency.new('RestKit/Networking')
dep.top_level_spec_name.should == 'RestKit' dep.top_level_spec_name.should == 'RestKit'
end end
it "returns a copy of the dependency but for the top level spec, if it's a subspec" do it "returns a copy of the dependency but for the top level spec, if it's a subspec" do
dep = Pod::Dependency.new('RestKit', '>= 1.2.3') dep = Dependency.new('RestKit', '>= 1.2.3')
dep.to_top_level_spec_dependency.should == Pod::Dependency.new('RestKit', '>= 1.2.3') dep.to_top_level_spec_dependency.should == Dependency.new('RestKit', '>= 1.2.3')
dep = Pod::Dependency.new('RestKit/Networking', '>= 1.2.3') dep = Dependency.new('RestKit/Networking', '>= 1.2.3')
dep.to_top_level_spec_dependency.should == Pod::Dependency.new('RestKit', '>= 1.2.3') dep.to_top_level_spec_dependency.should == Dependency.new('RestKit', '>= 1.2.3')
end end
it "is equal to another dependency if `external_source' is the same" do it "is equal to another dependency if `external_source' is the same" do
dep1 = Pod::Dependency.new('bananas', :git => 'GIT-URL') dep1 = Dependency.new('bananas', :git => 'GIT-URL')
dep2 = Pod::Dependency.new('bananas') dep2 = Dependency.new('bananas')
dep1.should.not == dep2 dep1.should.not == dep2
dep3 = Pod::Dependency.new('bananas', :git => 'GIT-URL') dep3 = Dependency.new('bananas', :git => 'GIT-URL')
dep1.should == dep3 dep1.should == dep3
end end
it "is equal to another dependency if `specification' is equal" do it "is equal to another dependency if `specification' is equal" do
dep1 = Pod::Dependency.new { |s| s.name = 'bananas'; s.version = '1' } dep1 = Dependency.new { |s| s.name = 'bananas'; s.version = '1' }
dep2 = Pod::Dependency.new('bananas') dep2 = Dependency.new('bananas')
dep1.should.not == dep2 dep1.should.not == dep2
dep2 = Pod::Dependency.new { |s| s.name = 'bananas'; s.version = '1' } dep2 = Dependency.new { |s| s.name = 'bananas'; s.version = '1' }
dep1.should == dep2 dep1.should == dep2
end end
it 'raises if created without either valid name/version/external requirements or a block' do it 'raises if created without either valid name/version/external requirements or a block' do
lambda { Pod::Dependency.new }.should.raise Pod::Informative lambda { Dependency.new }.should.raise Informative
end end
end
describe "Pod::Dependency", "defined with a block" do describe "defined with a block" do
before do before do
@dependency = Pod::Dependency.new do |spec| @dependency = Dependency.new do |spec|
spec.name = "my-custom-spec" spec.name = "my-custom-spec"
spec.version = "1.0.3" spec.version = "1.0.3"
end
end
it 'it identifies itself as an inline dependency' do
@dependency.should.be.inline
end
it 'attaches a custom spec to the dependency, configured by the block' do
@dependency.specification.name.should == "my-custom-spec"
end
end end
end
it 'it identifies itself as an inline dependency' do
@dependency.should.be.inline
end
it 'attaches a custom spec to the dependency, configured by the block' do
@dependency.specification.name.should == "my-custom-spec"
end
end
describe "Pod::Dependency", "with a hash of external source settings" do describe "with a hash of external source settings" do
before do before do
@dependency = Pod::Dependency.new("cocoapods", :git => "git://github.com/cocoapods/cocoapods") @dependency = Dependency.new("cocoapods", :git => "git://github.com/cocoapods/cocoapods")
end end
it 'it identifies itself as an external dependency' do it 'identifies itself as an external dependency' do
@dependency.should.be.external @dependency.should.be.external
end
end
describe "with flags" do
it "identifies itself as a `bleeding edge' dependency" do
dependency = Dependency.new("cocoapods", :head)
dependency.should.be.head
dependency.to_s.should == "cocoapods [HEAD]"
end
it "only supports the `:head' option on the last version of a pod" do
should.raise Informative do
Dependency.new("cocoapods", "1.2.3", :head)
end
end
it "raises if an invalid flag is given" do
should.raise ArgumentError do
Dependency.new("cocoapods", :foot)
end
end
end
end end
end end
require File.expand_path('../../spec_helper', __FILE__) require File.expand_path('../../spec_helper', __FILE__)
def stub_pod_with_source(source_options) def stub_pod_with_source(source_options)
specification = stub( specification = stub(:source => source_options)
:source => source_options
)
stub('pod') do stub('pod') do
stubs(:root).returns(temporary_sandbox.root) stubs(:root).returns(temporary_sandbox.root)
stubs(:top_specification).returns(specification) stubs(:top_specification).returns(specification)
end end
end end
describe "Pod::Downloader" do module Pod
it "returns a git downloader with parsed options" do describe Downloader do
pod = Pod::LocalPod.new(fixture_spec('banana-lib/BananaLib.podspec'), temporary_sandbox, Pod::Platform.ios) it "returns a git downloader with parsed options" do
downloader = Pod::Downloader.for_pod(pod) pod = LocalPod.new(fixture_spec('banana-lib/BananaLib.podspec'), temporary_sandbox, Platform.ios)
downloader.should.be.instance_of Pod::Downloader::Git downloader = Downloader.for_pod(pod)
downloader.url.should == 'http://banana-corp.local/banana-lib.git' downloader.should.be.instance_of Downloader::Git
downloader.options.should == { :tag => 'v1.0' } downloader.url.should == 'http://banana-corp.local/banana-lib.git'
downloader.options.should == { :tag => 'v1.0' }
end
it 'returns a github downloader when the :git URL is on github' do
pod = LocalPod.new(fixture_spec('banana-lib/BananaLib.podspec'), temporary_sandbox, Platform.ios)
pod.top_specification.stubs(:source).returns(:git => "git://github.com/CocoaPods/CocoaPods")
downloader = Downloader.for_pod(pod)
downloader.should.be.instance_of Downloader::GitHub
end
end end
it 'returns a github downloader when the :git URL is on github' do describe Downloader::GitHub do
pod = Pod::LocalPod.new(fixture_spec('banana-lib/BananaLib.podspec'), temporary_sandbox, Pod::Platform.ios) it 'can convert public HTTP repository URLs to the tarball URL' do
pod.top_specification.stubs(:source).returns(:git => "git://github.com/CocoaPods/CocoaPods") downloader = Downloader.for_pod(stub_pod_with_source(
downloader = Pod::Downloader.for_pod(pod) :git => "https://github.com/CocoaPods/CocoaPods.git"
downloader.should.be.instance_of Pod::Downloader::GitHub ))
downloader.tarball_url_for('master').should == "https://github.com/CocoaPods/CocoaPods/tarball/master"
end
it 'can convert private HTTP repository URLs to the tarball URL' do
downloader = Downloader.for_pod(stub_pod_with_source(
:git => "https://lukeredpath@github.com/CocoaPods/CocoaPods.git"
))
downloader.tarball_url_for('master').should == "https://github.com/CocoaPods/CocoaPods/tarball/master"
end
it 'can convert private SSH repository URLs to the tarball URL' do
downloader = Downloader.for_pod(stub_pod_with_source(
:git => "git@github.com:CocoaPods/CocoaPods.git"
))
downloader.tarball_url_for('master').should == "https://github.com/CocoaPods/CocoaPods/tarball/master"
end
it 'can convert public git protocol repository URLs to the tarball URL' do
downloader = Downloader.for_pod(stub_pod_with_source(
:git => "git://github.com/CocoaPods/CocoaPods.git"
))
downloader.tarball_url_for('master').should == "https://github.com/CocoaPods/CocoaPods/tarball/master"
end
end end
end end
describe Pod::Downloader::GitHub do
it 'can convert public HTTP repository URLs to the tarball URL' do
downloader = Pod::Downloader.for_pod(stub_pod_with_source(
:git => "https://github.com/CocoaPods/CocoaPods.git"
))
downloader.tarball_url_for('master').should == "https://github.com/CocoaPods/CocoaPods/tarball/master"
end
it 'can convert private HTTP repository URLs to the tarball URL' do
downloader = Pod::Downloader.for_pod(stub_pod_with_source(
:git => "https://lukeredpath@github.com/CocoaPods/CocoaPods.git"
))
downloader.tarball_url_for('master').should == "https://github.com/CocoaPods/CocoaPods/tarball/master"
end
it 'can convert private SSH repository URLs to the tarball URL' do
downloader = Pod::Downloader.for_pod(stub_pod_with_source(
:git => "git@github.com:CocoaPods/CocoaPods.git"
))
downloader.tarball_url_for('master').should == "https://github.com/CocoaPods/CocoaPods/tarball/master"
end
it 'can convert public git protocol repository URLs to the tarball URL' do
downloader = Pod::Downloader.for_pod(stub_pod_with_source(
:git => "git://github.com/CocoaPods/CocoaPods.git"
))
downloader.tarball_url_for('master').should == "https://github.com/CocoaPods/CocoaPods/tarball/master"
end
end
require File.expand_path('../../spec_helper', __FILE__) require File.expand_path('../../spec_helper', __FILE__)
describe "Pod::Installer" do module Pod
before do describe Installer do
config.repos_dir = fixture('spec-repos')
config.project_pods_root = fixture('integration')
end
describe "by default" do
before do before do
podfile = Pod::Podfile.new do config.repos_dir = fixture('spec-repos')
platform :ios config.project_pods_root = fixture('integration')
xcodeproj 'MyProject'
pod 'JSONKit'
end
@xcconfig = Pod::Installer.new(podfile).target_installers.first.xcconfig.to_hash
end end
it "sets the header search paths where installed Pod headers can be found" do describe "by default" do
@xcconfig['ALWAYS_SEARCH_USER_PATHS'].should == 'YES' before do
end podfile = Podfile.new do
platform :ios
xcodeproj 'MyProject'
pod 'JSONKit'
end
@xcconfig = Installer.new(podfile).target_installers.first.xcconfig.to_hash
end
it "configures the project to load all members that implement Objective-c classes or categories from the static library" do it "sets the header search paths where installed Pod headers can be found" do
@xcconfig['OTHER_LDFLAGS'].should == '-ObjC' @xcconfig['ALWAYS_SEARCH_USER_PATHS'].should == 'YES'
end end
it "configures the project to load all members that implement Objective-c classes or categories from the static library" do
@xcconfig['OTHER_LDFLAGS'].should == '-ObjC'
end
it "sets the PODS_ROOT build variable" do it "sets the PODS_ROOT build variable" do
@xcconfig['PODS_ROOT'].should.not == nil @xcconfig['PODS_ROOT'].should.not == nil
end
end end
end
it "generates a BridgeSupport metadata file from all the pod headers" do it "generates a BridgeSupport metadata file from all the pod headers" do
podfile = Pod::Podfile.new do podfile = Podfile.new do
platform :osx platform :osx
pod 'ASIHTTPRequest' pod 'ASIHTTPRequest'
end
installer = Installer.new(podfile)
pods = installer.specifications.map do |spec|
LocalPod.new(spec, installer.sandbox, podfile.target_definitions[:default].platform)
end
expected = pods.map { |pod| pod.header_files }.flatten.map { |header| config.project_pods_root + header }
expected.size.should > 0
installer.target_installers.first.bridge_support_generator_for(pods, installer.sandbox).headers.should == expected
end end
installer = Pod::Installer.new(podfile)
pods = installer.specifications.map do |spec| it "omits empty target definitions" do
Pod::LocalPod.new(spec, installer.sandbox, podfile.target_definitions[:default].platform) podfile = Podfile.new do
platform :ios
target :not_empty do
pod 'JSONKit'
end
end
installer = Installer.new(podfile)
installer.target_installers.map(&:target_definition).map(&:name).should == [:not_empty]
end end
expected = pods.map { |pod| pod.header_files }.flatten.map { |header| config.project_pods_root + header }
expected.size.should > 0
installer.target_installers.first.bridge_support_generator_for(pods, installer.sandbox).headers.should == expected
end
it "omits empty target definitions" do it "adds the user's build configurations" do
podfile = Pod::Podfile.new do path = fixture('SampleProject/SampleProject.xcodeproj')
platform :ios podfile = Podfile.new do
target :not_empty do platform :ios
pod 'JSONKit' xcodeproj path, 'App Store' => :release
end end
installer = Installer.new(podfile)
installer.project.build_configurations.map(&:name).sort.should == ['App Store', 'Debug', 'Release', 'Test']
end end
installer = Pod::Installer.new(podfile)
installer.target_installers.map(&:target_definition).map(&:name).should == [:not_empty]
end
it "adds the user's build configurations" do it "forces downloading of the `bleeding edge' version of a pod" do
path = fixture('SampleProject/SampleProject.xcodeproj') podfile = Podfile.new do
podfile = Pod::Podfile.new do platform :ios
platform :ios pod 'JSONKit', :head
xcodeproj path, 'App Store' => :release end
installer = Installer.new(podfile)
pod = installer.pods.first
downloader = stub('Downloader')
Downloader.stubs(:for_pod).returns(downloader)
downloader.expects(:download_head)
installer.download_pod(pod)
end end
installer = Pod::Installer.new(podfile)
installer.project.build_configurations.map(&:name).sort.should == ['App Store', 'Debug', 'Release', 'Test']
end end
end end
require File.expand_path('../../spec_helper', __FILE__) require File.expand_path('../../spec_helper', __FILE__)
describe "Pod::Resolver" do module Pod
before do describe Resolver do
config.repos_dir = fixture('spec-repos') before do
config.repos_dir = fixture('spec-repos')
@podfile = Pod::Podfile.new do
platform :ios
pod 'BlocksKit'
# pod 'ASIWebPageRequest'
end
@resolver = Pod::Resolver.new(@podfile, stub('sandbox'))
end
it "holds the context state, such as cached specification sets" do @podfile = Podfile.new do
@resolver.resolve platform :ios
@resolver.cached_sets.values.sort_by(&:name).should == [ pod 'BlocksKit'
Pod::Spec::Set.new(config.repos_dir + 'master/A2DynamicDelegate'), # pod 'ASIWebPageRequest'
Pod::Spec::Set.new(config.repos_dir + 'master/BlocksKit'), end
Pod::Spec::Set.new(config.repos_dir + 'master/libffi'), @resolver = Resolver.new(@podfile, stub('sandbox'))
].sort_by(&:name) end
end
it "returns all specs needed for the dependency" do it "holds the context state, such as cached specification sets" do
specs = @resolver.resolve.values.flatten @resolver.resolve
specs.map(&:class).uniq.should == [Pod::Specification] @resolver.cached_sets.values.sort_by(&:name).should == [
specs.map(&:name).sort.should == %w{ A2DynamicDelegate BlocksKit libffi } Spec::Set.new(config.repos_dir + 'master/A2DynamicDelegate'),
end Spec::Set.new(config.repos_dir + 'master/BlocksKit'),
Spec::Set.new(config.repos_dir + 'master/libffi'),
].sort_by(&:name)
end
it "does not raise if all dependencies match the platform of the root spec (Podfile)" do it "returns all specs needed for the dependency" do
@podfile.platform :ios specs = @resolver.resolve.values.flatten
lambda { @resolver.resolve }.should.not.raise specs.map(&:class).uniq.should == [Specification]
@podfile.platform :osx specs.map(&:name).sort.should == %w{ A2DynamicDelegate BlocksKit libffi }
lambda { @resolver.resolve }.should.not.raise end
end
it "raises once any of the dependencies does not match the platform of its podfile target" do it "does not raise if all dependencies match the platform of the root spec (Podfile)" do
set = Pod::Spec::Set.new(config.repos_dir + 'master/BlocksKit') @podfile.platform :ios
@resolver.cached_sets['BlocksKit'] = set lambda { @resolver.resolve }.should.not.raise
@podfile.platform :osx
lambda { @resolver.resolve }.should.not.raise
end
def set.stub_platform=(platform); @stubbed_platform = platform; end it "raises once any of the dependencies does not match the platform of its podfile target" do
def set.specification; spec = super; spec.platform = @stubbed_platform; spec; end set = Spec::Set.new(config.repos_dir + 'master/BlocksKit')
@resolver.cached_sets['BlocksKit'] = set
@podfile.platform :ios def set.stub_platform=(platform); @stubbed_platform = platform; end
set.stub_platform = :ios def set.specification; spec = super; spec.platform = @stubbed_platform; spec; end
lambda { @resolver.resolve }.should.not.raise
set.stub_platform = :osx
lambda { @resolver.resolve }.should.raise Pod::Informative
@podfile.platform :osx @podfile.platform :ios
set.stub_platform = :osx set.stub_platform = :ios
lambda { @resolver.resolve }.should.not.raise lambda { @resolver.resolve }.should.not.raise
set.stub_platform = :ios set.stub_platform = :osx
lambda { @resolver.resolve }.should.raise Pod::Informative lambda { @resolver.resolve }.should.raise Informative
end
it "raises once any of the dependencies does not have a deployment_target compatible with its podfile target" do @podfile.platform :osx
set = Pod::Spec::Set.new(config.repos_dir + 'master/BlocksKit') set.stub_platform = :osx
@resolver.cached_sets['BlocksKit'] = set lambda { @resolver.resolve }.should.not.raise
@podfile.platform :ios, "4.0" set.stub_platform = :ios
lambda { @resolver.resolve }.should.raise Informative
end
Pod::Specification.any_instance.stubs(:available_platforms).returns([ Pod::Platform.new(:ios, '4.0'), Pod::Platform.new(:osx, '10.7') ]) it "raises once any of the dependencies does not have a deployment_target compatible with its podfile target" do
lambda { @resolver.resolve }.should.not.raise set = Spec::Set.new(config.repos_dir + 'master/BlocksKit')
@resolver.cached_sets['BlocksKit'] = set
@podfile.platform :ios, "4.0"
Pod::Specification.any_instance.stubs(:available_platforms).returns([ Pod::Platform.new(:ios, '5.0'), Pod::Platform.new(:osx, '10.7') ]) Specification.any_instance.stubs(:available_platforms).returns([ Platform.new(:ios, '4.0'), Platform.new(:osx, '10.7') ])
lambda { @resolver.resolve }.should.raise Pod::Informative lambda { @resolver.resolve }.should.not.raise
end
it "resolves subspecs" do Specification.any_instance.stubs(:available_platforms).returns([ Platform.new(:ios, '5.0'), Platform.new(:osx, '10.7') ])
@podfile = Pod::Podfile.new do lambda { @resolver.resolve }.should.raise Informative
platform :ios
pod 'RestKit/Network'
pod 'RestKit/ObjectMapping/XML'
end end
resolver = Pod::Resolver.new(@podfile, stub('sandbox'))
resolver.resolve.values.flatten.map(&:name).sort.should == %w{
FileMD5Hash
ISO8601DateFormatter
LibComponentLogging-Core
LibComponentLogging-NSLog
NSData+Base64
RestKit/Network
RestKit/ObjectMapping/XML
SOCKit
XMLReader
cocoa-oauth
}
end
it "includes all the subspecs of a specification node" do it "resolves subspecs" do
@podfile = Pod::Podfile.new do @podfile = Podfile.new do
platform :ios platform :ios
pod 'RestKit' pod 'RestKit/Network'
pod 'RestKit/ObjectMapping/XML'
end
resolver = Resolver.new(@podfile, stub('sandbox'))
resolver.resolve.values.flatten.map(&:name).sort.should == %w{
FileMD5Hash
ISO8601DateFormatter
LibComponentLogging-Core
LibComponentLogging-NSLog
NSData+Base64
RestKit/Network
RestKit/ObjectMapping/XML
SOCKit
XMLReader
cocoa-oauth
}
end end
resolver = Pod::Resolver.new(@podfile, stub('sandbox'))
resolver.resolve.values.flatten.map(&:name).sort.should == %w{
FileMD5Hash
ISO8601DateFormatter
JSONKit
LibComponentLogging-Core
LibComponentLogging-NSLog
NSData+Base64
RestKit
RestKit/JSON
RestKit/Network
RestKit/ObjectMapping/CoreData
RestKit/ObjectMapping/JSON
RestKit/UI
SOCKit
cocoa-oauth
}
end
it "if defined it includes only the main subspec of of a specification node" do
@podfile = Pod::Podfile.new do
platform :ios
pod do |s|
s.name = 'RestKit'
s.version = '0.10.0'
s.preferred_dependency = 'JSON'
s.subspec 'JSON' do |js| it "includes all the subspecs of a specification node" do
js.dependency 'RestKit/Network' @podfile = Podfile.new do
js.dependency 'RestKit/UI' platform :ios
js.dependency 'RestKit/ObjectMapping/JSON' pod 'RestKit'
js.dependency 'RestKit/ObjectMapping/CoreData' end
end resolver = Resolver.new(@podfile, stub('sandbox'))
resolver.resolve.values.flatten.map(&:name).sort.should == %w{
FileMD5Hash
ISO8601DateFormatter
JSONKit
LibComponentLogging-Core
LibComponentLogging-NSLog
NSData+Base64
RestKit
RestKit/JSON
RestKit/Network
RestKit/ObjectMapping/CoreData
RestKit/ObjectMapping/JSON
RestKit/UI
SOCKit
cocoa-oauth
}
end
s.subspec 'Network' do |ns| it "it includes only the main subspec of a specification node" do
ns.dependency 'LibComponentLogging-NSLog', '>= 1.0.4' @podfile = Podfile.new do
end platform :ios
s.subspec 'UI' pod do |s|
s.subspec 'ObjectMapping' do |os| s.name = 'RestKit'
os.subspec 'JSON' s.version = '0.10.0'
os.subspec 'XML'
os.subspec 'CoreData' s.preferred_dependency = 'JSON'
s.subspec 'JSON' do |js|
js.dependency 'RestKit/Network'
js.dependency 'RestKit/UI'
js.dependency 'RestKit/ObjectMapping/JSON'
js.dependency 'RestKit/ObjectMapping/CoreData'
end
s.subspec 'Network' do |ns|
ns.dependency 'LibComponentLogging-NSLog', '>= 1.0.4'
end
s.subspec 'UI'
s.subspec 'ObjectMapping' do |os|
os.subspec 'JSON'
os.subspec 'XML'
os.subspec 'CoreData'
end
end end
end end
resolver = Resolver.new(@podfile, stub('sandbox'))
specs = resolver.resolve.values.flatten.map(&:name).sort
specs.should.not.include 'RestKit/ObjectMapping/XML'
specs.should == %w{
LibComponentLogging-Core
LibComponentLogging-NSLog
RestKit
RestKit/JSON
RestKit/Network
RestKit/ObjectMapping/CoreData
RestKit/ObjectMapping/JSON
RestKit/UI
}
end end
resolver = Pod::Resolver.new(@podfile, stub('sandbox'))
resolver.resolve.values.flatten.map(&:name).sort.should == %w{
LibComponentLogging-Core
LibComponentLogging-NSLog
RestKit
RestKit/JSON
RestKit/Network
RestKit/ObjectMapping/CoreData
RestKit/ObjectMapping/JSON
RestKit/UI
}
it "resolves subspecs with external constraints" do it "resolves subspecs with external constraints" do
@podfile = Pod::Podfile.new do @podfile = Podfile.new do
platform :ios platform :ios
pod 'MainSpec/FirstSubSpec', :git => 'GIT-URL' pod 'MainSpec/FirstSubSpec', :git => 'GIT-URL'
end end
spec = Pod::Spec.new do |s| spec = Spec.new do |s|
s.name = 'MainSpec' s.name = 'MainSpec'
s.version = '1.2.3' s.version = '1.2.3'
s.platform = :ios s.platform = :ios
...@@ -171,9 +175,20 @@ describe "Pod::Resolver" do ...@@ -171,9 +175,20 @@ describe "Pod::Resolver" do
end end
end end
@podfile.dependencies.first.external_source.stubs(:specification_from_sandbox).returns(spec) @podfile.dependencies.first.external_source.stubs(:specification_from_sandbox).returns(spec)
resolver = Pod::Resolver.new(@podfile, stub('sandbox')) resolver = Resolver.new(@podfile, stub('sandbox'))
resolver.resolve.values.flatten.map(&:name).sort.should == %w{ MainSpec/FirstSubSpec MainSpec/FirstSubSpec/SecondSubSpec } resolver.resolve.values.flatten.map(&:name).sort.should == %w{ MainSpec/FirstSubSpec MainSpec/FirstSubSpec/SecondSubSpec }
end end
it "marks a specification's version to be a `bleeding edge' version" do
podfile = Podfile.new do
platform :ios
pod 'FileMD5Hash'
pod 'JSONKit', :head
end
resolver = Resolver.new(podfile, stub('sandbox'))
filemd5hash, jsonkit = resolver.resolve.values.first.sort_by(&:name)
filemd5hash.version.should.not.be.head
jsonkit.version.should.be.head
end
end end
end end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment