class Pod::Podfile

The Podfile is a specification that describes the dependencies of the targets of an Xcode project.

It supports its own DSL and is stored in a file named `Podfile`.

The Podfile creates a hierarchy of target definitions that store the information necessary to generate the CocoaPods libraries.

Constants

HASH_KEYS

@return [Array] The keys used by the hash representation of the Podfile.

Attributes

current_target_definition[RW]

@return [TargetDefinition] The current target definition to which the DSL

commands apply.
defined_in_file[RW]

@return [Pathname] the path used to load the Podfile. It is nil

if the Podfile was generated programmatically.
internal_hash[RW]

@return [Hash] The hash which store the attributes of the Podfile.

root_target_definitions[RW]

@return [Array<TargetDefinition>] The root target definitions.

Public Class Methods

from_file(path) click to toggle source

Initializes a Podfile from the file with the given path.

@param [Pathname] path

the path from where the Podfile should be loaded.

@return [Podfile] the generated Podfile.

# File lib/cocoapods-core/podfile.rb, line 285
def self.from_file(path)
  path = Pathname.new(path)
  unless path.exist?
    raise Informative, "No Podfile exists at path `#{path}`."
  end

  case path.extname
  when '', '.podfile', '.rb'
    Podfile.from_ruby(path)
  when '.yaml'
    Podfile.from_yaml(path)
  else
    raise Informative, "Unsupported Podfile format `#{path}`."
  end
end
from_hash(hash, path = nil) click to toggle source

Configures a new Podfile from the given hash.

@param [Hash] hash

The hash which contains the information of the Podfile.

@param [Pathname] path

The path from which the Podfile is loaded.

@return [Podfile] the new Podfile

# File lib/cocoapods-core/podfile.rb, line 369
def self.from_hash(hash, path = nil)
  internal_hash = hash.dup
  target_definitions = internal_hash.delete('target_definitions') || []
  podfile = Podfile.new(path, internal_hash)
  target_definitions.each do |definition_hash|
    definition = TargetDefinition.from_hash(definition_hash, podfile)
    podfile.root_target_definitions << definition
  end
  podfile
end
from_ruby(path, contents = nil) click to toggle source

Configures a new Podfile from the given ruby string.

@param [Pathname] path

The path from which the Podfile is loaded.

@param [String] contents

The ruby string which will configure the Podfile with the DSL.

@return [Podfile] the new Podfile

