Class: Pod::Specification::Consumer

Inherits:
Object
  • Object
show all
Defined in:
lib/cocoapods-core/specification/consumer.rb

Overview

Allows to conveniently access a Specification programmatically.

It takes care of:

  • standardizing the attributes

  • handling multi-platform values

  • handle default values

  • handle inherited values

This class allows to store the values of the attributes in the Specification as specified in the DSL. The benefits is reduced reliance on meta programming to access the attributes and the possibility of serializing a specification back exactly as defined in a file.

Instance Attribute Summary collapse

Regular attributes collapse

File patterns collapse

Preparing Values collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(spec, platform) ⇒ Consumer



33
34
35
36
37
38
39
40
# File 'lib/cocoapods-core/specification/consumer.rb', line 33

def initialize(spec, platform)
  @spec = spec
  @platform_name = platform.is_a?(Symbol) ? platform : platform.name

  unless spec.supported_on_platform?(platform)
    raise StandardError, "#{self} is not compatible with #{platform}."
  end
end

Instance Attribute Details

#platform_nameSymbol (readonly)



27
28
29
# File 'lib/cocoapods-core/specification/consumer.rb', line 27

def platform_name
  @platform_name
end

#specSpecification (readonly)



22
23
24
# File 'lib/cocoapods-core/specification/consumer.rb', line 22

def spec
  @spec
end

Class Method Details

.spec_attr_accessor(name) ⇒ Object

Creates a method to access the contents of the attribute.



50
51
52
53
54
# File 'lib/cocoapods-core/specification/consumer.rb', line 50

def self.spec_attr_accessor(name)
  define_method(name) do
    value_for_attribute(name)
  end
end

Instance Method Details

#_prepare_prefix_header_contents(value) ⇒ String

Converts the prefix header to a string if specified as an array.



345
346
347
348
349
350
# File 'lib/cocoapods-core/specification/consumer.rb', line 345

def _prepare_prefix_header_contents(value)
  if value
    value = value.join("\n") if value.is_a?(Array)
    value.strip_heredoc.chomp
  end
end

#_prepare_resource_bundles(value) ⇒ Hash

Ensures that the file patterns of the resource bundles are contained in an array.



360
361
362
363
364
365
366
367
368
# File 'lib/cocoapods-core/specification/consumer.rb', line 360

def _prepare_resource_bundles(value)
  result = {}
  if value
    value.each do |key, patterns|
      result[key] = [*patterns].compact
    end
  end
  result
end

#compiler_flagsArray<String>



94
# File 'lib/cocoapods-core/specification/consumer.rb', line 94

spec_attr_accessor :compiler_flags

#dependenciesArray<Dependency>



189
190
191
192
193
194
# File 'lib/cocoapods-core/specification/consumer.rb', line 189

def dependencies
  value = value_for_attribute(:dependencies)
  value.map do |name, requirements|
    Dependency.new(name, requirements)
  end
end

#exclude_filesArray<String>



178
# File 'lib/cocoapods-core/specification/consumer.rb', line 178

spec_attr_accessor :exclude_files

#frameworksArray<String>



79
# File 'lib/cocoapods-core/specification/consumer.rb', line 79

spec_attr_accessor :frameworks

#header_dirString



130
# File 'lib/cocoapods-core/specification/consumer.rb', line 130

spec_attr_accessor :header_dir

#header_mappings_dirString



135
# File 'lib/cocoapods-core/specification/consumer.rb', line 135

spec_attr_accessor :header_mappings_dir

#librariesArray<String>



89
# File 'lib/cocoapods-core/specification/consumer.rb', line 89

spec_attr_accessor :libraries

#merge_values(attr, existing_value, new_value) ⇒ String, ...

Merges the values of an attribute, either because the attribute is multi platform or because it is inherited.



278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
# File 'lib/cocoapods-core/specification/consumer.rb', line 278

def merge_values(attr, existing_value, new_value)
  return existing_value if new_value.nil?
  return new_value if existing_value.nil?

  if attr.types.include?(TrueClass)
    new_value.nil? ? existing_value : new_value
  elsif attr.container == Array
    r = [*existing_value] + [*new_value]
    r.compact
  elsif attr.container == Hash
    existing_value.merge(new_value) do |_, old, new|
      if new.is_a?(Array) || old.is_a?(Array)
        r = [*old] + [*new]
        r.compact
      else
        old + ' ' + new
      end
    end
  else
    new_value
  end
end

#module_mapString



126
# File 'lib/cocoapods-core/specification/consumer.rb', line 126

spec_attr_accessor :module_map

#module_nameString



122
# File 'lib/cocoapods-core/specification/consumer.rb', line 122

spec_attr_accessor :module_name

#nameString



68
# File 'lib/cocoapods-core/specification/consumer.rb', line 68

spec_attr_accessor :name

#pod_target_xcconfigHash{String => String}



99
100
101
102
# File 'lib/cocoapods-core/specification/consumer.rb', line 99

def pod_target_xcconfig
  attr = Specification::DSL.attributes[:pod_target_xcconfig]
  merge_values(attr, value_for_attribute(:xcconfig), value_for_attribute(:pod_target_xcconfig))
