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, #generate_bridge_support!, #inherit!, #inhibit_all_warnings!, #install!, #platform, #plugin, #pod, #podspec, #post_install, #pre_install, #project, #script_phase, #set_arc_compatibility_flag!, #source, #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.



251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/cocoapods-core/podfile.rb', line 251

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'
    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.



335
336
337
338
339
340
341
342
343
344
# File 'lib/cocoapods-core/podfile.rb', line 335

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.



277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
# File 'lib/cocoapods-core/podfile.rb', line 277

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 Eval
      eval(contents, nil, path.to_s)
      # rubocop:enable 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.



315
316
317
318
319
320
321
322
323
# File 'lib/cocoapods-core/podfile.rb', line 315

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



236
237
238
239
# File 'lib/cocoapods-core/podfile.rb', line 236

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

#checksumString, Nil



225
226
227
228
229
230
231
232
233
234
# File 'lib/cocoapods-core/podfile.rb', line 225

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?Bool



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) ⇒ Bool

Calls the post install callback if defined.



177
178
179
180
181
182
183
184
# File 'lib/cocoapods-core/podfile.rb', line 177

def post_install!(installer)
  if @post_install_callback
    @post_install_callback.call(installer)
    true
  else
    false
  end
end

#pre_install!(installer) ⇒ Bool

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

#set_arc_compatibility_flag?Bool



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



206
207
208
209
210
211
# File 'lib/cocoapods-core/podfile.rb', line 206

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



215
216
217
218
# File 'lib/cocoapods-core/podfile.rb', line 215

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