cocoapods 0.33.1 → 0.34.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +171 -46
  3. data/README.md +9 -9
  4. data/bin/pod +5 -5
  5. data/bin/sandbox-pod +2 -6
  6. data/lib/cocoapods.rb +4 -4
  7. data/lib/cocoapods/command.rb +12 -10
  8. data/lib/cocoapods/command/init.rb +12 -13
  9. data/lib/cocoapods/command/inter_process_communication.rb +6 -17
  10. data/lib/cocoapods/command/lib.rb +27 -24
  11. data/lib/cocoapods/command/list.rb +9 -9
  12. data/lib/cocoapods/command/outdated.rb +4 -9
  13. data/lib/cocoapods/command/project.rb +57 -19
  14. data/lib/cocoapods/command/push.rb +0 -1
  15. data/lib/cocoapods/command/repo.rb +14 -15
  16. data/lib/cocoapods/command/repo/push.rb +24 -19
  17. data/lib/cocoapods/command/search.rb +12 -13
  18. data/lib/cocoapods/command/setup.rb +10 -9
  19. data/lib/cocoapods/command/spec.rb +67 -63
  20. data/lib/cocoapods/config.rb +21 -54
  21. data/lib/cocoapods/downloader.rb +0 -1
  22. data/lib/cocoapods/executable.rb +3 -8
  23. data/lib/cocoapods/external_sources.rb +2 -4
  24. data/lib/cocoapods/external_sources/abstract_external_source.rb +15 -10
  25. data/lib/cocoapods/external_sources/downloader_source.rb +0 -2
  26. data/lib/cocoapods/external_sources/path_source.rb +1 -4
  27. data/lib/cocoapods/external_sources/podspec_source.rb +1 -3
  28. data/lib/cocoapods/gem_version.rb +1 -2
  29. data/lib/cocoapods/generator/acknowledgements.rb +5 -8
  30. data/lib/cocoapods/generator/acknowledgements/markdown.rb +5 -7
  31. data/lib/cocoapods/generator/acknowledgements/plist.rb +9 -10
  32. data/lib/cocoapods/generator/bridge_support.rb +1 -1
  33. data/lib/cocoapods/generator/copy_resources_script.rb +10 -14
  34. data/lib/cocoapods/generator/dummy_source.rb +3 -3
  35. data/lib/cocoapods/generator/prefix_header.rb +15 -16
  36. data/lib/cocoapods/generator/target_environment_header.rb +122 -36
  37. data/lib/cocoapods/generator/xcconfig.rb +0 -4
  38. data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +74 -65
  39. data/lib/cocoapods/generator/xcconfig/private_pod_xcconfig.rb +92 -95
  40. data/lib/cocoapods/generator/xcconfig/public_pod_xcconfig.rb +48 -51
  41. data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +10 -10
  42. data/lib/cocoapods/hooks/installer_representation.rb +15 -18
  43. data/lib/cocoapods/hooks/library_representation.rb +4 -8
  44. data/lib/cocoapods/hooks/pod_representation.rb +1 -5
  45. data/lib/cocoapods/hooks_manager.rb +63 -0
  46. data/lib/cocoapods/installer.rb +60 -47
  47. data/lib/cocoapods/installer/analyzer.rb +60 -62
  48. data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +5 -8
  49. data/lib/cocoapods/installer/file_references_installer.rb +7 -10
  50. data/lib/cocoapods/installer/hooks_context.rb +74 -0
  51. data/lib/cocoapods/installer/migrator.rb +99 -0
  52. data/lib/cocoapods/installer/pod_source_installer.rb +9 -29
  53. data/lib/cocoapods/installer/target_installer.rb +7 -17
  54. data/lib/cocoapods/installer/target_installer/aggregate_target_installer.rb +40 -41
  55. data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +43 -54
  56. data/lib/cocoapods/installer/user_project_integrator.rb +54 -10
  57. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +66 -117
  58. data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +116 -0
  59. data/lib/cocoapods/open_uri.rb +1 -2
  60. data/lib/cocoapods/project.rb +34 -8
  61. data/lib/cocoapods/resolver.rb +43 -21
  62. data/lib/cocoapods/sandbox.rb +80 -75
  63. data/lib/cocoapods/sandbox/file_accessor.rb +3 -8
  64. data/lib/cocoapods/sandbox/headers_store.rb +6 -7
  65. data/lib/cocoapods/sandbox/path_list.rb +7 -10
  66. data/lib/cocoapods/sources_manager.rb +81 -49
  67. data/lib/cocoapods/target.rb +18 -12
  68. data/lib/cocoapods/target/aggregate_target.rb +43 -18
  69. data/lib/cocoapods/target/pod_target.rb +37 -4
  70. data/lib/cocoapods/user_interface.rb +19 -18
  71. data/lib/cocoapods/user_interface/error_report.rb +23 -4
  72. data/lib/cocoapods/validator.rb +30 -33
  73. metadata +100 -73
  74. data/lib/cocoapods/command/help.rb +0 -25
