cocoapods 0.0.8 → 0.1.0

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 CHANGED
@@ -20,9 +20,6 @@ For more in depth information see the [wiki][wiki], specifically the page about
20
20
  [creating a project that uses CocoaPods][wiki-create].
21
21
 
22
22
 
23
- **_NOTE: At the moment [only iOS projects are supported][ticket], but this will
24
- be fixed in the very near future._**
25
-
26
23
  ## Installing CocoaPods
27
24
 
28
25
  You’ll need MacRuby. CocoaPods itself installs through RubyGems, the Ruby
@@ -81,7 +78,6 @@ for more info.
81
78
  [cocoapods]: https://github.com/alloy/cocoapods
82
79
  [cocoapods-specs]: https://github.com/alloy/cocoapods-specs
83
80
  [tickets]: https://github.com/alloy/cocoapods/issues
84
- [ticket]: https://github.com/alloy/cocoapods/issues/3
85
81
  [example-spec]: https://github.com/alloy/cocoapods/blob/master/examples/PodSpec.podspec
86
82
  [dev-setup]: https://github.com/alloy/cocoapods/wiki/Setting-up-for-development-on-CocoaPods
87
83
  [wiki-create]: https://github.com/alloy/cocoapods/wiki/Creating-a-project-that-uses-CocoaPods
@@ -1,27 +1,30 @@
1
1
  module Pod
2
- VERSION = '0.0.8'
2
+ VERSION = '0.1.0'
3
3
 
4
4
  class Informative < StandardError
5
5
  end
6
6
 
7
- autoload :Command, 'cocoapods/command'
8
- autoload :Config, 'cocoapods/config'
9
- autoload :Dependency, 'cocoapods/dependency'
10
- autoload :Downloader, 'cocoapods/downloader'
11
- autoload :Executable, 'cocoapods/executable'
12
- autoload :Installer, 'cocoapods/installer'
13
- autoload :Resolver, 'cocoapods/resolver'
14
- autoload :Source, 'cocoapods/source'
15
- autoload :Spec, 'cocoapods/specification'
16
- autoload :Specification, 'cocoapods/specification'
17
- autoload :Version, 'cocoapods/version'
7
+ autoload :BridgeSupportGenerator, 'cocoapods/bridge_support_generator'
8
+ autoload :Command, 'cocoapods/command'
9
+ autoload :Config, 'cocoapods/config'
10
+ autoload :Dependency, 'cocoapods/dependency'
11
+ autoload :Downloader, 'cocoapods/downloader'
12
+ autoload :Executable, 'cocoapods/executable'
13
+ autoload :Installer, 'cocoapods/installer'
14
+ autoload :Podfile, 'cocoapods/podfile'
15
+ autoload :Resolver, 'cocoapods/resolver'
16
+ autoload :Source, 'cocoapods/source'
17
+ autoload :Spec, 'cocoapods/specification'
18
+ autoload :Specification, 'cocoapods/specification'
19
+ autoload :Version, 'cocoapods/version'
18
20
 
19
21
  module Xcode
20
- autoload :Config, 'cocoapods/xcode/config'
21
- autoload :Project, 'cocoapods/xcode/project'
22
+ autoload :Config, 'cocoapods/xcode/config'
23
+ autoload :CopyResourcesScript, 'cocoapods/xcode/copy_resources_script'
24
+ autoload :Project, 'cocoapods/xcode/project'
22
25
  end
23
26
 
24
- autoload :Pathname, 'pathname'
27
+ autoload :Pathname, 'pathname'
25
28
  end
26
29
 
27
30
  class Pathname
