cocoapods-core 0.27.1 → 0.28.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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cocoapods-core.rb +0 -2
  3. data/lib/cocoapods-core/core_ui.rb +0 -1
  4. data/lib/cocoapods-core/dependency.rb +20 -15
  5. data/lib/cocoapods-core/gem_version.rb +1 -1
  6. data/lib/cocoapods-core/github.rb +1 -1
  7. data/lib/cocoapods-core/lockfile.rb +15 -11
  8. data/lib/cocoapods-core/platform.rb +10 -6
  9. data/lib/cocoapods-core/podfile.rb +18 -11
  10. data/lib/cocoapods-core/podfile/dsl.rb +25 -23
  11. data/lib/cocoapods-core/podfile/target_definition.rb +60 -36
  12. data/lib/cocoapods-core/requirement.rb +2 -2
  13. data/lib/cocoapods-core/source.rb +34 -10
  14. data/lib/cocoapods-core/source/acceptor.rb +12 -8
  15. data/lib/cocoapods-core/source/aggregate.rb +22 -9
  16. data/lib/cocoapods-core/source/health_reporter.rb +2 -2
  17. data/lib/cocoapods-core/specification.rb +14 -12
  18. data/lib/cocoapods-core/specification/consumer.rb +8 -6
  19. data/lib/cocoapods-core/specification/dsl.rb +66 -18
  20. data/lib/cocoapods-core/specification/dsl/attribute.rb +5 -4
  21. data/lib/cocoapods-core/specification/dsl/deprecations.rb +35 -23
  22. data/lib/cocoapods-core/specification/dsl/platform_proxy.rb +16 -11
  23. data/lib/cocoapods-core/specification/linter.rb +107 -36
  24. data/lib/cocoapods-core/specification/root_attribute_accessors.rb +16 -4
  25. data/lib/cocoapods-core/specification/set.rb +41 -24
  26. data/lib/cocoapods-core/specification/set/presenter.rb +7 -5
  27. data/lib/cocoapods-core/specification/yaml.rb +6 -2
  28. data/lib/cocoapods-core/standard_error.rb +3 -3
  29. data/lib/cocoapods-core/vendor.rb +0 -1
  30. data/lib/cocoapods-core/vendor/requirement.rb +9 -9
  31. data/lib/cocoapods-core/vendor/version.rb +143 -140
  32. data/lib/cocoapods-core/version.rb +5 -6
  33. data/lib/cocoapods-core/yaml_converter.rb +3 -2
  34. metadata +17 -3
@@ -224,10 +224,12 @@ module Pod
224
224
  value = the_spec.attributes_hash[attr.name.to_s]
225
225
  value = prepare_value(attr, value)
226
226
 
227
- if attr.multi_platform? && the_spec.attributes_hash[platform_name.to_s]
228
- platform_value = the_spec.attributes_hash[platform_name.to_s][attr.name.to_s]
229
- platform_value = prepare_value(attr, platform_value)
230
- value = merge_values(attr, value, platform_value)
227
+ if attr.multi_platform?
228
+ if platform_hash = the_spec.attributes_hash[platform_name.to_s]
229
+ platform_value = platform_hash[attr.name.to_s]
230
+ platform_value = prepare_value(attr, platform_value)
231
+ value = merge_values(attr, value, platform_value)
232
+ end
231
233
  end
232
234
  value
233
235
  end
@@ -258,7 +260,7 @@ module Pod
258
260
  r = [*existing_value] + [*new_value]
259
261
  r.compact
260
262
  elsif attr.container == Hash
261
- existing_value = existing_value.merge(new_value) do |_, old, new|
263
+ existing_value.merge(new_value) do |_, old, new|
262
264
  if new.is_a?(Array) || old.is_a?(Array)
263
265
  r = [*old] + [*new]
264
266
  r.compact
@@ -289,7 +291,7 @@ module Pod
289
291
 
290
292
  hook_name = prepare_hook_name(attr)
291
293
  if self.respond_to?(hook_name, true)
292
- value = self.send(hook_name, value)
294
+ value = send(hook_name, value)
293
295
  else
294
296
  value
295
297
  end
@@ -105,7 +105,8 @@ module Pod
105
105
 
106
106
  # @!method authors=(authors)
107
107
  #
