Class: Pod::Specification
- Inherits:
-
Object
- Object
- Pod::Specification
- 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/set/statistics.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::LICENSE_KEYS, DSL::PLATFORMS, DSL::SOURCE_KEYS
Instance Attribute Summary collapse
-
#attributes_hash ⇒ Hash
The hash that stores the information of the attributes of the specification.
-
#parent ⇒ Specification
readonly
The parent of the specification unless the specification is a root.
-
#subspecs ⇒ Array<Specification>
The subspecs of the specification.
Hierarchy collapse
-
#root ⇒ Specification
The root specification or itself if it is root.
-
#root? ⇒ Bool
Whether the specification is root.
-
#subspec? ⇒ Bool
Whether the specification is a subspec.
Dependencies & Subspecs collapse
-
#all_dependencies(platform = nil) ⇒ Array<Dependency>
All the dependencies of the specification.
-
#consumer(platform) ⇒ Specification::Consumer
Returns a consumer to access the multi-platform attributes.
-
#default_subspecs ⇒ Array
The name of the default subspecs if provided.
-
#dependencies(platform = nil) ⇒ Array<Dependency>
Returns the dependencies on other Pods or subspecs of other Pods.
-
#recursive_subspecs ⇒ Array<Specifications>
The recursive list of all the subspecs of a specification.
-
#subspec_by_name(relative_name) ⇒ Specification
Returns the subspec with the given name or the receiver if the name is nil or equal to the name of the receiver.
-
#subspec_dependencies(platform = nil) ⇒ Array<Dependency>
Returns the dependencies on subspecs.
DSL helpers collapse
-
#available_platforms ⇒ Array<Platform>
The platforms that the Pod is supported on.
-
#deployment_target(platform_name) ⇒ String, Nil
Returns the deployment target for the specified platform.
-
#local? ⇒ Bool
Whether the specification should use a directory as it source.
-
#supported_on_platform?(*platform) ⇒ Bool
Whether the specification is supported in the given platform.
DSL attribute writers collapse
-
#store_attribute(name, value, platform_name = nil) ⇒ Object
Sets the value for the attribute with the given name.
File representation collapse
-
.from_file(path, subspec_name = nil) ⇒ Specification
Loads a specification form the given path.
-
.from_string(spec_contents, path, subspec_name = nil) ⇒ Specification
Loads a specification with the given string.
- #checksum ⇒ String, Nil
-
#defined_in_file ⇒ String
The path where the specification is defined, if loaded from a file.
Class Method Summary collapse
-
.from_hash(hash, parent = nil) ⇒ Specification
Configures a new specification from the given hash.
-
.from_json(json) ⇒ Specification
Configures a new specification from the given JSON representation.
-
.name_and_version_from_string(string_representation) ⇒ Array<String, Version>
The name and the version of a pod.
-
.root_name(full_name) ⇒ String
Returns the root name of a specification.
Instance Method Summary collapse
-
#==(other) ⇒ Bool
Checks if a specification is equal to the given one according its name and to its version.
- #eql?(other) ⇒ Boolean
-
#hash ⇒ Fixnum
Return the hash value for this specification according to its attributes hash.
-
#initialize(parent = nil, name = nil) {|_self| ... } ⇒ Specification
constructor
A new instance of Specification.
-
#inspect ⇒ String
A string suitable for debugging.
-
#to_s ⇒ String
A string suitable for representing the specification in clients.
Methods included from JSONSupport
#safe_to_hash?, #to_hash, #to_json
Methods included from DSL::Deprecations
Methods included from DSL
#authors=, #compiler_flags=, #default_subspecs=, #dependency, #deployment_target=, #deprecated=, #deprecated_in_favor_of=, #description=, #docset_url=, #documentation_url=, #exclude_files=, #frameworks=, #header_dir=, #header_mappings_dir=, #homepage=, #ios, #libraries=, #license=, #name=, #osx, #platform=, #prefix_header_contents=, #prefix_header_file=, #prepare_command=, #preserve_paths=, #private_header_files=, #public_header_files=, #requires_arc=, #resource_bundles=, #resources=, #screenshots=, #social_media_url=, #source=, #source_files=, #subspec, #summary=, #vendored_frameworks=, #vendored_libraries=, #version=, #weak_frameworks=, #xcconfig=
Methods included from DSL::AttributeSupport
Constructor Details
#initialize(parent = nil, name = nil) {|_self| ... } ⇒ Specification
Returns a new instance of Specification.
31 32 33 34 35 36 37 38 39 |
# File 'lib/cocoapods-core/specification.rb', line 31 def initialize(parent = nil, name = nil) @attributes_hash = {} @subspecs = [] @consumers = {} @parent = parent attributes_hash['name'] = name yield self if block_given? end |
Instance Attribute Details
#attributes_hash ⇒ Hash
Returns the hash that stores the information of the attributes of the specification.
44 45 46 |
# File 'lib/cocoapods-core/specification.rb', line 44 def attributes_hash @attributes_hash end |
#parent ⇒ Specification (readonly)
Returns the parent of the specification unless the specification is a root.
24 25 26 |
# File 'lib/cocoapods-core/specification.rb', line 24 def parent @parent end |
#subspecs ⇒ Array<Specification>
Returns The subspecs of the specification.
48 49 50 |
# File 'lib/cocoapods-core/specification.rb', line 48 def subspecs @subspecs end |
Class Method Details
.from_file(path, subspec_name = nil) ⇒ Specification
Loads a specification form the given path.
485 486 487 488 489 490 491 492 493 494 495 496 497 498 |
# File 'lib/cocoapods-core/specification.rb', line 485 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') { |f| f.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) ⇒ Specification
Configures a new specification from the given hash.
55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/cocoapods-core/specification/json.rb', line 55 def self.from_hash(hash, parent = nil) spec = Spec.new(parent) attributes_hash = hash.dup subspecs = attributes_hash.delete('subspecs') spec.attributes_hash = attributes_hash if subspecs spec.subspecs = subspecs.map do |s_hash| Specification.from_hash(s_hash, spec) end end spec end |
.from_json(json) ⇒ Specification
Configures a new specification from the given JSON representation.
42 43 44 45 46 |
# File 'lib/cocoapods-core/specification/json.rb', line 42 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.
510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 |
# File 'lib/cocoapods-core/specification.rb', line 510 def self.from_string(spec_contents, path, subspec_name = nil) path = Pathname.new(path) case path.extname when '.podspec' spec = ::Pod._eval_podspec(spec_contents, path) unless spec.is_a?(Specification) raise Informative, "Invalid podspec file at path `#{path}`." end when '.json' spec = Specification.from_json(spec_contents) else raise Informative, "Unsupported specification format `#{path.extname}`." end spec.defined_in_file = path spec.subspec_by_name(subspec_name) end |
.name_and_version_from_string(string_representation) ⇒ Array<String, Version>
Returns the name and the version of a pod.
122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/cocoapods-core/specification.rb', line 122 def self.name_and_version_from_string(string_representation) match_data = string_representation.match(/\A(\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.
141 142 143 |
# File 'lib/cocoapods-core/specification.rb', line 141 def self.root_name(full_name) full_name.split('/').first end |
Instance Method Details
#==(other) ⇒ Bool
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.
62 63 64 65 66 67 68 |
# File 'lib/cocoapods-core/specification.rb', line 62 def ==(other) # TODO # self.class === other && # attributes_hash == other.attributes_hash && # subspecs == other.subspecs && to_s == other.to_s end |
#all_dependencies(platform = nil) ⇒ Array<Dependency>
Returns all the dependencies of the specification.
266 267 268 |
# File 'lib/cocoapods-core/specification.rb', line 266 def all_dependencies(platform = nil) dependencies(platform) + subspec_dependencies(platform) end |
#available_platforms ⇒ Array<Platform>
If no platform is specified, this method returns all known platforms.
Returns The platforms that the Pod is supported on.
323 324 325 326 327 |
# File 'lib/cocoapods-core/specification.rb', line 323 def available_platforms names = supported_platform_names names = PLATFORMS if names.empty? names.map { |name| Platform.new(name, deployment_target(name)) } end |
#checksum ⇒ String, Nil
455 456 457 458 459 460 461 462 |
# File 'lib/cocoapods-core/specification.rb', line 455 def checksum require 'digest' unless defined_in_file.nil? checksum = Digest::SHA1.hexdigest(File.read(defined_in_file)) checksum = checksum.encode('UTF-8') if checksum.respond_to?(:encode) checksum end end |
#consumer(platform) ⇒ Specification::Consumer
Returns a consumer to access the multi-platform attributes.
277 278 279 280 |
# File 'lib/cocoapods-core/specification.rb', line 277 def consumer(platform) platform = platform.to_sym @consumers[platform] ||= Consumer.new(self, platform) end |
#default_subspecs ⇒ Array
Returns the name of the default subspecs if provided.
217 218 219 220 |
# File 'lib/cocoapods-core/specification.rb', line 217 def default_subspecs # TODO: remove singular form and update the JSON specs. Array(attributes_hash['default_subspecs'] || attributes_hash['default_subspec']) end |
#defined_in_file ⇒ String
Returns the path where the specification is defined, if loaded from a file.
467 468 469 |
# File 'lib/cocoapods-core/specification.rb', line 467 def defined_in_file root? ? @defined_in_file : root.defined_in_file end |
#dependencies(platform = nil) ⇒ Array<Dependency>
External dependencies are inherited by subspecs
Returns the dependencies on other Pods or subspecs of other Pods.
254 255 256 257 258 259 260 261 262 |
# File 'lib/cocoapods-core/specification.rb', line 254 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 |
#deployment_target(platform_name) ⇒ String, Nil
Returns the deployment target for the specified platform.
337 338 339 340 341 |
# File 'lib/cocoapods-core/specification.rb', line 337 def deployment_target(platform_name) result = platform_hash[platform_name.to_s] result ||= parent.deployment_target(platform_name) if parent result end |
#eql?(other) ⇒ Boolean
72 73 74 |
# File 'lib/cocoapods-core/specification.rb', line 72 def eql?(other) self == other end |
#hash ⇒ Fixnum
This function must have the property that a.eql?(b) implies a.hash == b.hash.
This method is used by the Hash class.
Return the hash value for this specification according to its attributes hash.
86 87 88 |
# File 'lib/cocoapods-core/specification.rb', line 86 def hash to_s.hash end |
#inspect ⇒ String
Returns A string suitable for debugging.
105 106 107 |
# File 'lib/cocoapods-core/specification.rb', line 105 def inspect "#<#{self.class.name} name=#{name.inspect}>" end |
#local? ⇒ Bool
Returns whether the specification should use a directory as it source.
291 292 293 294 295 |
# File 'lib/cocoapods-core/specification.rb', line 291 def local? return true if source[:path] return true if source[:local] false end |
#recursive_subspecs ⇒ Array<Specifications>
Returns the recursive list of all the subspecs of a specification.
178 179 180 181 182 183 184 185 |
# File 'lib/cocoapods-core/specification.rb', line 178 def recursive_subspecs mapper = lambda do |spec| spec.subspecs.map do |subspec| [subspec, *mapper.call(subspec)] end.flatten end mapper.call(self) end |
#root ⇒ Specification
Returns The root specification or itself if it is root.
153 154 155 |
# File 'lib/cocoapods-core/specification.rb', line 153 def root parent ? parent.root : self end |
#root? ⇒ Bool
Returns whether the specification is root.
159 160 161 |
# File 'lib/cocoapods-core/specification.rb', line 159 def root? parent.nil? end |
#store_attribute(name, value, platform_name = nil) ⇒ Object
If the provides value is Hash the keys are converted to a string.
Sets the value for the attribute with the given name.
400 401 402 403 404 405 406 407 408 409 410 |
# File 'lib/cocoapods-core/specification.rb', line 400 def store_attribute(name, value, platform_name = nil) name = name.to_s value = convert_keys_to_string(value) if value.is_a?(Hash) 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.
165 166 167 |
# File 'lib/cocoapods-core/specification.rb', line 165 def subspec? !parent.nil? end |
#subspec_by_name(relative_name) ⇒ Specification
Returns the subspec with the given name or the receiver if the name is nil or equal to the name of the receiver.
200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
# File 'lib/cocoapods-core/specification.rb', line 200 def subspec_by_name(relative_name) if relative_name.nil? || relative_name == base_name self else remainder = relative_name[base_name.size + 1..-1] subspec_name = remainder.split('/').shift subspec = subspecs.find { |s| s.base_name == subspec_name } unless subspec raise Informative, 'Unable to find a specification named ' \ "`#{relative_name}` in `#{name} (#{version})`." end subspec.subspec_by_name(remainder) end end |
#subspec_dependencies(platform = nil) ⇒ Array<Dependency>
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.
230 231 232 233 234 235 236 237 238 239 240 241 242 |
# File 'lib/cocoapods-core/specification.rb', line 230 def subspec_dependencies(platform = nil) if default_subspecs.empty? specs = subspecs.compact else specs = 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) } end |
#supported_on_platform?(platform) ⇒ Bool #supported_on_platform?(symbolic_name, deployment_target) ⇒ Bool
Returns whether the specification is supported in the given platform.
313 314 315 316 |
# File 'lib/cocoapods-core/specification.rb', line 313 def supported_on_platform?(*platform) platform = Platform.new(*platform) available_platforms.any? { |available| platform.supports?(available) } end |
#to_s ⇒ String
Returns A string suitable for representing the specification in clients.
93 94 95 96 97 98 99 100 101 |
# File 'lib/cocoapods-core/specification.rb', line 93 def to_s if name && !version.version.empty? "#{name} (#{version})" elsif name name else 'No-name' end end |