@@ -0,0 +1,25 @@
1
+ module Pod
2
+ class BridgeSupportGenerator
3
+ include Config::Mixin
4
+
5
+ extend Executable
6
+ executable :gen_bridge_metadata
7
+
8
+ attr_reader :headers
9
+
10
+ def initialize(headers)
11
+ @headers = headers
12
+ end
13
+
14
+ def search_paths
15
+ @headers.map { |header| "-I '#{header.dirname}'" }.uniq
16
+ end
17
+
18
+ def create_in(root)
19
+ puts "==> Generating BridgeSupport metadata file" unless config.silent?
20
+ file = root + "Pods.bridgesupport"
21
+ gen_bridge_metadata %{-c "#{search_paths.join(' ')}" -o '#{file}' '#{headers.join("' '")}'}
22
+ file
23
+ end
24
+ end
25
+ end
@@ -30,14 +30,12 @@ module Pod
30
30
  spec = nil
31
31
  if @podspec
32
32
  if @podspec.exist?
33
- spec = Specification.from_podspec(@podspec)
33
+ spec = Specification.from_file(@podspec)
34
34
  else
35
35
  raise Informative, "The specified podspec `#{@podspec}' doesn't exist."
36
36
  end
37
37
  else
38
- if config.project_podfile
39
- spec = Specification.from_podfile(config.project_podfile)
40
- else
38
+ unless spec = config.rootspec
41
39
  raise Informative, "No `Podfile' or `.podspec' file found in the current working directory."
42
40
  end
43
41
  end
@@ -55,7 +55,7 @@ module Pod
55
55
 
56
56
  def lint
57
57
  file = @name ? Pathname.new(@name) : Pathname.pwd.glob('*.podspec').first
58
- spec = Specification.from_podspec(file)
58
+ spec = Specification.from_file(file)
59
59
  spec.validate!
60
60
  end
61
61
  end
@@ -10,7 +10,7 @@ module Pod
10
10
  @instance = instance
11
11
  end
12
12
 
13
- attr_accessor :repos_dir, :project_pods_root, :clean, :verbose, :silent
13
+ attr_accessor :repos_dir, :project_pods_root, :rootspec, :clean, :verbose, :silent
14
14
  alias_method :clean?, :clean
15
15
  alias_method :verbose?, :verbose
16
16
  alias_method :silent?, :silent
@@ -40,6 +40,28 @@ module Pod
40
40
  @project_podfile
41
41
  end
42
42
 
43
+ # Returns the spec at the pat returned from `project_podfile`.
44
+ def rootspec
45
+ unless @rootspec
46
+ if project_podfile
47
+ if project_podfile.basename.to_s == 'Podfile'
48
+ @rootspec = Podfile.from_file(project_podfile)
49
+ else
50
+ @rootspec = Specification.from_file(project_podfile)
51
+ end
52
+ end
53
+ end
54
+ @rootspec
55
+ end
56
+
57
+ def ios?
58
+ rootspec.platform == :ios
59
+ end
60
+
61
+ def osx?
62
+ rootspec.platform == :osx
63
+ end
64
+
43
65
  module Mixin
44
66
  def config
45
67
  Config.instance
@@ -47,8 +47,14 @@ module Pod
47
47
  end
48
48
  end
49
49
 
50
- def clean
50
+ def clean(clean_paths = [])
51
51
  (@pod_root + '.git').rmtree
52
+ clean_paths.each do |pattern|
53
+ pattern = @pod_root + pattern
54
+ pattern.glob.each do |path|
55
+ path.rmtree
56
+ end
57
+ end if clean_paths
52
58
  end
53
59
  end
54
60
  end
@@ -3,11 +3,13 @@ module Pod
3
3
  def executable(name)
4
4
  define_method(name) do |command|
5
5
  if Config.instance.verbose?
6
+ puts "#{name} #{command}"
6
7
  `#{name} #{command} 1>&2`
7
8
  else
8
9
  `#{name} #{command} 2> /dev/null`
9
10
  end
10
11
  end
12
+ private name
11
13
  end
12
14
  end
13
15
  end
@@ -1,6 +1,4 @@
1
1
  module Pod
2
- # TODO the static library needs an extra xcconfig which sets the values from issue #1.
3
- # Or we could edit the project.pbxproj file, but that seems like more work...
4
2
  class Installer