108
- # The name and email address of each of the library’s the authors.
108
+ # The name and email addresses of the library maintainers, not the
109
+ # Podspec maintainer.
109
110
  #
110
111
  # @example
111
112
  #
@@ -124,7 +125,7 @@ module Pod
124
125
  # the list of the authors of the library and their emails.
125
126
  #
126
127
  root_attribute :authors, {
127
- :types => [ String, Array, Hash ],
128
+ :types => [String, Array, Hash],
128
129
  :container => Hash,
129
130
  :required => true,
130
131
  :singularize => true,
@@ -132,9 +133,34 @@ module Pod
132
133
 
133
134
  #------------------#
134
135
 
136
+ # @!method social_media_url=(social_media_url)
137
+ #
138
+ # The URL for the social media contact of the Pod, CocoaPods web
139
+ # services can use this.
140
+ #
141
+ # For example, the @CocoaPodsFeed notifications will include the
142
+ # Twitter handle (shortening the description) if the URL is relative to
143
+ # Twitter. This does **not** necessarily have to be a Twitter URL, but
144
+ # only those are included in the Twitter @CocoaPodsFeed notifications.
145
+ #
146
+ # @example
147
+ #
148
+ # spec.social_media_url = 'https://twitter.com/cocoapods'
149
+ #
150
+ # @example
151
+ #
152
+ # spec.social_media_url = 'https://groups.google.com/forum/#!forum/cocoapods'
153
+ #
154
+ # @param [String] social_media_url
155
+ # the social media URL.
156
+ #
157
+ root_attribute :social_media_url
158
+
159
+ #------------------#
160
+
135
161
  # The keys accepted by the license attribute.
136
162
  #
137
- LICENSE_KEYS = [ :type, :file, :text ].freeze
163
+ LICENSE_KEYS = [:type, :file, :text].freeze
138
164
 
139
165
  # @!method license=(license)
140
166
  #
@@ -210,15 +236,32 @@ module Pod
210
236
  #
211
237
  # The location from where the library should be retrieved.
212
238
  #
213
- # @example Specifying a Git source with a tag.
239
+ # @example Specifying a Git source with a tag. This is how most OSS Podspecs work.
214
240
  #
215
241
  # spec.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git',
216
242
  # :tag => 'v0.0.1' }
217
243
  #
218
- # @example Using the version of the Pod to identify the Git tag.
244
+ # @example Using the version of the Pod to identify the Git commit and using submodules.
219
245
  #
220
246
  # spec.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git',
221
- # :tag => "v#{spec.version}" }
247
+ # :commit => "v#{spec.version}", :submodules => true }
248
+ #
249
+ # @example Using the version of the Pod to identify the Git branch.
250
+ #
251
+ # spec.source = { :git => 'https://github.com/AFNetworking/AFNetworking.git',
252
+ # :branch => "orta_fixes"}
253
+ #
254
+ # @example Using Subversion with a tag.
255
+ #
256
+ # spec.source = { :svn => "http://svn.code.sf.net/p/polyclipping/code", :tag => '4.8.8' }
257
+ #
258
+ # @example Using Mercurial with the same revision as the spec's semantic version string.
259
+ #
260
+ # spec.source = { :hg => "https://bitbucket.org/dcutting/hyperbek", :revision => "#{s.version}" }
261
+ #
262
+ # @example Using HTTP to download a compressed file of the code. It supports zip, tgz, bz2 and tar.
263
+ #
264
+ # spec.source = { :http => "http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip" }
222
265
  #
223
266
  # @param [Hash{Symbol=>String}] source
224
267
  # The location from where the library should be retrieved.
@@ -304,8 +347,9 @@ module Pod
304
347
 
305
348
  # @!method documentation_url=(documentation_url)
306
349
  #
307
- # An URL for the documentation of the Pod which will be honored by
308
- # CocoaPods web properties.
350
+ # An optional URL for the documentation of the Pod which will be honored by
351
+ # CocoaPods web properties. Leaving it blank will default to a CocoaDocs
352
+ # generated URL for your library.
309
353
  #
310
354
  # @example
311
355
  #
@@ -396,9 +440,7 @@ module Pod
396
440
  def platform=(args)
397
441
  name, deployment_target = args
398
442
  if name
399
- attributes_hash["platforms"] = {
400
- name.to_s => deployment_target
401
- }
443
+ attributes_hash["platforms"] = { name.to_s => deployment_target }
402
444
  else
403
445
  attributes_hash["platforms"] = {}
404
446
  end
@@ -451,7 +493,8 @@ module Pod
451
493
  # The deployment target of the platform.
452
494
  #
453
495
  def deployment_target=(*args)
454
- raise Informative, "The deployment target can be declared only per platform."
496
+ raise Informative, "The deployment target can be declared only per " \
497
+ "platform."
455
498
  end
456
499
 
457
500
  #-----------------------------------------------------------------------#
@@ -497,19 +540,25 @@ module Pod
497
540
  #
498
541
  def dependency(*args)
499
542
  name, *version_requirements = args
500
- raise Informative, "A specification can't require itself as a subspec" if name == self.name
543
+ if name == self.name
544
+ raise Informative, "A specification can't require itself as a " \
545
+ "subspec"
546
+ end
501
547
  if @parent
502
548
  composed_name = ""
503
549
  @parent.name.split("/").each do |component|
504
550
  composed_name << component
505
551
  if name == composed_name
506
- raise Informative, "A subspec can't require one of its parents specifications"
507
- break
552
+ raise Informative, "A subspec can't require one of its " \
553
+ "parents specifications"
554
+ else
555
+ composed_name << "/"
508
556
  end
509
- composed_name << "/"
510
557
  end
511
558
  end
512
- raise Informative, "Unsupported version requirements" unless version_requirements.all? { |req| req.is_a?(String) }
559
+ unless version_requirements.all? { |req| req.is_a?(String) }
560
+ raise Informative, "Unsupported version requirements"
561
+ end
513
562
  attributes_hash["dependencies"] ||= {}
514
563
  attributes_hash["dependencies"][name] = version_requirements
515
564
  end
@@ -694,7 +743,6 @@ module Pod
694
743
  :inherited => true
695
744
  }
