Commit 4036b663 authored by Fabio Pelosin's avatar Fabio Pelosin

[LocalPod] Specs and fix all_specs_public_header_files.

Introduced Chameleon fixture.
parent 337ef587
...@@ -13,6 +13,7 @@ examples/Pods ...@@ -13,6 +13,7 @@ examples/Pods
examples/**/Pods examples/**/Pods
examples/RelativePathProject/RelativePathProject/RelativePathProject.xcodeproj examples/RelativePathProject/RelativePathProject/RelativePathProject.xcodeproj
spec/fixtures/banana-lib spec/fixtures/banana-lib
spec/fixtures/chameleon
spec/fixtures/integration/Headers/ spec/fixtures/integration/Headers/
/concatenated.* /concatenated.*
spec/fixtures/mercurial-repo/.hg/*cache spec/fixtures/mercurial-repo/.hg/*cache
......
...@@ -145,7 +145,7 @@ namespace :gem do ...@@ -145,7 +145,7 @@ namespace :gem do
# Update the last version in CocoaPods-version.yml # Update the last version in CocoaPods-version.yml
specs_branch = '0.6' specs_branch = '0.6'
Dir.chdir ('../Specs') do Dir.chdir('../Specs') do
puts Dir.pwd puts Dir.pwd
sh "git checkout #{specs_branch}" sh "git checkout #{specs_branch}"
sh "git pull" sh "git pull"
......
...@@ -304,7 +304,12 @@ module Pod ...@@ -304,7 +304,12 @@ module Pod
raise Informative, "The pod is cleaned and cannot compute the all the "\ raise Informative, "The pod is cleaned and cannot compute the all the "\
"header files as they might be deleted." "header files as they might be deleted."
end end
header_files
all_specs = [ top_specification ] + top_specification.subspecs
options = {:glob => '*.{h}'}
files = paths_by_spec(:source_files, options, all_specs).values.flatten!
headers = files.select { |f| f.extname == '.h' }
headers
end end
# @!group Target integration # @!group Target integration
...@@ -396,11 +401,12 @@ module Pod ...@@ -396,11 +401,12 @@ module Pod
# @param [Symbol] accessor The accessor to use to obtain the paths patterns. # @param [Symbol] accessor The accessor to use to obtain the paths patterns.
# @param [Hash] options (see #expanded_paths) # @param [Hash] options (see #expanded_paths)
# #
def paths_by_spec(accessor, options = {}) def paths_by_spec(accessor, options = {}, specs = nil)
specs ||= specifications
paths_by_spec = {} paths_by_spec = {}
processed_paths = [] processed_paths = []
specs = specifications.sort_by { |s| s.name.length } specs = specs.sort_by { |s| s.name.length }
specs.each do |spec| specs.each do |spec|
paths = expanded_paths(spec.send(accessor), options) paths = expanded_paths(spec.send(accessor), options)
unless paths.empty? unless paths.empty?
......
...@@ -6,7 +6,8 @@ describe Pod::LocalPod do ...@@ -6,7 +6,8 @@ describe Pod::LocalPod do
describe "in general" do describe "in general" do
before do before do
@sandbox = temporary_sandbox @sandbox = temporary_sandbox
@pod = Pod::LocalPod.new(fixture_spec('banana-lib/BananaLib.podspec'), @sandbox, Pod::Platform.new(:ios)) @spec = fixture_spec('banana-lib/BananaLib.podspec')
@pod = Pod::LocalPod.new(@spec, @sandbox, Pod::Platform.new(:ios))
copy_fixture_to_pod('banana-lib', @pod) copy_fixture_to_pod('banana-lib', @pod)
end end
...@@ -97,172 +98,201 @@ describe Pod::LocalPod do ...@@ -97,172 +98,201 @@ describe Pod::LocalPod do
end end
end end
describe "with installed source," do describe "with installed source and multiple subspecs" do
#before do
#config.project_pods_root = fixture('integration')
#podspec = fixture('spec-repos/master/SSZipArchive/0.1.0/SSZipArchive.podspec')
#@spec = Pod::Specification.from_file(podspec)
#@destroot = fixture('integration/SSZipArchive')
#end
xit "returns the list of files that the source_files pattern expand to" do def assert_array_equals(expected, computed)
files = @destroot.glob('**/*.{h,c,m}') delta1 = computed - expected
files = files.map { |file| file.relative_path_from(config.project_pods_root) } delta1.should == []
@spec.expanded_source_files[:ios].sort.should == files.sort delta2 = expected - computed
delta2.should == []
end end
xit "returns the list of headers" do
files = @destroot.glob('**/*.h')
files = files.map { |file| file.relative_path_from(config.project_pods_root) }
@spec.header_files[:ios].sort.should == files.sort
end
xit "returns a hash of mappings from the pod's destroot to its header dirs, which by default is just the pod's header dir" do
@spec.copy_header_mappings[:ios].size.should == 1
@spec.copy_header_mappings[:ios][Pathname.new('SSZipArchive')].sort.should == %w{
SSZipArchive.h
minizip/crypt.h
minizip/ioapi.h
minizip/mztools.h
minizip/unzip.h
minizip/zip.h
}.map { |f| Pathname.new("SSZipArchive/#{f}") }.sort
end
xit "allows for customization of header mappings by overriding copy_header_mapping" do
def @spec.copy_header_mapping(from)
Pathname.new('ns') + from.basename
end
@spec.copy_header_mappings[:ios].size.should == 1
@spec.copy_header_mappings[:ios][Pathname.new('SSZipArchive/ns')].sort.should == %w{
SSZipArchive.h
minizip/crypt.h
minizip/ioapi.h
minizip/mztools.h
minizip/unzip.h
minizip/zip.h
}.map { |f| Pathname.new("SSZipArchive/#{f}") }.sort
end
xit "returns a hash of mappings with a custom header dir prefix" do
@spec.header_dir = 'AnotherRoot'
@spec.copy_header_mappings[:ios][Pathname.new('AnotherRoot')].sort.should == %w{
SSZipArchive.h
minizip/crypt.h
minizip/ioapi.h
minizip/mztools.h
minizip/unzip.h
minizip/zip.h
}.map { |f| Pathname.new("SSZipArchive/#{f}") }.sort
end
xit "returns the user header search paths" do
def @spec.copy_header_mapping(from)
Pathname.new('ns') + from.basename
end
@spec.header_search_paths.should == %w{
"$(PODS_ROOT)/Headers/SSZipArchive"
"$(PODS_ROOT)/Headers/SSZipArchive/ns"
}
end
xit "returns the user header search paths with a custom header dir prefix" do
@spec.header_dir = 'AnotherRoot'
def @spec.copy_header_mapping(from)
Pathname.new('ns') + from.basename
end
@spec.header_search_paths.should == %w{
"$(PODS_ROOT)/Headers/AnotherRoot"
"$(PODS_ROOT)/Headers/AnotherRoot/ns"
}
end
xit "returns the list of files that the resources pattern expand to" do
@spec.expanded_resources.should == {}
@spec.resource = 'LICEN*'
@spec.expanded_resources[:ios].map(&:to_s).should == %w{ SSZipArchive/LICENSE }
@spec.expanded_resources[:osx].map(&:to_s).should == %w{ SSZipArchive/LICENSE }
@spec.resources = 'LICEN*', 'Readme.*'
@spec.expanded_resources[:ios].map(&:to_s).should == %w{ SSZipArchive/LICENSE SSZipArchive/Readme.markdown }
@spec.expanded_resources[:osx].map(&:to_s).should == %w{ SSZipArchive/LICENSE SSZipArchive/Readme.markdown }
end
end
describe "regarding multiple subspecs" do
before do before do
# specification with only some subspecs activated @sandbox = temporary_sandbox
# to check that only the needed files are being activated subspecs = fixture_spec('chameleon/Chameleon.podspec').subspecs
# A fixture is needed. @pod = Pod::LocalPod.new(subspecs[0], @sandbox, Pod::Platform.new(:osx))
# @pod.add_specification(subspecs[1])
# specification = Pod::Spec.new do |s| copy_fixture_to_pod('Chameleon', @pod)
# ... end
# s.xcconfig = ...
# s.compiler_flags = ... it "identifies the top level specification" do
# s.subspec 's1' do |s1| @pod.top_specification.name.should == 'Chameleon'
# s1.xcconfig = ... end
# s1.compiler_flags = ...
# s1.ns.source_files = 's1.{h,m}' it "returns the subspecs" do
# end @pod.specifications.map(&:name).should == %w[ Chameleon/UIKit Chameleon/StoreKit ]
# end
# s.subspec 's2' do |s2|
# s2.ns.source_files = 's2.{h,m}' it "resolve the source files" do
# end computed = @pod.relative_source_files.map(&:to_s)
# expected = %w[
# Add only s1 to the localPod Chameleon/UIKit/Classes/UIKit.h
# s1 = specification.subspec_by_name(s1) Chameleon/UIKit/Classes/UIView.h
# @pod = Pod::LocalPod.new(s1, @sandbox, Pod::Platform.new(:ios)) Chameleon/UIKit/Classes/UIWindow.h
# @pod.add_specification(specification) Chameleon/UIKit/Classes/UIView.m
end Chameleon/UIKit/Classes/UIWindow.m
Chameleon/StoreKit/Classes/SKPayment.h
xit "returns the subspecs" do Chameleon/StoreKit/Classes/StoreKit.h
@pod.subspecs.map{ |s| name }.should == %w[ s1 ] Chameleon/StoreKit/Classes/SKPayment.m ]
end
assert_array_equals(expected, computed)
xit "resolve the source files" do end
@pod.source_files.should == %w[ s1.h s1.m ]
end it "resolve the resources" do
@pod.relative_resource_files.map(&:to_s).should == [
xit "resolve the resources" do "Chameleon/UIKit/Resources/<UITabBar> background.png",
end "Chameleon/UIKit/Resources/<UITabBar> background@2x.png" ]
end
xit "resolve the clean paths" do
@pod.clean_paths.should == %w[ s2.h s2.m ] it "resolve the clean paths" do
end # fake_git serves to check that source control files are deleted
expected = %w[
xit "resolves the used files" do /.fake_git
@pod.used_files.should == %w[ s1.h s1.m README.md ] /.fake_git/branches
end /.fake_git/HEAD
/.fake_git/index
xit "resolved the header files" do /AddressBookUI
@pod.header_files.should == %w[ s1.h ] /AddressBookUI/AddressBookUI_Prefix.pch
end /AddressBookUI/Classes
/AddressBookUI/Classes/ABUnknownPersonViewController.h
xit "resolves the header files of every subspec" do /AddressBookUI/Classes/ABUnknownPersonViewController.m
@pod.all_specs_public_header_files.should == %w[ s1.h s2.h ] /AddressBookUI/Classes/AddressBookUI.h
end /AssetsLibrary
/AssetsLibrary/AssetsLibrary_Prefix.pch
xit "merges the xcconfigs" do /AssetsLibrary/Classes
end /AssetsLibrary/Classes/ALAsset.h
/AssetsLibrary/Classes/ALAsset.m
xit "adds each file to a target with the compiler flags of its specification" do /AssetsLibrary/Classes/ALAssetRepresentation.h
# @pod.add_to_target(target) /AssetsLibrary/Classes/ALAssetRepresentation.m
end /AssetsLibrary/Classes/ALAssetsFilter.h
/AssetsLibrary/Classes/ALAssetsFilter.m
xit "can provide the source files of all the subspecs" do /AssetsLibrary/Classes/ALAssetsGroup.h
sources = @pod.all_specs_source_files.map { |p| p.relative_path_from(@sandbox.root).to_s } /AssetsLibrary/Classes/ALAssetsGroup.m
sources.should == %w[ s1.h s1.m s2.h s2.m ] /AssetsLibrary/Classes/ALAssetsLibrary.h
end /AssetsLibrary/Classes/ALAssetsLibrary.m
/AssetsLibrary/Classes/AssetsLibrary.h
xit 'can clean the unused files' do /AVFoundation
# copy fixture to another folder /AVFoundation/AVFoundation_Prefix.pch
@pod.clean /AVFoundation/Classes
@pod.clean_paths.tap do |paths| /AVFoundation/Classes/AVAudioPlayer.h
paths.each do |path| /AVFoundation/Classes/AVAudioPlayer.m
path.should.not.exist /AVFoundation/Classes/AVAudioSession.h
end /AVFoundation/Classes/AVAudioSession.m
end /AVFoundation/Classes/AVFoundation.h
/MediaPlayer
/MediaPlayer/Classes
/MediaPlayer/Classes/MediaPlayer.h
/MediaPlayer/Classes/MPMediaPlayback.h
/MediaPlayer/Classes/MPMoviePlayerController.h
/MediaPlayer/Classes/MPMoviePlayerController.m
/MediaPlayer/Classes/MPMusicPlayerController.h
/MediaPlayer/Classes/MPMusicPlayerController.m
/MediaPlayer/Classes/UIInternalMovieView.h
/MediaPlayer/Classes/UIInternalMovieView.m
/MediaPlayer/MediaPlayer_Prefix.pch
/MessageUI
/MessageUI/Classes
/MessageUI/Classes/MessageUI.h
/MessageUI/Classes/MFMailComposeViewController.h
/MessageUI/Classes/MFMailComposeViewController.m
/MessageUI/MessageUI_Prefix.pch
/StoreKit/StoreKit_Prefix.pch
/UIKit/UIKit_Prefix.pch
]
computed = @pod.clean_paths.each{ |p| p.gsub!(@pod.root.to_s, '') }
assert_array_equals(expected, computed)
end
it "resolves the used files" do
expected = %w[
/UIKit/Classes/UIKit.h
/UIKit/Classes/UIView.h
/UIKit/Classes/UIWindow.h
/UIKit/Classes/UIView.m
/UIKit/Classes/UIWindow.m
/StoreKit/Classes/SKPayment.h
/StoreKit/Classes/StoreKit.h
/StoreKit/Classes/SKPayment.m
/Chameleon.podspec
/README.md
/LICENSE
] + [
"/UIKit/Resources/<UITabBar> background.png",
"/UIKit/Resources/<UITabBar> background@2x.png"
]
computed = @pod.used_files.map{ |p| p.gsub!(@pod.root.to_s, '').to_s }
assert_array_equals(expected, computed)
end
it "resolved the header files" do
expected = %w[
Chameleon/UIKit/Classes/UIKit.h
Chameleon/UIKit/Classes/UIView.h
Chameleon/UIKit/Classes/UIWindow.h
Chameleon/StoreKit/Classes/SKPayment.h
Chameleon/StoreKit/Classes/StoreKit.h ]
computed = @pod.relative_header_files.map(&:to_s)
assert_array_equals(expected, computed)
end
it "resolves the header files of **every** subspec" do
computed = @pod.all_specs_public_header_files.map { |p| p.relative_path_from(@pod.root).to_s }
expected = %w[
UIKit/Classes/UIKit.h
UIKit/Classes/UIView.h
UIKit/Classes/UIWindow.h
StoreKit/Classes/SKPayment.h
StoreKit/Classes/StoreKit.h
MessageUI/Classes/MessageUI.h
MessageUI/Classes/MFMailComposeViewController.h
MediaPlayer/Classes/MediaPlayer.h
MediaPlayer/Classes/MPMediaPlayback.h
MediaPlayer/Classes/MPMoviePlayerController.h
MediaPlayer/Classes/MPMusicPlayerController.h
MediaPlayer/Classes/UIInternalMovieView.h
AVFoundation/Classes/AVAudioPlayer.h
AVFoundation/Classes/AVAudioSession.h
AVFoundation/Classes/AVFoundation.h
AssetsLibrary/Classes/ALAsset.h
AssetsLibrary/Classes/ALAssetRepresentation.h
AssetsLibrary/Classes/ALAssetsFilter.h
AssetsLibrary/Classes/ALAssetsGroup.h
AssetsLibrary/Classes/ALAssetsLibrary.h
AssetsLibrary/Classes/AssetsLibrary.h
]
assert_array_equals(expected, computed)
end
it "merges the xcconfigs without duplicates" do
@pod.xcconfig.should == {
"OTHER_LDFLAGS"=>"-framework AppKit -framework Foundation -framework IOKit -framework QTKit -framework QuartzCore -framework SystemConfiguration -framework WebKit" }
end
it "returns a hash of mappings with a custom header dir prefix" do
mappings = @pod.send(:header_mappings)
mappings = mappings.map do |folder, headers|
"#{folder} > #{headers.map{ |p| p.relative_path_from(@pod.root).to_s }.join(' ')}"
end
mappings.sort.should == [
"Chameleon/StoreKit > StoreKit/Classes/SKPayment.h StoreKit/Classes/StoreKit.h",
"Chameleon/UIKit > UIKit/Classes/UIKit.h UIKit/Classes/UIView.h UIKit/Classes/UIWindow.h" ]
end
it "respects the headers excluded from the search paths" do
@pod.stubs(:headers_excluded_from_search_paths).returns([@pod.root + 'UIKit/Classes/UIKit.h'])
mappings = @pod.send(:header_mappings)
mappings = mappings.map do |folder, headers|
"#{folder} > #{headers.map{ |p| p.relative_path_from(@pod.root).to_s }.join(' ')}"
end
mappings.sort.should == [
"Chameleon/StoreKit > StoreKit/Classes/SKPayment.h StoreKit/Classes/StoreKit.h",
"Chameleon/UIKit > UIKit/Classes/UIView.h UIKit/Classes/UIWindow.h" ]
end
it "includes the sandbox of the pod's headers while linking" do
@sandbox.expects(:add_header_search_path).with(Pathname.new('Chameleon'))
@pod.link_headers
end 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