Class: Pod::Specification

Inherits:
Object
  • Object
show all
Includes:
DSL, DSL::Deprecations, JSONSupport, RootAttributesAccessors
Defined in:
lib/cocoapods-core/specification.rb,
lib/cocoapods-core/specification/dsl.rb,
lib/cocoapods-core/specification/set.rb,
lib/cocoapods-core/specification/json.rb,
lib/cocoapods-core/specification/linter.rb,
lib/cocoapods-core/specification/consumer.rb,
lib/cocoapods-core/specification/dsl/attribute.rb,
lib/cocoapods-core/specification/linter/result.rb,
lib/cocoapods-core/specification/set/presenter.rb,
lib/cocoapods-core/specification/linter/analyzer.rb,
lib/cocoapods-core/specification/dsl/deprecations.rb,
lib/cocoapods-core/specification/dsl/platform_proxy.rb,
lib/cocoapods-core/specification/dsl/attribute_support.rb,
lib/cocoapods-core/specification/root_attribute_accessors.rb

Overview

The Specification provides a DSL to describe a Pod. A pod is defined as a library originating from a source. A specification can support detailed attributes for modules of code through subspecs.

Usually it is stored in files with podspec extension.

Defined Under Namespace

Modules: DSL, JSONSupport Classes: Consumer, Linter, Set

Constant Summary

Constants included from DSL

DSL::ALL_SCRIPT_PHASE_KEYS, DSL::EXECUTION_POSITION_KEYS, DSL::LICENSE_KEYS, DSL::PLATFORMS, DSL::SCHEME_KEYS, DSL::SCRIPT_PHASE_OPTIONAL_KEYS, DSL::SCRIPT_PHASE_REQUIRED_KEYS, DSL::SOURCE_KEYS, DSL::SUPPORTED_TEST_TYPES

Instance Attribute Summary collapse

Hierarchy collapse

Dependencies & Subspecs collapse

DSL helpers collapse

DSL attribute writers collapse

File representation collapse

Validation collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from JSONSupport

#to_hash, #to_json, #to_pretty_json

Methods included from DSL::Deprecations

#xcconfig=

Methods included from DSL

#app_host_name=, #app_spec, #authors=, #cocoapods_version=, #compiler_flags=, #default_subspecs=, #dependency, #dependency=, #deployment_target=, #deprecated=, #deprecated_in_favor_of=, #description=, #documentation_url=, #exclude_files=, #frameworks=, #header_dir=, #header_mappings_dir=, #homepage=, #info_plist=, #ios, #libraries=, #license=, #module_map=, #module_name=, #osx, #platform=, #pod_target_xcconfig=, #prefix_header_contents=, #prefix_header_file=, #prepare_command=, #preserve_paths=, #private_header_files=, #public_header_files=, #requires_app_host=, #requires_arc=, #resource_bundles=, #resources=, #scheme=, #screenshots=, #script_phases=, #social_media_url=, #source=, #source_files=, #static_framework=, #subspec, #summary=, #swift_versions=, #test_spec, #tvos, #user_target_xcconfig=, #vendored_frameworks=, #vendored_libraries=, #watchos, #weak_frameworks=

Methods included from DSL::AttributeSupport

#attribute, #root_attribute

Constructor Details

#initialize(parent = nil, name = nil, test_specification = false, app_specification: false) {|_self| ... } ⇒ Specification

Returns a new instance of Specification.

Parameters:

  • parent (Specification) (defaults to: nil)

    @see parent

  • name (String) (defaults to: nil)

    the name of the specification.

  • test_specification (Bool) (defaults to: false)

    Whether the specification is a test specification

  • app_specification (Bool) (defaults to: false)

    Whether the specification is an app specification

Yields:

  • (_self)

Yield Parameters:

Raises:


43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/cocoapods-core/specification.rb', line 43

