cocoapods 0.6.0.rc2 → 0.6.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|