@@ -0,0 +1,116 @@
1
+ module Pod
2
+ class Installer
3
+ class UserProjectIntegrator
4
+ class TargetIntegrator
5
+ # Configures an user target to use the CocoaPods xcconfigs which allow
6
+ # lo link against the Pods.
7
+ #
8
+ class XCConfigIntegrator
9
+ # Integrates the user target.
10
+ #
11
+ # @param [Target::AggregateTarget] pod_bundle
12
+ # The Pods bundle.
13
+ #
14
+ # @param [Array<PBXNativeTarget>] targets
15
+ # The native targets associated which should be integrated
16
+ # with the Pod bundle.
17
+ #
18
+ def self.integrate(pod_bundle, targets)
19
+ targets.each do |target|
20
+ target.build_configurations.each do |config|
21
+ update_to_cocoapods_0_34(pod_bundle, targets)
22
+ set_target_xcconfig(pod_bundle, config)
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ # @!group Integration steps
30
+ #-------------------------------------------------------------------#
31
+
32
+ # Removes the xcconfig used up to CocoaPods 0.33 from the project and
33
+ # deletes the file if it exists.
34
+ #
35
+ # @param [Target::AggregateTarget] pod_bundle
36
+ # The Pods bundle.
37
+ #
38
+ # @param [XcodeProj::PBXNativeTarget] target
39
+ # The native targets.
40
+ #
41
+ # @todo This can be removed for CocoaPods 1.0
42
+ #
43
+ def self.update_to_cocoapods_0_34(pod_bundle, targets)
44
+ sandbox = pod_bundle.sandbox
45
+ targets.map(&:project).uniq.each do |project|
46
+ file_refs = project.files.select do |file_ref|
47
+ path = file_ref.path.to_s
48
+ if File.extname(path) == '.xcconfig'
49
+ absolute_path = file_ref.real_path.to_s
50
+ absolute_path.start_with?(sandbox.root.to_s) &&
51
+ !absolute_path.start_with?(sandbox.target_support_files_root.to_s)
52
+ end
53
+ end
54
+
55
+ file_refs.uniq.each do |file_ref|
56
+ UI.message "- Removing (#{file_ref.path})" do
57
+ file_ref.remove_from_project
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ # Creates a file reference to the xcconfig generated by
64
+ # CocoaPods (if needed) and sets it as the base configuration of
65
+ # build configuration of the user target.
66
+ #
67
+ # @param [Target::AggregateTarget] pod_bundle
68
+ # The Pods bundle.
69
+ #
70
+ # @param [[Xcodeproj::XCBuildConfiguration] config
71
+ # The build configuration.
72
+ #
73
+ def self.set_target_xcconfig(pod_bundle, config)
74
+ path = pod_bundle.xcconfig_relative_path(config.name)
75
+ group = config.project['Pods'] || config.project.new_group('Pods')
76
+ file_ref = group.files.find { |f| f.path == path }
77
+ file_ref ||= group.new_file(path)
78
+ config.base_configuration_reference = file_ref
79
+ end
80
+
81
+ private
82
+
83
+ # @!group Private helpers
84
+ #-------------------------------------------------------------------#
85
+
86
+ # Prints a warning informing the user that a build configuration of
87
+ # the integrated target is overriding the CocoaPods build settings.
88
+ #
89
+ # @param [Target::AggregateTarget] pod_bundle
90
+ # The Pods bundle.
91
+ #
92
+ # @param [XcodeProj::PBXNativeTarget] target
93
+ # The native target.
94
+ #
95
+ # @param [Xcodeproj::XCBuildConfiguration] config
96
+ # The build configuration.
97
+ #
98
+ # @param [String] key
99
+ # The key of the overridden build setting.
100
+ #
101
+ def self.print_override_warning(pod_bundle, target, config, key)
102
+ actions = [
103
+ 'Use the `$(inherited)` flag, or',
104
+ 'Remove the build settings from the target.',
105
+ ]
106
+ message = "The `#{target.name} [#{config.name}]` " \
107
+ "target overrides the `#{key}` build setting defined in " \
108
+ "`#{pod_bundle.xcconfig_relative_path(config.name)}'. " \
109
+ 'This can lead to problems with the CocoaPods installation'
110
+ UI.warn(message, actions)
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -3,7 +3,6 @@ require 'open-uri'
3
3
  # Allow OpenURI to follow http to https redirects.