# File lib/cocoapods-core/podfile.rb, line 311
def self.from_ruby(path, contents = nil)
  contents ||= File.open(path, 'r:utf-8', &:read)

  # Work around for Rubinius incomplete encoding in 1.9 mode
  if contents.respond_to?(:encoding) && contents.encoding.name != 'UTF-8'
    contents.encode!('UTF-8')
  end

  if contents.tr!('“”‘’‛', %(""'''))
    # Changes have been made
    CoreUI.warn "Smart quotes were detected and ignored in your #{path.basename}. " \
                'To avoid issues in the future, you should not use ' \
                'TextEdit for editing it. If you are not using TextEdit, ' \
                'you should turn off smart quotes in your editor of choice.'
  end

  podfile = Podfile.new(path) do
    # rubocop:disable Lint/RescueException
    begin
      # rubocop:disable Security/Eval
      eval(contents, nil, path.to_s)
      # rubocop:enable Security/Eval
    rescue Exception => e
      message = "Invalid `#{path.basename}` file: #{e.message}"
      raise DSLError.new(message, path, e, contents)
    end
    # rubocop:enable Lint/RescueException
  end
  podfile
end
from_yaml(path) click to toggle source

Configures a new Podfile from the given YAML representation.

@param [Pathname] path

The path from which the Podfile is loaded.

@return [Podfile] the new Podfile

# File lib/cocoapods-core/podfile.rb, line 349
def self.from_yaml(path)
  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
  hash = YAMLHelper.load_string(string)
  from_hash(hash, path)
end
new(defined_in_file = nil, internal_hash = {}, &block) click to toggle source

@param [Pathname] defined_in_file

the path of the podfile.

@param [Proc] block

an optional block that configures the Podfile through the DSL.

@example Creating a Podfile.

platform :ios, "6.0"
target :my_app do
  pod "AFNetworking", "~> 1.0"
end
# File lib/cocoapods-core/podfile.rb, line 42
def initialize(defined_in_file = nil, internal_hash = {}, &block)
  self.defined_in_file = defined_in_file
  @internal_hash = internal_hash
  if block
    default_target_def = TargetDefinition.new('Pods', self)
    default_target_def.abstract = true
    @root_target_definitions = [default_target_def]
    @current_target_definition = default_target_def
    instance_eval(&block)
  else
    @root_target_definitions = []
  end
end

Public Instance Methods

==(other) click to toggle source
# File lib/cocoapods-core/podfile.rb, line 270
def ==(other)
  self.class == other.class &&
    to_hash == other.to_hash
end
checksum() click to toggle source

@return [String] The SHA1 digest of the file in which the Podfile

is defined.

@return [Nil] If the podfile is not defined in a file.

# File lib/cocoapods-core/podfile.rb, line 259
def checksum
  @checksum ||= begin
    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
  end
end
dependencies() click to toggle source

@return [Array<Dependency>] the dependencies of all of the target

definitions.
# File lib/cocoapods-core/podfile.rb, line 89
def dependencies
  target_definition_list.map(&:dependencies).flatten.uniq
end
generate_bridge_support?() click to toggle source

@return [Bool] whether the podfile should generate a BridgeSupport

metadata document.
# File lib/cocoapods-core/podfile.rb, line 127
def generate_bridge_support?
  get_hash_value('generate_bridge_support')
end
installation_method() click to toggle source

@return [(String,Hash)] the installation strategy and installation options

to be used during installation.
# File lib/cocoapods-core/podfile.rb, line 141
def installation_method
  get_hash_value('installation_method', 'name' => 'cocoapods', 'options' => {}).
    values_at('name', 'options')
end
plugins() click to toggle source

@return [Hash<String, Hash>] The plugins, keyed by name.

# File lib/cocoapods-core/podfile.rb, line 107
def plugins
  get_hash_value('plugins') || {}
end
post_install!(installer) click to toggle source

Calls the post install callback if defined.

@param [Pod::Installer] installer

the installer that is performing the installation.

@return [Bool] whether a post install callback was specified and it was

called.
# File lib/cocoapods-core/podfile.rb, line 194
def post_install!(installer)
  if @post_install_callback
    @post_install_callback.call(installer)
    true
  else
    false
  end
end
post_integrate!(installer) click to toggle source

Calls the post integrate callback if defined.

@param [Pod::Installer] installer

the installer that is performing the installation.

@return [Bool] whether a post install callback was specified and it was

called.
# File lib/cocoapods-core/podfile.rb, line 211
def post_integrate!(installer)
  if @post_integrate_callback
    @post_integrate_callback.call(installer)
    true
  else
    false
  end
end
pre_install!(installer) click to toggle source

Calls the pre install callback if defined.

@param [Pod::Installer] installer

the installer that is performing the installation.

@return [Bool] whether a pre install callback was specified and it was

called.
# File lib/cocoapods-core/podfile.rb, line 160
def pre_install!(installer)
  if @pre_install_callback
    @pre_install_callback.call(installer)
    true
  else
    false
  end
end
pre_integrate!(installer) click to toggle source

Calls the pre integrate callback if defined.

@param [Pod::Installer] installer

the installer that is performing the installation.

@return [Bool] whether a pre integrate callback was specified and it was

called.
# File lib/cocoapods-core/podfile.rb, line 177
def pre_integrate!(installer)
  if @pre_integrate_callback
    @pre_integrate_callback.call(installer)
    true
  else
    false
  end
end
set_arc_compatibility_flag?() click to toggle source

@return [Bool] whether the -fobjc-arc flag should be added to the

OTHER_LD_FLAGS.
# File lib/cocoapods-core/podfile.rb, line 134
def set_arc_compatibility_flag?
  get_hash_value('set_arc_compatibility_flag')
end
sources() click to toggle source

@return [Array<String>] The names of the sources.

# File lib/cocoapods-core/podfile.rb, line 101
def sources
  get_hash_value('sources') || []
end
target_definition_list() click to toggle source

@return [Array<TargetDefinition>] all target definitions in the Podfile.

# File lib/cocoapods-core/podfile.rb, line 78
def target_definition_list
  root_target_definitions.map { |td| [td, td.recursive_children] }.flatten
end
target_definitions() click to toggle source

@return [Hash{Symbol,String => TargetDefinition}] the target definitions

of the Podfile stored by their name.
# File lib/cocoapods-core/podfile.rb, line 72
def target_definitions
  Hash[target_definition_list.map { |td| [td.name, td] }]
end
to_hash() click to toggle source

@return [Hash] The hash representation of the Podfile.

# File lib/cocoapods-core/podfile.rb, line 240
def to_hash
  hash = {}
  hash['target_definitions'] = root_target_definitions.map(&:to_hash)
  hash.merge!(internal_hash)
  hash
end
to_s() click to toggle source

@return [String] a string useful to represent the Podfile in a message

presented to the user.
# File lib/cocoapods-core/podfile.rb, line 59
def to_s
  'Podfile'
end
to_yaml() click to toggle source

@return [String] The YAML representation of the Podfile.

# File lib/cocoapods-core/podfile.rb, line 249
def to_yaml
  require 'cocoapods-core/yaml_helper'
  "---\n" << YAMLHelper.convert_hash(to_hash, HASH_KEYS)
end
workspace_path() click to toggle source

@return [String] the path of the workspace if specified by the user.

# File lib/cocoapods-core/podfile.rb, line 113
def workspace_path
  path = get_hash_value('workspace')
  if path
    if File.extname(path) == '.xcworkspace'
      path
    else
      "#{path}.xcworkspace"
    end
  end
end

Private Instance Methods

get_hash_value(key, default = nil) click to toggle source

Returns the value for the given key in the internal hash of the Podfile.

@param [String] key

The key for which the value is needed.

@param default

The default value to return if the internal hash has no entry for
the given `key`.

@raise [StandardError] If the key is not recognized.

@return [Object] The value for the key.

# File lib/cocoapods-core/podfile.rb, line 422
def get_hash_value(key, default = nil)
  unless HASH_KEYS.include?(key)
    raise StandardError, "Unsupported hash key `#{key}`"
  end
  internal_hash.fetch(key, default)
end
set_hash_value(key, value) click to toggle source

Set a value in the internal hash of the Podfile for the given key.

@param [String] key

The key for which to store the value.

@param [Object] value

The value to store.

@raise [StandardError] If the key is not recognized.

@return [void]

# File lib/cocoapods-core/podfile.rb, line 402
def set_hash_value(key, value)
  unless HASH_KEYS.include?(key)
    raise StandardError, "Unsupported hash key `#{key}`"
  end
  internal_hash[key] = value
end