5
3
  include Config::Mixin
6
4
 
@@ -16,55 +14,44 @@ module Pod
16
14
  dependent_specification_sets.reject(&:only_part_of_other_pod?)
17
15
  end
18
16
 
19
- def source_files
20
- source_files = {}
21
- build_specification_sets.each do |set|
22
- spec = set.specification
23
- source_files[spec.name] = []
24
- spec.source_files.each do |pattern|
25
- pattern = spec.pod_destroot + pattern
26
- pattern = pattern + '*.{h,m,mm,c,cpp}' if pattern.directory?
27
- pattern.glob.each do |file|
28
- source_files[spec.name] << file.relative_path_from(config.project_pods_root)
29
- end
30
- end
31
- end
32
- source_files
17
+ def build_specifications
18
+ build_specification_sets.map(&:specification)
33
19
  end
34
20
 
35
21
  def xcconfig
36
22
  @xcconfig ||= Xcode::Config.new({
37
- # In a workspace this is where the static library headers should be found
38
- # We could also make this recursive, but let's let the user decide on that.
23
+ # In a workspace this is where the static library headers should be found.
39
24
  'USER_HEADER_SEARCH_PATHS' => '"$(BUILT_PRODUCTS_DIR)/Pods"',
40
- # search the user headers
41
25
  'ALWAYS_SEARCH_USER_PATHS' => 'YES',
26
+ # This makes categories from static libraries work, which many libraries
27
+ # require, so we add these by default.
28
+ 'OTHER_LDFLAGS' => '-ObjC -all_load',
42
29
  })
43
30
  end
44
31
 
45
32
  def xcodeproj
46
- @xcodeproj ||= Xcode::Project.ios_static_library
33
+ @xcodeproj ||= Xcode::Project.static_library(@specification.platform)
47
34
  end
48
35
 
36
+ # TODO move xcconfig related code into the xcconfig method, like copy_resources_script and generate_bridge_support.
49
37
  def generate_project
50
38
  puts "==> Generating Xcode project and xcconfig" unless config.silent?
51
39
  user_header_search_paths = []
52
- build_specification_sets.each do |set|
53
- spec = set.specification
40
+ build_specifications.each do |spec|
54
41
  xcconfig.merge!(spec.xcconfig)
55
- xcodeproj.add_group(spec.name)
42
+ group = xcodeproj.add_pod_group(spec.name)
56
43
 
57
44
  # Only add implementation files to the compile phase
58
45
  spec.implementation_files.each do |file|
59
- xcodeproj.add_source_file(file, spec.name, nil, spec.compiler_flags)
46
+ group.add_source_file(file, nil, spec.compiler_flags)
60
47
  end
61
48
 
62
49
  # Add header files to a `copy header build phase` for each destination
63
50
  # directory in the pod's header directory.
64
- set.specification.copy_header_mappings.each do |header_dir, files|
65
- copy_phase_uuid = xcodeproj.add_copy_header_build_phase(spec.name, header_dir)
51
+ spec.copy_header_mappings.each do |header_dir, files|
52
+ copy_phase = xcodeproj.add_copy_header_build_phase(spec.name, header_dir)
66
53
  files.each do |file|
67
- xcodeproj.add_source_file(file, spec.name, copy_phase_uuid)
54
+ group.add_source_file(file, copy_phase)
68
55
  end
69
56
  end
70
57
 
@@ -74,16 +61,33 @@ module Pod
74
61
  xcconfig.merge!('USER_HEADER_SEARCH_PATHS' => user_header_search_paths.sort.uniq.join(" "))
75
62
  end
76
63
 
77
- # TODO we need a spec that tests that all dependencies are first downloaded/installed
78
- # before #generate_project is called!
64
+ def copy_resources_script
65
+ @copy_resources_script ||= Xcode::CopyResourcesScript.new(build_specifications.map { |spec| spec.expanded_resources }.flatten)
66
+ end
67
+
68
+ def bridge_support_generator
69
+ BridgeSupportGenerator.new(build_specifications.map do |spec|
70
+ spec.header_files.map do |header|
71
+ config.project_pods_root + header
72
+ end
73
+ end.flatten)
74
+ end
75
+
79
76
  def install!