def initialize(parent = nil, name = nil, test_specification = false, app_specification: false)
  raise StandardError, "#{self} can not be both an app and test specification." if test_specification && app_specification
  @attributes_hash = {}
  @subspecs = []
  @consumers = {}
  @parent = parent
  @hash_value = nil
  @test_specification = test_specification
  @app_specification = app_specification
  attributes_hash['name'] = name
  attributes_hash['test_type'] = :unit if test_specification

  yield self if block_given?
end

Instance Attribute Details

#app_specificationBool Also known as: app_specification?

Returns If this specification is an app specification.

Returns:

  • (Bool)

    If this specification is an app specification.


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

def app_specification
  @app_specification
end

#attributes_hashHash

Returns the hash that stores the information of the attributes of the specification.

Returns:

  • (Hash)

    the hash that stores the information of the attributes of the specification.


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

def attributes_hash
  @attributes_hash
end

#hash_valueInteger (readonly)

Returns the cached hash value for this spec.

Returns:

  • (Integer)

    the cached hash value for this spec.


30
31
32
# File 'lib/cocoapods-core/specification.rb', line 30

def hash_value
  @hash_value
end

#parentSpecification (readonly)

Returns the parent of the specification unless the specification is a root.

Returns:

  • (Specification)

    the parent of the specification unless the specification is a root.


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

def parent
  @parent
end

#subspecsArray<Specification>

Returns The subspecs of the specification.

Returns:


75
76
77
# File 'lib/cocoapods-core/specification.rb', line 75

def subspecs
  @subspecs
end

#test_specificationBool Also known as: test_specification?

Returns If this specification is a test specification.

Returns:

  • (Bool)

    If this specification is a test specification.


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

def test_specification
  @test_specification
end

Class Method Details

.convert_keys_to_string(value, recursive: true) ⇒ Hash

Converts the keys of the given hash to a string.

Parameters:

  • value (Object)

    the value that needs to be stripped from the Symbols.

  • recursive (Boolean) (defaults to: true)

    whether to convert keys of nested hashes.

Returns:

  • (Hash)

    the hash with the keys as strings instead of symbols.


627
628
629
630
631
632
633
634
635
# File 'lib/cocoapods-core/specification.rb', line 627

def self.convert_keys_to_string(value, recursive: true)
  return unless value
  result = {}
  value.each do |key, subvalue|
    subvalue = Specification.convert_keys_to_string(subvalue) if recursive && subvalue.is_a?(Hash)
    result[key.to_s] = subvalue
  end
  result
end

.convert_keys_to_symbol(value, recursive: true) ⇒ Hash

Converts the keys of the given hash to a symbol.

Parameters:

  • value (Object)

    the value that needs to be stripped from the Strings.

  • recursive (Boolean) (defaults to: true)

    whether to convert keys of nested hashes.

Returns:

  • (Hash)

    the hash with the keys as symbols instead of strings.


647
648
649
650
651
652
653
654
655
# File 'lib/cocoapods-core/specification.rb', line 647

def self.convert_keys_to_symbol(value, recursive: true)
  return unless value
  result = {}
  value.each do |key, subvalue|
    subvalue = Specification.convert_keys_to_symbol(subvalue) if recursive && subvalue.is_a?(Hash)
    result[key.to_sym] = subvalue
  end
  result
end

.from_file(path, subspec_name = nil) ⇒ Specification

Loads a specification form the given path.

Parameters:

  • path (Pathname, String)

    the path of the podspec file.

  • subspec_name (String) (defaults to: nil)

    the name of the specification that should be returned. If it is nil returns the root specification.

Returns:

Raises:

  • If the file doesn't return a Pods::Specification after evaluation.


704
705
706
707
708
709
710
711
712
713
714
715
716
717
# File 'lib/cocoapods-core/specification.rb', line 704

