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
......
...@@ -44,7 +44,7 @@ module Pod ...@@ -44,7 +44,7 @@ module Pod
# generated and be cleaned. # generated and be cleaned.
# #
attr_accessor :downloaded attr_accessor :downloaded
alias_method :downloaded?, :downloaded alias_method :downloaded?, :downloaded
# @param [Specification] specification The first activated specification # @param [Specification] specification The first activated specification
# of the pod. # of the pod.
......
...@@ -3,503 +3,465 @@ require 'yaml' ...@@ -3,503 +3,465 @@ 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. # @!group Helpers
def specs_by_target
@specs_by_target ||= super.tap do |hash| def skip_xcodebuild?
hash.values.flatten.each do |spec| ENV['SKIP_XCODEBUILD']
next if spec.subspec? end
source = spec.source
source[:git] = SpecHelper.fixture("integration/#{spec.name}").to_s puts " [!] ".red << "Skipping xcodebuild based checks, because it can't be found." if skip_xcodebuild?
spec.source = source
end def should_xcodebuild(target_definition)
end return if skip_xcodebuild?
end target = target_definition
Dir.chdir(config.project_pods_root) do
print "[!] Compiling #{target.label}...\r"
should_successfully_perform "xcodebuild -target '#{target.label}'"
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'}"
end end
end end
unless SpecHelper.fixture('integration/ASIHTTPRequest/Classes').exist? def should_successfully_perform(command)
puts "[!] You must run `git submodule update --init` for the integration spec to work, skipping." output = `#{command} 2>&1`
else puts output unless $?.success?
[:ios, :osx].each do |platform| $?.should.be.success
describe "A full (integration spec) installation for platform `#{platform}'" do end
extend SpecHelper::TemporaryDirectory
def create_config! #-----------------------------------------------------------------------------#
config.repos_dir = fixture('spec-repos')
config.project_root = temporary_directory
config.integrate_targets = false
end
before do module Pod
fixture('spec-repos/master') # ensure the archive is unpacked
create_config!
end
def should_successfully_perform(command) describe "Full integration" do
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? before do
# fixture('spec-repos/master') # ensure the archive is unpacked
config.integrate_targets = false
end
def should_xcodebuild(target_definition) #-------------------------------------------------------------------------#
return if skip_xcodebuild?
target = target_definition
Dir.chdir(config.project_pods_root) do
print "[!] Compiling #{target.label}...\r"
should_successfully_perform "xcodebuild -target '#{target.label}'"
lib_path = config.project_pods_root + "build/Release#{'-iphoneos' if target.platform == :ios}" + target.lib_name
`lipo -info '#{lib_path}'`.should.include "#{target.platform == :ios ? 'armv7' : 'x86_64'}"
end
end
# Lame way to run on one platform only describe "Single platform" do
if platform == :ios extend SpecHelper::TemporaryDirectory
it "installs a Pod directly from its repo" do
url = fixture('integration/sstoolkit').to_s
commit = '2adcd0f81740d6b0cd4589af98790eee3bd1ae7b'
podfile = Pod::Podfile.new do
self.platform :ios
xcodeproj 'dummy'
pod 'SSToolkit', :git => url, :commit => commit
end
# Note that we are *not* using the stubbed SpecHelper::Installer subclass. # it "includes automatically inherited subspecs" do
installer = Pod::Installer.new(Pod::Sandbox.new(config.project_pods_root), podfile) # end
installer.install!
result = installer.lockfile.to_hash
result['PODS'].should == ['SSToolkit (0.1.3)']
result['DEPENDENCIES'].should == ["SSToolkit (from `#{url}', commit `#{commit}')"]
result['EXTERNAL SOURCES'].should == {"SSToolkit" => { :git=>url, :commit=>commit}}
end
it "installs a library with a podspec outside of the repo" do # it "handles different subspecs for the same Pod in different target definitions" do
url = 'https://raw.github.com/gist/1349824/3ec6aa60c19113573fc48eac19d0fafd6a69e033/Reachability.podspec' # end
podfile = Pod::Podfile.new do
self.platform :ios
xcodeproj 'dummy'
# TODO use a local file instead of http?
pod 'Reachability', :podspec => url
end
installer = SpecHelper::Installer.new(Pod::Sandbox.new(config.project_pods_root), podfile) it "installs a Pod directly from its repo" do
installer.install! url = fixture('integration/sstoolkit').to_s
result = installer.lockfile.to_hash commit = '2adcd0f81740d6b0cd4589af98790eee3bd1ae7b'
result['PODS'].should == ['Reachability (1.2.3)'] podfile = Podfile.new do
result['DEPENDENCIES'].should == ["Reachability (from `#{url}')"] platform :ios
result['EXTERNAL SOURCES'].should == {"Reachability"=>{ :podspec=>"https://raw.github.com/gist/1349824/3ec6aa60c19113573fc48eac19d0fafd6a69e033/Reachability.podspec"}} xcodeproj 'dummy'
pod 'SSToolkit', :git => url, :commit => commit
end end
it "installs a dummy source file" do installer = Installer.new(config.sandbox, podfile)
create_config! installer.install!
podfile = Pod::Podfile.new do lockfile = installer.lockfile.to_hash
self.platform :ios lockfile['PODS'].should == ['SSToolkit (0.1.3)']
xcodeproj 'dummy' lockfile['DEPENDENCIES'].should == ["SSToolkit (from `#{url}`, commit `#{commit}`)"]
pod do |s| lockfile['EXTERNAL SOURCES'].should == {"SSToolkit" => { :git=>url, :commit=>commit}}
s.name = 'JSONKit' end
s.version = '1.2'
s.source = { :git => SpecHelper.fixture('integration/JSONKit').to_s, :tag => 'v1.2' }
s.source_files = 'JSONKit.*'
end
end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) #--------------------------------------#
installer = SpecHelper::Installer.new(resolver)
installer.install!
dummy = (config.project_pods_root + 'PodsDummy_Pods.m').read # @todo Using the podspec from the repo might invalidate the test.
dummy.should.include?('@implementation PodsDummy_Pods') #
it "installs a library with a podspec outside of the repo" do
url = fixture('integration/Reachability/Reachability.podspec').to_s
podfile = Podfile.new do
platform :ios
xcodeproj 'dummy'
pod 'Reachability', :podspec => url
end end
it "installs a dummy source file unique to the target" do installer = Installer.new(config.sandbox, podfile)
create_config! installer.install!
podfile = Pod::Podfile.new do lockfile = installer.lockfile.to_hash
self.platform :ios lockfile['PODS'].should == ['Reachability (3.0.0)']
xcodeproj 'dummy' lockfile['DEPENDENCIES'].should == ["Reachability (from `#{url}`)"]
pod do |s| lockfile['EXTERNAL SOURCES'].should == {"Reachability"=>{ :podspec=> url}}
s.name = 'JSONKit' end
s.version = '1.2'
s.source = { :git => SpecHelper.fixture('integration/JSONKit').to_s, :tag => 'v1.2' }
s.source_files = 'JSONKit.*'
end
target :AnotherTarget do
pod 'ASIHTTPRequest'
end
end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) #--------------------------------------#
installer = SpecHelper::Installer.new(resolver)
installer.install!
dummy = (config.project_pods_root + 'PodsDummy_Pods_AnotherTarget.m').read it "installs a dummy source file" do
dummy.should.include?('@implementation PodsDummy_Pods_AnotherTarget') podfile = Podfile.new do
platform :ios
pod 'JSONKit'
end end
it "installs a library with a podspec defined inline" do installer = Installer.new(config.sandbox, podfile)
podfile = Pod::Podfile.new do installer.install!
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']) dummy = (config.project_pods_root + 'PodsDummy_Pods.m').read
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) dummy.should.include?('@implementation PodsDummy_Pods')
installer = SpecHelper::Installer.new(resolver) end
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 it "installs a dummy source file unique to the target" do
change_log.should.include '1.2' podfile = Podfile.new do
change_log.should.not.include '1.3' platform :ios
xcodeproj 'dummy'
pod 'JSONKit'
target :AnotherTarget do
pod 'ASIHTTPRequest'
end
end end
it "creates targets for different platforms" do installer = Installer.new(config.sandbox, podfile)
podfile = Pod::Podfile.new do installer.install!
self.platform :ios
xcodeproj 'dummy' dummy = (config.project_pods_root + 'PodsDummy_Pods_AnotherTarget.m').read
pod 'JSONKit', '1.4' dummy.should.include?('@implementation PodsDummy_Pods_AnotherTarget')
target :ios_target do end
# This brings in Reachability on iOS
pod 'ASIHTTPRequest' #--------------------------------------#
end
target :osx_target do # @note ASIHTTPRequest depends on Reachability in iOS.
self.platform :osx #
pod 'ASIHTTPRequest' it "creates targets for different platforms" do
end podfile = Podfile.new do
platform :ios
xcodeproj 'dummy'
pod 'JSONKit', '1.4'
target :ios_target do
pod 'ASIHTTPRequest', '1.8.1'
end end
target :osx_target do
platform :osx
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 = 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)",
"ASIHTTPRequest/S3 (= 1.8.1)", "ASIHTTPRequest/S3 (= 1.8.1)",
"Reachability" "Reachability"
] ]
}, },
{ "ASIHTTPRequest/ASIWebPageRequest (1.8.1)" => ["Reachability"] }, { "ASIHTTPRequest/ASIWebPageRequest (1.8.1)" => ["Reachability"] },
{ "ASIHTTPRequest/CloudFiles (1.8.1)" => ["Reachability"] }, { "ASIHTTPRequest/CloudFiles (1.8.1)" => ["Reachability"] },
{ "ASIHTTPRequest/S3 (1.8.1)" => ["Reachability"] }, { "ASIHTTPRequest/S3 (1.8.1)" => ["Reachability"] },
"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[:osx_target]) should_xcodebuild(podfile.target_definitions[:ios_target])
end should_xcodebuild(podfile.target_definitions[:osx_target])
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
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root))
installer = SpecHelper::Installer.new(resolver)
installer.install!
doc = (config.project_pods_root + 'Documentation/JSONKit/html/index.html').read
doc.should.include?('<title>JSONKit 1.4 Reference</title>')
doc = (config.project_pods_root + 'Documentation/SSToolkit/html/index.html').read
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." 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!
doc = (config.project_pods_root + 'Documentation/JSONKit/html/index.html').read
doc.should.include?('<title>JSONKit 1.4 Reference</title>')
doc = (config.project_pods_root + 'Documentation/SSToolkit/html/index.html').read
doc.should.include?('<title>SSToolkit 1.0.0 Reference</title>')
end end
end end
end
before do #-------------------------------------------------------------------------#
FileUtils.cp_r(fixture('integration/.'), config.project_pods_root)
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 [:ios, :osx].each do |test_platform|
podfile = Pod::Podfile.new do
self.platform platform
xcodeproj 'dummy'
pod 'SSZipArchive', '0.1.0'
pre_install do |installer| describe "Multi-platform (#{test_platform})" do
memo = "PODS:#{installer.pods * ', '} TARGETS:#{installer.project.targets.to_a * ', '}" extend SpecHelper::TemporaryDirectory
File.open(config.project_pods_root + 'memo.txt', 'w') {|f| f.puts memo}
end before do
FileUtils.cp_r(fixture('integration/.'), config.project_pods_root)
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root))
SpecHelper::Installer.new(resolver).install!
File.open(config.project_pods_root + 'memo.txt','rb').read.should == "PODS:SSZipArchive (0.1.0) TARGETS:\n"
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
xcodeproj 'dummy'
pod 'SSZipArchive', '0.1.0'
post_install do |installer| it "runs the optional pre-install callback defined in the Podfile *before* the targets are integrated but *after* the pods have been downloaded" do
target = installer.project.targets.first podfile = Podfile.new do
target.build_configurations.each do |config| platform test_platform
config.build_settings['GCC_ENABLE_OBJC_GC'] = 'supported' xcodeproj 'dummy'
pod 'SSZipArchive', '0.1.0'
pre_install do |installer|
memo = "PODS:#{installer.pods * ', '} TARGETS:#{installer.project.targets.to_a * ', '}"
File.open(installer.config.project_pods_root + 'memo.txt', 'w') {|f| f.puts memo}
end end
end end
Installer.new(config.sandbox, podfile).install!
File.open(config.project_pods_root + 'memo.txt','rb').read.should == "PODS:SSZipArchive (0.1.0) TARGETS:\n"
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) #--------------------------------------#
SpecHelper::Installer.new(resolver).install!
project = Pod::Project.new(config.project_pods_root + 'Pods.xcodeproj')
project.targets.first.build_configurations.map do |config|
config.build_settings['GCC_ENABLE_OBJC_GC']
end.should == %w{ supported supported }
end
# TODO add a simple source file which uses the compiled lib to check that it really really works it "runs the optional post-install callback defined in the Podfile *before* the project is saved to disk" do
it "activates required pods and create a working static library xcode project" do podfile = Podfile.new do
podfile = Pod::Podfile.new do platform test_platform
self.platform platform xcodeproj 'dummy'
xcodeproj 'dummy' pod 'SSZipArchive', '0.1.0'
pod 'Reachability', '> 2.0.5' if platform == :ios
pod 'JSONKit', '>= 1.0'
pod 'SSZipArchive', '< 0.1.2'
end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) post_install do |installer|
installer = SpecHelper::Installer.new(resolver) target = installer.project.targets.first
installer.install! target.build_configurations.each do |config|
config.build_settings['GCC_ENABLE_OBJC_GC'] = 'supported'
end
end
end
lockfile_contents = {
'PODS' => [
'JSONKit (999.999.999)',
'Reachability (3.1.0)',
'SSZipArchive (0.1.1)',
],
'DEPENDENCIES' => [
"JSONKit (>= 1.0)",
"Reachability (> 2.0.5)",
"SSZipArchive (< 0.1.2)",
],
"COCOAPODS" => Pod::VERSION
}
unless platform == :ios
# No Reachability is required by ASIHTTPRequest on OSX
lockfile_contents['DEPENDENCIES'].delete_at(1)
lockfile_contents['PODS'].delete_at(1)
# lockfile_contents['PODS'][0] = 'ASIHTTPRequest (1.8.1)'
end
result = installer.lockfile.to_hash
result.delete("SPEC CHECKSUMS")
result.should == lockfile_contents
root = config.project_pods_root Installer.new(config.sandbox, podfile).install!
(root + 'Pods.xcconfig').read.should == installer.target_installers.first.xcconfig.to_s project = Project.new(config.project_pods_root + 'Pods.xcodeproj')
project_file = (root + 'Pods.xcodeproj/project.pbxproj').to_s project.targets.first.build_configurations.map do |config|
Xcodeproj.read_plist(project_file).should == installer.project.to_hash config.build_settings['GCC_ENABLE_OBJC_GC']
end.should == %w{ supported supported }
end
should_xcodebuild(podfile.target_definitions[:default]) #--------------------------------------#
end
if platform == :ios # TODO add a simple source file which uses the compiled lib to check that it really really works
it "does not activate pods that are only part of other pods" do it "activates required pods and create a working static library xcode project" do
spec = Pod::Podfile.new do podfile = Podfile.new do
self.platform platform platform test_platform
xcodeproj 'dummy' xcodeproj 'dummy'
pod 'Reachability', '2.0.4' # only 2.0.4 is part of ASIHTTPRequest’s source. if test_platform == :ios
pod 'Reachability', '> 2.0.5'
end
pod 'JSONKit', '>= 1.0'
pod 'SSZipArchive', '< 0.1.2'
end end
resolver = Pod::Resolver.new(spec, nil, Pod::Sandbox.new(config.project_pods_root))
installer = SpecHelper::Installer.new(resolver) installer = Installer.new(config.sandbox, podfile)
installer.install! installer.install!
result = installer.lockfile.to_hash lockfile_contents = {
result['PODS'].should == [ 'Reachability (2.0.4)' ] 'PODS' => [
result['DEPENDENCIES'].should == ["Reachability (= 2.0.4)"] 'JSONKit (999.999.999)',
end 'Reachability (3.1.0)',
end 'SSZipArchive (0.1.1)',
],
'DEPENDENCIES' => [
"JSONKit (>= 1.0)",
"Reachability (> 2.0.5)",
"SSZipArchive (< 0.1.2)",
],
"COCOAPODS" => VERSION
}
it "adds resources to the xcode copy script" do unless test_platform == :ios
spec = Pod::Podfile.new do # No Reachability is required by ASIHTTPRequest on OSX
self.platform platform lockfile_contents['DEPENDENCIES'].delete_at(1)
xcodeproj 'dummy' lockfile_contents['PODS'].delete_at(1)
pod 'SSZipArchive', '0.1.0' # lockfile_contents['PODS'][0] = 'ASIHTTPRequest (1.8.1)'
end
lockfile = installer.lockfile.to_hash
lockfile.delete("SPEC CHECKSUMS")
lockfile.should == lockfile_contents
root = config.project_pods_root
(root + 'Pods.xcconfig').read.should == installer.libraries.first.xcconfig.to_s
project_file = (root + 'Pods.xcodeproj/project.pbxproj').to_s
Xcodeproj.read_plist(project_file).should == installer.project.to_hash
should_xcodebuild(podfile.target_definitions[:default])
end end
resolver = Pod::Resolver.new(spec, nil, Pod::Sandbox.new(config.project_pods_root)) #--------------------------------------#
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!
contents = (config.project_pods_root + 'Pods-resources.sh').read it "adds resources to the xcode copy script" do
contents.should.include "install_resource 'SSZipArchive/LICENSE'\n" \ podfile = Podfile.new do
"install_resource 'SSZipArchive/Readme.markdown'" platform test_platform
end xcodeproj 'dummy'
pod 'SSZipArchive', '0.1.0'
end
# TODO we need to do more cleaning and/or add a --prune task installer = Installer.new(config.sandbox, podfile)
it "overwrites an existing project.pbxproj file" do installer.install!
spec = Pod::Podfile.new do resources_value = { :resources => ['LICEN*', 'Readme.*'] }
self.platform platform resources_pattern = { :ios => resources_value, :osx => resources_value}
xcodeproj 'dummy' Specification.any_instance.stubs(:resources).returns(resources_pattern)
pod 'JSONKit'
end
resolver = Pod::Resolver.new(spec, nil, Pod::Sandbox.new(config.project_pods_root))
installer = SpecHelper::Installer.new(resolver)
installer.install!
spec = Pod::Podfile.new do contents = (config.project_pods_root + 'Pods-resources.sh').read
self.platform platform contents.should.include "install_resource 'SSZipArchive/LICENSE'\n" \
xcodeproj 'dummy' "install_resource 'SSZipArchive/Readme.markdown'"
pod 'SSZipArchive', '0.1.0'
end end
resolver = Pod::Resolver.new(spec, nil, Pod::Sandbox.new(config.project_pods_root))
installer = SpecHelper::Installer.new(resolver)
installer.install!
project = Pod::Project.new(config.project_pods_root + 'Pods.xcodeproj') #--------------------------------------#
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? }
disk_source_files.should == installer_source_files
end
it "creates a project with multiple targets" do # @todo we need to do more cleaning and/or add a --prune task
podfile = Pod::Podfile.new do #
self.platform platform it "overwrites an existing project.pbxproj file" do
xcodeproj 'dummy' podfile = Podfile.new do
target(:debug) { pod 'SSZipArchive', '0.1.0' } platform test_platform
target(:test, :exclusive => true) { pod 'JSONKit' } xcodeproj 'dummy'
pod 'ASIHTTPRequest' pod 'JSONKit'
end
installer = Installer.new(config.sandbox, podfile)
installer.install!
podfile = Podfile.new do
platform test_platform
xcodeproj 'dummy'
pod 'SSZipArchive', '0.1.0'
end
installer = Installer.new(config.sandbox, podfile)
installer.install!
project = Project.new(config.project_pods_root + 'Pods.xcodeproj')
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? }
disk_source_files.should == installer_source_files
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(fixture('integration'))) #--------------------------------------#
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root))
installer = Pod::Installer.new(resolver) it "creates a project with multiple targets" do
installer.install! podfile = Podfile.new do
platform test_platform
pod 'ASIHTTPRequest'
target :debug do
pod 'SSZipArchive', '0.1.0'
end
project = Xcodeproj::Project.new(config.project_pods_root + 'Pods.xcodeproj') target :test, :exclusive => true do
project.targets.each do |target| pod 'JSONKit'
phase = target.build_phases.find { |phase| phase.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase) } end
files = phase.files.map { |bf| bf.file_ref.name }
case target.product_name
when 'Pods'
files.should.include "ASIHTTPRequest.m"
files.should.not.include "SSZipArchive.m"
files.should.not.include "JSONKit.m"
when 'Pods-debug'
files.should.include "ASIHTTPRequest.m"
files.should.include "SSZipArchive.m"
files.should.not.include "JSONKit.m"
when 'Pods-test'
files.should.not.include "ASIHTTPRequest.m"
files.should.not.include "SSZipArchive.m"
files.should.include "JSONKit.m"
else
raise "ohnoes"
end end
end
root = config.project_pods_root installer = Installer.new(config.sandbox, podfile)
(root + 'Pods.xcconfig').should.exist installer.install!
(root + 'Pods-debug.xcconfig').should.exist
(root + 'Pods-test.xcconfig').should.exist project = Xcodeproj::Project.new(config.project_pods_root + 'Pods.xcodeproj')
(root + 'Pods-resources.sh').should.exist project.targets.count.should == 3
(root + 'Pods-debug-resources.sh').should.exist project.targets.each do |target|
(root + 'Pods-test-resources.sh').should.exist phase = target.build_phases.find { |phase| phase.isa == 'PBXSourcesBuildPhase' }
files = phase.files.map { |bf| bf.file_ref.name }
should_xcodebuild(podfile.target_definitions[:default]) case target.product_name
should_xcodebuild(podfile.target_definitions[:debug]) when 'Pods'
should_xcodebuild(podfile.target_definitions[:test]) files.should.include "ASIHTTPRequest.m"
end files.should.not.include "SSZipArchive.m"
files.should.not.include "JSONKit.m"
when 'Pods-debug'
files.should.include "ASIHTTPRequest.m"
files.should.include "SSZipArchive.m"
files.should.not.include "JSONKit.m"
when 'Pods-test'
files.should.include "JSONKit.m"
files.should.not.include "ASIHTTPRequest.m"
files.should.not.include "SSZipArchive.m"
end
end
it "sets up an existing project with pods" do expected_files = %w[
config.integrate_targets = true Pods.xcconfig
Pods-debug.xcconfig
Pods-test.xcconfig
Pods-resources.sh
Pods-debug-resources.sh
Pods-test-resources.sh
]
basename = platform == :ios ? 'iPhone' : 'Mac' expected_files.each do |file|
projpath = temporary_directory + 'ASIHTTPRequest.xcodeproj' (config.project_pods_root + file).should.exist
FileUtils.cp_r(fixture("integration/ASIHTTPRequest/#{basename}.xcodeproj"), projpath) end
podfile = Pod::Podfile.new do should_xcodebuild(podfile.target_definitions[:default])
self.platform platform should_xcodebuild(podfile.target_definitions[:debug])
xcodeproj projpath should_xcodebuild(podfile.target_definitions[:test])
pod 'SSZipArchive', '0.1.0'
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) #--------------------------------------#
installer = SpecHelper::Installer.new(resolver)
installer.install!
workspace = Xcodeproj::Workspace.new_from_xcworkspace(temporary_directory + 'ASIHTTPRequest.xcworkspace') # @note The shell script should be the last phase.
workspace.projpaths.sort.should == ['ASIHTTPRequest.xcodeproj', 'Pods/Pods.xcodeproj'] #
it "sets up an existing project with pods" do
config.integrate_targets = true
project = Pod::Project.new(projpath) basename = test_platform == :ios ? 'iPhone' : 'Mac'
libPods = project.files.find { |f| f.name == 'libPods.a' } projpath = temporary_directory + 'ASIHTTPRequest.xcodeproj'
FileUtils.cp_r(fixture("integration/ASIHTTPRequest/#{basename}.xcodeproj"), projpath)
target = project.targets.first podfile = Podfile.new do
target.build_configurations.each do |config| platform test_platform
config.base_configuration_reference.path.should == 'Pods/Pods.xcconfig' xcodeproj projpath
end pod 'SSZipArchive', '0.1.0'
target.frameworks_build_phase.files.should.include libPods.build_files.first end
# should be the last phase
target.build_phases.last.shell_script.should == %{"${SRCROOT}/Pods/Pods-resources.sh"\n}
end
it "should prevent duplication cleaning headers symlinks with multiple targets" do installer = Installer.new(config.sandbox, podfile)
podfile = Pod::Podfile.new do installer.install!
self.platform platform
xcodeproj 'dummy' workspace = Xcodeproj::Workspace.new_from_xcworkspace(temporary_directory + 'ASIHTTPRequest.xcworkspace')
target(:debug) { pod 'SSZipArchive', '0.1.0' } workspace.projpaths.sort.should == ['ASIHTTPRequest.xcodeproj', 'Pods/Pods.xcodeproj']
target(:test, :exclusive => true) { pod 'JSONKit' }
pod 'ASIHTTPRequest' project = Project.new(projpath)
libPods = project.files.find { |f| f.name == 'libPods.a' }
target = project.targets.first
target.build_configurations.each do |config|
config.base_configuration_reference.path.should == 'Pods/Pods.xcconfig'
end
target.frameworks_build_phase.files.should.include libPods.build_files.first
target.build_phases.last.shell_script.should == %{"${SRCROOT}/Pods/Pods-resources.sh"\n}
end end
resolver = Pod::Resolver.new(podfile, nil, Pod::Sandbox.new(config.project_pods_root)) #--------------------------------------#
installer = Pod::Installer.new(resolver)
installer.install!
root = config.project_pods_root it "should prevent duplication cleaning headers symlinks with multiple targets" do
(root + 'Pods.xcconfig').should.exist podfile = Podfile.new do
(root + 'Headers').should.exist platform test_platform
(root + 'Headers/SSZipArchive').should.exist xcodeproj 'dummy'
(root + 'Headers/ASIHTTPRequest').should.exist target(:debug) { pod 'SSZipArchive', '0.1.0' }
(root + 'Headers/JSONKit').should.exist target(:test, :exclusive => true) { pod 'JSONKit' }
Pathname.glob(File.join(root.to_s, 'Headers/ASIHTTPRequest/*.h')).size.should.be > 0 pod 'ASIHTTPRequest', '1.8.1'
Pathname.glob(File.join(root.to_s, 'Headers/SSZipArchive/*.h')).size.should.be > 0 end
Pathname.glob(File.join(root.to_s, 'Headers/JSONKit/*.h')).size.should.be > 0
end installer = Installer.new(config.sandbox, podfile)
installer.install!
root = config.project_pods_root
(root + 'Pods.xcconfig').should.exist
(root + 'Headers').should.exist
(root + 'Headers/SSZipArchive').should.exist
(root + 'Headers/ASIHTTPRequest').should.exist
(root + 'Headers/JSONKit').should.exist
Pathname.glob(File.join(root.to_s, 'Headers/ASIHTTPRequest/*.h')).size.should.be > 0
Pathname.glob(File.join(root.to_s, 'Headers/SSZipArchive/*.h')).size.should.be > 0
Pathname.glob(File.join(root.to_s, 'Headers/JSONKit/*.h')).size.should.be > 0
end
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