80
77
  puts "Installing dependencies of: #{@specification.defined_in_file}" unless config.silent?
81
- build_specification_sets.each do |set|
82
- set.specification.install!
83
- end
78
+ build_specifications.each(&:install!)
84
79
  generate_project
85
- xcodeproj.create_in(config.project_pods_root)
86
- xcconfig.create_in(config.project_pods_root)
80
+
81
+ root = config.project_pods_root
82
+ xcodeproj.create_in(root)
83
+ xcconfig.create_in(root)
84
+ if @specification.generate_bridge_support?
85
+ path = bridge_support_generator.create_in(root)
86
+ copy_resources_script.resources << path.relative_path_from(config.project_pods_root)
87
+ end
88
+ copy_resources_script.create_in(root)
89
+
90
+ build_specifications.each(&:post_install)
87
91
  end
88
92
  end
89
93
  end
@@ -0,0 +1,99 @@
1
+ module Pod
2
+ class Podfile
3
+ def self.from_file(path)
4
+ podfile = Podfile.new do
5
+ eval(path.read, nil, path.to_s)
6
+ end
7
+ podfile.defined_in_file = path
8
+ podfile.validate!
9
+ podfile
10
+ end
11
+
12
+ def initialize(&block)
13
+ @dependencies = []
14
+ instance_eval(&block)
15
+ end
16
+
17
+ # Specifies the platform for which a static library should be build.
18
+ #
19
+ # This can be either `:osx` for Mac OS X applications, or `:ios` for iOS
20
+ # applications.
21
+ def platform(platform = nil)
22
+ platform ? @platform = platform : @platform
23
+ end
24
+
25
+ # Specifies a dependency of the project.
26
+ #
27
+ # A dependency requirement is defined by the name of the Pod and _optionally_
28
+ # a list of version requirements.
29
+ #
30
+ #
31
+ # When starting out with a project it is likely that you will want to use the
32
+ # latest version of a Pod. If this is the case, simply omit the version
33
+ # requirements.
34
+ #
35
+ # dependency 'SSZipArchive'
36
+ #
37
+ #
38
+ # Later on in the project you may want to freeze to a specific version of a
39
+ # Pod, in which case you can specify that version number.
40
+ #
41
+ # dependency 'Objection', '0.9'
42
+ #
43
+ #
44
+ # Besides no version, or a specific one, it is also possible to use operators:
45
+ #
46
+ # * `> 0.1` Any version higher than 0.1
47
+ # * `>= 0.1` Version 0.1 and any higher version
48
+ # * `< 0.1` Any version lower than 0.1
49
+ # * `<= 0.1` Version 0.1 and any lower version
50
+ # * `~> 0.1.2` Version 0.1.2 and the versions upto 0.2, not including 0.2
51
+ #
52
+ #
53
+ # Finally, a list of version requirements can be specified for even more fine
54
+ # grained control.
55
+ #
56
+ # For more information, regarding versioning policy, see:
57
+ #
58
+ # * http://semver.org
59
+ # * http://docs.rubygems.org/read/chapter/7
60
+ def dependency(name, *version_requirements)
61
+ @dependencies << Dependency.new(name, *version_requirements)
62
+ end
63
+
64
+ attr_reader :dependencies
65
+
66
+ # Specifies that a BridgeSupport metadata should be generated from the
67
+ # headers of all installed Pods.
68
+ #
69
+ # This is for scripting languages such as MacRuby, Nu, and JSCocoa, which use
70
+ # it to bridge types, functions, etc better.
71
+ def generate_bridge_support!
72
+ @generate_bridge_support = true
73
+ end
74
+
75
+ # This is to be compatible with a Specification for use in the Installer and
76
+ # Resolver.
77
+
78
+ def podfile?
79
+ true
80
+ end
81
+
82
+ attr_accessor :defined_in_file
83
+
84
+ def generate_bridge_support?
85
+ @generate_bridge_support
86
+ end
87
+
88
+ def dependency_by_name(name)
89
+ @dependencies.find { |d| d.name == name }
90
+ end
91
+
92
+ def validate!
93
+ lines = []
94
+ lines << "* the `platform` attribute should be either `:osx` or `:ios`" unless [:osx, :ios].include?(@platform)
95
+ lines << "* no dependencies were specified, which is, well, kinda pointless" if @dependencies.empty?
96
+ raise(Informative, (["The Podfile at `#{@defined_in_file}' is invalid:"] + lines).join("\n")) unless lines.empty?
97
+ end
98
+ end
99
+ end
@@ -12,13 +12,26 @@ module Pod
12
12
 
