cocoapods 0.6.0.rc2 → 0.6.0.rc3
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.
- data/README.md +10 -6
- data/lib/cocoapods.rb +1 -3
- data/lib/cocoapods/command/spec.rb +8 -7
- data/lib/cocoapods/installer.rb +1 -1
- data/lib/cocoapods/installer/target_installer.rb +5 -3
- data/lib/cocoapods/local_pod.rb +300 -86
- data/lib/cocoapods/platform.rb +99 -27
- data/lib/cocoapods/podfile.rb +6 -5
- data/lib/cocoapods/sandbox.rb +10 -0
- data/lib/cocoapods/specification.rb +44 -16
- metadata +9 -9
data/README.md
CHANGED
@@ -50,13 +50,17 @@ Now that you've got CocoaPods installed you can easily add it to your project.
|
|
50
50
|
Search for Pods by name or description.
|
51
51
|
|
52
52
|
```
|
53
|
-
$ pod search
|
54
|
-
==> ASIHTTPRequest (1.8.1)
|
55
|
-
Easy to use CFNetwork wrapper for HTTP requests, Objective-C, Mac OS X and iPhone
|
53
|
+
$ pod search json
|
56
54
|
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
--> JSONKit (1.4, 1.5pre)
|
56
|
+
A Very High Performance Objective-C JSON Library.
|
57
|
+
- Homepage: https://github.com/johnezang/JSONKit
|
58
|
+
- Source: https://github.com/johnezang/JSONKit.git
|
59
|
+
|
60
|
+
--> SBJson (2.2.3, 3.0.4, 3.1)
|
61
|
+
This library implements strict JSON parsing and generation in Objective-C.
|
62
|
+
- Homepage: http://stig.github.com/json-framework/
|
63
|
+
- Source: https://github.com/stig/json-framework.git
|
60
64
|
```
|
61
65
|
|
62
66
|
After you've found your favorite dependencies you add them to your [Podfile](https://github.com/CocoaPods/CocoaPods/wiki/A-Podfile).
|
data/lib/cocoapods.rb
CHANGED
@@ -241,13 +241,14 @@ module Pod
|
|
241
241
|
end
|
242
242
|
|
243
243
|
def podfile_from_spec
|
244
|
-
name
|
245
|
-
podspec
|
246
|
-
|
247
|
-
podfile
|
248
|
-
platform(
|
244
|
+
name = spec.name
|
245
|
+
podspec = file.realpath.to_s
|
246
|
+
platform = @platform
|
247
|
+
podfile = Pod::Podfile.new do
|
248
|
+
platform(platform)
|
249
249
|
dependency name, :podspec => podspec
|
250
250
|
end
|
251
|
+
podfile
|
251
252
|
end
|
252
253
|
|
253
254
|
def set_up_lint_environment
|
@@ -337,7 +338,7 @@ module Pod
|
|
337
338
|
messages << "The description should end with a dot" if @spec.description !~ /.*\./ && @spec.description != @spec.summary
|
338
339
|
messages << "Git sources should specify either a tag or a commit" if source[:git] && !source[:commit] && !source[:tag]
|
339
340
|
messages << "Github repositories should end in `.git'" if github_source? && source[:git] !~ /.*\.git/
|
340
|
-
messages << "Github repositories should use `https' link" if github_source? && source[:git] !~ /https:\/\/github.com/
|
341
|
+
# messages << "Github repositories should use `https' link" if github_source? && source[:git] !~ /https:\/\/github.com/
|
341
342
|
messages << "Comments must be deleted" if text =~ /^\w*#\n\w*#/ # allow a single line comment as it is generally used in subspecs
|
342
343
|
messages
|
343
344
|
end
|
@@ -405,7 +406,7 @@ module Pod
|
|
405
406
|
def file_patterns_errors
|
406
407
|
messages = []
|
407
408
|
messages << "The sources did not match any file" if !@spec.source_files.empty? && @pod.source_files.empty?
|
408
|
-
messages << "The resources did not match any file" if !@spec.resources.empty? && @pod.
|
409
|
+
messages << "The resources did not match any file" if !@spec.resources.empty? && @pod.resource_files.empty?
|
409
410
|
messages << "The preserve_paths did not match any file" if !@spec.preserve_paths.empty? && @pod.preserve_paths.empty?
|
410
411
|
messages << "The exclude_header_search_paths did not match any file" if !@spec.exclude_header_search_paths.empty? && @pod.headers_excluded_from_search_paths.empty?
|
411
412
|
messages
|
data/lib/cocoapods/installer.rb
CHANGED
@@ -29,7 +29,7 @@ module Pod
|
|
29
29
|
pods.each do |pod|
|
30
30
|
# Add all source files to the project grouped by pod
|
31
31
|
group = @project.add_pod_group(pod.name)
|
32
|
-
pod.
|
32
|
+
pod.relative_source_files.each do |path|
|
33
33
|
group.files.new('path' => path.to_s)
|
34
34
|
end
|
35
35
|
end
|
@@ -20,12 +20,12 @@ module Pod
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def copy_resources_script_for(pods)
|
23
|
-
@copy_resources_script ||= Generator::CopyResourcesScript.new(pods.map { |p| p.
|
23
|
+
@copy_resources_script ||= Generator::CopyResourcesScript.new(pods.map { |p| p.relative_resource_files }.flatten)
|
24
24
|
end
|
25
25
|
|
26
26
|
def bridge_support_generator_for(pods, sandbox)
|
27
27
|
Generator::BridgeSupport.new(pods.map do |pod|
|
28
|
-
pod.
|
28
|
+
pod.relative_header_files.map { |header| sandbox.root + header }
|
29
29
|
end.flatten)
|
30
30
|
end
|
31
31
|
|
@@ -62,13 +62,15 @@ module Pod
|
|
62
62
|
|
63
63
|
@target = @project.add_pod_target(@target_definition.label, @target_definition.platform)
|
64
64
|
|
65
|
+
source_file_descriptions = []
|
65
66
|
pods.each do |pod|
|
66
67
|
xcconfig.merge!(pod.xcconfig)
|
67
|
-
pod.
|
68
|
+
source_file_descriptions += pod.source_file_descriptions
|
68
69
|
|
69
70
|
# TODO: this doesn't need to be done here, it has nothing to do with the target
|
70
71
|
pod.link_headers
|
71
72
|
end
|
73
|
+
@target.add_source_files(source_file_descriptions)
|
72
74
|
|
73
75
|
xcconfig.merge!('HEADER_SEARCH_PATHS' => quoted(sandbox.header_search_paths).join(" "))
|
74
76
|
|
data/lib/cocoapods/local_pod.rb
CHANGED
@@ -1,125 +1,266 @@
|
|
1
1
|
module Pod
|
2
|
+
|
3
|
+
# A {LocalPod} interfaces one or more specifications belonging to one pod
|
4
|
+
# (a library) and their concrete instance in the file system.
|
5
|
+
#
|
6
|
+
# The {LocalPod} is responsible for orchestrating the activated
|
7
|
+
# specifications of a single pod. Specifically, it keeps track of the
|
8
|
+
# activated specifications and handles issues related to duplicates
|
9
|
+
# files.
|
10
|
+
# Inheritance logic belongs to the {Specification} class.
|
11
|
+
#
|
12
|
+
# The activated specifications are used to compute the paths that can be
|
13
|
+
# safely cleaned by the pod.
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
# pod = LocalPod.new 'RestKit/Networking'
|
17
|
+
# pod.add_specification 'RestKit/UI'
|
18
|
+
#
|
19
|
+
# @note
|
20
|
+
# Unless otherwise specified in the name of the method the {LocalPod}
|
21
|
+
# returns absolute paths.
|
22
|
+
#
|
2
23
|
class LocalPod
|
3
|
-
|
24
|
+
|
25
|
+
# @return [Specification] The specification that describes the pod.
|
26
|
+
#
|
27
|
+
attr_reader :top_specification
|
28
|
+
|
29
|
+
# @return [Specification] The activated specifications of the pod.
|
30
|
+
#
|
31
|
+
attr_reader :specifications
|
32
|
+
|
33
|
+
# @return [Sandbox] The sandbox where the pod is installed.
|
34
|
+
#
|
4
35
|
attr_reader :sandbox
|
5
36
|
|
37
|
+
# @return [Platform] The platform that will be used to build the pod.
|
38
|
+
#
|
39
|
+
attr_reader :platform
|
40
|
+
|
41
|
+
# @param [Specification] specification
|
42
|
+
# The first activated specification of the pod.
|
43
|
+
# @param [Sandbox] sandbox
|
44
|
+
# The sandbox where the files of the pod will be located.
|
45
|
+
# @param [Platform] platform
|
46
|
+
# The platform that will be used to build the pod.
|
47
|
+
#
|
48
|
+
# @todo The local pod should be initialized with all the activated
|
49
|
+
# specifications passed as an array, in order to be able to cache the
|
50
|
+
# computed values. In other words, it should be immutable.
|
51
|
+
#
|
6
52
|
def initialize(specification, sandbox, platform)
|
7
|
-
@top_specification, @sandbox = specification.top_level_parent, sandbox
|
53
|
+
@top_specification, @sandbox, @platform = specification.top_level_parent, sandbox, platform
|
8
54
|
@top_specification.activate_platform(platform)
|
9
55
|
@specifications = [] << specification
|
10
56
|
end
|
11
57
|
|
58
|
+
# Initializes a local pod from the top specification of a podspec file.
|
59
|
+
#
|
60
|
+
# @return [LocalPod] A new local pod.
|
61
|
+
#
|
12
62
|
def self.from_podspec(podspec, sandbox, platform)
|
13
63
|
new(Specification.from_file(podspec), sandbox, platform)
|
14
64
|
end
|
15
65
|
|
16
|
-
#
|
17
|
-
# parent. With this information the local pod can determine the
|
18
|
-
# paths to clean and avoid duplication in file processing.
|
66
|
+
# Activates a specification or subspecs for the pod.
|
19
67
|
# Adding specifications is idempotent.
|
68
|
+
#
|
69
|
+
# @param {Specification} spec The specification to add to the pod.
|
70
|
+
#
|
71
|
+
# @raise {Informative} If the specification is not part of the same pod.
|
72
|
+
#
|
20
73
|
def add_specification(spec)
|
21
|
-
|
74
|
+
unless spec.top_level_parent == top_specification
|
75
|
+
raise Informative,
|
76
|
+
"[Local Pod] Attempt to add a specification from another pod"
|
77
|
+
end
|
22
78
|
spec.activate_platform(platform)
|
23
79
|
@specifications << spec unless @specifications.include?(spec)
|
24
80
|
end
|
25
81
|
|
82
|
+
# @return [Pathname] The root directory of the pod
|
83
|
+
#
|
26
84
|
def root
|
27
85
|
@sandbox.root + top_specification.name
|
28
86
|
end
|
29
87
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
88
|
+
# @return [String] A string representation of the pod which indicates if
|
89
|
+
# the pods comes from a local source.
|
90
|
+
#
|
34
91
|
def to_s
|
35
92
|
result = top_specification.to_s
|
36
93
|
result << " [LOCAL]" if top_specification.local?
|
37
94
|
result
|
38
95
|
end
|
39
96
|
|
97
|
+
# @return [String] The name of the Pod.
|
98
|
+
#
|
40
99
|
def name
|
41
100
|
top_specification.name
|
42
101
|
end
|
43
102
|
|
44
|
-
|
45
|
-
top_specification.active_platform
|
46
|
-
end
|
47
|
-
|
48
|
-
# Installation methods
|
103
|
+
# @!group Installation
|
49
104
|
|
105
|
+
# Creates the root path of the pod.
|
106
|
+
#
|
107
|
+
# @return [void]
|
108
|
+
#
|
50
109
|
def create
|
51
110
|
root.mkpath unless exists?
|
52
111
|
end
|
53
112
|
|
113
|
+
# Whether the root path of the pod exists.
|
114
|
+
#
|
54
115
|
def exists?
|
55
116
|
root.exist?
|
56
117
|
end
|
57
118
|
|
119
|
+
# Executes a block in the root directory of the Pod.
|
120
|
+
#
|
121
|
+
# @return [void]
|
122
|
+
#
|
58
123
|
def chdir(&block)
|
59
124
|
create
|
60
125
|
Dir.chdir(root, &block)
|
61
126
|
end
|
62
127
|
|
128
|
+
# Deletes the pod from the file system.
|
129
|
+
#
|
130
|
+
# @return [void]
|
131
|
+
#
|
63
132
|
def implode
|
64
133
|
root.rmtree if exists?
|
65
134
|
end
|
66
135
|
|
67
|
-
|
136
|
+
# @!group Cleaning
|
68
137
|
|
69
|
-
#
|
138
|
+
# Deletes any path that is not used by the pod.
|
139
|
+
#
|
140
|
+
# @return [void]
|
141
|
+
#
|
70
142
|
def clean
|
71
143
|
clean_paths.each { |path| FileUtils.rm_rf(path) }
|
144
|
+
@cleaned = true
|
72
145
|
end
|
73
146
|
|
74
|
-
#
|
75
|
-
# that are not used by the pod and can be safely deleted.
|
147
|
+
# Finds the absolute paths, including hidden ones, of the files
|
148
|
+
# that are not used by the pod and thus can be safely deleted.
|
149
|
+
#
|
150
|
+
# @return [Array<Strings>] The paths that can be deleted.
|
76
151
|
#
|
77
|
-
# Returns an Array of Strings containing the absolute paths.
|
78
152
|
def clean_paths
|
79
|
-
cached_used_paths =
|
153
|
+
cached_used_paths = used_files
|
80
154
|
files = Dir.glob(root + "**/*", File::FNM_DOTMATCH)
|
155
|
+
|
81
156
|
files.reject! do |candidate|
|
82
|
-
candidate.end_with?('.', '..') ||
|
83
|
-
|
157
|
+
candidate.end_with?('.', '..') || cached_used_paths.any? do |path|
|
158
|
+
path.include?(candidate) || candidate.include?(path)
|
159
|
+
end
|
84
160
|
end
|
85
161
|
files
|
86
162
|
end
|
87
163
|
|
88
|
-
#
|
164
|
+
# @return [Array<String>] The absolute path of the files used by the pod.
|
89
165
|
#
|
90
|
-
|
91
|
-
|
92
|
-
files
|
93
|
-
files.
|
166
|
+
def used_files
|
167
|
+
files = [ source_files, resource_files, preserve_files, readme_file, license_file, prefix_header_file ]
|
168
|
+
files.compact!
|
169
|
+
files.flatten!
|
170
|
+
files.map!{ |path| path.to_s }
|
171
|
+
files
|
94
172
|
end
|
95
173
|
|
96
|
-
|
174
|
+
# @!group Files
|
97
175
|
|
98
|
-
|
99
|
-
|
176
|
+
# @return [Array<Pathname>] The paths of the source files.
|
177
|
+
#
|
178
|
+
def source_files
|
179
|
+
source_files_by_spec.values.flatten
|
180
|
+
end
|
181
|
+
|
182
|
+
# @return [Array<Pathname>] The *relative* paths of the source files.
|
183
|
+
#
|
184
|
+
def relative_source_files
|
185
|
+
source_files.map{ |p| p.relative_path_from(@sandbox.root) }
|
100
186
|
end
|
101
187
|
|
102
|
-
|
103
|
-
|
188
|
+
# Finds the source files that every activated {Specification} requires.
|
189
|
+
#
|
190
|
+
# @note If the same file is required by two specifications the one at the
|
191
|
+
# higher level in the inheritance chain wins.
|
192
|
+
#
|
193
|
+
# @return [Hash{Specification => Array<Pathname>}] The files grouped by
|
194
|
+
# {Specification}.
|
195
|
+
#
|
196
|
+
def source_files_by_spec
|
197
|
+
options = {:glob => '*.{h,m,mm,c,cpp}'}
|
198
|
+
paths_by_spec(:source_files, options)
|
104
199
|
end
|
105
200
|
|
201
|
+
# @return [Array<Pathname>] The paths of the header files.
|
202
|
+
#
|
106
203
|
def header_files
|
107
|
-
|
204
|
+
header_files_by_spec.values.flatten
|
108
205
|
end
|
109
206
|
|
110
|
-
|
111
|
-
|
207
|
+
# @return [Array<Pathname>] The *relative* paths of the source files.
|
208
|
+
#
|
209
|
+
def relative_header_files
|
210
|
+
header_files.map{ |p| p.relative_path_from(@sandbox.root) }
|
112
211
|
end
|
113
212
|
|
114
|
-
#
|
115
|
-
|
116
|
-
|
213
|
+
# @return [Hash{Specification => Array<Pathname>}] The paths of the header
|
214
|
+
# files grouped by {Specification}.
|
215
|
+
#
|
216
|
+
def header_files_by_spec
|
217
|
+
result = {}
|
218
|
+
source_files_by_spec.each do |spec, paths|
|
219
|
+
headers = paths.select { |f| f.extname == '.h' }
|
220
|
+
result[spec] = headers unless headers.empty?
|
221
|
+
end
|
222
|
+
result
|
223
|
+
end
|
224
|
+
|
225
|
+
# @return [Array<Pathname>] The paths of the resources.
|
226
|
+
#
|
227
|
+
def resource_files
|
228
|
+
paths_by_spec(:resources).values.flatten
|
229
|
+
end
|
230
|
+
|
231
|
+
# @return [Array<Pathname>] The *relative* paths of the resources.
|
232
|
+
#
|
233
|
+
def relative_resource_files
|
234
|
+
resource_files.map{ |p| p.relative_path_from(@sandbox.root) }
|
235
|
+
end
|
236
|
+
|
237
|
+
# @return [Pathname] The absolute path of the prefix header file
|
238
|
+
#
|
239
|
+
def prefix_header_file
|
240
|
+
root + top_specification.prefix_header_file if top_specification.prefix_header_file
|
117
241
|
end
|
118
242
|
|
243
|
+
# @return [Array<Pathname>] The absolute paths of the files of the pod
|
244
|
+
# that should be preserved.
|
245
|
+
#
|
246
|
+
def preserve_files
|
247
|
+
paths = paths_by_spec(:preserve_paths).values
|
248
|
+
paths += expanded_paths(%w[ *.podspec notice* NOTICE* CREDITS* ])
|
249
|
+
paths.compact!
|
250
|
+
paths.uniq!
|
251
|
+
paths
|
252
|
+
end
|
253
|
+
|
254
|
+
# @return [Pathname] The automatically detected absolute path of the README
|
255
|
+
# file.
|
256
|
+
#
|
119
257
|
def readme_file
|
120
258
|
expanded_paths(%w[ README{*,.*} readme{*,.*} ]).first
|
121
259
|
end
|
122
260
|
|
261
|
+
# @return [Pathname] The absolute path of the license file from the
|
262
|
+
# specification or automatically detected.
|
263
|
+
#
|
123
264
|
def license_file
|
124
265
|
if top_specification.license && top_specification.license[:file]
|
125
266
|
root + top_specification.license[:file]
|
@@ -128,6 +269,9 @@ module Pod
|
|
128
269
|
end
|
129
270
|
end
|
130
271
|
|
272
|
+
# @return [String] The text of the license of the pod from the
|
273
|
+
# specification or from the license file.
|
274
|
+
#
|
131
275
|
def license_text
|
132
276
|
if (license_hash = top_specification.license)
|
133
277
|
if (result = license_hash[:text])
|
@@ -142,88 +286,162 @@ module Pod
|
|
142
286
|
specifications.map { |s| s.xcconfig }.reduce(:merge)
|
143
287
|
end
|
144
288
|
|
145
|
-
#
|
146
|
-
#
|
289
|
+
# Computes the paths of all the public headers of the pod including every
|
290
|
+
# subspec. For this reason the pod must not be cleaned before calling it.
|
291
|
+
#
|
292
|
+
# This method is used by {Generator::Documentation}.
|
293
|
+
#
|
294
|
+
# @raise [Informative] If the pod was cleaned.
|
295
|
+
#
|
296
|
+
# @todo Merge with #221
|
297
|
+
#
|
298
|
+
# @return [Array<Pathname>] The path of all the public headers of the pod.
|
299
|
+
#
|
147
300
|
def all_specs_public_header_files
|
148
|
-
|
149
|
-
|
150
|
-
|
301
|
+
if @cleaned
|
302
|
+
raise Informative, "The pod is cleaned and cannot compute the all the "\
|
303
|
+
"header files as they might be deleted."
|
304
|
+
end
|
305
|
+
|
306
|
+
all_specs = [ top_specification ] + top_specification.subspecs
|
307
|
+
options = {:glob => '*.{h}'}
|
308
|
+
files = paths_by_spec(:source_files, options, all_specs).values.flatten!
|
309
|
+
headers = files.select { |f| f.extname == '.h' }
|
310
|
+
headers
|
151
311
|
end
|
152
312
|
|
153
|
-
#
|
313
|
+
# @!group Target integration
|
154
314
|
|
315
|
+
# @return [void] Copies the pods headers to the sandbox.
|
316
|
+
#
|
155
317
|
def link_headers
|
156
|
-
|
318
|
+
@sandbox.add_header_search_path(headers_sandbox)
|
319
|
+
header_mappings.each do |namespaced_path, files|
|
157
320
|
@sandbox.add_header_files(namespaced_path, files)
|
158
321
|
end
|
159
322
|
end
|
160
323
|
|
161
|
-
|
162
|
-
|
324
|
+
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target
|
325
|
+
# The target to integrate.
|
326
|
+
#
|
327
|
+
# @return [void] Adds the pods source files to a given target.
|
328
|
+
#
|
329
|
+
def source_file_descriptions
|
330
|
+
result = []
|
331
|
+
source_files_by_spec.each do | spec, files |
|
332
|
+
compiler_flags = spec.compiler_flags.strip
|
163
333
|
files.each do |file|
|
164
|
-
|
165
|
-
|
166
|
-
|
334
|
+
file = file.relative_path_from(@sandbox.root)
|
335
|
+
desc = Xcodeproj::Project::PBXNativeTarget::SourceFileDescription.new(file, compiler_flags, nil)
|
336
|
+
result << desc
|
167
337
|
end
|
168
338
|
end
|
339
|
+
result
|
169
340
|
end
|
170
341
|
|
342
|
+
# @return Whether the pod requires ARC.
|
343
|
+
#
|
171
344
|
def requires_arc?
|
172
345
|
top_specification.requires_arc
|
173
346
|
end
|
174
347
|
|
175
348
|
private
|
176
349
|
|
350
|
+
# @return [Array<Pathname>] The implementation files
|
351
|
+
# (the files the need to compiled) of the pod.
|
352
|
+
#
|
177
353
|
def implementation_files
|
178
|
-
|
354
|
+
relative_source_files.select { |f| f.extname != '.h' }
|
179
355
|
end
|
180
356
|
|
357
|
+
# @return [Pathname] The path of the pod relative from the sandbox.
|
358
|
+
#
|
181
359
|
def relative_root
|
182
360
|
root.relative_path_from(@sandbox.root)
|
183
361
|
end
|
184
362
|
|
185
|
-
#
|
363
|
+
# @return Hash{Pathname => [Array<Pathname>]} A hash containing the headers
|
364
|
+
# folders as the keys and the the absolute paths of the header files
|
365
|
+
# as the values.
|
366
|
+
#
|
367
|
+
# @todo this is being overridden in the RestKit 0.9.4 spec, need to do
|
186
368
|
# something with that, and this method also still exists in Specification.
|
187
369
|
#
|
188
|
-
# This is not
|
189
|
-
# Pod::Specification#copy_header_mapping can be moved here.
|
190
|
-
def
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
370
|
+
# @todo This is not overridden anymore in specification refactor and the
|
371
|
+
# code Pod::Specification#copy_header_mapping can be moved here.
|
372
|
+
def header_mappings
|
373
|
+
mappings = {}
|
374
|
+
header_files_by_spec.each do |spec, paths|
|
375
|
+
paths = paths - headers_excluded_from_search_paths
|
376
|
+
paths.each do |from|
|
377
|
+
from_relative = from.relative_path_from(root)
|
378
|
+
to = headers_sandbox + (spec.header_dir) + spec.copy_header_mapping(from_relative)
|
379
|
+
(mappings[to.dirname] ||= []) << from
|
380
|
+
end
|
197
381
|
end
|
382
|
+
mappings
|
198
383
|
end
|
199
384
|
|
200
|
-
|
201
|
-
|
202
|
-
# higher level in the inheritance chain wins.
|
203
|
-
def sources_files_by_specification
|
204
|
-
files_by_spec = {}
|
205
|
-
processed_files = []
|
206
|
-
specifications.sort_by { |s| s.name.length }.each do |spec|
|
207
|
-
files = []
|
208
|
-
expanded_paths(spec.source_files, :glob => '*.{h,m,mm,c,cpp}', :relative_to_sandbox => true).each do | file |
|
209
|
-
files << file unless processed_files.include?(file)
|
210
|
-
end
|
211
|
-
files_by_spec[spec] = files
|
212
|
-
processed_files += files
|
213
|
-
end
|
214
|
-
files_by_spec
|
385
|
+
def headers_sandbox
|
386
|
+
@headers_sandbox ||= Pathname.new(top_specification.name)
|
215
387
|
end
|
216
388
|
|
389
|
+
# @return [<Pathname>] The relative path of the headers that should not be
|
390
|
+
# included in the linker search paths.
|
391
|
+
#
|
217
392
|
def headers_excluded_from_search_paths
|
218
|
-
|
393
|
+
options = { :glob => '*.h' }
|
394
|
+
paths = paths_by_spec(:exclude_header_search_paths, options)
|
395
|
+
paths.values.compact.uniq
|
219
396
|
end
|
220
397
|
|
221
|
-
|
222
|
-
|
398
|
+
# @!group Paths Patterns
|
399
|
+
|
400
|
+
# The paths obtained by resolving the patterns of an attribute
|
401
|
+
# groupped by spec.
|
402
|
+
#
|
403
|
+
# @param [Symbol] accessor The accessor to use to obtain the paths patterns.
|
404
|
+
# @param [Hash] options (see #expanded_paths)
|
405
|
+
#
|
406
|
+
def paths_by_spec(accessor, options = {}, specs = nil)
|
407
|
+
specs ||= specifications
|
408
|
+
paths_by_spec = {}
|
409
|
+
processed_paths = []
|
410
|
+
|
411
|
+
specs = specs.sort_by { |s| s.name.length }
|
412
|
+
specs.each do |spec|
|
413
|
+
paths = expanded_paths(spec.send(accessor), options)
|
414
|
+
unless paths.empty?
|
415
|
+
paths_by_spec[spec] = paths - processed_paths
|
416
|
+
processed_paths += paths
|
417
|
+
end
|
418
|
+
end
|
419
|
+
paths_by_spec
|
223
420
|
end
|
224
421
|
|
422
|
+
# Converts patterns of paths to the {Pathname} of the files present in the
|
423
|
+
# pod.
|
424
|
+
#
|
425
|
+
# @param [String, FileList, Array<String, Pathname>] patterns
|
426
|
+
# The patterns to expand.
|
427
|
+
# @param [Hash] options
|
428
|
+
# The options to used for expanding the paths patterns.
|
429
|
+
# @option options [String] :glob
|
430
|
+
# The pattern to use for globing directories.
|
431
|
+
#
|
432
|
+
# @raise [Informative] If the pod does not exists.
|
433
|
+
#
|
434
|
+
# @todo implement case insensitive search
|
435
|
+
#
|
436
|
+
# @return [Array<Pathname>] A list of the paths.
|
437
|
+
#
|
225
438
|
def expanded_paths(patterns, options = {})
|
226
|
-
|
439
|
+
unless exists?
|
440
|
+
raise Informative, "[Local Pod] Attempt to resolve paths for nonexistent pod.\n" \
|
441
|
+
"\tSpecifications: #{@specifications.inspect}\n" \
|
442
|
+
"\t Patterns: #{patterns.inspect}\n" \
|
443
|
+
"\t Options: #{options.inspect}"
|
444
|
+
end
|
227
445
|
|
228
446
|
patterns = [ patterns ] if patterns.is_a? String
|
229
447
|
patterns.map do |pattern|
|
@@ -234,11 +452,7 @@ module Pod
|
|
234
452
|
end
|
235
453
|
|
236
454
|
pattern.glob.map do |file|
|
237
|
-
|
238
|
-
file.relative_path_from(@sandbox.root)
|
239
|
-
else
|
240
|
-
file
|
241
|
-
end
|
455
|
+
file
|
242
456
|
end
|
243
457
|
end.flatten
|
244
458
|
end
|
data/lib/cocoapods/platform.rb
CHANGED
@@ -1,68 +1,140 @@
|
|
1
1
|
module Pod
|
2
|
+
|
3
|
+
# A platform describes an SDK name and deployment target.
|
4
|
+
#
|
2
5
|
class Platform
|
6
|
+
|
7
|
+
# @return [Platform] Convenience method to initialize an iOS platform.
|
8
|
+
#
|
3
9
|
def self.ios
|
4
10
|
new :ios
|
5
11
|
end
|
6
12
|
|
13
|
+
# @return [Platform] Convenience method to initialize an OS X platform.
|
14
|
+
#
|
7
15
|
def self.osx
|
8
16
|
new :osx
|
9
17
|
end
|
10
18
|
|
11
|
-
|
19
|
+
# Constructs a platform from either another platform or by
|
20
|
+
# specifying the symbolic name and optionally the deployment target.
|
21
|
+
#
|
22
|
+
# @overload initialize(name, deployment_target)
|
23
|
+
# @param [Symbol] name The name of platform.
|
24
|
+
# @param [String, Version] deployment_target The optional deployment.
|
25
|
+
# If not provided a default value according to the platform name will
|
26
|
+
# be assigned.
|
27
|
+
#
|
28
|
+
# @note that if the name is not specified a default deployment
|
29
|
+
# target will not be assigned.
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
#
|
33
|
+
# Platform.new(:ios)
|
34
|
+
# Platform.new(:ios, '4.3')
|
35
|
+
#
|
36
|
+
# @overload initialize(name, opts)
|
37
|
+
# @deprecated Remove after adding a warning to {Podfile} class.
|
38
|
+
# @param [Symbol] name The name of platform.
|
39
|
+
# @param [Hash] opts The options to create a platform with.
|
40
|
+
# @option opts [String, Version] :deployment_target The deployment target.
|
41
|
+
#
|
42
|
+
# @overload initialize(platform)
|
43
|
+
# @param [Platform] platform Another {Platform}.
|
44
|
+
#
|
45
|
+
# @example
|
46
|
+
#
|
47
|
+
# platform = Platform.new(:ios)
|
48
|
+
# Platform.new(platform)
|
49
|
+
#
|
50
|
+
def initialize(input, target = nil)
|
51
|
+
if input.is_a? Platform
|
52
|
+
@symbolic_name = input.name
|
53
|
+
@deployment_target = input.deployment_target
|
54
|
+
@declared_deployment_target = input.declared_deployment_target
|
55
|
+
else
|
56
|
+
@symbolic_name = input
|
57
|
+
|
58
|
+
target = target[:deployment_target] if target.is_a?(Hash)
|
59
|
+
@declared_deployment_target = target
|
12
60
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
61
|
+
unless target
|
62
|
+
case @symbolic_name
|
63
|
+
when :ios
|
64
|
+
target = '4.3'
|
65
|
+
when :osx
|
66
|
+
target = '10.6'
|
67
|
+
else
|
68
|
+
target = ''
|
69
|
+
end
|
70
|
+
end
|
71
|
+
@deployment_target = Version.create(target)
|
18
72
|
end
|
19
73
|
end
|
20
74
|
|
75
|
+
# @return [Symbol] The name of the SDK represented by the platform.
|
76
|
+
#
|
21
77
|
def name
|
22
78
|
@symbolic_name
|
23
79
|
end
|
24
80
|
|
25
|
-
|
26
|
-
|
27
|
-
|
81
|
+
# @return [Version] The deployment target of the platform.
|
82
|
+
#
|
83
|
+
attr_reader :deployment_target
|
84
|
+
|
85
|
+
# @return [Version] The deployment target declared on initialization.
|
86
|
+
#
|
87
|
+
attr_reader :declared_deployment_target
|
28
88
|
|
29
|
-
|
30
|
-
|
31
|
-
|
89
|
+
# @param [Platform, Symbol] other The other platform to check.
|
90
|
+
#
|
91
|
+
# @note If a symbol is passed the comparison does not take into account
|
92
|
+
# the deployment target.
|
93
|
+
#
|
94
|
+
# @return [Boolean] Whether two platforms are the equivalent.
|
95
|
+
#
|
96
|
+
def ==(other)
|
97
|
+
if other.is_a?(Symbol)
|
98
|
+
@symbolic_name == other
|
32
99
|
else
|
33
|
-
|
100
|
+
(name == other.name) && (deployment_target == other.deployment_target)
|
34
101
|
end
|
35
102
|
end
|
36
103
|
|
104
|
+
# In the context of operating system SDKs, a platform supports another
|
105
|
+
# one if they have the same name and the other platform has a minor or
|
106
|
+
# equal deployment target.
|
107
|
+
#
|
108
|
+
# @return Whether the platform supports another platform.
|
109
|
+
#
|
37
110
|
def supports?(other)
|
38
|
-
|
39
|
-
|
40
|
-
version_check = (deployment_target.nil? || other.deployment_target.nil? || deployment_target >= other.deployment_target)
|
41
|
-
os_check && version_check
|
111
|
+
other = Platform.new(other)
|
112
|
+
(other.name == name) && (other.deployment_target <= deployment_target)
|
42
113
|
end
|
43
114
|
|
115
|
+
# @return [String] A string representation including the deployment target.
|
116
|
+
#
|
44
117
|
def to_s
|
45
118
|
case @symbolic_name
|
46
119
|
when :ios
|
47
|
-
|
120
|
+
s = 'iOS'
|
48
121
|
when :osx
|
49
|
-
'OS X'
|
50
|
-
else
|
51
|
-
'iOS - OS X'
|
122
|
+
s = 'OS X'
|
52
123
|
end
|
124
|
+
s << " #{declared_deployment_target}" if declared_deployment_target
|
125
|
+
s
|
53
126
|
end
|
54
127
|
|
128
|
+
# @return [Symbol] A Symbol representation of the name.
|
129
|
+
#
|
55
130
|
def to_sym
|
56
131
|
name
|
57
132
|
end
|
58
133
|
|
59
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
|
134
|
+
# @return Whether the platform requires legacy architectures for iOS.
|
135
|
+
#
|
63
136
|
def requires_legacy_ios_archs?
|
64
|
-
|
65
|
-
(name == :ios) && (deployment_target < Pod::Version.new("4.3"))
|
137
|
+
(name == :ios) && (deployment_target < Version.new("4.3"))
|
66
138
|
end
|
67
139
|
end
|
68
140
|
end
|
data/lib/cocoapods/podfile.rb
CHANGED
@@ -153,7 +153,10 @@ module Pod
|
|
153
153
|
|
154
154
|
def self.from_file(path)
|
155
155
|
podfile = Podfile.new do
|
156
|
-
|
156
|
+
string = File.open(path, 'r:utf-8') { |f| f.read }
|
157
|
+
# TODO: work around for Rubinius incomplete encoding in 1.9 mode
|
158
|
+
string.encode!('UTF-8') if string.respond_to?(:encoding) && string.encoding.name != "UTF-8"
|
159
|
+
eval(string, nil, path.to_s)
|
157
160
|
end
|
158
161
|
podfile.defined_in_file = path
|
159
162
|
podfile.validate!
|
@@ -332,12 +335,14 @@ module Pod
|
|
332
335
|
# Pod::Specification is yielded to the block. This is the same class which
|
333
336
|
# is normally used to specify a Pod.
|
334
337
|
#
|
338
|
+
# ```
|
335
339
|
# dependency do |spec|
|
336
340
|
# spec.name = 'JSONKit'
|
337
341
|
# spec.version = '1.4'
|
338
342
|
# spec.source = { :git => 'https://github.com/johnezang/JSONKit.git', :tag => 'v1.4' }
|
339
343
|
# spec.source_files = 'JSONKit.*'
|
340
344
|
# end
|
345
|
+
# ```
|
341
346
|
#
|
342
347
|
#
|
343
348
|
# For more info on the definition of a Pod::Specification see:
|
@@ -455,10 +460,6 @@ module Pod
|
|
455
460
|
end
|
456
461
|
|
457
462
|
def validate!
|
458
|
-
#lines = []
|
459
|
-
#lines << "* the `platform` attribute should be either `:osx` or `:ios`" unless @platform && [:osx, :ios].include?(@platform.name)
|
460
|
-
#lines << "* no dependencies were specified, which is, well, kinda pointless" if dependencies.empty?
|
461
|
-
#raise(Informative, (["The Podfile at `#{@defined_in_file}' is invalid:"] + lines).join("\n")) unless lines.empty?
|
462
463
|
end
|
463
464
|
end
|
464
465
|
end
|
data/lib/cocoapods/sandbox.rb
CHANGED
@@ -42,6 +42,16 @@ module Pod
|
|
42
42
|
@header_search_paths.uniq.map { |path| "${PODS_ROOT}/#{path}" }
|
43
43
|
end
|
44
44
|
|
45
|
+
# Adds an header search path to the sandbox.
|
46
|
+
#
|
47
|
+
# @param path [Pathname] The path tho add.
|
48
|
+
#
|
49
|
+
# @return [void]
|
50
|
+
#
|
51
|
+
def add_header_search_path(path)
|
52
|
+
@header_search_paths << Pathname.new(HEADERS_DIR) + path
|
53
|
+
end
|
54
|
+
|
45
55
|
def prepare_for_install
|
46
56
|
headers_root.rmtree if headers_root.exist?
|
47
57
|
end
|
@@ -4,7 +4,10 @@ module Pod
|
|
4
4
|
extend Config::Mixin
|
5
5
|
|
6
6
|
def self._eval_podspec(path)
|
7
|
-
|
7
|
+
string = File.open(path, 'r:utf-8') { |f| f.read }
|
8
|
+
# TODO: work around for Rubinius incomplete encoding in 1.9 mode
|
9
|
+
string.encode!('UTF-8') if string.respond_to?(:encoding) && string.encoding.name != "UTF-8"
|
10
|
+
eval(string, nil, path.to_s)
|
8
11
|
end
|
9
12
|
|
10
13
|
class Specification
|
@@ -35,10 +38,18 @@ module Pod
|
|
35
38
|
end
|
36
39
|
|
37
40
|
# multi-platform attributes
|
38
|
-
%w[ source_files
|
41
|
+
%w[ source_files
|
42
|
+
resources
|
43
|
+
preserve_paths
|
44
|
+
exclude_header_search_paths
|
45
|
+
frameworks
|
46
|
+
libraries
|
47
|
+
dependencies
|
48
|
+
compiler_flags ].each do |attr|
|
39
49
|
instance_variable_set( "@#{attr}", { :ios => [], :osx => [] } )
|
40
50
|
end
|
41
51
|
@xcconfig = { :ios => Xcodeproj::Config.new, :osx => Xcodeproj::Config.new }
|
52
|
+
@header_dir = { :ios => nil, :osx => nil }
|
42
53
|
|
43
54
|
yield self if block_given?
|
44
55
|
end
|
@@ -58,7 +69,7 @@ module Pod
|
|
58
69
|
# be passed to initalize the value
|
59
70
|
def self.top_attr_writer(attr, init_lambda = nil)
|
60
71
|
define_method("#{attr}=") do |value|
|
61
|
-
raise Informative, "Can't set `#{attr}' for subspecs." if @parent
|
72
|
+
raise Informative, "#{self.inspect} Can't set `#{attr}' for subspecs." if @parent
|
62
73
|
instance_variable_set("@#{attr}", init_lambda ? init_lambda.call(value) : value);
|
63
74
|
end
|
64
75
|
end
|
@@ -119,6 +130,7 @@ module Pod
|
|
119
130
|
libraries=
|
120
131
|
compiler_flags=
|
121
132
|
deployment_target=
|
133
|
+
header_dir=
|
122
134
|
dependency }.each do |method|
|
123
135
|
define_method(method) do |args|
|
124
136
|
@specification._on_platform(@platform) do
|
@@ -180,16 +192,10 @@ module Pod
|
|
180
192
|
top_attr_accessor :license, lambda { |l| ( l.kind_of? String ) ? { :type => l } : l }
|
181
193
|
top_attr_accessor :version, lambda { |v| Version.new(v) }
|
182
194
|
top_attr_accessor :authors, lambda { |a| parse_authors(a) }
|
183
|
-
top_attr_accessor :header_mappings_dir, lambda { |file| Pathname.new(file) } # If not provided the headers files are flattened
|
184
|
-
top_attr_accessor :prefix_header_file, lambda { |file| Pathname.new(file) }
|
185
|
-
top_attr_accessor :prefix_header_contents
|
186
195
|
|
187
196
|
top_attr_reader :description, lambda {|instance, ivar| ivar || instance.summary }
|
188
197
|
top_attr_writer :description
|
189
198
|
|
190
|
-
top_attr_reader :header_dir, lambda {|instance, ivar| ivar || instance.pod_destroot_name }
|
191
|
-
top_attr_writer :header_dir, lambda {|dir| Pathname.new(dir) }
|
192
|
-
|
193
199
|
alias_method :author=, :authors=
|
194
200
|
|
195
201
|
def self.parse_authors(*names_and_email_addresses)
|
@@ -203,6 +209,13 @@ module Pod
|
|
203
209
|
|
204
210
|
### Attributes **with** multiple platform support
|
205
211
|
|
212
|
+
# @todo allow for subspecs
|
213
|
+
#
|
214
|
+
top_attr_accessor :header_mappings_dir, lambda { |file| Pathname.new(file) } # If not provided the headers files are flattened
|
215
|
+
top_attr_accessor :prefix_header_file, lambda { |file| Pathname.new(file) }
|
216
|
+
top_attr_accessor :prefix_header_contents
|
217
|
+
|
218
|
+
|
206
219
|
pltf_chained_attr_accessor :source_files, lambda {|value, current| pattern_list(value) }
|
207
220
|
pltf_chained_attr_accessor :resources, lambda {|value, current| pattern_list(value) }
|
208
221
|
pltf_chained_attr_accessor :preserve_paths, lambda {|value, current| pattern_list(value) } # Paths that should not be cleaned
|
@@ -215,7 +228,28 @@ module Pod
|
|
215
228
|
alias_method :framework=, :frameworks=
|
216
229
|
alias_method :library=, :libraries=
|
217
230
|
|
218
|
-
|
231
|
+
# @!method header_dir=
|
232
|
+
#
|
233
|
+
# @abstract The directory where to name space the headers files of
|
234
|
+
# the specification.
|
235
|
+
#
|
236
|
+
# @param [String] The headers directory.
|
237
|
+
#
|
238
|
+
platform_attr_writer :header_dir, lambda { |dir, _| Pathname.new(dir) }
|
239
|
+
|
240
|
+
# @abstract (see #header_dir=)
|
241
|
+
#
|
242
|
+
# @return [Pathname] The headers directory.
|
243
|
+
#
|
244
|
+
# @note If no value is provided it returns an empty {Pathname}.
|
245
|
+
#
|
246
|
+
def header_dir
|
247
|
+
@header_dir[active_platform] || (@parent.header_dir if @parent) || Pathname.new('')
|
248
|
+
end
|
249
|
+
|
250
|
+
# @!method xcconfig=
|
251
|
+
#
|
252
|
+
platform_attr_writer :xcconfig, lambda {|value, current| current.tap { |c| c.merge!(value) } }
|
219
253
|
|
220
254
|
def xcconfig
|
221
255
|
raw_xconfig.dup.
|
@@ -338,12 +372,6 @@ module Pod
|
|
338
372
|
end
|
339
373
|
end
|
340
374
|
|
341
|
-
def pod_destroot_name
|
342
|
-
if root = pod_destroot
|
343
|
-
root.basename
|
344
|
-
end
|
345
|
-
end
|
346
|
-
|
347
375
|
def self.pattern_list(patterns)
|
348
376
|
if patterns.is_a?(Array) && (!defined?(Rake) || !patterns.is_a?(Rake::FileList))
|
349
377
|
patterns
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.0.
|
4
|
+
version: 0.6.0.rc3
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 1.
|
37
|
+
version: 1.7.0
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 1.
|
45
|
+
version: 1.7.0
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: colored
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,7 +130,7 @@ dependencies:
|
|
130
130
|
requirements:
|
131
131
|
- - ~>
|
132
132
|
- !ruby/object:Gem::Version
|
133
|
-
version: 0.2.0.
|
133
|
+
version: 0.2.0.rc3
|
134
134
|
type: :runtime
|
135
135
|
prerelease: false
|
136
136
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -138,7 +138,7 @@ dependencies:
|
|
138
138
|
requirements:
|
139
139
|
- - ~>
|
140
140
|
- !ruby/object:Gem::Version
|
141
|
-
version: 0.2.0.
|
141
|
+
version: 0.2.0.rc3
|
142
142
|
- !ruby/object:Gem::Dependency
|
143
143
|
name: bacon
|
144
144
|
requirement: !ruby/object:Gem::Requirement
|
@@ -220,8 +220,7 @@ files:
|
|
220
220
|
homepage: https://github.com/CocoaPods/CocoaPods
|
221
221
|
licenses:
|
222
222
|
- MIT
|
223
|
-
post_install_message:
|
224
|
-
you are upgrading, first run: $ pod setup'
|
223
|
+
post_install_message:
|
225
224
|
rdoc_options: []
|
226
225
|
require_paths:
|
227
226
|
- lib
|
@@ -233,7 +232,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
233
232
|
version: '0'
|
234
233
|
segments:
|
235
234
|
- 0
|
236
|
-
hash: -
|
235
|
+
hash: -4255808977828615188
|
237
236
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
238
237
|
none: false
|
239
238
|
requirements:
|
@@ -247,3 +246,4 @@ signing_key:
|
|
247
246
|
specification_version: 3
|
248
247
|
summary: An Objective-C library package manager.
|
249
248
|
test_files: []
|
249
|
+
has_rdoc:
|