696
745
 
697
-
698
746
  #------------------#
699
747
 
700
748
  # @!method header_dir=(dir)
@@ -42,7 +42,7 @@ module Pod
42
42
  @default_value = options.delete(:default_value) { nil }
43
43
  @ios_default = options.delete(:ios_default) { nil }
44
44
  @osx_default = options.delete(:osx_default) { nil }
45
- @types = options.delete(:types) { [String ] }
45
+ @types = options.delete(:types) { [String] }
46
46
 
47
47
  unless options.empty?
48
48
  raise StandardError, "Unrecognized options: #{options} for #{to_s}"
@@ -58,8 +58,8 @@ module Pod
58
58
  # @return [String] A string representation suitable for debugging.
59
59
  #
60
60
  def inspect
61
- "<#{self.class} name=#{self.name} types=#{types} " \
62
- "multi_platform=#{multi_platform?}>"
61
+ "<#{self.class} name=#{name} types=#{types} " \
62
+ "multi_platform=#{multi_platform?}>"
63
63
  end
64
64
 
65
65
  #---------------------------------------------------------------------#
@@ -209,7 +209,8 @@ module Pod
209
209
  #
210
210
  def validate_for_writing(spec, value)
211
211
  if root_only? && !spec.root?
212
- raise StandardError, "Can't set `#{name}` attribute for subspecs (in `#{spec.name}`)."
212
+ raise StandardError, "Can't set `#{name}` attribute for " \
213
+ "subspecs (in `#{spec.name}`)."
213
214
  end
214
215
 
215
216
  if keys
@@ -8,59 +8,73 @@ module Pod
8
8
 
9
9
  def preferred_dependency=(name)
10
10
  self.default_subspec = name
11
- CoreUI.warn "[#{to_s}] `preferred_dependency` has been renamed to `default_subspec`."
11
+ CoreUI.warn "[#{to_s}] `preferred_dependency` has been renamed "\
12
+ "to `default_subspec`."
12
13
  end
13
14
 
14
15
  def singleton_method_added(method)
15
16
  if method == :pre_install
16
- CoreUI.warn "[#{to_s}] The use of `#{method}` by overriding the method is deprecated."
17
+ CoreUI.warn "[#{to_s}] The use of `#{method}` by overriding " \
18
+ "the method is deprecated."
17
19
  @pre_install_callback = Proc.new do |pod, target_definition|
18
- self.pre_install(pod, target_definition)
20
+ pre_install(pod, target_definition)
19
21
  end