def self.from_file(path, subspec_name = nil)
  path = Pathname.new(path)
  unless path.exist?
    raise Informative, "No podspec exists at path `#{path}`."
  end

  string = File.open(path, 'r:utf-8', &:read)
  # Work around for Rubinius incomplete encoding in 1.9 mode
  if string.respond_to?(:encoding) && string.encoding.name != 'UTF-8'
    string.encode!('UTF-8')
  end

  from_string(string, path, subspec_name)
end

.from_hash(hash, parent = nil, test_specification: false, app_specification: false) ⇒ Specification

Configures a new specification from the given hash.

Parameters:

  • hash (Hash)

    the hash which contains the information of the specification.

  • parent (Specification) (defaults to: nil)

    the parent of the specification unless the specification is a root.

Returns:


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/cocoapods-core/specification/json.rb', line 75

def self.from_hash(hash, parent = nil, test_specification: false, app_specification: false)
  attributes_hash = hash.dup
  spec = Spec.new(parent, nil, test_specification, :app_specification => app_specification)
  subspecs = attributes_hash.delete('subspecs')
  testspecs = attributes_hash.delete('testspecs')
  appspecs = attributes_hash.delete('appspecs')

  ## backwards compatibility with 1.3.0
  spec.test_specification = !attributes_hash['test_type'].nil?

  spec.attributes_hash = attributes_hash
  spec.subspecs.concat(subspecs_from_hash(spec, subspecs, false, false))
  spec.subspecs.concat(subspecs_from_hash(spec, testspecs, true, false))
  spec.subspecs.concat(subspecs_from_hash(spec, appspecs, false, true))

  spec
end

.from_json(json) ⇒ Specification

Configures a new specification from the given JSON representation.

Parameters:

  • the (String)

    JSON encoded hash which contains the information of the specification.

Returns:


59
60
61
62
63
# File 'lib/cocoapods-core/specification/json.rb', line 59

def self.from_json(json)
  require 'json'
  hash = JSON.parse(json)
  from_hash(hash)
end

.from_string(spec_contents, path, subspec_name = nil) ⇒ Specification

Loads a specification with the given string. The specification is evaluated in the context of path.

Parameters:

  • spec_contents (String)

    A string describing a specification.

  • path (Pathname, String)

    @see from_file

  • subspec_name (String) (defaults to: nil)

    @see from_file

Returns:


730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
# File 'lib/cocoapods-core/specification.rb', line 730

def self.from_string(spec_contents, path, subspec_name = nil)
  path = Pathname.new(path).expand_path
  spec = nil
  case path.extname
  when '.podspec'
    Dir.chdir(path.parent.directory? ? path.parent : Dir.pwd) do
      spec = ::Pod._eval_podspec(spec_contents, path)
      unless spec.is_a?(Specification)
        raise Informative, "Invalid podspec file at path `#{path}`."
      end
    end
  when '.json'
    spec = Specification.from_json(spec_contents)
  else
    raise Informative, "Unsupported specification format `#{path.extname}` for spec at `#{path}`."
  end

  spec.defined_in_file = path
  spec.subspec_by_name(subspec_name, true)
end

.name_and_version_from_string(string_representation) ⇒ Array<String, Version>

Returns the name and the version of a pod.

Examples:

Input examples


"libPusher (1.0)"
"RestKit/JSON (1.0)"

Parameters:

Returns:

  • (Array<String, Version>)

    the name and the version of a pod.


156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/cocoapods-core/specification.rb', line 156