end

#prefix_header_contentsString



114
# File 'lib/cocoapods-core/specification/consumer.rb', line 114

spec_attr_accessor :prefix_header_contents

#prefix_header_fileString



118
# File 'lib/cocoapods-core/specification/consumer.rb', line 118

spec_attr_accessor :prefix_header_file

#prepare_hook_name(attr) ⇒ String

Note:

The hook is called after the value has been wrapped in an array (if needed according to the container) but before validation.

Returns the name of the prepare hook for this attribute.



334
335
336
# File 'lib/cocoapods-core/specification/consumer.rb', line 334

def prepare_hook_name(attr)
  "_prepare_#{attr.name}"
end

#prepare_value(attr, value) ⇒ Object

Note:

Only array containers are wrapped. To automatically wrap values for attributes with hash containers a prepare hook should be used.

Wraps a value in an Array if needed and calls the prepare hook to allow further customization of a value before storing it in the instance variable.



312
313
314
315
316
317
318
319
320
321
322
323
# File 'lib/cocoapods-core/specification/consumer.rb', line 312

def prepare_value(attr, value)
  if attr.container == Array
    value = [*value].compact
  end

  hook_name = prepare_hook_name(attr)
  if self.respond_to?(hook_name, true)
    send(hook_name, value)
  else
    value
  end
end

#preserve_pathsArray<String>



183
# File 'lib/cocoapods-core/specification/consumer.rb', line 183

spec_attr_accessor :preserve_paths

#private_header_filesArray<String>



151
# File 'lib/cocoapods-core/specification/consumer.rb', line 151

spec_attr_accessor :private_header_files

#public_header_filesArray<String>



147
# File 'lib/cocoapods-core/specification/consumer.rb', line 147

spec_attr_accessor :public_header_files

#raw_value_for_attribute(the_spec, attr) ⇒ String, ...

Returns the value of a given attribute taking into account multi platform values.



248
249
250
251
252
253
254
255
256
257
258
259
260
# File 'lib/cocoapods-core/specification/consumer.rb', line 248

def raw_value_for_attribute(the_spec, attr)
  value = the_spec.attributes_hash[attr.name.to_s]
  value = prepare_value(attr, value)

  if attr.multi_platform?
    if platform_hash = the_spec.attributes_hash[platform_name.to_s]
      platform_value = platform_hash[attr.name.to_s]
      platform_value = prepare_value(attr, platform_value)
      value = merge_values(attr, value, platform_value)
    end
  end
  value
end

#requires_arcBool Also known as: requires_arc?



73
# File 'lib/cocoapods-core/specification/consumer.rb', line 73

spec_attr_accessor :requires_arc

#resource_bundlesHash{String=>String}



167
# File 'lib/cocoapods-core/specification/consumer.rb', line 167

spec_attr_accessor :resource_bundles

#resourcesArray<String>



173
# File 'lib/cocoapods-core/specification/consumer.rb', line 173

spec_attr_accessor :resources

#source_filesArray<String>



143
# File 'lib/cocoapods-core/specification/consumer.rb', line 143

spec_attr_accessor :source_files

#user_target_xcconfigHash{String => String}



107
108
109
110
# File 'lib/cocoapods-core/specification/consumer.rb', line 107

def user_target_xcconfig
  attr = Specification::DSL.attributes[:user_target_xcconfig]
  merge_values(attr, value_for_attribute(:xcconfig), value_for_attribute(:user_target_xcconfig))
end

#value_for_attribute(attr_name) ⇒ String, ...

Returns the value for the attribute with the given name for the specification. It takes into account inheritance, multi-platform attributes and default values.



209
210
211
212
213
214
215
# File 'lib/cocoapods-core/specification/consumer.rb', line 209

def value_for_attribute(attr_name)
  attr = Specification::DSL.attributes[attr_name]
  value = value_with_inheritance(spec, attr)
  value = attr.default(platform_name) if value.nil?
  value = attr.container.new if value.nil? && attr.container
  value
end

#value_with_inheritance(the_spec, attr) ⇒ String, ...

Returns the value of a given attribute taking into account inheritance.



227
228
229
230
231
232
233
234
235
# File 'lib/cocoapods-core/specification/consumer.rb', line 227

def value_with_inheritance(the_spec, attr)
  value = raw_value_for_attribute(the_spec, attr)
  if the_spec.root? || !attr.inherited?
    return value
  end

  parent_value = value_with_inheritance(the_spec.parent, attr)
  merge_values(attr, parent_value, value)
end

#vendored_frameworksArray<String>



156
# File 'lib/cocoapods-core/specification/consumer.rb', line 156

spec_attr_accessor :vendored_frameworks

#vendored_librariesArray<String>



161
# File 'lib/cocoapods-core/specification/consumer.rb', line 161

spec_attr_accessor :vendored_libraries

#weak_frameworksArray<String>



84
# File 'lib/cocoapods-core/specification/consumer.rb', line 84

spec_attr_accessor :weak_frameworks