20
22
 
21
23
  elsif method == :post_install
22
- CoreUI.warn "[#{to_s}] The use of `#{method}` by overriding the method is deprecated."
24
+ CoreUI.warn "[#{to_s}] The use of `#{method}` by overriding the " \
25
+ "method is deprecated."
23
26
  @post_install_callback = Proc.new do |target_installer|
24
- self.post_install(target_installer)
27
+ post_install(target_installer)
25
28
  end
26
29
 
27
30
  elsif method == :header_mappings
28
- raise Informative, "[#{to_s}] The use of the `header_mappings` hook has been deprecated.\n" \
29
- "Use the `header_dir` and the `header_mappings_dir` attributes."
31
+ raise Informative, "[#{to_s}] The use of the `header_mappings` " \
32
+ "hook has been deprecated.\n Use the `header_dir` and the " \
33
+ "`header_mappings_dir` attributes."
30
34
 
31
35
  elsif method == :copy_header_mapping
32
- raise Informative, "[#{to_s}] The use of the `copy_header_mapping` hook has been deprecated.\n" \
33
- "Use the `header_dir` and the `header_mappings_dir` attributes."
36
+ raise Informative, "[#{to_s}] The use of the " \
37
+ "`copy_header_mapping` hook has been deprecated.\nUse" \
38
+ "the `header_dir` and the `header_mappings_dir` attributes."
34
39
  end
35
40
  end
36
41
 
37
42
  def documentation=(value)
38
- CoreUI.warn "[#{to_s}] The `documentation` DSL directive of the podspec format has been deprecated."
43
+ CoreUI.warn "[#{to_s}] The `documentation` DSL directive of the " \
44
+ "podspec format has been deprecated."
39
45
  end
40
46
 
41
47
  def clean_paths=(value)
42
- raise Informative, "[#{to_s}] Clean paths are deprecated. CocoaPods now " \
43
- "cleans unused files by default. Use the `preserve_paths` attribute if needed."
48
+ raise Informative, "[#{to_s}] Clean paths are deprecated. " \
49
+ "CocoaPods now cleans unused files by default. Use the " \
50
+ "`preserve_paths` attribute if needed."
44
51
  end
45
52
 
46
- [ :part_of_dependency=, :part_of=, :exclude_header_search_paths= ].each do |method|
53
+ DEPRECATED_METHODS = [
54
+ :part_of_dependency=,
55
+ :part_of=,
56
+ :exclude_header_search_paths=
57
+ ]
58
+
59
+ DEPRECATED_METHODS.each do |method|
47
60
  define_method method do |value|
48
- raise Informative, "[#{to_s}] Attribute `#{method.to_s[0..-2]}` has been deprecated."
61
+ raise Informative, "[#{to_s}] Attribute "\
62
+ "`#{method.to_s[0..-2]}` has been deprecated."
49
63
  end
50
64
  end
51
65
 
52
66
  # @!group Hooks
53
67
  #
54
- # The specification class provides hooks which are called by CocoaPods
55
- # when a Pod is installed.
68
+ # The specification class provides hooks which are called by
69
+ # CocoaPods when a Pod is installed.
56
70
 
57
71
  #-----------------------------------------------------------------------#
58
72
 
59
- # This is a convenience method which gets called after all pods have been
60
- # downloaded but before they have been installed, and the Xcode project
61
- # and related files have been generated. Note that this hook is called
62
- # for each Pods library and only for installations where the Pod is
63
- # installed.
73
+ # This is a convenience method which gets called after all pods have
74
+ # been downloaded but before they have been installed, and the Xcode
75
+ # project and related files have been generated. Note that this hook is
76
+ # called for each Pods library and only for installations where the Pod
77
+ # is installed.
64
78
  #
65
79
  # This hook should be used to generate and modify the files of the Pod.
66
80
  #
@@ -117,9 +131,7 @@ module Pod
117
131
 
118
132
  #-----------------------------------------------------------------------#
119
133
 
120
-
121
134
  end
122
-
123
135
  end
124
136
  end
125
137
  end
@@ -11,8 +11,8 @@ module Pod
11
11
  #
12
12
  attr_accessor :spec
13
13
 
14
- # @return [Symbol] the platform described by this proxy. Can be either `:ios` or
15
- # `:osx`.
14
+ # @return [Symbol] the platform described by this proxy. Can be either
15
+ # `:ios` or `:osx`.
16
16
  #
