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

Returns a new instance of Consumer.

Parameters:

  • spec (Specification)

    @see spec

  • platform (Symbol, Platform)

    The platform for which the specification needs to be consumed.



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)

Returns The name of the platform for which the specification needs to be consumed.

Returns:

  • (Symbol)

    The name of the platform for which the specification needs to be consumed.



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

def platform_name
  @platform_name
end

#specSpecification (readonly)

Returns The specification to consume.

Returns:



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.

Parameters:

  • name (Symbol)

    the name 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.

Parameters:

  • value. (String, Array)

    The value of the attribute as specified by the user.

Returns:

  • (String)

    the prefix header.



316
317
318
319
320
321
# File 'lib/cocoapods-core/specification/consumer.rb', line 316

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.

Parameters:

  • value. (String, Array, Hash)

    The value of the attribute as specified by the user.

Returns:

  • (Hash)

    the resources.



331
332
333
334
335
336
337
338
339
# File 'lib/cocoapods-core/specification/consumer.rb', line 331

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

#compiler_flagsArray<String>

Returns the list of compiler flags needed by the specification files.

Returns:

  • (Array<String>)

    the list of compiler flags needed by the specification files.



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

spec_attr_accessor :compiler_flags

#dependenciesArray<Dependency>

Returns the dependencies on other Pods.

Returns:

  • (Array<Dependency>)

    the dependencies on other Pods.



160
161
162
163
164
165
# File 'lib/cocoapods-core/specification/consumer.rb', line 160

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

#exclude_filesArray<String>

Returns The file patterns that the Pod should ignore.

Returns:

  • (Array<String>)

    The file patterns that the Pod should ignore.



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

spec_attr_accessor :exclude_files

#frameworksArray<String>

Returns A list of frameworks that the user’s target needs to link against.

Returns:

  • (Array<String>)

    A list of frameworks that the user’s target needs to link against



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

spec_attr_accessor :frameworks

#header_dirString

Returns the headers directory.

Returns:

  • (String)

    the headers directory.



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

spec_attr_accessor :header_dir

#header_mappings_dirString

Returns the directory from where to preserve the headers namespacing.

Returns:

  • (String)

    the directory from where to preserve the headers namespacing.



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

spec_attr_accessor :header_mappings_dir

#librariesArray<String>

Returns A list of libraries that the user’s target needs to link against.

Returns:

  • (Array<String>)

    A list of libraries that the user’s target needs to link against



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

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.

Parameters:

  • attr (Specification::DSL::Attribute)

    the attribute for which that value is needed.

  • existing_value (String, Array, Hash)

    the current value (the value of the parent or non-multiplatform value).

  • new_value (String, Array, Hash)

    the value to append (the value of the spec or the multi-platform value).

Returns:

  • (String, Array, Hash)

    The merged value.



249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/cocoapods-core/specification/consumer.rb', line 249

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

#prefix_header_contentsString

Returns The contents of the prefix header.

Returns:

  • (String)

    The contents of the prefix header.



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

spec_attr_accessor :prefix_header_contents

#prefix_header_fileString

Returns The path of the prefix header file.

Returns:

  • (String)

    The path of the prefix header file.



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

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.

Returns:

  • (String)

    the name of the prepare hook for this attribute.



305
306
307
# File 'lib/cocoapods-core/specification/consumer.rb', line 305

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.

Returns:

  • (Object)

    the customized value of the original one if no prepare hook was defined.



283
284
285
286
287
288
289
290
291
292
293
294
# File 'lib/cocoapods-core/specification/consumer.rb', line 283

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)
    value = send(hook_name, value)
  else
    value
  end
end

#preserve_pathsArray<String>

Returns The paths that should be not cleaned.

Returns:

  • (Array<String>)

    The paths that should be not cleaned.



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

spec_attr_accessor :preserve_paths

#private_header_filesArray<String>

Returns the private headers of the Pod.

Returns:

  • (Array<String>)

    the private headers of the Pod.



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

spec_attr_accessor :private_header_files

#public_header_filesArray<String>

Returns the public headers of the Pod.

Returns:

  • (Array<String>)

    the public headers of the Pod.



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

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.

Parameters:

Returns:

  • (String, Array, Hash)

    The value for an attribute.



219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'lib/cocoapods-core/specification/consumer.rb', line 219

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?

Returns Whether the source files of the specification require to be compiled with ARC.

Returns:

  • (Bool)

    Whether the source files of the specification require to be compiled with ARC.



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

spec_attr_accessor :requires_arc

#resource_bundlesHash{String=>String}

Returns ] hash where the keys are the names of the resource bundles and the values are their relative file patterns.

Returns:

  • (Hash{String=>String})

    ] hash where the keys are the names of the resource bundles and the values are their relative file patterns.



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

spec_attr_accessor :resource_bundles

#resourcesArray<String>

Returns A hash where the key represents the paths of the resources to copy and the values the paths of the resources that should be copied.

Returns:

  • (Array<String>)

    A hash where the key represents the paths of the resources to copy and the values the paths of the resources that should be copied.



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

spec_attr_accessor :resources

#source_filesArray<String>

Returns the source files of the Pod.

Returns:

  • (Array<String>)

    the source files of the Pod.



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

spec_attr_accessor :source_files

#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.

Parameters:

  • attr_name (Symbol)

    The name of the attribute.

Returns:

  • (String, Array, Hash)

    the value for the attribute.



180
181
182
183
184
185
186
# File 'lib/cocoapods-core/specification/consumer.rb', line 180

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.

Parameters:

Returns:

  • (String, Array, Hash)

    the value for the attribute.



198
199
200
201
202
203
204
205
206
# File 'lib/cocoapods-core/specification/consumer.rb', line 198

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>

Returns The paths of the framework bundles shipped with the Pod.

Returns:

  • (Array<String>)

    The paths of the framework bundles shipped with the Pod.



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

spec_attr_accessor :vendored_frameworks

#vendored_librariesArray<String>

Returns The paths of the libraries shipped with the Pod.

Returns:

  • (Array<String>)

    The paths of the libraries shipped with the Pod.



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

spec_attr_accessor :vendored_libraries

#weak_frameworksArray<String>

Returns A list of frameworks that the user’s target needs to weakly link against.

Returns:

  • (Array<String>)

    A list of frameworks that the user’s target needs to weakly link against



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

spec_attr_accessor :weak_frameworks

#xcconfigHash{String => String}

Returns the xcconfig flags for the current specification.

Returns:

  • (Hash{String => String})

    the xcconfig flags for the current specification.



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

spec_attr_accessor :xcconfig