4
4
  #
5
5
  module OpenURI
6
-
7
6
  # Whether {#open} should follow a redirect.
8
7
  #
9
8
  # Inspiration from: https://gist.github.com/1271420
@@ -17,7 +16,7 @@ module OpenURI
17
16
  # (RFC 2109 4.3.1, RFC 2965 3.3, RFC 2616 15.1.3)
18
17
  # However this is ad hoc. It should be extensible/configurable.
19
18
  #
20
- def OpenURI.redirectable?(uri1, uri2)
19
+ def self.redirectable?(uri1, uri2)
21
20
  uri1.scheme.downcase == uri2.scheme.downcase ||
22
21
  (/\A(?:http|ftp)\z/i =~ uri1.scheme && /\A(?:https?|ftp)\z/i =~ uri2.scheme)
23
22
  end
@@ -1,14 +1,12 @@
1
1
  require 'xcodeproj'
2
2
 
3
3
  module Pod
4
-
5
4
  # The Pods project.
6
5
  #
7
6
  # Model class which provides helpers for working with the Pods project
8
7
  # through the installation process.
9
8
  #
10
9
  class Project < Xcodeproj::Project
11
-
12
10
  # @param [Pathname, String] path @see path
13
11
  # @param [Bool] skip_initialization
14
12
  # Wether the project should be initialized from scratch.
@@ -34,7 +32,6 @@ module Pod
34
32
  #
35
33
  attr_reader :development_pods
36
34
 
37
-
38
35
  public
39
36
 
40
37
  # @!group Pod Groups
@@ -58,7 +55,7 @@ module Pod
58
55
  # @return [PBXGroup] The new group.
59
56
  #
60
57
  def add_pod_group(pod_name, path, development = false, absolute = false)
61
- raise "[BUG]" if pod_group(pod_name)
58
+ raise '[BUG]' if pod_group(pod_name)
62
59
 
63
60
  parent_group = development ? development_pods : pods
64
61
  source_tree = absolute ? :absolute : :group
@@ -125,12 +122,11 @@ module Pod
125
122
  #
126
123
  # @return [PBXGroup] The group.
127
124
  #
128
- def pod_support_files_group(pod_name)
125
+ def pod_support_files_group(pod_name, dir)
129
126
  group = pod_group(pod_name)
130
127
  support_files_group = group['Support Files']
131
128
  unless support_files_group
132
- support_files_group = group.new_group('Support Files')
133
- support_files_group.source_tree = 'SOURCE_ROOT'
129
+ support_files_group = group.new_group('Support Files', dir)
134
130
  end
135
131
  support_files_group
136
132
  end
@@ -193,6 +189,37 @@ module Pod
193
189
  podfile_ref
194
190
  end
195
191
 
