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 =
%w(
  installation_method
  workspace
  sources
  plugins
  set_arc_compatibility_flag
  generate_bridge_support
  target_definitions
).freeze

Working with a Podfile collapse

Instance Attribute Summary collapse

Working with a Podfile collapse

Attributes collapse

Hooks collapse

Representations collapse

Class methods collapse

Instance Method Summary collapse

Methods included from DSL

#abstract!, #abstract_target, #ensure_bundler!, #generate_bridge_support!, #inherit!, #inhibit_all_warnings!, #install!, #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

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


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

#defined_in_filePathname



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

def defined_in_file
  @defined_in_file
end

#root_target_definitionsArray<TargetDefinition>



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.



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.



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.



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.



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



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>



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



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

def generate_bridge_support?
  get_hash_value('generate_bridge_support')
end

#installation_method(String,Hash)



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>



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.



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.



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.



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.



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



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

def set_arc_compatibility_flag?
  get_hash_value('set_arc_compatibility_flag')
end

#sourcesArray<String>



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

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

#target_definition_listArray<TargetDefinition>



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}



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



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



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

def to_s
  'Podfile'
end

#to_yamlString



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



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