13
13
  def find_dependency_sets(specification)
14
14
  specification.dependencies.each do |dependency|
15
- set = Source.search(dependency)
15
+ set = find_dependency_set(dependency)
16
16
  set.required_by(specification)
17
17
  unless @sets.include?(set)
18
+ validate_platform!(set)
18
19
  @sets << set
19
20
  find_dependency_sets(set.specification)
20
21
  end
21
22
  end
22
23
  end
24
+
25
+ def find_dependency_set(dependency)
26
+ Source.search(dependency)
27
+ end
28
+
29
+ def validate_platform!(set)
30
+ spec = set.specification
31
+ unless spec.platform.nil? || spec.platform == @specification.platform
32
+ raise Informative, "The platform required by the Podfile (:#{@specification.platform}) " \
33
+ "does not match that of #{spec} (:#{spec.platform})"
34
+ end
35
+ end
23
36
  end
24
37
  end
@@ -1,21 +1,15 @@
1
1
  module Pod
2
+ extend Config::Mixin
3
+
2
4
  def self._eval_podspec(path)
3
5
  eval(path.read, nil, path.to_s)
4
6
  end
5
7
 
6
- class Specification
8
+ class Specification
7
9
  autoload :Set, 'cocoapods/specification/set'
8
10
 
9
- def self.from_podfile(path)
10
- if path.exist?
11
- spec = new
12
- spec.instance_eval(path.read)
13
- spec.defined_in_file = path
14
- spec
15
- end
16
- end
17
-
18
- def self.from_podspec(path)
11
+ # The file is expected to define and return a Pods::Specification.
12
+ def self.from_file(path)
19
13
  spec = Pod._eval_podspec(path)
20
14
  spec.defined_in_file = path
21
15
  spec
@@ -70,17 +64,20 @@ module Pod
70
64
  end
71
65
 
72
66
  def source_files=(*patterns)
73
- @source_files = patterns.flatten.map { |p| Pathname.new(p) }
67
+ @source_files = patterns.flatten
74
68
  end
75
69
  attr_reader :source_files
76
70
 
77
- def dependency(*name_and_version_requirements)
78
- name, *version_requirements = name_and_version_requirements.flatten
79
- dep = Dependency.new(name, *version_requirements)
80
- @dependencies << dep
81
- dep
71
+ def resources=(*patterns)
72
+ @resources = patterns.flatten
82
73
  end
83
- attr_reader :dependencies
74
+ attr_reader :resources
75
+ alias_method :resource=, :resources=
76
+
77
+ def clean_paths=(*patterns)
78
+ @clean_paths = patterns.flatten.map { |p| Pathname.new(p) }
79
+ end
80
+ attr_reader :clean_paths
84
81
 
85
82
  def xcconfig=(hash)
86
83
  @xcconfig.merge!(hash)
@@ -95,7 +92,7 @@ module Pod
95
92
 
96
93
  def libraries=(*libraries)
97
94
  libraries.unshift('')