192
+ # Adds a new build configuration to the project and populates it with
193
+ # default settings according to the provided type.
194
+ #
195
+ # @note This method extends the original Xcodeproj implementation to
196
+ # include a preprocessor definition named after the build
197
+ # setting. This is done to support the TargetEnvironmentHeader
198
+ # specification of Pods available only on certain build
199
+ # configurations.
200
+ #
201
+ # @param [String] name
202
+ # The name of the build configuration.
203
+ #
204
+ # @param [Symbol] type
205
+ # The type of the build configuration used to populate the build
206
+ # settings, must be :debug or :release.
207
+ #
208
+ # @return [XCBuildConfiguration] The new build configuration.
209
+ #
210
+ def add_build_configuration(name, type)
211
+ build_configuration = super
212
+ values = ["#{name.gsub(' ', '_').upcase}=1"]
213
+ settings = build_configuration.build_settings
214
+ definitions = Array(settings['GCC_PREPROCESSOR_DEFINITIONS'])
215
+ values.each do |value|
216
+ unless definitions.include?(value)
217
+ definitions << value
218
+ end
219
+ end
220
+ settings['GCC_PREPROCESSOR_DEFINITIONS'] = definitions
221
+ build_configuration
222
+ end
196
223
 
197
224
  private
198
225
 
@@ -205,6 +232,5 @@ module Pod
205
232
  attr_reader :refs_by_absolute_path
206
233
 
207
234
  #-------------------------------------------------------------------------#
208
-
209
235
  end
210
236
  end
@@ -1,5 +1,4 @@
1
1
  module Pod
2
-
3
2
  # The resolver is responsible of generating a list of specifications grouped
4
3
  # by target for a given Podfile.
5
4
  #
@@ -15,7 +14,6 @@ module Pod
15
14
  #
16
15
  #
17
16
  class Resolver
18
-
19
17
  # @return [Sandbox] the Sandbox used by the resolver to find external
20
18
  # dependencies.
21
19
  #
@@ -30,14 +28,21 @@ module Pod
30
28
  #
31
29
  attr_reader :locked_dependencies
32
30
 
31
+ # @return [Array<Source>] The list of the sources which will be used for
32
+ # the resolution.
33
+ #
34
+ attr_accessor :sources
35
+
33
36
  # @param [Sandbox] sandbox @see sandbox
34
37
  # @param [Podfile] podfile @see podfile
35
38
  # @param [Array<Dependency>] locked_dependencies @see locked_dependencies
39
+ # @param [Array<Source>, Source] sources @see sources
36
40
  #
37
- def initialize(sandbox, podfile, locked_dependencies = [])
41
+ def initialize(sandbox, podfile, locked_dependencies, sources)
38
42
  @sandbox = sandbox
39
43
  @podfile = podfile
40
44
  @locked_dependencies = locked_dependencies
45
+ @sources = Array(sources)
41
46
  end
42
47
 
43
48
  #-------------------------------------------------------------------------#
@@ -53,14 +58,15 @@ module Pod
53
58
  # definition.
54
59
  #
55
60
  def resolve
56
- @cached_sources = SourcesManager.aggregate
57
61
  @cached_sets = {}
58
62
  @cached_specs = {}
59
63
  @specs_by_target = {}
60
64
 
61
65
  target_definitions = podfile.target_definition_list
62
66
  target_definitions.each do |target|
63
- UI.section "Resolving dependencies for target `#{target.name}' (#{target.platform})" do
67
+ title = "Resolving dependencies for target `#{target.name}' " \
68
+ "(#{target.platform})"
69
+ UI.section(title) do
64
70
  @loaded_specs = []
65
71
  find_dependency_specs(podfile, target.dependencies, target)
66
72
  specs = cached_specs.values_at(*@loaded_specs).sort_by(&:name)
@@ -85,14 +91,6 @@ module Pod
85
91
 
86
92
  # !@ Resolution context
87
93
 
88
- # @return [Source::Aggregate] A cache of the sources needed to find the
89
- # podspecs.
90
- #
91
- # @note The sources are cached because frequently accessed by the
92
- # resolver and loading them requires disk activity.
93
- #
94
- attr_accessor :cached_sources
95
-
96
94
  # @return [Hash<String => Set>] A cache that keeps tracks of the sets
97
95
  # loaded by the resolution process.
98
96
  #
@@ -150,7 +148,7 @@ module Pod
150
148
  dependency = locked_dep if locked_dep
151
149
 
152
150
  UI.message("- #{dependency}", '', 2) do
153
- set = find_cached_set(dependency)
151
+ set = find_cached_set(dependency, dependent_spec)
154
152
  set.required_by(dependency, dependent_spec.to_s)