17
17
  attr_accessor :platform
18
18
 
@@ -23,18 +23,22 @@ module Pod
23
23
  @spec, @platform = spec, platform
24
24
  end
25
25
 
26
- # Defines a setter method for each attribute of the specification class,
27
- # that forwards the message to the {#specification} using the
26
+ # Defines a setter method for each attribute of the specification
27
+ # class, that forwards the message to the {#specification} using the
28
28
  # {Specification#on_platform} method.
29
29
  #
30
30
  # @return [void]
31
31
  #
32
32
  def method_missing(meth, *args, &block)
33
- attr = Specification::DSL.attributes.values.find do |attr|
34
- attr.writer_name.to_sym == meth || (attr.writer_singular_form && attr.writer_singular_form.to_sym == meth)
33
+ attribute = Specification::DSL.attributes.values.find do |attr|
34
+ if attr.writer_name.to_sym == meth
35
+ true
36
+ elsif attr.writer_singular_form
37
+ attr.writer_singular_form.to_sym == meth
38
+ end
35
39
  end
36
- if attr && attr.multi_platform?
37
- spec.store_attribute(attr.name, args.first, platform)
40
+ if attribute && attribute.multi_platform?
41
+ spec.store_attribute(attribute.name, args.first, platform)
38
42
  else
39
43
  super
40
44
  end
@@ -47,9 +51,10 @@ module Pod
47
51
  def dependency(*args)
48
52
  name, *version_requirements = args
49
53
  platform_name = platform.to_s
50
- spec.attributes_hash[platform_name] ||= {}
51
- spec.attributes_hash[platform_name]["dependencies"] ||= {}
52
- spec.attributes_hash[platform_name]["dependencies"][name] = version_requirements
54
+ platform_hash = spec.attributes_hash[platform_name] || {}
55
+ platform_hash["dependencies"] ||= {}
56
+ platform_hash["dependencies"][name] = version_requirements
57
+ spec.attributes_hash[platform_name] = platform_hash
53
58
  end
54
59
 
55
60
  # Allows to set the deployment target for the platform.
@@ -90,13 +90,23 @@ module Pod
90
90
  def perform_textual_analysis
91
91
  return unless @file
92
92
  text = @file.read
93
- error "`config.ios?` and `config.osx?` are deprecated." if text =~ /config\..?os.?/
94
- error "clean_paths are deprecated (use preserve_paths)." if text =~ /clean_paths/
93
+ if text =~ /config\..?os.?/
94
+ error "`config.ios?` and `config.osx?` are deprecated."
95
+ end
96
+ if text =~ /clean_paths/
97
+ error "clean_paths are deprecated (use preserve_paths)."
98
+ end
99
+
95
100
  all_lines_count = text.lines.count
96
101
  comments_lines_count = text.scan(/^\s*#\s+/).length
97
102
  comments_ratio = comments_lines_count.fdiv(all_lines_count)
98
- warning "Comments must be deleted." if comments_lines_count > 20 && comments_ratio > 0.2
99
- warning "Comments placed at the top of the specification must be deleted." if text.lines.first =~ /^\s*#\s+/
103
+ if comments_lines_count > 20 && comments_ratio > 0.2
104
+ warning "Comments must be deleted."
105
+ end
106
+ if text.lines.first =~ /^\s*#\s+/
107
+ warning "Comments placed at the top of the specification must be " \
108
+ "deleted."
109
+ end
100
110
  end
101
111
 
102
112
  # Checks that every root only attribute which is required has a value.
@@ -138,7 +148,7 @@ module Pod
138
148
  # @return [void]
139
149
  #
140
150
  def perform_all_specs_analysis
141
- all_specs = [ spec, *spec.recursive_subspecs ]
151
+ all_specs = [spec, *spec.recursive_subspecs]
142
152
  all_specs.each do |current_spec|
143
153
  current_spec.available_platforms.each do |platform|
144
154
  @consumer = Specification::Consumer.new(current_spec, platform)
@@ -193,7 +203,11 @@ module Pod
193
203
  #
194
204
  def _validate_name(n)
195
205
  if spec.name && file
196
- names_match = (file.basename.to_s == spec.root.name + '.podspec') || (file.basename.to_s == spec.root.name + '.podspec.yaml')
206
+ acceptable_names = [
207
+ spec.root.name + '.podspec',
208
+ spec.root.name + '.podspec.yaml'
209
+ ]
210
+ names_match = acceptable_names.include?(file.basename.to_s)
197
211
  unless names_match
198
212
  error "The name of the spec should match the name of the file."
199
213
  end
@@ -203,37 +217,56 @@ module Pod
203
217
  def _validate_version(v)
204
218
  if v.to_s.empty?
205
219
  error "A version is required."
206
- else
207
- error "The version of the spec should be higher than 0." unless v > Version::ZERO
220
+ elsif v <= Version::ZERO
221
+ error "The version of the spec should be higher than 0."
208
222
  end
209
223
  end
210
224
 
211
225
  # Performs validations related to the `summary` attribute.
212
226
  #
213
227
  def _validate_summary(s)
214
- warning "The summary should be a short version of `description` (max 140 characters)." if s.length > 140
215
- warning "The summary is not meaningful." if s =~ /A short description of/
228
+ if s.length > 140
229
+ warning "The summary should be a short version of `description` " \
230
+ "(max 140 characters)."
231
+ end
232
+ if s =~ /A short description of/
233
+ warning "The summary is not meaningful."
234
+ end
216
235
  end
217
236
 
218
237
  # Performs validations related to the `description` attribute.
219
238
  #
220
239
  def _validate_description(d)
221
- warning "The description is not meaningful." if d =~ /An optional longer description of/
222
- warning "The description is equal to the summary." if d == spec.summary
223
- warning "The description is shorter than the summary." if d.length < spec.summary.length
240
+ if d =~ /An optional longer description of/
241
+ warning "The description is not meaningful."
242
+ end
243
+ if d == spec.summary
244
+ warning "The description is equal to the summary."
245
+ end
246
+ if d.length < spec.summary.length
247
+ warning "The description is shorter than the summary."
248
+ end
224
249
  end
225
250
 
226
251
  def _validate_homepage(h)
227
- warning "The homepage has not been updated from default" if h =~ /http:\/\/EXAMPLE/
252
+ if h =~ %r[http://EXAMPLE]
253
+ warning "The homepage has not been updated from default"
254
+ end
228
255
  end
229
256
 
230
257
  # Performs validations related to the `license` attribute.
231
258
  #
232
259
  def _validate_license(l)
233
260
  type = l[:type]
234
- warning "Missing license type." if type.nil?
235
- warning "Invalid license type." if type && type.gsub(' ', '').gsub("\n", '').empty?
236
- error "Sample license type." if type && type =~ /\(example\)/
261
+ if type.nil?
262
+ warning "Missing license type."
263
+ end
264
+ if type && type.gsub(' ', '').gsub("\n", '').empty?
265
+ warning "Invalid license type."
266
+ end
267
+ if type && type =~ /\(example\)/
268
+ error "Sample license type."
269
+ end
237
270
  end
238
271
 
239
272
  # Performs validations related to the `source` attribute.
@@ -241,21 +274,49 @@ module Pod
241
274
  def _validate_source(s)
242
275
  if git = s[:git]
243
276
  tag, commit = s.values_at(:tag, :commit)
244
- github = git.include?('github.com')
245
- version = spec.version.to_s
277
+ version = spec.version.to_s
246
278
 
247
- error "Example source." if git =~ /http:\/\/EXAMPLE/
248
- error 'The commit of a Git source cannot be `HEAD`.' if commit && commit.downcase =~ /head/
249
- warning 'The version should be included in the Git tag.' if tag && !tag.include?(version)
250
- warning "Github repositories should end in `.git`." if github && !git.end_with?('.git')
251
- warning "Github repositories should use `https` link." if github && !git.start_with?('https://github.com') && !git.start_with?('git://gist.github.com')
279
+ if git =~ %r[http://EXAMPLE]
280
+ error "Example source."
281
+ end
282
+ if commit && commit.downcase =~ /head/
283
+ error 'The commit of a Git source cannot be `HEAD`.'
284
+ end
285
+ if tag && !tag.include?(version)
286
+ warning 'The version should be included in the Git tag.'
287
+ end
252
288
 
253
289
  if version == '0.0.1'
254
- error 'Git sources should specify either a commit or a tag.' if commit.nil? && tag.nil?
290
+ if commit.nil? && tag.nil?
291
+ error 'Git sources should specify either a commit or a tag.'
292
+ end
255
293
  else
256
294
  warning 'Git sources should specify a tag.' if tag.nil?
257
295
  end
258
296
  end
297
+
298
+ perform_github_source_checks(s)
299
+ end
300
+
301
+ # Performs validations related to github sources.
302
+ #
303
+ def perform_github_source_checks(s)
304
+ supported_domains = [
305
+ 'https://github.com',
306
+ 'https://gist.github.com',
307
+ ]
308
+
309
+ if git = s[:git]
310
+ is_github = git.include?('github.com')
311
+ if is_github
312
+ unless git.end_with?('.git')
313
+ warning "Github repositories should end in `.git`."
314
+ end
315
+ unless supported_domains.find { |domain| git.start_with?(domain) }
316
+ warning "Github repositories should use `https` link."
317
+ end
318
+ end
319
+ end
259
320
  end
260
321
 
261
322
  #-----------------------------------------------------------------------#
@@ -285,7 +346,8 @@ module Pod
285
346
  end
286
347
  patterns.each do |pattern|
287
348
  if pattern.start_with?('/')
288
- error "File patterns must be relative and cannot start with a slash (#{attrb.name})."
349
+ error "File patterns must be relative and cannot start with a " \
350
+ "slash (#{attrb.name})."
289
351
  end
290
352
  end
291
353
  end
@@ -295,31 +357,38 @@ module Pod
295
357
  #
296
358
  def check_tmp_arc_not_nil
297
359
  if consumer.requires_arc.nil?
298
- warning "A value for `requires_arc` should be specified until the migration to a `true` default."
360
+ warning "A value for `requires_arc` should be specified until the " \
361
+ "migration to a `true` default."
299
362
  end
300
363
  end
301
364
 
302
365
  # Check empty subspec attributes
303
366
  #
304
367
  def check_if_spec_is_empty
305
- methods = %w[ source_files resources preserve_paths dependencies ]
368
+ methods = %w[ source_files resources preserve_paths dependencies vendored_libraries vendored_frameworks ]
306
369
  empty_patterns = methods.all? { |m| consumer.send(m).empty? }
307
370
  empty = empty_patterns && consumer.spec.subspecs.empty?
308
371
  if empty
309
- error "The #{consumer.spec} spec is empty (no source files, resources, preserve paths, dependencies or subspecs)."
372
+ error "The #{consumer.spec} spec is empty (no source files, " \
373
+ "resources, preserve paths, , vendored_libraries, " \
374
+ "vendored_frameworks dependencies or subspecs)."
310
375
  end
311
376
  end
312
377
 
313
378
  # Check the hooks
314
379
  #
315
380
  def check_install_hooks
316
- warning "The pre install hook of the specification DSL has been " \
317
- "deprecated, use the `resource_bundles` or the `prepare_command` " \
318
- "attributes." unless consumer.spec.pre_install_callback.nil?
381
+ unless consumer.spec.pre_install_callback.nil?
382
+ warning "The pre install hook of the specification DSL has been " \
383
+ "deprecated, use the `resource_bundles` or the " \
384
+ "`prepare_command` attributes."
385
+ end
319
386
 
320
- warning "The post install hook of the specification DSL has been " \
321
- "deprecated, use the `resource_bundles` or the `prepare_command` " \
322
- "attributes." unless consumer.spec.post_install_callback.nil?
387
+ unless consumer.spec.post_install_callback.nil?
388
+ warning "The post install hook of the specification DSL has been " \
389
+ "deprecated, use the `resource_bundles` or the " \
390
+ " `prepare_command` attributes."
391
+ end
323
392
  end
324
393
 
325
394
  #-----------------------------------------------------------------------#
@@ -403,7 +472,9 @@ module Pod
403
472
  def to_s
404
473
  r = "[#{type.to_s.upcase}] #{message}"
405
474
  if platforms != Specification::PLATFORMS
406
- platforms_names = platforms.uniq.map { |p| Platform.string_name(p) }
475
+ platforms_names = platforms.uniq.map do |p|
476
+ Platform.string_name(p)
477
+ end
407
478
  r << " [#{platforms_names * ' - '}]" unless platforms.empty?
408
479
  end
409
480
  r