98
- self.xcconfig = { 'OTHER_LDFLAGS' => libraries.join(' -l ').strip }
95
+ self.xcconfig = { 'OTHER_LDFLAGS' => libraries.join(' -l').strip }
99
96
  end
100
97
  alias_method :library=, :libraries=
101
98
 
@@ -106,8 +103,6 @@ module Pod
106
103
  @header_dir || pod_destroot_name
107
104
  end
108
105
 
109
- attr_accessor :requires_arc
110
-
111
106
  attr_writer :compiler_flags
112
107
  def compiler_flags
113
108
  flags = "#{@compiler_flags} "
@@ -115,14 +110,31 @@ module Pod
115
110
  flags
116
111
  end
117
112
 
113
+ # These are attributes which are also on a Podfile
114
+
115
+ attr_accessor :platform
116
+
117
+ attr_accessor :requires_arc
118
+
119
+ attr_accessor :generate_bridge_support
120
+ alias_method :generate_bridge_support?, :generate_bridge_support
121
+
122
+ def dependency(*name_and_version_requirements)
123
+ name, *version_requirements = name_and_version_requirements.flatten
124
+ dep = Dependency.new(name, *version_requirements)
125
+ @dependencies << dep
126
+ dep
127
+ end
128
+ attr_reader :dependencies
129
+
118
130
  # Not attributes
119
131
 
120
132
  include Config::Mixin
121
133
 
122
134
  def ==(other)
123
135
  self.class === other &&
124
- @name && @name == other.name &&
125
- @version && @version == other.version
136
+ name && name == other.name &&
137
+ version && version == other.version
126
138
  end
127
139
 
128
140
  def dependency_by_name(name)
@@ -130,8 +142,8 @@ module Pod
130
142
  end
131
143
 
132
144
  def part_of_specification_set
133
- if @part_of
134
- Set.by_specification_name(@part_of.name)
145
+ if part_of
146
+ Set.by_specification_name(part_of.name)
135
147
  end
136
148
  end
137
149
 
@@ -141,7 +153,6 @@ module Pod
141
153
  end
142
154
 
143
155
  def pod_destroot
144
- return if from_podfile?
145
156
  if part_of_other_pod?
146
157
  part_of_specification.pod_destroot
147
158
  else
@@ -156,17 +167,32 @@ module Pod
156
167
  end
157
168
 
158
169
  def part_of_other_pod?
159
- !@part_of.nil?
170
+ !part_of.nil?
160
171
  end
161
172
 
162
- def from_podfile?
163
- @name.nil? && @version.nil?
173
+ def podfile?
174
+ false
164
175
  end
165
176
 
166
- # Returns all source files of this pod including header files.
177
+ # Returns all resource files of this pod, but relative to the
178
+ # project pods root.
179
+ def expanded_resources
180
+ files = []
181
+ [*resources].each do |pattern|
182
+ pattern = pod_destroot + pattern
183
+ pattern = pattern + '*' if pattern.directory?
184
+ pattern.glob.each do |file|
185
+ files << file.relative_path_from(config.project_pods_root)
186
+ end
187
+ end
188
+ files
189
+ end
190
+
191
+ # Returns all source files of this pod including header files,
192
+ # but relative to the project pods root.
167
193
  def expanded_source_files
168
194
  files = []
169
- source_files.each do |pattern|
195
+ [*source_files].each do |pattern|
170
196
  pattern = pod_destroot + pattern
171
197
  pattern = pattern + '*.{h,m,mm,c,cpp}' if pattern.directory?
172
198
  pattern.glob.each do |file|
@@ -215,11 +241,7 @@ module Pod
215
241
  end
216
242
 
217
243
  def to_s
218
- if from_podfile?
219
- "podfile at `#{@defined_in_file}'"
220
- else
221
- "`#{@name}' version `#{@version}'"
222
- end
244
+ "`#{name}' version `#{version}'"
223
245
  end
224
246
 
225
247
  def inspect
@@ -227,18 +249,24 @@ module Pod
227
249
  end
228
250
 
229
251
  def validate!