155
153
 
156
154
  unless @loaded_specs.include?(dependency.name)
@@ -170,38 +168,62 @@ module Pod
170
168
  end
171
169
  end
172
170
 
173
- # Loads or returns a previously initialized for the Pod of the given
174
- # dependency.
171
+ # @return [Set] Loads or returns a previously initialized set for the Pod
172
+ # of the given dependency.
175
173
  #
176
174
  # @param [Dependency] dependency
177
- # the dependency for which the set is needed.
175
+ # The dependency for which the set is needed.
176
+ #
177
+ # @param [#to_s] dependent_spec
178
+ # the specification whose dependencies are being resolved. Used
179
+ # only for UI purposes.
178
180
  #
179
181
  # @return [Set] the cached set for a given dependency.
180
182
  #
181
- def find_cached_set(dependency)
183
+ def find_cached_set(dependency, dependent_spec)
182
184
  name = dependency.root_name
183
185
  unless cached_sets[name]
184
186
  if dependency.external_source
185
187
  spec = sandbox.specification(dependency.root_name)
186
188
  unless spec
187
- raise StandardError, "[Bug] Unable to find the specification for `#{dependency}`."
189
+ raise StandardError, '[Bug] Unable to find the specification ' \
190
+ "for `#{dependency}`."
188
191
  end
189
192
  set = Specification::Set::External.new(spec)
190
193
  else
191
- set = cached_sources.search(dependency)
194
+ set = find_set_from_sources(dependency)
192
195
  end
193
196
  cached_sets[name] = set
194
197
  unless set
195
- raise Informative, "Unable to find a specification for `#{dependency}`."
198
+ raise Informative, 'Unable to find a specification for ' \
199
+ "`#{dependency}` depended upon by #{dependent_spec}."
196
200
  end
197
201
  end
198
202
  cached_sets[name]
199
203
  end
200
204
 
205
+ # @return [Set] Loads a set for the Pod of the given dependency from the
206
+ # sources. The set will be limited to the versions of the first
207
+ # source which includes the Pod.
208
+ #
209
+ # @param [Dependency] dependency
210
+ # The dependency for which the set is needed.
211
+ #
212
+ def find_set_from_sources(dependency)
213
+ sources.each do |source|
214
+ set = source.search(dependency)
215
+ return set if set
216
+ end
217
+ nil
218
+ end
219
+
201
220
  # Ensures that a specification is compatible with the platform of a target.
202
221
  #
203
222
  # @raise If the specification is not supported by the target.
204
223
  #
224
+ # @todo This step is not specific to the resolution process and should be
225
+ # performed later in the analysis.
226
+ #
205
227
  # @return [void]
206
228
  #
207
229
  def validate_platform(spec, target)
@@ -1,7 +1,6 @@
1
1
  require 'fileutils'
2
2
 
3
3
  module Pod
4
-
5
4
  # The sandbox provides support for the directory that CocoaPods uses for an
6
5
  # installation. In this directory the Pods projects, the support files and
7
6
  # the sources of the Pods are stored.
@@ -12,41 +11,31 @@ module Pod
12
11
  #
13
12
  # Pods
14
13
  # |
15
- # +-- User
16
- # | +-- [Target Name]-configuration.h
17
- # | +-- Specs
18
- # | +-- Scripts
14
+ # +-- Headers
15
+ # | +-- Private
16
+ # | | +-- [Pod Name]
17
+ # | +-- Public
18
+ # | +-- [Pod Name]
19
19
  # |
