Class: Pod::Podfile

Inherits:
Object
  • Object
show all
Includes:
DSL
Defined in:
lib/cocoapods-core/podfile.rb,
lib/cocoapods-core/podfile/dsl.rb,
lib/cocoapods-core/podfile/target_definition.rb

Overview

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.

Defined Under Namespace

Modules: DSL Classes: StandardError, TargetDefinition

Representations collapse

HASH_KEYS =

Returns The keys used by the hash representation of the Podfile.

Returns:

  • (Array)

    The keys used by the hash representation of the Podfile.

%w(
  installation_method
  workspace
  sources
  plugins
  set_arc_compatibility_flag
  generate_bridge_support
  target_definitions
).freeze

Working with a Podfile collapse

Private helpers collapse

Instance Attribute Summary collapse

Working with a Podfile collapse

Attributes collapse

Hooks collapse

Representations collapse

Class methods collapse

Private helpers collapse

Instance Method Summary collapse

Methods included from DSL

#abstract!, #abstract_target, #ensure_bundler!, #generate_bridge_support!, #inherit!, #inhibit_all_warnings!, #install!, #link_with, #platform, #plugin, #pod, #podspec, #post_install, #post_integrate, #pre_install, #pre_integrate, #project, #script_phase, #set_arc_compatibility_flag!, #source, #supports_swift_versions, #target, #use_frameworks!, #use_modular_headers!, #workspace, #xcodeproj

Constructor Details

#initialize(defined_in_file = nil, internal_hash = {}, &block) ⇒ Podfile

Returns a new instance of Podfile.

Examples:

Creating a Podfile.


platform :ios, "6.0"
target :my_app do
  pod "AFNetworking", "~> 1.0"
end

Parameters:

  • defined_in_file (Pathname) (defaults to: nil)

    the path of the podfile.

  • block (Proc)

    an optional block that configures the Podfile through the DSL.



42
43
44
45
46
47
48
49
50
51
52
53
54
# 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

Instance Attribute Details

#current_target_definitionTargetDefinition (private)

Returns The current target definition to which the DSL commands apply.

Returns:

  • (TargetDefinition)

    The current target definition to which the DSL commands apply.



432
433
434
# File 'lib/cocoapods-core/podfile.rb', line 432

def current_target_definition
  @current_target_definition
end

#defined_in_filePathname

Returns the path used to load the Podfile. It is nil if the Podfile was generated programmatically.

Returns:

  • (Pathname)

    the path used to load the Podfile. It is nil if the Podfile was generated programmatically.



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

def defined_in_file
  @defined_in_file
end

#internal_hashHash (private)

Returns The hash which store the attributes of the Podfile.

Returns:

  • (Hash)

    The hash which store the attributes of the Podfile.



388
389
390
# File 'lib/cocoapods-core/podfile.rb', line 388

def internal_hash
  @internal_hash
end

#root_target_definitionsArray<TargetDefinition>

Returns The root target definitions.

Returns:



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

def root_target_definitions
  @root_target_definitions
end

Class Method Details

.from_file(path) ⇒ Podfile

Initializes a Podfile from the file with the given path.

Parameters:

  • path (Pathname)

    the path from where the Podfile should be loaded.

Returns:

  • (Podfile)

    the generated Podfile.



285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
# 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) ⇒ Podfile

Configures a new Podfile from the given hash.

Parameters:

  • hash (Hash)

    The hash which contains the information of the Podfile.

  • path (Pathname) (defaults to: nil)

    The path from which the Podfile is loaded.

Returns:



369
370
371
372
373
374
375
376
377
378
# 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) ⇒ Podfile

Configures a new Podfile from the given ruby string.

Parameters:

  • path (Pathname)

    The path from which the Podfile is loaded.

  • contents (String) (defaults to: nil)

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

Returns:



311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
# 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) ⇒ Podfile

Configures a new Podfile from the given YAML representation.

Parameters:

  • path (Pathname)

    The path from which the Podfile is loaded.

Returns:



349
350
351
352
353
354
355
356
357
# 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

Instance Method Details

#==(other) ⇒ Object



270
271
272
273
# File 'lib/cocoapods-core/podfile.rb', line 270

def ==(other)
  self.class == other.class &&
    to_hash == other.to_hash
end

#checksumString, Nil

Returns:

  • (String)

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

  • (Nil)

    If the podfile is not defined in a file.



259
260
261
262
263
264
265
266
267
268
# 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

#dependenciesArray<Dependency>

Returns the dependencies of all of the target definitions.

Returns:

  • (Array<Dependency>)

    the dependencies of all of the target definitions.



89
90
91
# File 'lib/cocoapods-core/podfile.rb', line 89

def dependencies
  target_definition_list.map(&:dependencies).flatten.uniq
end

#generate_bridge_support?Boolean