def self.name_and_version_from_string(string_representation)
  match_data = string_representation.match(/\A((?:\s?[^\s(])+)(?: \((.+)\))?\Z/)
  unless match_data
    raise Informative, 'Invalid string representation for a ' \
      "specification: `#{string_representation}`. " \
      'The string representation should include the name and ' \
      'optionally the version of the Pod.'
  end
  name = match_data[1]
  vers = Version.new(match_data[2])
  [name, vers]
end

.root_name(full_name) ⇒ String

Returns the root name of a specification.

Parameters:

  • the (String)

    name of a specification or of a subspec.

Returns:

  • (String)

    the root name


175
176
177
# File 'lib/cocoapods-core/specification.rb', line 175

def self.root_name(full_name)
  full_name.split('/', 2).first
end

.subspecs_from_hash(spec, subspecs, test_specification, app_specification) ⇒ Object


93
94
95
96
97
98
99
100
# File 'lib/cocoapods-core/specification/json.rb', line 93

def self.subspecs_from_hash(spec, subspecs, test_specification, app_specification)
  return [] if subspecs.nil?
  subspecs.map do |s_hash|
    Specification.from_hash(s_hash, spec,
                            :test_specification => test_specification,
                            :app_specification => app_specification)
  end
end

Instance Method Details

#==(other) ⇒ Bool Also known as: eql?

TODO:

Not sure if comparing only the name and the version is the way to go. This is used by the installer to group specifications by root spec.

Checks if a specification is equal to the given one according its name and to its version.

Parameters:

Returns:

  • (Bool)

    Whether the specifications are equal.


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

def ==(other)
  other.is_a?(self.class) &&
    name == other.name &&
    version == other.version
end

#all_dependencies(platform = nil) ⇒ Array<Dependency>

Returns all the dependencies of the specification.

Returns:

  • (Array<Dependency>)

    all the dependencies of the specification.


410
411
412
# File 'lib/cocoapods-core/specification.rb', line 410

def all_dependencies(platform = nil)
  dependencies(platform) + subspec_dependencies(platform)
end

#app_specsArray<Specification>

Returns the list of all the app subspecs of a specification.

Returns:

  • (Array<Specification>)

    the list of all the app subspecs of a specification.


287
288
289
# File 'lib/cocoapods-core/specification.rb', line 287

def app_specs
  subspecs.select(&:app_specification?)
end

#available_platformsArray<Platform>

Note:

If no platform is specified, this method returns all known platforms.

Returns The platforms that the Pod is supported on.

Returns:

  • (Array<Platform>)

    The platforms that the Pod is supported on.


514
515
516
517
518
# File 'lib/cocoapods-core/specification.rb', line 514

def available_platforms
  names = supported_platform_names
  names = PLATFORMS if names.empty?
  names.map { |name| Platform.new(name, deployment_target(name)) }
end

#c99ext_identifier(name) ⇒ String (private)

Transforms the given string into a valid +identifier+ after C99ext standard, so that it can be used in source code where escaping of ambiguous characters is not applicable.

Parameters:

  • name (String)

    any name, which may contain leading numbers, spaces or invalid characters.

Returns:

  • (String)

201
202
203
204
205
# File 'lib/cocoapods-core/specification.rb', line 201

def c99ext_identifier(name)
  return nil if name.nil?
  I18n.transliterate(name).gsub(/^([0-9])/, '_\1').
    gsub(/[^a-zA-Z0-9_]/, '_').gsub(/_+/, '_')
end

#checksumString, Nil

Returns:

  • (String)

    The SHA1 digest of the file in which the specification is defined.

  • (Nil)

    If the specification is not defined in a file.


668
669
670
671
672
673
674
675
676
677
678
679
680
681
# File 'lib/cocoapods-core/specification.rb', line 668

def checksum
  @checksum ||= begin
    if root?
      unless defined_in_file.nil?
        require 'digest'
        checksum = Digest::SHA1.hexdigest(File.read(defined_in_file))
        checksum = checksum.encode('UTF-8') if checksum.respond_to?(:encode)
        checksum
      end
    else
      root.checksum
    end
  end
end

#consumer(platform) ⇒ Specification::Consumer

Returns a consumer to access the multi-platform attributes.

Parameters:

  • platform (String, Symbol, Platform)

    the platform of the consumer

Returns:


440
441
442
443
# File 'lib/cocoapods-core/specification.rb', line 440

def consumer(platform)
  platform = platform.to_sym
  @consumers[platform] ||= Consumer.new(self, platform)
end

#default_subspecsArray<String>, Symbol

Returns the name(s) of the default subspecs if provided or :none for no default subspecs.

Returns:

  • (Array<String>, Symbol)

    the name(s) of the default subspecs if provided or :none for no default subspecs.


351
352
353
354
355
356
357
358
359
360
# File 'lib/cocoapods-core/specification.rb', line 351

def default_subspecs
  # TODO: remove singular form and update the JSON specs.
  value = Array(attributes_hash['default_subspecs'] || attributes_hash['default_subspec'])
  first = value.first
  if first == :none || first == 'none'
    first.to_sym
  else
    value
  end
end

#defined_in_fileString

Returns the path where the specification is defined, if loaded from a file.

Returns:

  • (String)

    the path where the specification is defined, if loaded from a file.


686
687
688
# File 'lib/cocoapods-core/specification.rb', line 686

def defined_in_file
  root? ? @defined_in_file : root.defined_in_file
end

#defined_in_file=(file) ⇒ void (private)

This method returns an undefined value.

Sets the path of the podspec file used to load the specification.

Parameters:

  • file (String)

    the podspec file.


760
761
762
763
764
765
# File 'lib/cocoapods-core/specification.rb', line 760

def defined_in_file=(file)
  unless root?
    raise StandardError, 'Defined in file can be set only for root specs.'
  end
  @defined_in_file = file
end

#dependencies(platform = nil) ⇒ Array<Dependency>

Note:

External dependencies are inherited by subspecs

Returns the dependencies on other Pods or subspecs of other Pods.

Parameters:

  • platform (Platform) (defaults to: nil)

    return only dependencies supported on the given platform.

Returns:

  • (Array<Dependency>)

    the dependencies on other Pods.


398
399
400
401
402
403
404
405
406
# File 'lib/cocoapods-core/specification.rb', line 398

def dependencies(platform = nil)
  if platform
    consumer(platform).dependencies || []
  else
    available_platforms.map do |spec_platform|
      consumer(spec_platform).dependencies
    end.flatten.uniq
  end
end

#dependency_whitelisted_for_configuration?(dependency, configuration) ⇒ Bool

Returns whether a dependency is whitelisted for the given configuration.

Parameters:

  • dependency (Pod::Dependency)

    the dependency verify.

  • configuration (Symbol, String)

    the configuration to check against.

Returns:

  • (Bool)

    whether the dependency is whitelisted or not.


424
425
426
427
428
429
430
431
# File 'lib/cocoapods-core/specification.rb', line 424

def dependency_whitelisted_for_configuration?(dependency, configuration)
  inherited = -> { root? ? true : parent.dependency_whitelisted_for_configuration?(dependency, configuration) }

  return inherited[] unless configuration_whitelist = attributes_hash['configuration_pod_whitelist']
  return inherited[] unless whitelist_for_pod = configuration_whitelist[dependency.name]

  whitelist_for_pod.include?(configuration.to_s.downcase)
end

#deployment_target(platform_name) ⇒ String, Nil

Returns the deployment target for the specified platform.

Parameters:

  • platform_name (String)

    the symbolic name of the platform.

Returns:

  • (String)

    the deployment target

  • (Nil)

    if not deployment target was specified for the platform.


528
529
530
531
532
# File 'lib/cocoapods-core/specification.rb', line 528

def deployment_target(platform_name)
  result = platform_hash[platform_name.to_s]
  result ||= parent.deployment_target(platform_name) if parent
  result
end

#hashFixnum

Note:

This function must have the property that a.eql?(b) implies a.hash == b.hash.

Note:

This method is used by the Hash class.

Return the hash value for this specification according to its attributes hash.

Returns:

  • (Fixnum)

    The hash value.


117
118
119
120
121
122
# File 'lib/cocoapods-core/specification.rb', line 117

def hash
  if @hash_value.nil?
    @hash_value = (name.hash * 53) ^ version.hash
  end
  @hash_value
end

#info_plistHash

Returns The Info.plist value.

Returns:

  • (Hash)

    The Info.plist value.


475
476
477
# File 'lib/cocoapods-core/specification.rb', line 475

def info_plist
  attributes_hash['info_plist'] || {}
end

#initialize_copy(other) ⇒ Object


58
59
60
61
62
63
64
65
66
# File 'lib/cocoapods-core/specification.rb', line 58

def initialize_copy(other)
  super

  @subspecs = @subspecs.map do |subspec|
    subspec = subspec.dup
    subspec.instance_variable_set :@parent, self
    subspec
  end
end

#inspectString

Returns A string suitable for debugging.

Returns:

  • (String)

    A string suitable for debugging.


140
141
142
# File 'lib/cocoapods-core/specification.rb', line 140

def inspect
  "#<#{self.class.name} name=#{name.inspect}>"
end

#library_specification?Bool

Note:

a library specification is a specification that is not of type app or test.

Returns If this specification is a library specification.

Returns:

  • (Bool)

    If this specification is a library specification.


259
260
261
# File 'lib/cocoapods-core/specification.rb', line 259

def library_specification?
  !app_specification? && !test_specification?
end

#local?Bool

Returns whether the specification should use a directory as its source.

Returns:

  • (Bool)

    whether the specification should use a directory as its source.


488
489
490
491
# File 'lib/cocoapods-core/specification.rb', line 488

def local?
  return true if source[:path]
  false
end

#module_nameString

Returns the module name of a specification

Returns:

  • (String)

    the module name


183
184
185
186
187
# File 'lib/cocoapods-core/specification.rb', line 183

def module_name
  attributes_hash['module_name'] ||
    c99ext_identifier(attributes_hash['header_dir']) ||
    c99ext_identifier(attributes_hash['name'])
end

#name=(name) ⇒ void (private)

This method returns an undefined value.

Sets the name of the podspec.

Parameters:

  • name (String)

    the podspec name.


776
777
778
779
# File 'lib/cocoapods-core/specification.rb', line 776

def name=(name)
  @hash_value = nil
  attributes_hash['name'] = name
end

#non_library_specification?Bool

Note:

see #library_specification?

Returns If this specification is not a library specification.

Returns:

  • (Bool)

    If this specification is not a library specification.


267
268
269
# File 'lib/cocoapods-core/specification.rb', line 267

def non_library_specification?
  !library_specification?
end

#non_library_specsArray<Specification>

Returns the list of all the non libary (app or test) subspecs of a specification.

Returns:

  • (Array<Specification>)

    the list of all the non libary (app or test) subspecs of a specification.


294
295
296
# File 'lib/cocoapods-core/specification.rb', line 294

def non_library_specs
  subspecs.select(&:non_library_specification?)
end

#prefix_header_fileBool, String

Returns The prefix_header_file value.

Returns:

  • (Bool, String)

    The prefix_header_file value.


447
448
449
# File 'lib/cocoapods-core/specification.rb', line 447

def prefix_header_file
  attributes_hash['prefix_header_file']
end

#raw_versionObject, Nil (private)

Returns the raw value specified for the version attribute, or nil.

Returns:

  • (Object, Nil)

    the raw value specified for the version attribute, or nil


210
211
212
# File 'lib/cocoapods-core/specification.rb', line 210

def raw_version
  root.attributes_hash['version']
end

#recursive_subspecsArray<Specification>

Returns the recursive list of all the subspecs of a specification.

Returns:

  • (Array<Specification>)

    the recursive list of all the subspecs of a specification.


301
302
303
304
305
306
307
308
# File 'lib/cocoapods-core/specification.rb', line 301

def recursive_subspecs
  mapper = lambda do |spec|
    spec.subspecs.map do |subspec|
      [subspec, *mapper.call(subspec)]
    end.flatten
  end
  mapper.call(self)
end

#rootSpecification

Returns The root specification or itself if it is root.

Returns:

  • (Specification)

    The root specification or itself if it is root.


222
223
224
# File 'lib/cocoapods-core/specification.rb', line 222

def root
  parent ? parent.root : self
end

#root?Bool

Returns whether the specification is root.

Returns:

  • (Bool)

    whether the specification is root.


228
229
230
# File 'lib/cocoapods-core/specification.rb', line 228

def root?
  parent.nil?
end

#schemeHash

Returns The scheme value.

Returns:

  • (Hash)

    The scheme value.


468
469
470
471
# File 'lib/cocoapods-core/specification.rb', line 468

def scheme
  value = attributes_hash['scheme'] || {}
  Specification.convert_keys_to_symbol(value, :recursive => false)
end

#script_phasesArray<Hash{Symbol=>String}>

Returns The script_phases value.

Returns:

  • (Array<Hash{Symbol=>String}>)

    The script_phases value.


453
454
455
456
457
458
459
460
461
462
463
464
# File 'lib/cocoapods-core/specification.rb', line 453

def script_phases
  script_phases = attributes_hash['script_phases'] || []
  script_phases.map do |script_phase|
    phase = Specification.convert_keys_to_symbol(script_phase)
    phase[:execution_position] = if phase.key?(:execution_position)
                                   phase[:execution_position].to_sym
                                 else
                                   :any
                                 end
    phase
  end
end

#spec_typeSymbol

Note:

see Attribute#SUPPORTED_SPEC_TYPES for the list of available spec_types.

Returns Spec type of the current spec.

Returns:

  • (Symbol)

    Spec type of the current spec.


246
247
248
249
250
251
# File 'lib/cocoapods-core/specification.rb', line 246

def spec_type
  return :app if app_specification?
  return :test if test_specification?

  :library
end

#store_attribute(name, value, platform_name = nil) ⇒ Object

Note:

If the provides value is Hash the keys are converted to a string.

Sets the value for the attribute with the given name.

Parameters:

  • name (Symbol)

    the name of the attribute.

  • value (Object)

    the value to store.

  • platform_name (Symbol) (defaults to: nil)

    If provided the attribute is stored only for the given platform.

Returns:

  • void


591
592
593
594
595
596
597
598
599
600
601
602
# File 'lib/cocoapods-core/specification.rb', line 591

def store_attribute(name, value, platform_name = nil)
  name = name.to_s
  value = Specification.convert_keys_to_string(value) if value.is_a?(Hash)
  value = value.strip_heredoc.strip if value.respond_to?(:strip_heredoc)
  if platform_name
    platform_name = platform_name.to_s
    attributes_hash[platform_name] ||= {}
    attributes_hash[platform_name][name] = value
  else
    attributes_hash[name] = value
  end
end

#subspec?Bool

Returns whether the specification is a subspec.

Returns:

  • (Bool)

    whether the specification is a subspec.


234
235
236
# File 'lib/cocoapods-core/specification.rb', line 234

def subspec?
  !parent.nil?
end

#subspec_by_name(relative_name, raise_if_missing = true, include_non_library_specifications = false) ⇒ Specification

Returns the subspec with the given name or the receiver if the name is nil or equal to the name of the receiver.

Examples:

Retrieving a subspec


s.subspec_by_name('Pod/subspec').name #=> 'subspec'

Parameters:

  • relative_name (String)

    the relative name of the subspecs starting from the receiver including the name of the receiver.

  • raise_if_missing (Boolean) (defaults to: true)

    whether an exception should be raised if no specification named relative_name is found.

Returns:


327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
# File 'lib/cocoapods-core/specification.rb', line 327

def subspec_by_name(relative_name, raise_if_missing = true, include_non_library_specifications = false)
  if relative_name.nil? || relative_name == base_name
    self
  elsif relative_name.downcase == base_name.downcase
    raise Informative, "Trying to access a `#{relative_name}` " \
      "specification from `#{base_name}`, which has a different case."
  else
    remainder = relative_name[base_name.size + 1..-1]
    subspec_name = remainder.split('/').shift
    subspec = subspecs.find { |s| s.base_name == subspec_name && (include_non_library_specifications || !s.non_library_specification?) }
    unless subspec
      if raise_if_missing
        raise Informative, 'Unable to find a specification named ' \
          "`#{relative_name}` in `#{name} (#{version})`."
      else
        return nil
      end
    end
    subspec.subspec_by_name(remainder, raise_if_missing, include_non_library_specifications)
  end
end

#subspec_dependencies(platform = nil) ⇒ Array<Dependency>

Note:

A specification has a dependency on either the #default_subspecs or each of its children subspecs that are compatible with its platform.

Returns the dependencies on subspecs.

Parameters:

  • platform (Platform) (defaults to: nil)

    return only dependencies supported on the given platform.

Returns:

  • (Array<Dependency>)

    the dependencies on subspecs.


373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
# File 'lib/cocoapods-core/specification.rb', line 373

def subspec_dependencies(platform = nil)
  specs = if default_subspecs.empty?
            subspecs.compact.reject(&:non_library_specification?)
          elsif default_subspecs == :none
            []
          else
            default_subspecs.map do |subspec_name|
              root.subspec_by_name("#{name}/#{subspec_name}")
            end
          end
  if platform
    specs = specs.select { |s| s.supported_on_platform?(platform) }
  end
  specs.map { |s| Dependency.new(s.name, version) }
end

#supported_on_platform?(platform) ⇒ Bool #supported_on_platform?(symbolic_name, deployment_target) ⇒ Bool

Returns whether the specification is supported in the given platform.

Overloads:

  • #supported_on_platform?(platform) ⇒ Bool

    Parameters:

    • platform (Platform)

      the platform which is checked for support.

Returns:

  • (Bool)

    whether the specification is supported in the given platform.


504
505
506
507
# File 'lib/cocoapods-core/specification.rb', line 504

def supported_on_platform?(*platform)
  platform = Platform.new(*platform)
  available_platforms.any? { |available| platform.supports?(available) }
end

#test_specsArray<Specification>

Returns the list of all the test subspecs of a specification.

Returns:

  • (Array<Specification>)

    the list of all the test subspecs of a specification.


280
281
282
# File 'lib/cocoapods-core/specification.rb', line 280

def test_specs
  subspecs.select(&:test_specification?)
end

#test_typeSymbol

Returns the test type supported if this is a test specification.

Returns:

  • (Symbol)

    the test type supported if this is a test specification.


273
274
275
# File 'lib/cocoapods-core/specification.rb', line 273

def test_type
  attributes_hash['test_type'].to_sym
end

#to_sString

Returns A string suitable for representing the specification in clients.

Returns:

  • (String)

    A string suitable for representing the specification in clients.


127
128
129
130
131
132
133
134
135
136
# File 'lib/cocoapods-core/specification.rb', line 127

def to_s
  specified_version = raw_version || ''
  if name && !specified_version.empty?
    "#{name} (#{specified_version})"
  elsif name
    name
  else
    'No-name'
  end
end

#validate_cocoapods_versionObject

Validates the cocoapods_version in the specification against the current version of Core. It will raise an Informative error if the version is not satisfied.


801
802
803
804
805
806
# File 'lib/cocoapods-core/specification.rb', line 801

def validate_cocoapods_version
  unless cocoapods_version.satisfied_by?(Version.create(CORE_VERSION))
    raise Informative, "`#{name}` requires CocoaPods version `#{cocoapods_version}`, " \
                       "which is not satisfied by your current version, `#{CORE_VERSION}`."
  end
end

#version=(version) ⇒ void (private)

This method returns an undefined value.

Sets the version of the podspec.

Parameters:

  • version (String)

    the podspec version.


790
791
792
793
794
# File 'lib/cocoapods-core/specification.rb', line 790

def version=(version)
  @hash_value = nil
  store_attribute(:version, version)
  @version = nil
end