20
- # +-- Generated
21
- # +-- Headers
22
- # | +-- Private
23
- # | | +-- [Pod Name]
24
- # | +-- Public
25
- # | +-- [Pod Name]
26
- # |
27
- # +-- Sources
28
- # | +-- [Pod Name]
29
- # |
30
- # +-- Specs
31
- # | +-- External Sources
32
- # | +-- Normal Sources
33
- # |
34
- # +-- Target Support Files
35
- # | +-- [Target Name]
36
- # | +-- Pods-acknowledgements.markdown
37
- # | +-- Pods-acknowledgements.plist
38
- # | +-- Pods-dummy.m
39
- # | +-- Pods-prefix.pch
40
- # | +-- Pods.xcconfig
41
- # |
42
- # +-- Manifest.lock
43
- # |
44
- # +-- Pods.xcodeproj
45
- #
46
- # See #833
20
+ # +-- Local Podspecs
21
+ # | +-- External Sources
22
+ # | +-- Normal Sources
23
+ # |
24
+ # +-- Target Support Files
25
+ # | +-- [Target Name]
26
+ # | +-- Pods-acknowledgements.markdown
27
+ # | +-- Pods-acknowledgements.plist
28
+ # | +-- Pods-dummy.m
29
+ # | +-- Pods-prefix.pch
30
+ # | +-- Pods.xcconfig
31
+ # |
32
+ # +-- [Pod Name]
33
+ # |
34
+ # +-- Manifest.lock
35
+ # |
36
+ # +-- Pods.xcodeproj
47
37
  #
48
38
  class Sandbox
49
-
50
39
  autoload :FileAccessor, 'cocoapods/sandbox/file_accessor'
51
40
  autoload :HeadersStore, 'cocoapods/sandbox/headers_store'
52
41
  autoload :PathList, 'cocoapods/sandbox/path_list'
@@ -64,7 +53,7 @@ module Pod
64
53
  def initialize(root)
65
54
  FileUtils.mkdir_p(root)
66
55
  @root = Pathname.new(root).realpath
67
- @public_headers = HeadersStore.new(self, "Headers")
56
+ @public_headers = HeadersStore.new(self, 'Public')
68
57
  @predownloaded_pods = []
69
58
  @head_pods = []
70
59
  @checkout_sources = {}
@@ -83,14 +72,6 @@ module Pod
83
72
  #
84
73
  attr_accessor :project
85
74
 
86
- # Removes the sandbox.
87
- #
88
- # @return [void]
89
- #
90
- def implode
91
- root.rmtree
92
- end
93
-
94
75
  # Removes the files of the Pod with the given name from the sandbox.
95
76
  #
96
77
  # @return [void]
@@ -105,6 +86,19 @@ module Pod
105
86
  podspe_path.rmtree if podspe_path
106
87
  end
107
88
 
89
+ # Prepares the sandbox for a new installation removing any file that will
90
+ # be regenerated and ensuring that the directories exists.
91
+ #
92
+ def prepare
93
+ FileUtils.rm_rf(headers_root)
94
+ FileUtils.rm_rf(target_support_files_root)
95
+
96
+ FileUtils.mkdir_p(headers_root)
97
+ FileUtils.mkdir_p(sources_root)
98
+ FileUtils.mkdir_p(specifications_root)
99
+ FileUtils.mkdir_p(target_support_files_root)
100
+ end
101
+
108
102
  # @return [String] a string representation suitable for debugging.
109
103
  #
110
104
  def inspect
@@ -120,26 +114,25 @@ module Pod
120
114
  # @return [Pathname] the path of the manifest.
121
115
  #
122
116
  def manifest_path
123
- root + "Manifest.lock"
117
+ root + 'Manifest.lock'
124
118
  end
125
119
 
126
120
  # @return [Pathname] the path of the Pods project.
127
121
  #
128
122
  def project_path
129
- root + "Pods.xcodeproj"
123
+ root + 'Pods.xcodeproj'
130
124
  end
131
125
 
132
- # Returns the path for the directory where to store the support files of
133
- # a target.
126
+ # Returns the path for the directory where the support files of
127
+ # a target are stored.
134
128
  #
135
129
  # @param [String] name
136
130
  # The name of the target.
137
131
  #
138
132
  # @return [Pathname] the path of the support files.
139
133
  #
140
- def library_support_files_dir(name)
141
- # root + "Target Support Files/#{name}"
142
- root
134
+ def target_support_files_dir(name)
135
+ target_support_files_root + name
143
136
  end
144
137
 
145
138
  # Returns the path where the Pod with the given name is stored, taking into
@@ -155,8 +148,7 @@ module Pod
155
148
  if local?(root_name)
156
149
  Pathname.new(development_pods[root_name])
157
150
  else
