Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
C
cocoapods
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gengmeiios
cocoapods
Commits
b14f3708
Commit
b14f3708
authored
Sep 05, 2013
by
Fabio Pelosin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Installer][Refactor] Add PodsProjectGenerator
parent
28b23c82
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
529 additions
and
158 deletions
+529
-158
installer.rb
lib/cocoapods/installer.rb
+15
-143
pods_project_generator.rb
lib/cocoapods/installer/pods_project_generator.rb
+222
-0
file_references_installer.rb
...aller/pods_project_generator/file_references_installer.rb
+2
-0
target_installer.rb
...pods/installer/pods_project_generator/target_installer.rb
+2
-0
aggregate_target_installer.rb
..._generator/target_installer/aggregate_target_installer.rb
+2
-0
pod_target_installer.rb
...roject_generator/target_installer/pod_target_installer.rb
+2
-0
pod_target.rb
lib/cocoapods/target/pod_target.rb
+1
-1
file_references_installer_spec.rb
.../pods_project_generator/file_references_installer_spec.rb
+5
-5
aggregate_target_installer_spec.rb
...rator/target_installer/aggregate_target_installer_spec.rb
+3
-3
pod_target_installer_spec.rb
...t_generator/target_installer/pod_target_installer_spec.rb
+3
-3
target_installer_spec.rb
...installer/pods_project_generator/target_installer_spec.rb
+3
-3
pods_project_generator_spec.rb
spec/unit/installer/pods_project_generator_spec.rb
+257
-0
installer_spec.rb
spec/unit/installer_spec.rb
+0
-0
pod_target_spec.rb
spec/unit/target/pod_target_spec.rb
+12
-0
No files found.
lib/cocoapods/installer.rb
View file @
b14f3708
...
...
@@ -28,13 +28,10 @@ module Pod
#
class
Installer
autoload
:Analyzer
,
'cocoapods/installer/analyzer'
autoload
:FileReferencesInstaller
,
'cocoapods/installer/file_references_installer'
autoload
:PodSourceInstaller
,
'cocoapods/installer/pod_source_installer'
autoload
:TargetInstaller
,
'cocoapods/installer/target_installer'
autoload
:AggregateTargetInstaller
,
'cocoapods/installer/target_installer/aggregate_target_installer'
autoload
:PodTargetInstaller
,
'cocoapods/installer/target_installer/pod_target_installer'
autoload
:UserProjectIntegrator
,
'cocoapods/installer/user_project_integrator'
autoload
:Analyzer
,
'cocoapods/installer/analyzer'
autoload
:PodSourceInstaller
,
'cocoapods/installer/pod_source_installer'
autoload
:PodsProjectGenerator
,
'cocoapods/installer/pods_project_generator'
autoload
:UserProjectIntegrator
,
'cocoapods/installer/user_project_integrator'
include
Config
::
Mixin
...
...
@@ -86,6 +83,7 @@ module Pod
resolve_dependencies
download_dependencies
generate_pods_project
write_lockfiles
integrate_user_project
if
config
.
integrate_targets?
end
...
...
@@ -108,14 +106,12 @@ module Pod
def
generate_pods_project
UI
.
section
"Generating Pods project"
do
prepare_pods_project
install_file_references
install_libraries
set_target_dependencies
link_aggregate_target
installer
=
PodsProjectGenerator
.
new
(
sandbox
,
aggregate_targets
)
installer
.
user_build_configurations
=
analysis_result
.
all_user_build_configurations
installer
.
podfile_path
=
config
.
podfile_path
installer
.
install
run_post_install_hooks
write_pod_project
write_lockfiles
installer
.
write_pod_project
end
end
...
...
@@ -130,11 +126,8 @@ module Pod
#
attr_reader
:analysis_result
# @return [Pod::Project] the `Pods/Pods.xcodeproj` project.
#
attr_reader
:pods_project
# @return [Array<String>] The Pods that should be installed.
# TODO
#
attr_reader
:names_of_pods_to_install
...
...
@@ -147,6 +140,10 @@ module Pod
#
attr_accessor
:installed_specs
def
pods_project
sandbox
.
project
end
#-------------------------------------------------------------------------#
private
...
...
@@ -277,132 +274,7 @@ module Pod
end
end
# Creates the Pods project from scratch if it doesn't exists.
#
# @return [void]
#
# @todo Clean and modify the project if it exists.
#
def
prepare_pods_project
UI
.
message
"- Creating Pods project"
do
@pods_project
=
Pod
::
Project
.
new
(
sandbox
.
project_path
)
analysis_result
.
all_user_build_configurations
.
each
do
|
name
,
type
|
@pods_project
.
add_build_configuration
(
name
,
type
)
end
pod_names
=
pod_targets
.
map
(
&
:pod_name
).
uniq
pod_names
.
each
do
|
pod_name
|
path
=
sandbox
.
pod_dir
(
pod_name
)
local
=
sandbox
.
local?
(
pod_name
)
@pods_project
.
add_pod_group
(
pod_name
,
path
,
local
)
end
if
config
.
podfile_path
@pods_project
.
add_podfile
(
config
.
podfile_path
)
end
sandbox
.
project
=
@pods_project
platforms
=
aggregate_targets
.
map
(
&
:platform
)
osx_deployment_target
=
platforms
.
select
{
|
p
|
p
.
name
==
:osx
}.
map
(
&
:deployment_target
).
min
ios_deployment_target
=
platforms
.
select
{
|
p
|
p
.
name
==
:ios
}.
map
(
&
:deployment_target
).
min
@pods_project
.
build_configurations
.
each
do
|
build_configuration
|
build_configuration
.
build_settings
[
'MACOSX_DEPLOYMENT_TARGET'
]
=
osx_deployment_target
.
to_s
if
osx_deployment_target
build_configuration
.
build_settings
[
'IPHONEOS_DEPLOYMENT_TARGET'
]
=
ios_deployment_target
.
to_s
if
ios_deployment_target
build_configuration
.
build_settings
[
'STRIP_INSTALLED_PRODUCT'
]
=
'NO'
end
end
end
# Installs the file references in the Pods project. This is done once per
# Pod as the same file reference might be shared by multiple aggregate
# targets.
#
# @return [void]
#
def
install_file_references
installer
=
FileReferencesInstaller
.
new
(
sandbox
,
pod_targets
,
pods_project
)
installer
.
install!
end
# Installs the aggregate targets of the Pods projects and generates their
# support files.
#
# @return [void]
#
def
install_libraries
UI
.
message
"- Installing libraries"
do
pod_targets
.
sort_by
(
&
:name
).
each
do
|
pod_target
|
next
if
pod_target
.
target_definition
.
empty?
target_installer
=
PodTargetInstaller
.
new
(
sandbox
,
pod_target
)
target_installer
.
install!
end
aggregate_targets
.
sort_by
(
&
:name
).
each
do
|
target
|
next
if
target
.
target_definition
.
empty?
target_installer
=
AggregateTargetInstaller
.
new
(
sandbox
,
target
)
target_installer
.
install!
end
# TODO
# Move and add specs
pod_targets
.
sort_by
(
&
:name
).
each
do
|
pod_target
|
pod_target
.
file_accessors
.
each
do
|
file_accessor
|
file_accessor
.
spec_consumer
.
frameworks
.
each
do
|
framework
|
ref
=
pods_project
.
add_system_framework
(
framework
,
pod_target
.
target
)
end
end
end
end
end
def
set_target_dependencies
aggregate_targets
.
each
do
|
aggregate_target
|
aggregate_target
.
pod_targets
.
each
do
|
pod_target
|
aggregate_target
.
target
.
add_dependency
(
pod_target
.
target
)
pod_target
.
dependencies
.
each
do
|
dep
|
unless
dep
==
pod_target
.
pod_name
pod_dependency_target
=
aggregate_target
.
pod_targets
.
find
{
|
target
|
target
.
pod_name
==
dep
}
# TODO remove me
unless
pod_dependency_target
puts
"[BUG] DEP:
#{
dep
}
"
end
pod_target
.
target
.
add_dependency
(
pod_dependency_target
.
target
)
end
end
end
end
end
# Links the aggregate targets with all the dependent libraries.
#
# @note This is run in the integration step to ensure that targets
# have been created for all per spec libraries.
#
def
link_aggregate_target
aggregate_targets
.
each
do
|
aggregate_target
|
native_target
=
aggregate_target
.
target
aggregate_target
.
pod_targets
.
each
do
|
pod_target
|
product
=
pod_target
.
target
.
product_reference
native_target
.
frameworks_build_phase
.
add_file_reference
(
product
)
end
end
end
# Writes the Pods project to the disk.
#
# @return [void]
#
def
write_pod_project
UI
.
message
"- Writing Xcode project file to
#{
UI
.
path
sandbox
.
project_path
}
"
do
pods_project
.
pods
.
remove_from_project
if
pods_project
.
pods
.
empty?
pods_project
.
development_pods
.
remove_from_project
if
pods_project
.
development_pods
.
empty?
pods_project
.
main_group
.
recursively_sort_by_type
pods_project
.
save
end
end
# Writes the Podfile and the lock files.
#
...
...
lib/cocoapods/installer/pods_project_generator.rb
0 → 100644
View file @
b14f3708
module
Pod
class
Installer
# Generates the Pods project according to the targets identified by the
# analyzer.
#
class
PodsProjectGenerator
autoload
:FileReferencesInstaller
,
'cocoapods/installer/pods_project_generator/file_references_installer'
autoload
:TargetInstaller
,
'cocoapods/installer/pods_project_generator/target_installer'
autoload
:AggregateTargetInstaller
,
'cocoapods/installer/pods_project_generator/target_installer/aggregate_target_installer'
autoload
:PodTargetInstaller
,
'cocoapods/installer/pods_project_generator/target_installer/pod_target_installer'
# @return [Sandbox] The sandbox of the installation.
#
attr_reader
:sandbox
# @return [Array<AggregateTarget>] The aggregate targets of the
# installation.
#
attr_reader
:aggregate_targets
# @param [Sandbox] sandbox @see sandbox
# @param [Array<AggregateTarget>] aggregate_targets @see aggregate_targets
#
def
initialize
(
sandbox
,
aggregate_targets
)
@sandbox
=
sandbox
@aggregate_targets
=
aggregate_targets
@user_build_configurations
=
[]
end
# @return [Pathname] The path of the Podfile.
#
attr_accessor
:podfile_path
# @return [Hash] The name and the type of the build configurations of the
# user.
#
attr_accessor
:user_build_configurations
# Generates the Pods project.
#
# @return [void]
#
def
install
prepare_project
install_file_references
install_targets
install_system_frameworks
set_target_dependencies
link_aggregate_target
end
# @return [Project] the generated Pods project.
#
attr_reader
:project
# Writes the Pods project to the disk.
#
# @return [void]
#
def
write_pod_project
UI
.
message
"- Writing Xcode project file to
#{
UI
.
path
sandbox
.
project_path
}
"
do
clean_up_project
project
.
save
end
end
private
# @!group Installation steps
#-----------------------------------------------------------------------#
# Creates the Pods project from scratch.
#
# @return [void]
#
def
prepare_project
UI
.
message
"- Creating Pods project"
do
@project
=
Pod
::
Project
.
new
(
sandbox
.
project_path
)
user_build_configurations
.
each
do
|
name
,
type
|
project
.
add_build_configuration
(
name
,
type
)
end
pod_names
=
pod_targets
.
map
(
&
:pod_name
).
uniq
pod_names
.
each
do
|
pod_name
|
path
=
sandbox
.
pod_dir
(
pod_name
)
local
=
sandbox
.
local?
(
pod_name
)
project
.
add_pod_group
(
pod_name
,
path
,
local
)
end
if
podfile_path
project
.
add_podfile
(
podfile_path
)
end
sandbox
.
project
=
@project
platforms
=
aggregate_targets
.
map
(
&
:platform
)
osx_deployment_target
=
platforms
.
select
{
|
p
|
p
.
name
==
:osx
}.
map
(
&
:deployment_target
).
min
ios_deployment_target
=
platforms
.
select
{
|
p
|
p
.
name
==
:ios
}.
map
(
&
:deployment_target
).
min
project
.
build_configurations
.
each
do
|
build_configuration
|
build_configuration
.
build_settings
[
'MACOSX_DEPLOYMENT_TARGET'
]
=
osx_deployment_target
.
to_s
if
osx_deployment_target
build_configuration
.
build_settings
[
'IPHONEOS_DEPLOYMENT_TARGET'
]
=
ios_deployment_target
.
to_s
if
ios_deployment_target
build_configuration
.
build_settings
[
'STRIP_INSTALLED_PRODUCT'
]
=
'NO'
end
end
end
# Installs the file references in the Pods project. This is done once per
# Pod as the same file reference might be shared by multiple aggregate
# targets.
#
# @return [void]
#
def
install_file_references
installer
=
FileReferencesInstaller
.
new
(
sandbox
,
pod_targets
,
project
)
installer
.
install!
end
# Installs the pods and the aggregate targets generating their support
# files.
#
# @return [void]
#
def
install_targets
UI
.
message
"- Installing Targets"
do
pod_targets
.
sort_by
(
&
:name
).
each
do
|
pod_target
|
next
if
pod_target
.
target_definition
.
empty?
target_installer
=
PodTargetInstaller
.
new
(
sandbox
,
pod_target
)
target_installer
.
install!
end
aggregate_targets
.
sort_by
(
&
:name
).
each
do
|
target
|
next
if
target
.
target_definition
.
empty?
target_installer
=
AggregateTargetInstaller
.
new
(
sandbox
,
target
)
target_installer
.
install!
end
end
end
# Generates file references to the system frameworks used by the targets.
# This is done for informative purposes and is not needed as the
# canonical source for the build settings are the xcconfig files.
#
# @return [void]
#
def
install_system_frameworks
pod_targets
.
each
do
|
pod_target
|
pod_target
.
specs
.
each
do
|
spec
|
spec
.
consumer
(
pod_target
.
platform
).
frameworks
.
each
do
|
framework
|
project
.
add_system_framework
(
framework
,
pod_target
.
target
)
end
end
end
end
# Sets the dependencies of the targets.
#
# @return [void]
#
def
set_target_dependencies
aggregate_targets
.
each
do
|
aggregate_target
|
aggregate_target
.
pod_targets
.
each
do
|
pod_target
|
aggregate_target
.
target
.
add_dependency
(
pod_target
.
target
)
pod_target
.
dependencies
.
each
do
|
dep
|
pod_dependency_target
=
aggregate_target
.
pod_targets
.
find
{
|
target
|
target
.
pod_name
==
dep
}
pod_target
.
target
.
add_dependency
(
pod_dependency_target
.
target
)
end
end
end
end
# Links the aggregate targets with all the dependent pod targets.
#
# @return [void]
#
def
link_aggregate_target
aggregate_targets
.
each
do
|
aggregate_target
|
native_target
=
aggregate_target
.
target
aggregate_target
.
pod_targets
.
each
do
|
pod_target
|
product
=
pod_target
.
target
.
product_reference
native_target
.
frameworks_build_phase
.
add_file_reference
(
product
)
end
end
end
private
# @!group Write steps
#-----------------------------------------------------------------------#
# Cleans up the project to prepare it for serialization.
#
# @return [void]
#
def
clean_up_project
project
.
pods
.
remove_from_project
if
project
.
pods
.
empty?
project
.
development_pods
.
remove_from_project
if
project
.
development_pods
.
empty?
project
.
main_group
.
recursively_sort_by_type
end
private
# @!group Private Helpers
#-----------------------------------------------------------------------#
# @return [Array<PodTarget>] The pod targets generated by the installation
# process.
#
def
pod_targets
aggregate_targets
.
map
(
&
:pod_targets
).
flatten
end
#-----------------------------------------------------------------------#
end
end
end
lib/cocoapods/installer/file_references_installer.rb
→
lib/cocoapods/installer/
pods_project_generator/
file_references_installer.rb
View file @
b14f3708
module
Pod
class
Installer
class
PodsProjectGenerator
# Controller class responsible of installing the file references of the
# specifications in the Pods project.
...
...
@@ -206,3 +207,4 @@ module Pod
end
end
end
end
lib/cocoapods/installer/target_installer.rb
→
lib/cocoapods/installer/
pods_project_generator/
target_installer.rb
View file @
b14f3708
module
Pod
class
Installer
class
PodsProjectGenerator
# Controller class responsible of creating and configuring the static
# library target in Pods project. It also creates the support file needed
...
...
@@ -128,4 +129,5 @@ module Pod
end
end
end
end
lib/cocoapods/installer/target_installer/aggregate_target_installer.rb
→
lib/cocoapods/installer/
pods_project_generator/
target_installer/aggregate_target_installer.rb
View file @
b14f3708
module
Pod
class
Installer
class
PodsProjectGenerator
# Creates the targets which aggregate the Pods libraries in the Pods
# project and the relative support files.
...
...
@@ -131,3 +132,4 @@ module Pod
end
end
end
end
lib/cocoapods/installer/target_installer/pod_target_installer.rb
→
lib/cocoapods/installer/
pods_project_generator/
target_installer/pod_target_installer.rb
View file @
b14f3708
module
Pod
class
Installer
class
PodsProjectGenerator
# Creates the target for the Pods libraries in the Pods project and the
# relative support files.
...
...
@@ -205,3 +206,4 @@ module Pod
end
end
end
end
lib/cocoapods/target/pod_target.rb
View file @
b14f3708
...
...
@@ -61,7 +61,7 @@ module Pod
def
dependencies
specs
.
map
do
|
spec
|
spec
.
consumer
(
platform
).
dependencies
.
map
{
|
dep
|
Specification
.
root_name
(
dep
.
name
)
}
end
.
flatten
end
.
flatten
.
reject
{
|
dep
|
dep
==
pod_name
}
end
end
...
...
spec/unit/installer/file_references_installer_spec.rb
→
spec/unit/installer/
pods_project_generator/
file_references_installer_spec.rb
View file @
b14f3708
require
File
.
expand_path
(
'../../../spec_helper'
,
__FILE__
)
require
File
.
expand_path
(
'../../../
../
spec_helper'
,
__FILE__
)
module
Pod
describe
Installer
::
FileReferencesInstaller
do
describe
Installer
::
PodsProjectGenerator
::
FileReferencesInstaller
do
before
do
@file_accessor
=
fixture_file_accessor
(
'banana-lib/BananaLib.podspec'
)
...
...
@@ -9,7 +9,7 @@ module Pod
@pod_target
.
file_accessors
=
[
@file_accessor
]
@project
=
Project
.
new
(
config
.
sandbox
.
project_path
)
@project
.
add_pod_group
(
'BananaLib'
,
fixture
(
'banana-lib'
))
@installer
=
Installer
::
FileReferencesInstaller
.
new
(
config
.
sandbox
,
[
@pod_target
],
@project
)
@installer
=
Installer
::
PodsProjectGenerator
::
FileReferencesInstaller
.
new
(
config
.
sandbox
,
[
@pod_target
],
@project
)
end
#-------------------------------------------------------------------------#
...
...
@@ -74,7 +74,7 @@ module Pod
pod_target_1
.
file_accessors
=
[
fixture_file_accessor
(
'banana-lib/BananaLib.podspec'
)]
pod_target_2
=
PodTarget
.
new
([],
nil
,
config
.
sandbox
)
pod_target_2
.
file_accessors
=
[
fixture_file_accessor
(
'banana-lib/BananaLib.podspec'
)]
installer
=
Installer
::
FileReferencesInstaller
.
new
(
config
.
sandbox
,
[
pod_target_1
,
pod_target_2
],
@project
)
installer
=
Installer
::
PodsProjectGenerator
::
FileReferencesInstaller
.
new
(
config
.
sandbox
,
[
pod_target_1
,
pod_target_2
],
@project
)
roots
=
installer
.
send
(
:file_accessors
).
map
{
|
fa
|
fa
.
path_list
.
root
}
roots
.
should
==
[
fixture
(
'banana-lib'
),
fixture
(
'banana-lib'
)]
end
...
...
@@ -82,7 +82,7 @@ module Pod
it
"handles libraries empty libraries without file accessors"
do
pod_target_1
=
PodTarget
.
new
([],
nil
,
config
.
sandbox
)
pod_target_1
.
file_accessors
=
[]
installer
=
Installer
::
FileReferencesInstaller
.
new
(
config
.
sandbox
,
[
pod_target_1
],
@project
)
installer
=
Installer
::
PodsProjectGenerator
::
FileReferencesInstaller
.
new
(
config
.
sandbox
,
[
pod_target_1
],
@project
)
roots
=
installer
.
send
(
:file_accessors
).
should
==
[]
end
end
...
...
spec/unit/installer/target_installer/aggregate_target_installer_spec.rb
→
spec/unit/installer/
pods_project_generator/
target_installer/aggregate_target_installer_spec.rb
View file @
b14f3708
require
File
.
expand_path
(
'../../../../spec_helper'
,
__FILE__
)
require
File
.
expand_path
(
'../../../../
../
spec_helper'
,
__FILE__
)
module
Pod
describe
Installer
::
AggregateTargetInstaller
do
describe
Installer
::
PodsProjectGenerator
::
AggregateTargetInstaller
do
describe
"In General"
do
before
do
@podfile
=
Podfile
.
new
do
...
...
@@ -34,7 +34,7 @@ module Pod
@target
.
pod_targets
=
[
@pod_target
]
@installer
=
Installer
::
AggregateTargetInstaller
.
new
(
config
.
sandbox
,
@target
)
@installer
=
Installer
::
PodsProjectGenerator
::
AggregateTargetInstaller
.
new
(
config
.
sandbox
,
@target
)
@spec
.
prefix_header_contents
=
'#import "BlocksKit.h"'
end
...
...
spec/unit/installer/target_installer/pod_target_installer_spec.rb
→
spec/unit/installer/
pods_project_generator/
target_installer/pod_target_installer_spec.rb
View file @
b14f3708
require
File
.
expand_path
(
'../../../../spec_helper'
,
__FILE__
)
require
File
.
expand_path
(
'../../../../
../
spec_helper'
,
__FILE__
)
module
Pod
describe
Installer
::
PodTargetInstaller
do
describe
Installer
::
Pod
sProjectGenerator
::
Pod
TargetInstaller
do
describe
"In General"
do
before
do
@podfile
=
Podfile
.
new
do
...
...
@@ -25,7 +25,7 @@ module Pod
@pod_target
.
stubs
(
:platform
).
returns
(
Platform
.
new
(
:ios
,
'6.0'
))
@pod_target
.
file_accessors
=
[
file_accessor
]
@pod_target
.
user_build_configurations
=
{
'Debug'
=>
:debug
,
'Release'
=>
:release
}
@installer
=
Installer
::
PodTargetInstaller
.
new
(
config
.
sandbox
,
@pod_target
)
@installer
=
Installer
::
Pod
sProjectGenerator
::
Pod
TargetInstaller
.
new
(
config
.
sandbox
,
@pod_target
)
@spec
.
prefix_header_contents
=
'#import "BlocksKit.h"'
end
...
...
spec/unit/installer/target_installer_spec.rb
→
spec/unit/installer/
pods_project_generator/
target_installer_spec.rb
View file @
b14f3708
require
File
.
expand_path
(
'../../../spec_helper'
,
__FILE__
)
require
File
.
expand_path
(
'../../../
../
spec_helper'
,
__FILE__
)
module
Pod
describe
Installer
::
TargetInstaller
do
describe
Installer
::
PodsProjectGenerator
::
TargetInstaller
do
before
do
@podfile
=
Podfile
.
new
do
...
...
@@ -26,7 +26,7 @@ module Pod
@pod_target
.
user_build_configurations
=
{
'Debug'
=>
:debug
,
'Release'
=>
:release
,
'AppStore'
=>
:release
,
'Test'
=>
:debug
}
@pod_target
.
file_accessors
=
[
file_accessor
]
@installer
=
Installer
::
TargetInstaller
.
new
(
config
.
sandbox
,
@pod_target
)
@installer
=
Installer
::
PodsProjectGenerator
::
TargetInstaller
.
new
(
config
.
sandbox
,
@pod_target
)
end
it
"sets the ARCHS"
do
...
...
spec/unit/installer/pods_project_generator_spec.rb
0 → 100644
View file @
b14f3708
require
File
.
expand_path
(
'../../../spec_helper'
,
__FILE__
)
module
Pod
class
Installer
describe
PodsProjectGenerator
do
#-----------------------------------------------------------------------#
describe
"In general"
do
before
do
@sut
=
PodsProjectGenerator
.
new
(
config
.
sandbox
,
[])
end
it
"performs an installation"
do
@sut
.
send
(
:install
)
@sut
.
project
.
should
.
not
.
be
.
nil
end
it
"can write the pods project"
do
@sut
.
send
(
:install
)
@sut
.
project
.
expects
(
:save
)
@sut
.
send
(
:write_pod_project
)
end
end
#-----------------------------------------------------------------------#
describe
"#prepare_project"
do
before
do
@sut
=
PodsProjectGenerator
.
new
(
config
.
sandbox
,
[])
@sut
.
user_build_configurations
=
{
'App Store'
=>
:release
,
'Test'
=>
:debug
}
end
it
"creates the Pods project"
do
@sut
.
send
(
:prepare_project
)
@sut
.
project
.
class
.
should
==
Pod
::
Project
end
it
"creates a group for each Pod"
do
pod_target
=
PodTarget
.
new
([],
nil
,
config
.
sandbox
)
pod_target
.
stubs
(
:pod_name
).
returns
(
'BananaLib'
)
@sut
.
stubs
(
:pod_targets
).
returns
([
pod_target
])
@sut
.
send
(
:prepare_project
)
@sut
.
project
[
'Pods/BananaLib'
].
should
.
not
.
be
.
nil
end
it
"creates a group for each development Pod"
do
pod_target
=
PodTarget
.
new
([],
nil
,
config
.
sandbox
)
pod_target
.
stubs
(
:pod_name
).
returns
(
'BananaLib'
)
@sut
.
stubs
(
:pod_targets
).
returns
([
pod_target
])
config
.
sandbox
.
expects
(
:pod_dir
).
with
(
'BananaLib'
).
returns
(
'/BananaLib'
)
config
.
sandbox
.
expects
(
:local?
).
with
(
'BananaLib'
).
returns
(
true
)
@sut
.
send
(
:prepare_project
)
@sut
.
project
[
'Development Pods/BananaLib'
].
should
.
not
.
be
.
nil
end
it
"adds the Podfile to the project"
do
@sut
.
podfile_path
=
Pathname
.
new
(
'/Podfile'
)
@sut
.
send
(
:prepare_project
)
@sut
.
project
[
'Podfile'
].
should
.
be
.
not
.
nil
end
it
"adds the user build configurations to the project"
do
@sut
.
send
(
:prepare_project
)
@sut
.
project
.
build_configurations
.
map
(
&
:name
).
sort
.
should
==
[
'App Store'
,
'Debug'
,
'Release'
,
'Test'
]
end
it
"sets STRIP_INSTALLED_PRODUCT to NO for all configurations of the project"
do
@sut
.
send
(
:prepare_project
)
@sut
.
project
.
build_configurations
.
each
do
|
build_configuration
|
build_configuration
.
build_settings
[
"STRIP_INSTALLED_PRODUCT"
].
should
==
"NO"
end
end
it
"sets the deployment target for the project"
do
target_ios
=
AggregateTarget
.
new
(
nil
,
config
.
sandbox
)
target_osx
=
AggregateTarget
.
new
(
nil
,
config
.
sandbox
)
target_ios
.
stubs
(
:platform
).
returns
(
Platform
.
new
(
:ios
,
'6.0'
))
target_osx
.
stubs
(
:platform
).
returns
(
Platform
.
new
(
:osx
,
'10.8'
))
@sut
.
stubs
(
:aggregate_targets
).
returns
([
target_ios
,
target_osx
])
@sut
.
send
(
:prepare_project
)
build_settings
=
@sut
.
project
.
build_configurations
.
map
(
&
:build_settings
)
build_settings
.
each
do
|
build_setting
|
build_setting
[
"MACOSX_DEPLOYMENT_TARGET"
].
should
==
'10.8'
build_setting
[
"IPHONEOS_DEPLOYMENT_TARGET"
].
should
==
'6.0'
end
end
end
#-----------------------------------------------------------------------#
describe
"#install_file_references"
do
before
do
@sut
=
PodsProjectGenerator
.
new
(
config
.
sandbox
,
[])
end
it
"installs the file references"
do
Installer
::
PodsProjectGenerator
::
FileReferencesInstaller
.
any_instance
.
expects
(
:install!
)
@sut
.
send
(
:install_file_references
)
end
end
#-----------------------------------------------------------------------#
describe
"#install_targets"
do
before
do
@target_definition
=
Podfile
::
TargetDefinition
.
new
(
:default
,
nil
)
pod_target
=
PodTarget
.
new
([],
@target_definition
,
config
.
sandbox
)
pod_target
.
stubs
(
:name
).
returns
(
'BananaLib'
)
aggregate_target
=
AggregateTarget
.
new
(
@target_definition
,
config
.
sandbox
)
aggregate_target
.
pod_targets
=
[
pod_target
]
@sut
=
PodsProjectGenerator
.
new
(
config
.
sandbox
,
[
aggregate_target
])
end
it
"install the aggregate targets"
do
@target_definition
.
store_pod
(
'BananaLib'
)
Installer
::
PodsProjectGenerator
::
PodTargetInstaller
.
any_instance
.
stubs
(
:install!
)
Installer
::
PodsProjectGenerator
::
AggregateTargetInstaller
.
any_instance
.
expects
(
:install!
)
@sut
.
send
(
:install_targets
)
end
it
"install the Pod targets"
do
@target_definition
.
store_pod
(
'BananaLib'
)
Installer
::
PodsProjectGenerator
::
AggregateTargetInstaller
.
any_instance
.
stubs
(
:install!
)
Installer
::
PodsProjectGenerator
::
PodTargetInstaller
.
any_instance
.
expects
(
:install!
)
@sut
.
send
(
:install_targets
)
end
it
"skips empty targets"
do
Installer
::
PodsProjectGenerator
::
PodTargetInstaller
.
any_instance
.
expects
(
:install!
).
never
Installer
::
PodsProjectGenerator
::
PodTargetInstaller
.
any_instance
.
expects
(
:install!
).
never
@sut
.
send
(
:install_targets
)
end
end
#-----------------------------------------------------------------------#
describe
"#install_system_frameworks"
do
before
do
spec
=
Spec
.
new
spec
.
frameworks
=
[
'QuartzCore'
]
pod_target
=
PodTarget
.
new
([
spec
],
nil
,
config
.
sandbox
)
pod_target
.
stubs
(
:pod_name
).
returns
(
'BananaLib'
)
pod_target
.
stubs
(
:platform
).
returns
(
:ios
)
@pod_native_target
=
stub
()
pod_target
.
target
=
@pod_native_target
@sut
=
PodsProjectGenerator
.
new
(
config
.
sandbox
,
[])
@sut
.
stubs
(
:pod_targets
).
returns
([
pod_target
])
@sut
.
send
(
:prepare_project
)
end
it
'adds the frameworks required by to the pod to the project for informative purposes'
do
Project
.
any_instance
.
expects
(
:add_system_framework
).
with
(
'QuartzCore'
,
@pod_native_target
)
@sut
.
send
(
:install_system_frameworks
)
end
end
#-----------------------------------------------------------------------#
describe
"#set_target_dependencies"
do
before
do
project
=
Pod
::
Project
.
new
(
config
.
sandbox
.
project_path
)
aggregate_native_target
=
project
.
new_target
(
:static_library
,
'Pods'
,
:ios
)
pod_native_target_1
=
project
.
new_target
(
:static_library
,
'Pods-BananaLib'
,
:ios
)
@pod_target_1
=
PodTarget
.
new
([],
nil
,
config
.
sandbox
)
@pod_target_1
.
stubs
(
:pod_name
).
returns
(
'BananaLib'
)
@pod_target_1
.
target
=
pod_native_target_1
pod_native_target_2
=
project
.
new_target
(
:static_library
,
'Pods-monkey'
,
:ios
)
pod_target_2
=
PodTarget
.
new
([],
nil
,
config
.
sandbox
)
pod_target_2
.
stubs
(
:pod_name
).
returns
(
'monkey'
)
pod_target_2
.
target
=
pod_native_target_2
@aggregate_target
=
AggregateTarget
.
new
(
nil
,
config
.
sandbox
)
@aggregate_target
.
pod_targets
=
[
@pod_target_1
,
pod_target_2
]
@aggregate_target
.
target
=
aggregate_native_target
@sut
=
PodsProjectGenerator
.
new
(
config
.
sandbox
,
[
@aggregate_target
])
end
it
"sets the pod targets as dependencies of the aggregate target"
do
@sut
.
send
(
:set_target_dependencies
)
dependencies
=
@aggregate_target
.
target
.
dependencies
dependencies
.
map
{
|
d
|
d
.
target
.
name
}.
should
==
[
"Pods-BananaLib"
,
"Pods-monkey"
]
end
it
"sets the dependencies of the pod targets"
do
@pod_target_1
.
stubs
(
:dependencies
).
returns
([
'monkey'
])
@sut
.
send
(
:set_target_dependencies
)
dependencies
=
@pod_target_1
.
target
.
dependencies
dependencies
.
map
{
|
d
|
d
.
target
.
name
}.
should
==
[
"Pods-monkey"
]
end
end
#-----------------------------------------------------------------------#
describe
"#link_aggregate_target"
do
before
do
project
=
Pod
::
Project
.
new
(
config
.
sandbox
.
project_path
)
@aggregate_native_target
=
project
.
new_target
(
:static_library
,
'Pods'
,
:ios
)
@pod_native_target
=
project
.
new_target
(
:static_library
,
'Pods-BananaLib'
,
:ios
)
pod_target
=
PodTarget
.
new
([],
nil
,
config
.
sandbox
)
pod_target
.
target
=
@pod_native_target
aggregate_target
=
AggregateTarget
.
new
(
nil
,
config
.
sandbox
)
aggregate_target
.
pod_targets
=
[
pod_target
]
aggregate_target
.
target
=
@aggregate_native_target
@sut
=
PodsProjectGenerator
.
new
(
config
.
sandbox
,
[
aggregate_target
])
end
it
"links the aggregate targets to the pod targets"
do
@sut
.
send
(
:link_aggregate_target
)
@aggregate_native_target
.
frameworks_build_phase
.
files
.
map
(
&
:file_ref
).
should
.
include?
(
@pod_native_target
.
product_reference
)
end
end
#-----------------------------------------------------------------------#
describe
"#clean_up_project"
do
before
do
@sut
=
PodsProjectGenerator
.
new
(
config
.
sandbox
,
[])
@sut
.
install
end
it
"removes the Pods group if empty"
do
@sut
.
send
(
:write_pod_project
)
@sut
.
project
[
'Pods'
].
should
.
be
.
nil
end
it
"removes the Development Pods group if empty"
do
@sut
.
send
(
:write_pod_project
)
@sut
.
project
[
'Development Pods'
].
should
.
be
.
nil
end
it
"recursively sorts the project by type"
do
@sut
.
project
.
main_group
.
expects
(
:recursively_sort_by_type
)
@sut
.
send
(
:write_pod_project
)
end
end
#-----------------------------------------------------------------------#
end
end
end
spec/unit/installer_spec.rb
View file @
b14f3708
This diff is collapsed.
Click to expand it.
spec/unit/target/pod_target_spec.rb
View file @
b14f3708
...
...
@@ -37,6 +37,18 @@ module Pod
it
"returns the name of the Pods on which this target depends"
do
@pod_target
.
dependencies
.
should
==
[
"monkey"
]
end
it
"returns the dependencies as root names"
do
dependencies
=
[
stub
(
:name
=>
'monkey/subspec'
)]
Specification
::
Consumer
.
any_instance
.
stubs
(
:dependencies
).
returns
(
dependencies
)
@pod_target
.
dependencies
.
should
==
[
"monkey"
]
end
it
"never includes itself in the dependencies"
do
dependencies
=
[
stub
(
:name
=>
'BananaLib/subspec'
)]
Specification
::
Consumer
.
any_instance
.
stubs
(
:dependencies
).
returns
(
dependencies
)
@pod_target
.
dependencies
.
should
==
[]
end
end
describe
"Support files"
do
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment