cocoapods-core 0.27.1 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
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