158
- # root + "Sources/#{name}"
159
- root + root_name
151
+ sources_root + root_name
160
152
  end
161
153
  end
162
154
 
@@ -170,10 +162,31 @@ module Pod
170
162
  @pods_with_absolute_path.include? name
171
163
  end
172
164
 
173
- # @return [Pathname] the directory where to store the documentation.
165
+ # @return [Pathname] The directory where headers are stored.
166
+ #
167
+ def headers_root
168
+ root + 'Headers'
169
+ end
170
+
171
+ # @return [Pathname] The directory where the downloaded sources of
172
+ # the Pods are stored.
173
+ #
174
+ def sources_root
175
+ root
176
+ end
177
+
178
+ # @return [Pathname] the path for the directory where the
179
+ # specifications are stored.
180
+ #
181
+ def specifications_root
182
+ root + 'Local Podspecs'
183
+ end
184
+
185
+ # @return [Pathname] The directory where the files generated by
186
+ # CocoaPods to support the umbrella targets are stored.
174
187
  #
175
- def documentation_dir
176
- root + 'Documentation'
188
+ def target_support_files_root
189
+ root + 'Target Support Files'
177
190
  end
178
191
 
179
192
  #-------------------------------------------------------------------------#
@@ -191,21 +204,11 @@ module Pod
191
204
  #
192
205
  def specification(name)
193
206
  if file = specification_path(name)
194
- Specification.from_file(file)
207
+ original_path = development_pods[name]
208
+ Dir.chdir(original_path || Dir.pwd) { Specification.from_file(file) }
195
209
  end
196
210
  end
197
211
 
198
- # @return [Pathname] the path for the directory where to store the
199
- # specifications.
200
- #
201
- # @todo Migrate old installations and store the for all the pods.
202
- # Two folders should be created `External Sources` and `Podspecs`.
203
- #
204
- def specifications_dir(external_source = false)
205
- # root + "Specifications"
206
- root + "Local Podspecs"
207
- end
208
-
209
212
  # Returns the path of the specification for the Pod with the
210
213
  # given name, if one is stored.
211
214
  #
@@ -216,11 +219,11 @@ module Pod
216
219
  # @return [Nil] if the podspec is not stored.
217
220
  #
218
221
  def specification_path(name)
219
- path = specifications_dir + "#{name}.podspec"
222
+ path = specifications_root + "#{name}.podspec"
220
223
  if path.exist?
221
224
  path
222
225
  else
223
- path = specifications_dir + "#{name}.podspec.json"
226
+ path = specifications_root + "#{name}.podspec.json"
224
227
  if path.exist?
225
228
  path
226
229
  else
@@ -241,9 +244,9 @@ module Pod
241
244
  # @todo Store all the specifications (including those not originating
242
245
  # from external sources) so users can check them.
243
246
  #
244
- def store_podspec(name, podspec, external_source = false, json = false)
247
+ def store_podspec(name, podspec, _external_source = false, json = false)
245
248
  file_name = json ? "#{name}.podspec.json" : "#{name}.podspec"
246
- output_path = specifications_dir(external_source) + file_name
249
+ output_path = specifications_root + file_name
247
250
  output_path.dirname.mkpath
248
251
  if podspec.is_a?(String)
249
252
  output_path.open('w') { |f| f.puts(podspec) }
@@ -253,9 +256,13 @@ module Pod
253
256
  end
254
257
  FileUtils.copy(podspec, output_path)
255
258
  end
256
- spec = Specification.from_file(output_path)
257
- unless spec.name == name
258
- raise Informative, "The name of the given podspec `#{spec.name}` doesn't match the expected one `#{name}`"
259
+
260
+ Dir.chdir(podspec.is_a?(Pathname) ? File.dirname(podspec) : Dir.pwd) do
261
+ spec = Specification.from_file(output_path)
262
+
263
+ unless spec.name == name
264
+ raise Informative, "The name of the given podspec `#{spec.name}` doesn't match the expected one `#{name}`"
265
+ end
259
266
  end
260
267
  end
261
268
 
@@ -390,7 +397,5 @@ module Pod
390
397
  end
391
398
 
392
399
  #-------------------------------------------------------------------------#
393
-
394
400
  end
395
401
  end
396
-