Returns whether the podfile should generate a BridgeSupport metadata document.

Returns:

  • (Boolean)

    whether the podfile should generate a BridgeSupport metadata document.



127
128
129
# File 'lib/cocoapods-core/podfile.rb', line 127

def generate_bridge_support?
  get_hash_value('generate_bridge_support')
end

#get_hash_value(key, default = nil) ⇒ Object (private)

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

Parameters:

  • key (String)

    The key for which the value is needed.

  • default (defaults to: nil)

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

Returns:

  • (Object)

    The value for the key.

Raises:



422
423
424
425
426
427
# 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

#installation_method(String,Hash)

Returns the installation strategy and installation options to be used during installation.

Returns:

  • ((String,Hash))

    the installation strategy and installation options to be used during installation.



141
142
143
144
# File 'lib/cocoapods-core/podfile.rb', line 141

def installation_method
  get_hash_value('installation_method', 'name' => 'cocoapods', 'options' => {}).
    values_at('name', 'options')
end

#pluginsHash<String, Hash>

Returns The plugins, keyed by name.

Returns:

  • (Hash<String, Hash>)

    The plugins, keyed by name.



107
108
109
# File 'lib/cocoapods-core/podfile.rb', line 107

def plugins
  get_hash_value('plugins') || {}
end

#post_install!(installer) ⇒ Boolean

Calls the post install callback if defined.

Parameters:

  • installer (Pod::Installer)

    the installer that is performing the installation.

Returns:

  • (Boolean)

    whether a post install callback was specified and it was called.



194
195
196
197
198
199
200
201
# 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) ⇒ Boolean

Calls the post integrate callback if defined.

Parameters:

  • installer (Pod::Installer)

    the installer that is performing the installation.

Returns:

  • (Boolean)

    whether a post install callback was specified and it was called.



211
212
213
214
215
216
217
218
# 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) ⇒ Boolean

Calls the pre install callback if defined.

Parameters:

  • installer (Pod::Installer)

    the installer that is performing the installation.

Returns:

  • (Boolean)

    whether a pre install callback was specified and it was called.



160
161
162
163
164
165
166
167
# 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) ⇒ Boolean

Calls the pre integrate callback if defined.

Parameters:

  • installer (Pod::Installer)

    the installer that is performing the installation.

Returns:

  • (Boolean)

    whether a pre integrate callback was specified and it was called.



177
178
179
180
181
182
183
184
# 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?Boolean

Returns whether the -fobjc-arc flag should be added to the OTHER_LD_FLAGS.

Returns:

  • (Boolean)

    whether the -fobjc-arc flag should be added to the OTHER_LD_FLAGS.



134
135
136
# File 'lib/cocoapods-core/podfile.rb', line 134

def set_arc_compatibility_flag?
  get_hash_value('set_arc_compatibility_flag')
end

#set_hash_value(key, value) ⇒ void (private)

This method returns an undefined value.

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

Parameters:

  • key (String)

    The key for which to store the value.

  • value (Object)

    The value to store.

Raises:



402
403
404
405
406
407
# 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

#sourcesArray<String>

Returns The names of the sources.

Returns:

  • (Array<String>)

    The names of the sources.



101
102
103
# File 'lib/cocoapods-core/podfile.rb', line 101

def sources
  get_hash_value('sources') || []
end

#target_definition_listArray<TargetDefinition>

Returns all target definitions in the Podfile.

Returns:



78
79
80
# File 'lib/cocoapods-core/podfile.rb', line 78

def target_definition_list
  root_target_definitions.map { |td| [td, td.recursive_children] }.flatten
end

#target_definitionsHash{Symbol,String => TargetDefinition}

Returns the target definitions of the Podfile stored by their name.

Returns:

  • (Hash{Symbol,String => TargetDefinition})

    the target definitions of the Podfile stored by their name.



72
73
74
# File 'lib/cocoapods-core/podfile.rb', line 72

def target_definitions
  Hash[target_definition_list.map { |td| [td.name, td] }]
end

#to_hashHash

Returns The hash representation of the Podfile.

Returns:

  • (Hash)

    The hash representation of the Podfile.



240
241
242
243
244
245
# 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_sString

Returns a string useful to represent the Podfile in a message presented to the user.

Returns:

  • (String)

    a string useful to represent the Podfile in a message presented to the user.



59
60
61
# File 'lib/cocoapods-core/podfile.rb', line 59

def to_s
  'Podfile'
end

#to_yamlString

Returns The YAML representation of the Podfile.

Returns:

  • (String)

    The YAML representation of the Podfile.



249
250
251
252
# 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_pathString

Returns the path of the workspace if specified by the user.

Returns:

  • (String)

    the path of the workspace if specified by the user.



113
114
115
116
117
118
119
120
121
122
# 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