Commit a6029d66 authored by Fabio Pelosin's avatar Fabio Pelosin

[Integration] Cleaned specs.

parent 5190db62
GIT GIT
remote: git://github.com/CocoaPods/Core.git remote: git://github.com/CocoaPods/Core.git
revision: 08a308017a4fbf327143f14353cf698460088ac9 revision: 65076d5eb9b6b99ecce7b4628ce08b4c0f98f192
specs: specs:
cocoapods-core (0.17.0.alpha) cocoapods-core (0.17.0.alpha)
activesupport (~> 3.2.6) activesupport (~> 3.2.6)
...@@ -63,7 +63,7 @@ GEM ...@@ -63,7 +63,7 @@ GEM
multipart-post (~> 1.1) multipart-post (~> 1.1)
faraday_middleware (0.9.0) faraday_middleware (0.9.0)
faraday (>= 0.7.4, < 0.9) faraday (>= 0.7.4, < 0.9)
github-markup (0.7.4) github-markup (0.7.5)
hashie (1.2.0) hashie (1.2.0)
i18n (0.6.1) i18n (0.6.1)
json (1.7.5) json (1.7.5)
......
...@@ -128,6 +128,13 @@ module Pod ...@@ -128,6 +128,13 @@ module Pod
#-------------------------------------------------------------------------# #-------------------------------------------------------------------------#
# @!group Hooks compatiblity
alias :project :pods_project
alias :pods :local_pods
#-------------------------------------------------------------------------#
# @!group Installation steps # @!group Installation steps
private private
...@@ -238,7 +245,7 @@ module Pod ...@@ -238,7 +245,7 @@ module Pod
unless analyzer.sandbox_state.deleted.empty? unless analyzer.sandbox_state.deleted.empty?
UI.section "Removing deleted dependencies" do UI.section "Removing deleted dependencies" do
pods_deleted_from_the_lockfile.each do |pod_name| analyzer.sandbox_state.deleted.each do |pod_name|
UI.section("Removing #{pod_name}", "-> ".red) do UI.section("Removing #{pod_name}", "-> ".red) do
path = sandbox.root + pod_name path = sandbox.root + pod_name
path.rmtree if path.exist? path.rmtree if path.exist?
......
...@@ -203,7 +203,7 @@ module Pod ...@@ -203,7 +203,7 @@ module Pod
lib.user_targets = [] lib.user_targets = []
lib.user_build_configurations = {} lib.user_build_configurations = {}
lib.platform = target_definition.platform lib.platform = target_definition.platform
raise Informative "It is necessary to specify the platform in the Podfile if not integrating." unless target_definition.platform raise Informative, "It is necessary to specify the platform in the Podfile if not integrating." unless target_definition.platform
end end
libraries << lib libraries << lib
end end
......
...@@ -3,195 +3,150 @@ require 'yaml' ...@@ -3,195 +3,150 @@ require 'yaml'
# TODO Make specs faster by limiting remote network connections # TODO Make specs faster by limiting remote network connections
module SpecHelper #-----------------------------------------------------------------------------#
class Installer < Pod::Installer
# Here we override the `source' of the pod specifications to point to the integration fixtures.
def specs_by_target
@specs_by_target ||= super.tap do |hash|
hash.values.flatten.each do |spec|
next if spec.subspec?
source = spec.source
source[:git] = SpecHelper.fixture("integration/#{spec.name}").to_s
spec.source = source
end
end
end
end
end
unless SpecHelper.fixture('integration/ASIHTTPRequest/Classes').exist?
puts "[!] You must run `git submodule update --init` for the integration spec to work, skipping."
else
[:ios, :osx].each do |platform|
describe "A full (integration spec) installation for platform `#{platform}'" do
extend SpecHelper::TemporaryDirectory
def create_config! # @!group Helpers
config.repos_dir = fixture('spec-repos')
config.project_root = temporary_directory
config.integrate_targets = false
end
before do def skip_xcodebuild?
fixture('spec-repos/master') # ensure the archive is unpacked ENV['SKIP_XCODEBUILD']
create_config! end
end
def should_successfully_perform(command)
output = `#{command} 2>&1`
puts output unless $?.success?
$?.should.be.success
end
puts " ! ".red << "Skipping xcodebuild based checks, because it can't be found." if skip_xcodebuild? puts " [!] ".red << "Skipping xcodebuild based checks, because it can't be found." if skip_xcodebuild?
def should_xcodebuild(target_definition) def should_xcodebuild(target_definition)
return if skip_xcodebuild? return if skip_xcodebuild?
target = target_definition target = target_definition
Dir.chdir(config.project_pods_root) do Dir.chdir(config.project_pods_root) do
print "[!] Compiling #{target.label}...\r" print "[!] Compiling #{target.label}...\r"
should_successfully_perform "xcodebuild -target '#{target.label}'" should_successfully_perform "xcodebuild -target '#{target.label}'"
lib_path = config.project_pods_root + "build/Release#{'-iphoneos' if target.platform == :ios}" + target.lib_name product_name = "lib#{target_definition.label}.a"
lib_path = config.project_pods_root + "build/Release#{'-iphoneos' if target.platform == :ios}" + product_name
`lipo -info '#{lib_path}'`.should.include "#{target.platform == :ios ? 'armv7' : 'x86_64'}" `lipo -info '#{lib_path}'`.should.include "#{target.platform == :ios ? 'armv7' : 'x86_64'}"
end end
end
def should_successfully_perform(command)
output = `#{command} 2>&1`
puts output unless $?.success?
$?.should.be.success
end
#-----------------------------------------------------------------------------#
module Pod
describe "Full integration" do
before do
# fixture('spec-repos/master') # ensure the archive is unpacked
config.integrate_targets = false
end end
# Lame way to run on one platform only #-------------------------------------------------------------------------#
if platform == :ios
describe "Single platform" do
extend SpecHelper::TemporaryDirectory
# it "includes automatically inherited subspecs" do
# end
# it "handles different subspecs for the same Pod in different target definitions" do
# end
it "installs a Pod directly from its repo" do it "installs a Pod directly from its repo" do
url = fixture('integration/sstoolkit').to_s url = fixture('integration/sstoolkit').to_s
commit = '2adcd0f81740d6b0cd4589af98790eee3bd1ae7b' commit = '2adcd0f81740d6b0cd4589af98790eee3bd1ae7b'
podfile = Pod::Podfile.new do podfile = Podfile.new do
self.platform :ios platform :ios
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'SSToolkit', :git => url, :commit => commit pod 'SSToolkit', :git => url, :commit => commit
end end
# Note that we are *not* using the stubbed SpecHelper::Installer subclass. installer = Installer.new(config.sandbox, podfile)
installer = Pod::Installer.new(Pod::Sandbox.new(config.project_pods_root), podfile)
installer.install! installer.install!
result = installer.lockfile.to_hash lockfile = installer.lockfile.to_hash
result['PODS'].should == ['SSToolkit (0.1.3)'] lockfile['PODS'].should == ['SSToolkit (0.1.3)']
result['DEPENDENCIES'].should == ["SSToolkit (from `#{url}', commit `#{commit}')"] lockfile['DEPENDENCIES'].should == ["SSToolkit (from `#{url}`, commit `#{commit}`)"]
result['EXTERNAL SOURCES'].should == {"SSToolkit" => { :git=>url, :commit=>commit}} lockfile['EXTERNAL SOURCES'].should == {"SSToolkit" => { :git=>url, :commit=>commit}}
end end
#--------------------------------------#
# @todo Using the podspec from the repo might invalidate the test.
#
it "installs a library with a podspec outside of the repo" do it "installs a library with a podspec outside of the repo" do
url = 'https://raw.github.com/gist/1349824/3ec6aa60c19113573fc48eac19d0fafd6a69e033/Reachability.podspec' url = fixture('integration/Reachability/Reachability.podspec').to_s
podfile = Pod::Podfile.new do podfile = Podfile.new do
self.platform :ios platform :ios
xcodeproj 'dummy' xcodeproj 'dummy'
# TODO use a local file instead of http?
pod 'Reachability', :podspec => url pod 'Reachability', :podspec => url
end end
installer = SpecHelper::Installer.new(Pod::Sandbox.new(config.project_pods_root), podfile) installer = Installer.new(config.sandbox, podfile)
installer.install! installer.install!
result = installer.lockfile.to_hash lockfile = installer.lockfile.to_hash
result['PODS'].should == ['Reachability (1.2.3)'] lockfile['PODS'].should == ['Reachability (3.0.0)']
result['DEPENDENCIES'].should == ["Reachability (from `#{url}')"] lockfile['DEPENDENCIES'].should == ["Reachability (from `#{url}`)"]
result['EXTERNAL SOURCES'].should == {"Reachability"=>{ :podspec=>"https://raw.github.com/gist/1349824/3ec6aa60c19113573fc48eac19d0fafd6a69e033/Reachability.podspec"}} lockfile['EXTERNAL SOURCES'].should == {"Reachability"=>{ :podspec=> url}}
end end
#--------------------------------------#
it "installs a dummy source file" do it "installs a dummy source file" do
create_config! podfile = Podfile.new do
podfile = Pod::Podfile.new do platform :ios
self.platform :ios pod 'JSONKit'
xcodeproj 'dummy'
pod do |s|
s.name = 'JSONKit'
s.version = '1.2'
s.source = { :git => SpecHelper.fixture('integration/JSONKit').to_s, :tag => 'v1.2' }
s.source_files = 'JSONKit.*'
end
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) installer = Installer.new(config.sandbox, podfile)
installer = SpecHelper::Installer.new(resolver)
installer.install! installer.install!
dummy = (config.project_pods_root + 'PodsDummy_Pods.m').read dummy = (config.project_pods_root + 'PodsDummy_Pods.m').read
dummy.should.include?('@implementation PodsDummy_Pods') dummy.should.include?('@implementation PodsDummy_Pods')
end end
#--------------------------------------#
it "installs a dummy source file unique to the target" do it "installs a dummy source file unique to the target" do
create_config! podfile = Podfile.new do
podfile = Pod::Podfile.new do platform :ios
self.platform :ios
xcodeproj 'dummy' xcodeproj 'dummy'
pod do |s| pod 'JSONKit'
s.name = 'JSONKit'
s.version = '1.2'
s.source = { :git => SpecHelper.fixture('integration/JSONKit').to_s, :tag => 'v1.2' }
s.source_files = 'JSONKit.*'
end
target :AnotherTarget do target :AnotherTarget do
pod 'ASIHTTPRequest' pod 'ASIHTTPRequest'
end end
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) installer = Installer.new(config.sandbox, podfile)
installer = SpecHelper::Installer.new(resolver)
installer.install! installer.install!
dummy = (config.project_pods_root + 'PodsDummy_Pods_AnotherTarget.m').read dummy = (config.project_pods_root + 'PodsDummy_Pods_AnotherTarget.m').read
dummy.should.include?('@implementation PodsDummy_Pods_AnotherTarget') dummy.should.include?('@implementation PodsDummy_Pods_AnotherTarget')
end end
it "installs a library with a podspec defined inline" do #--------------------------------------#
podfile = Pod::Podfile.new do
self.platform :ios
xcodeproj 'dummy'
pod do |s|
s.name = 'JSONKit'
s.version = '1.2'
s.source = { :git => SpecHelper.fixture('integration/JSONKit').to_s, :tag => 'v1.2' }
s.source_files = 'JSONKit.*'
end
pod do |s|
s.name = 'SSZipArchive'
s.version = '0.1.0'
s.source = { :git => SpecHelper.fixture('integration/SSZipArchive').to_s, :tag => '0.1.0' }
s.source_files = 'SSZipArchive.*', 'minizip/*.{h,c}'
end
end
Pod::Specification.any_instance.stubs(:preserve_paths).returns(['CHANGELOG.md'])
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root))
installer = SpecHelper::Installer.new(resolver)
installer.install!
installer.lockfile.to_hash.tap {|d| d.delete("COCOAPODS") }.should == {
'PODS' => ['JSONKit (1.2)', 'SSZipArchive (0.1.0)'],
'DEPENDENCIES' => ["JSONKit (defined in Podfile)", "SSZipArchive (defined in Podfile)"]
}
change_log = (config.project_pods_root + 'JSONKit/CHANGELOG.md').read
change_log.should.include '1.2'
change_log.should.not.include '1.3'
end
# @note ASIHTTPRequest depends on Reachability in iOS.
#
it "creates targets for different platforms" do it "creates targets for different platforms" do
podfile = Pod::Podfile.new do podfile = Podfile.new do
self.platform :ios platform :ios
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'JSONKit', '1.4' pod 'JSONKit', '1.4'
target :ios_target do target :ios_target do
# This brings in Reachability on iOS pod 'ASIHTTPRequest', '1.8.1'
pod 'ASIHTTPRequest'
end end
target :osx_target do target :osx_target do
self.platform :osx platform :osx
pod 'ASIHTTPRequest' pod 'ASIHTTPRequest', '1.8.1'
end end
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) installer = Installer.new(config.sandbox, podfile)
installer = SpecHelper::Installer.new(resolver)
installer.install! installer.install!
result = installer.lockfile.to_hash lockfile = installer.lockfile.to_hash
result['PODS'].should == [ lockfile['PODS'].should == [
{ "ASIHTTPRequest (1.8.1)" => { "ASIHTTPRequest (1.8.1)" =>
[ "ASIHTTPRequest/ASIWebPageRequest (= 1.8.1)", [ "ASIHTTPRequest/ASIWebPageRequest (= 1.8.1)",
"ASIHTTPRequest/CloudFiles (= 1.8.1)", "ASIHTTPRequest/CloudFiles (= 1.8.1)",
...@@ -205,34 +160,30 @@ else ...@@ -205,34 +160,30 @@ else
"JSONKit (1.4)", "JSONKit (1.4)",
"Reachability (3.1.0)" "Reachability (3.1.0)"
] ]
result['DEPENDENCIES'].should == ["ASIHTTPRequest", "JSONKit (= 1.4)"] lockfile['DEPENDENCIES'].should == ["ASIHTTPRequest (= 1.8.1)", "JSONKit (= 1.4)"]
# TODO might be nicer looking to not show the dependencies of the top level spec for each subspec (Reachability).
should_xcodebuild(podfile.target_definitions[:ios_target])
should_xcodebuild(podfile.target_definitions[:osx_target]) should_xcodebuild(podfile.target_definitions[:osx_target])
end end
unless `which appledoc`.strip.empty? #--------------------------------------#
it "generates documentation of all pods by default" do
::Pod::Config.instance = nil
::Pod::Config.instance.tap do |c|
ENV['VERBOSE_SPECS'] ? c.verbose = true : c.silent = true
c.doc_install = false
c.repos_dir = fixture('spec-repos')
c.project_root = temporary_directory
c.integrate_targets = false
c.skip_repo_update = true
end
Pod::Generator::Documentation.any_instance.stubs(:already_installed?).returns(false) if `which appledoc`.strip.empty?
puts " ! ".red << "Skipping documentation generation specs, because appledoc can't be found."
else
it "generates documentation of all pods by default" do
podfile = Pod::Podfile.new do podfile = Podfile.new do
self.platform :ios platform :ios
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'JSONKit', '1.4' pod 'JSONKit', '1.4'
pod 'SSToolkit', '1.0.0' pod 'SSToolkit', '1.0.0'
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root))
installer = SpecHelper::Installer.new(resolver) config.generate_docs = true
config.doc_install = false
Generator::Documentation.any_instance.stubs(:already_installed?).returns(false)
installer = Installer.new(config.sandbox, podfile)
installer.install! installer.install!
doc = (config.project_pods_root + 'Documentation/JSONKit/html/index.html').read doc = (config.project_pods_root + 'Documentation/JSONKit/html/index.html').read
...@@ -240,34 +191,43 @@ else ...@@ -240,34 +191,43 @@ else
doc = (config.project_pods_root + 'Documentation/SSToolkit/html/index.html').read doc = (config.project_pods_root + 'Documentation/SSToolkit/html/index.html').read
doc.should.include?('<title>SSToolkit 1.0.0 Reference</title>') doc.should.include?('<title>SSToolkit 1.0.0 Reference</title>')
end end
else
puts " ! ".red << "Skipping documentation generation specs, because appledoc can't be found."
end end
end end
#-------------------------------------------------------------------------#
[:ios, :osx].each do |test_platform|
describe "Multi-platform (#{test_platform})" do
extend SpecHelper::TemporaryDirectory
before do before do
FileUtils.cp_r(fixture('integration/.'), config.project_pods_root) FileUtils.cp_r(fixture('integration/.'), config.project_pods_root)
end end
it "runs the optional pre_install callback defined in the Podfile _before_ the targets are integrated but _after_ the pods have been downloaded" do #--------------------------------------#
podfile = Pod::Podfile.new do
self.platform platform it "runs the optional pre-install callback defined in the Podfile *before* the targets are integrated but *after* the pods have been downloaded" do
podfile = Podfile.new do
platform test_platform
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'SSZipArchive', '0.1.0' pod 'SSZipArchive', '0.1.0'
pre_install do |installer| pre_install do |installer|
memo = "PODS:#{installer.pods * ', '} TARGETS:#{installer.project.targets.to_a * ', '}" memo = "PODS:#{installer.pods * ', '} TARGETS:#{installer.project.targets.to_a * ', '}"
File.open(config.project_pods_root + 'memo.txt', 'w') {|f| f.puts memo} File.open(installer.config.project_pods_root + 'memo.txt', 'w') {|f| f.puts memo}
end end
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root))
SpecHelper::Installer.new(resolver).install! Installer.new(config.sandbox, podfile).install!
File.open(config.project_pods_root + 'memo.txt','rb').read.should == "PODS:SSZipArchive (0.1.0) TARGETS:\n" File.open(config.project_pods_root + 'memo.txt','rb').read.should == "PODS:SSZipArchive (0.1.0) TARGETS:\n"
end end
it "runs the optional post_install callback defined in the Podfile _before_ the project is saved to disk" do #--------------------------------------#
podfile = Pod::Podfile.new do
self.platform platform it "runs the optional post-install callback defined in the Podfile *before* the project is saved to disk" do
podfile = Podfile.new do
platform test_platform
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'SSZipArchive', '0.1.0' pod 'SSZipArchive', '0.1.0'
...@@ -279,26 +239,30 @@ else ...@@ -279,26 +239,30 @@ else
end end
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root))
SpecHelper::Installer.new(resolver).install! Installer.new(config.sandbox, podfile).install!
project = Pod::Project.new(config.project_pods_root + 'Pods.xcodeproj') project = Project.new(config.project_pods_root + 'Pods.xcodeproj')
project.targets.first.build_configurations.map do |config| project.targets.first.build_configurations.map do |config|
config.build_settings['GCC_ENABLE_OBJC_GC'] config.build_settings['GCC_ENABLE_OBJC_GC']
end.should == %w{ supported supported } end.should == %w{ supported supported }
end end
#--------------------------------------#
# TODO add a simple source file which uses the compiled lib to check that it really really works # TODO add a simple source file which uses the compiled lib to check that it really really works
it "activates required pods and create a working static library xcode project" do it "activates required pods and create a working static library xcode project" do
podfile = Pod::Podfile.new do podfile = Podfile.new do
self.platform platform platform test_platform
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'Reachability', '> 2.0.5' if platform == :ios if test_platform == :ios
pod 'Reachability', '> 2.0.5'
end
pod 'JSONKit', '>= 1.0' pod 'JSONKit', '>= 1.0'
pod 'SSZipArchive', '< 0.1.2' pod 'SSZipArchive', '< 0.1.2'
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root))
installer = SpecHelper::Installer.new(resolver) installer = Installer.new(config.sandbox, podfile)
installer.install! installer.install!
lockfile_contents = { lockfile_contents = {
...@@ -312,105 +276,97 @@ else ...@@ -312,105 +276,97 @@ else
"Reachability (> 2.0.5)", "Reachability (> 2.0.5)",
"SSZipArchive (< 0.1.2)", "SSZipArchive (< 0.1.2)",
], ],
"COCOAPODS" => Pod::VERSION "COCOAPODS" => VERSION
} }
unless platform == :ios
unless test_platform == :ios
# No Reachability is required by ASIHTTPRequest on OSX # No Reachability is required by ASIHTTPRequest on OSX
lockfile_contents['DEPENDENCIES'].delete_at(1) lockfile_contents['DEPENDENCIES'].delete_at(1)
lockfile_contents['PODS'].delete_at(1) lockfile_contents['PODS'].delete_at(1)
# lockfile_contents['PODS'][0] = 'ASIHTTPRequest (1.8.1)' # lockfile_contents['PODS'][0] = 'ASIHTTPRequest (1.8.1)'
end end
result = installer.lockfile.to_hash lockfile = installer.lockfile.to_hash
result.delete("SPEC CHECKSUMS") lockfile.delete("SPEC CHECKSUMS")
result.should == lockfile_contents lockfile.should == lockfile_contents
root = config.project_pods_root root = config.project_pods_root
(root + 'Pods.xcconfig').read.should == installer.target_installers.first.xcconfig.to_s (root + 'Pods.xcconfig').read.should == installer.libraries.first.xcconfig.to_s
project_file = (root + 'Pods.xcodeproj/project.pbxproj').to_s project_file = (root + 'Pods.xcodeproj/project.pbxproj').to_s
Xcodeproj.read_plist(project_file).should == installer.project.to_hash Xcodeproj.read_plist(project_file).should == installer.project.to_hash
should_xcodebuild(podfile.target_definitions[:default]) should_xcodebuild(podfile.target_definitions[:default])
end end
if platform == :ios #--------------------------------------#
it "does not activate pods that are only part of other pods" do
spec = Pod::Podfile.new do
self.platform platform
xcodeproj 'dummy'
pod 'Reachability', '2.0.4' # only 2.0.4 is part of ASIHTTPRequest’s source.
end
resolver = Pod::Resolver.new(spec, nil, Pod::Sandbox.new(config.project_pods_root))
installer = SpecHelper::Installer.new(resolver)
installer.install!
result = installer.lockfile.to_hash
result['PODS'].should == [ 'Reachability (2.0.4)' ]
result['DEPENDENCIES'].should == ["Reachability (= 2.0.4)"]
end
end
it "adds resources to the xcode copy script" do it "adds resources to the xcode copy script" do
spec = Pod::Podfile.new do podfile = Podfile.new do
self.platform platform platform test_platform
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'SSZipArchive', '0.1.0' pod 'SSZipArchive', '0.1.0'
end end
resolver = Pod::Resolver.new(spec, nil, Pod::Sandbox.new(config.project_pods_root)) installer = Installer.new(config.sandbox, podfile)
installer = SpecHelper::Installer.new(resolver)
target_definition = installer.target_installers.first.target_definition
installer.specs_by_target[target_definition].first.resources = 'LICEN*', 'Readme.*'
installer.install! installer.install!
resources_value = { :resources => ['LICEN*', 'Readme.*'] }
resources_pattern = { :ios => resources_value, :osx => resources_value}
Specification.any_instance.stubs(:resources).returns(resources_pattern)
contents = (config.project_pods_root + 'Pods-resources.sh').read contents = (config.project_pods_root + 'Pods-resources.sh').read
contents.should.include "install_resource 'SSZipArchive/LICENSE'\n" \ contents.should.include "install_resource 'SSZipArchive/LICENSE'\n" \
"install_resource 'SSZipArchive/Readme.markdown'" "install_resource 'SSZipArchive/Readme.markdown'"
end end
# TODO we need to do more cleaning and/or add a --prune task #--------------------------------------#
# @todo we need to do more cleaning and/or add a --prune task
#
it "overwrites an existing project.pbxproj file" do it "overwrites an existing project.pbxproj file" do
spec = Pod::Podfile.new do podfile = Podfile.new do
self.platform platform platform test_platform
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'JSONKit' pod 'JSONKit'
end end
resolver = Pod::Resolver.new(spec, nil, Pod::Sandbox.new(config.project_pods_root)) installer = Installer.new(config.sandbox, podfile)
installer = SpecHelper::Installer.new(resolver)
installer.install! installer.install!
spec = Pod::Podfile.new do podfile = Podfile.new do
self.platform platform platform test_platform
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'SSZipArchive', '0.1.0' pod 'SSZipArchive', '0.1.0'
end end
resolver = Pod::Resolver.new(spec, nil, Pod::Sandbox.new(config.project_pods_root)) installer = Installer.new(config.sandbox, podfile)
installer = SpecHelper::Installer.new(resolver)
installer.install! installer.install!
project = Pod::Project.new(config.project_pods_root + 'Pods.xcodeproj') project = Project.new(config.project_pods_root + 'Pods.xcodeproj')
disk_source_files = project.files.sort.reject { |f| f.build_files.empty? } disk_source_files = project.files.sort.reject { |f| f.build_files.empty? }
installer_source_files = installer.project.files.sort.reject { |f| f.build_files.empty? } installer_source_files = installer.project.files.sort.reject { |f| f.build_files.empty? }
disk_source_files.should == installer_source_files disk_source_files.should == installer_source_files
end end
#--------------------------------------#
it "creates a project with multiple targets" do it "creates a project with multiple targets" do
podfile = Pod::Podfile.new do podfile = Podfile.new do
self.platform platform platform test_platform
xcodeproj 'dummy'
target(:debug) { pod 'SSZipArchive', '0.1.0' }
target(:test, :exclusive => true) { pod 'JSONKit' }
pod 'ASIHTTPRequest' pod 'ASIHTTPRequest'
target :debug do
pod 'SSZipArchive', '0.1.0'
end
target :test, :exclusive => true do
pod 'JSONKit'
end
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(fixture('integration'))) installer = Installer.new(config.sandbox, podfile)
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root))
installer = Pod::Installer.new(resolver)
installer.install! installer.install!
project = Xcodeproj::Project.new(config.project_pods_root + 'Pods.xcodeproj') project = Xcodeproj::Project.new(config.project_pods_root + 'Pods.xcodeproj')
project.targets.count.should == 3
project.targets.each do |target| project.targets.each do |target|
phase = target.build_phases.find { |phase| phase.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase) } phase = target.build_phases.find { |phase| phase.isa == 'PBXSourcesBuildPhase' }
files = phase.files.map { |bf| bf.file_ref.name } files = phase.files.map { |bf| bf.file_ref.name }
case target.product_name case target.product_name
when 'Pods' when 'Pods'
...@@ -422,48 +378,54 @@ else ...@@ -422,48 +378,54 @@ else
files.should.include "SSZipArchive.m" files.should.include "SSZipArchive.m"
files.should.not.include "JSONKit.m" files.should.not.include "JSONKit.m"
when 'Pods-test' when 'Pods-test'
files.should.include "JSONKit.m"
files.should.not.include "ASIHTTPRequest.m" files.should.not.include "ASIHTTPRequest.m"
files.should.not.include "SSZipArchive.m" files.should.not.include "SSZipArchive.m"
files.should.include "JSONKit.m"
else
raise "ohnoes"
end end
end end
root = config.project_pods_root expected_files = %w[
(root + 'Pods.xcconfig').should.exist Pods.xcconfig
(root + 'Pods-debug.xcconfig').should.exist Pods-debug.xcconfig
(root + 'Pods-test.xcconfig').should.exist Pods-test.xcconfig
(root + 'Pods-resources.sh').should.exist Pods-resources.sh
(root + 'Pods-debug-resources.sh').should.exist Pods-debug-resources.sh
(root + 'Pods-test-resources.sh').should.exist Pods-test-resources.sh
]
expected_files.each do |file|
(config.project_pods_root + file).should.exist
end
should_xcodebuild(podfile.target_definitions[:default]) should_xcodebuild(podfile.target_definitions[:default])
should_xcodebuild(podfile.target_definitions[:debug]) should_xcodebuild(podfile.target_definitions[:debug])
should_xcodebuild(podfile.target_definitions[:test]) should_xcodebuild(podfile.target_definitions[:test])
end end
#--------------------------------------#
# @note The shell script should be the last phase.
#
it "sets up an existing project with pods" do it "sets up an existing project with pods" do
config.integrate_targets = true config.integrate_targets = true
basename = platform == :ios ? 'iPhone' : 'Mac' basename = test_platform == :ios ? 'iPhone' : 'Mac'
projpath = temporary_directory + 'ASIHTTPRequest.xcodeproj' projpath = temporary_directory + 'ASIHTTPRequest.xcodeproj'
FileUtils.cp_r(fixture("integration/ASIHTTPRequest/#{basename}.xcodeproj"), projpath) FileUtils.cp_r(fixture("integration/ASIHTTPRequest/#{basename}.xcodeproj"), projpath)
podfile = Pod::Podfile.new do podfile = Podfile.new do
self.platform platform platform test_platform
xcodeproj projpath xcodeproj projpath
pod 'SSZipArchive', '0.1.0' pod 'SSZipArchive', '0.1.0'
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) installer = Installer.new(config.sandbox, podfile)
installer = SpecHelper::Installer.new(resolver)
installer.install! installer.install!
workspace = Xcodeproj::Workspace.new_from_xcworkspace(temporary_directory + 'ASIHTTPRequest.xcworkspace') workspace = Xcodeproj::Workspace.new_from_xcworkspace(temporary_directory + 'ASIHTTPRequest.xcworkspace')
workspace.projpaths.sort.should == ['ASIHTTPRequest.xcodeproj', 'Pods/Pods.xcodeproj'] workspace.projpaths.sort.should == ['ASIHTTPRequest.xcodeproj', 'Pods/Pods.xcodeproj']
project = Pod::Project.new(projpath) project = Project.new(projpath)
libPods = project.files.find { |f| f.name == 'libPods.a' } libPods = project.files.find { |f| f.name == 'libPods.a' }
target = project.targets.first target = project.targets.first
...@@ -471,21 +433,21 @@ else ...@@ -471,21 +433,21 @@ else
config.base_configuration_reference.path.should == 'Pods/Pods.xcconfig' config.base_configuration_reference.path.should == 'Pods/Pods.xcconfig'
end end
target.frameworks_build_phase.files.should.include libPods.build_files.first target.frameworks_build_phase.files.should.include libPods.build_files.first
# should be the last phase
target.build_phases.last.shell_script.should == %{"${SRCROOT}/Pods/Pods-resources.sh"\n} target.build_phases.last.shell_script.should == %{"${SRCROOT}/Pods/Pods-resources.sh"\n}
end end
#--------------------------------------#
it "should prevent duplication cleaning headers symlinks with multiple targets" do it "should prevent duplication cleaning headers symlinks with multiple targets" do
podfile = Pod::Podfile.new do podfile = Podfile.new do
self.platform platform platform test_platform
xcodeproj 'dummy' xcodeproj 'dummy'
target(:debug) { pod 'SSZipArchive', '0.1.0' } target(:debug) { pod 'SSZipArchive', '0.1.0' }
target(:test, :exclusive => true) { pod 'JSONKit' } target(:test, :exclusive => true) { pod 'JSONKit' }
pod 'ASIHTTPRequest' pod 'ASIHTTPRequest', '1.8.1'
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) installer = Installer.new(config.sandbox, podfile)
installer = Pod::Installer.new(resolver)
installer.install! installer.install!
root = config.project_pods_root root = config.project_pods_root
...@@ -501,5 +463,5 @@ else ...@@ -501,5 +463,5 @@ else
end end
end end
end
end end
...@@ -33,7 +33,6 @@ module Bacon ...@@ -33,7 +33,6 @@ module Bacon
include Pod::Config::Mixin include Pod::Config::Mixin
include SpecHelper::Fixture include SpecHelper::Fixture
include SpecHelper::Command include SpecHelper::Command
def skip_xcodebuild? def skip_xcodebuild?
ENV['SKIP_XCODEBUILD'] ENV['SKIP_XCODEBUILD']
end end
...@@ -64,6 +63,28 @@ def copy_fixture_to_pod(name, pod) ...@@ -64,6 +63,28 @@ def copy_fixture_to_pod(name, pod)
FileUtils.cp_r(path, pod.root) FileUtils.cp_r(path, pod.root)
end end
#-----------------------------------------------------------------------------#
# Override {Specification#source} to return sources from fixtures and limit
# network connections.
#
module Pod
class Specification
alias :original_source :source
def source
fixture = SpecHelper.fixture("integration/#{name}")
result = super
if fixture.exist?
# puts "Using fixture [#{name}]"
result[:git] = fixture.to_s
else
# puts "MISSING fixture [#{name}]"
end
result
end
end
end
SpecHelper::Fixture.fixture('banana-lib') # ensure it exists SpecHelper::Fixture.fixture('banana-lib') # ensure it exists
require "active_support/core_ext/string/strip" require "active_support/core_ext/string/strip"
...@@ -81,7 +81,7 @@ module Bacon ...@@ -81,7 +81,7 @@ module Bacon
end end
def handle_requirement(description, disabled = false) def handle_requirement(description, disabled = false)
if false && @first_error if @first_error
print Bacon.color(nil, '_') print Bacon.color(nil, '_')
else else
error = yield error = yield
......
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