230
- attrs = []
231
- attrs << "`name'" unless @name
232
- attrs << "`version'" unless @version
233
- attrs << "`summary'" unless @summary
234
- attrs << "`homepage'" unless @homepage
235
- attrs << "`author(s)'" unless @authors
236
- attrs << "either `source' or `part_of'" unless @source || @part_of
237
- attrs << "`source_files'" unless @source_files
238
- unless attrs.empty?
239
- raise Informative, "The following required " \
240
- "#{attrs.size == 1 ? 'attribute is' : 'attributes are'} " \
241
- "missing: #{attrs.join(", ")}"
252
+ missing = []
253
+ missing << "`name'" unless name
254
+ missing << "`version'" unless version
255
+ missing << "`summary'" unless summary
256
+ missing << "`homepage'" unless homepage
257
+ missing << "`author(s)'" unless authors
258
+ missing << "either `source' or `part_of'" unless source || part_of
259
+ missing << "`source_files'" unless source_files
260
+
261
+ incorrect = []
262
+ allowed = [nil, :ios, :osx]
263
+ incorrect << ["`platform'", allowed] unless allowed.include?(platform)
264
+
265
+ unless missing.empty? && incorrect.empty?
266
+ message = "The following #{(missing + incorrect).size == 1 ? 'attribute is' : 'attributes are'}:\n"
267
+ message << "* missing: #{missing.join(", ")}" unless missing.empty?
268
+ message << "* incorrect: #{incorrect.map { |x| "#{x[0]} (#{x[1..-1]})" }.join(", ")}" unless incorrect.empty?
269
+ raise Informative, message
242
270
  end
243
271
  end
244
272
 
@@ -249,8 +277,8 @@ module Pod
249
277
  # Override this if you need to perform work before or after activating the
250
278
  # pod. Eg:
251
279
  #
252
- # Pod::Spec.new do
253
- # def install!
280
+ # Pod::Spec.new do |s|
281
+ # def s.install!
254
282
  # # pre-install
255
283
  # super
256
284
  # # post-install
@@ -260,7 +288,7 @@ module Pod
260
288
  puts "==> Installing: #{self}" unless config.silent?
261
289
  config.project_pods_root.mkpath
262
290
  require 'fileutils'
263
- FileUtils.cp(@defined_in_file, config.project_pods_root)
291
+ FileUtils.cp(defined_in_file, config.project_pods_root)
264
292
 
265
293
  # In case this spec is part of another pod's source, we need to dowload
266
294
  # the other pod's source.
@@ -282,17 +310,32 @@ module Pod
282
310
  # Override this if you need to perform work before or after downloading the
283
311
  # pod, or if you need to implement custom dowloading. Eg:
284
312
  #
285
- # Pod::Spec.new do
286
- # def download!
313
+ # Pod::Spec.new do |s|
314
+ # def s.download!
287
315
  # # pre-download
288
316
  # super # or custom downloading
289
317
  # # post-download
290
318
  # end
291
319
  # end
292
320
  def download!
293
- downloader = Downloader.for_source(pod_destroot, @source)
321
+ downloader = Downloader.for_source(pod_destroot, source)
294
322
  downloader.download
295
- downloader.clean if config.clean
323
+ downloader.clean(clean_paths) if config.clean
324
+ end
325
+
326
+ # This is a convenience method which gets called after all pods have been
327
+ # downloaded, installed, and the Xcode project and related files have been
328
+ # generated. Override this to, for instance, add to the prefix header:
329
+ #
330
+ # Pod::Spec.new do |s|
331
+ # def s.post_install
332
+ # prefix_header = config.project_pods_root + 'Pods-Prefix.pch'
333
+ # prefix_header.open('a') do |file|
334
+ # file.puts(%{#ifdef __OBJC__\n#import "SSToolkitDefines.h"\n#endif})
335
+ # end
336
+ # end
337
+ # end
338
+ def post_install
296
339
  end
297
340
 
298
341
  end