Class: Pod::Sandbox::FileAccessor

Inherits:
Object
  • Object
show all
Defined in:
lib/cocoapods/sandbox/file_accessor.rb

Overview

Note:

The FileAccessor always returns absolute paths.

Resolves the file patterns of a specification against its root directory, taking into account any exclude pattern and the default extensions to use for directories.

Constant Summary collapse

HEADER_EXTENSIONS =
Xcodeproj::Constants::HEADER_FILES_EXTENSIONS
SOURCE_FILE_EXTENSIONS =
(%w(.m .mm .i .c .cc .cxx .cpp .c++ .swift) + HEADER_EXTENSIONS).uniq.freeze
GLOB_PATTERNS =
{
  :readme              => 'readme{*,.*}'.freeze,
  :license             => 'licen{c,s}e{*,.*}'.freeze,
  :source_files        => "*{#{SOURCE_FILE_EXTENSIONS.join(',')}}".freeze,
  :public_header_files => "*{#{HEADER_EXTENSIONS.join(',')}}".freeze,
  :podspecs            => '*.{podspec,podspec.json}'.freeze,
  :docs                => 'doc{s}{*,.*}/**/*'.freeze,
}.freeze

Instance Attribute Summary collapse

Paths collapse

Instance Method Summary collapse

Constructor Details

#initialize(path_list, spec_consumer) ⇒ FileAccessor

Initialize a new instance

Parameters:

  • path_list (Sandbox::PathList, Pathname)

    @see #path_list

  • spec_consumer (Specification::Consumer)

    @see #spec_consumer


39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 39

def initialize(path_list, spec_consumer)
  if path_list.is_a?(PathList)
    @path_list = path_list
  else
    @path_list = PathList.new(path_list)
  end
  @spec_consumer = spec_consumer

  unless @spec_consumer
    raise Informative, 'Attempt to initialize File Accessor without a specification consumer.'
  end
end

Instance Attribute Details

#path_listSandbox::PathList (readonly)

Returns the directory where the source of the Pod is located.

Returns:


27
28
29
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 27

def path_list
  @path_list
end

#spec_consumerSpecification::Consumer (readonly)

Returns the consumer of the specification for which the file patterns should be resolved.

Returns:

  • (Specification::Consumer)

    the consumer of the specification for which the file patterns should be resolved.


32
33
34
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 32

def spec_consumer
  @spec_consumer
end

Class Method Details

.all_files(file_accessors) ⇒ Array<String>

Returns The list of all file accessors that a target will integrate into the project.

Parameters:

  • file_accessors (Array<FileAccessor>)

    The list of all file accessors to compute.

Returns:

  • (Array<String>)

    The list of all file accessors that a target will integrate into the project.


187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 187

def self.all_files(file_accessors)
  files = [
    file_accessors.map(&:vendored_frameworks),
    file_accessors.map(&:vendored_libraries),
    file_accessors.map(&:resource_bundle_files),
    file_accessors.map(&:license),
    file_accessors.map(&:prefix_header),
    file_accessors.map(&:preserve_paths),
    file_accessors.map(&:readme),
    file_accessors.map(&:resources),
    file_accessors.map(&:source_files),
    file_accessors.map(&:module_map),
  ]
  files.flatten.compact.map(&:to_s).uniq
end

.vendored_frameworks_headers(framework) ⇒ Array<Pathname>

Returns The paths of the headers included in the vendored framework.

Parameters:

  • framework (Pathname)

    The vendored framework to search into.

Returns:

  • (Array<Pathname>)

    The paths of the headers included in the vendored framework.


218
219
220
221
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 218

def self.vendored_frameworks_headers(framework)
  headers_dir = vendored_frameworks_headers_dir(framework)
  Pathname.glob(headers_dir + '**/' + GLOB_PATTERNS[:public_header_files])
end

.vendored_frameworks_headers_dir(framework) ⇒ Pathname

Returns The path of the header directory of the vendored framework.

Parameters:

  • framework (Pathname)

    The vendored framework to search into.

Returns:

  • (Pathname)

    The path of the header directory of the vendored framework.


208
209
210
211
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 208

def self.vendored_frameworks_headers_dir(framework)
  dir = framework + 'Headers'
  dir.directory? ? dir.realpath : dir
end

Instance Method Details

#arc_source_filesArray<Pathname>

Returns the source files of the specification that use ARC.

Returns:

  • (Array<Pathname>)

    the source files of the specification that use ARC.


91
92
93
94
95
96
97
98
99
100
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 91

def arc_source_files
  case spec_consumer.requires_arc
  when TrueClass
    source_files
  when FalseClass
    []
  else
    paths_for_attribute(:requires_arc) & source_files
  end
end

#developer_filesArray<Pathname>

Returns Paths to include for local pods to assist in development

Returns:

  • (Array<Pathname>)

    Paths to include for local pods to assist in development


344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 344

def developer_files
  podspecs = specs
  result = [module_map, prefix_header]

  if license_path = spec_consumer.license[:file]
    license_path = root + license_path
    unless File.exist?(license_path)
      UI.warn "A license was specified in podspec `#{spec.name}` but the file does not exist - #{license_path}"
    end
  end

  if podspecs.size <= 1
    result += [license, readme, podspecs, docs]
  else
    # Manually add non-globbing files since there are multiple podspecs in the same folder
    result << podspec_file
    if license_file = spec_license
      absolute_path = root + license_file
      result << absolute_path if File.exist?(absolute_path)
    end
  end
  result.compact.flatten.sort
end

#docsArray<Pathname>

Returns The paths of auto-detected docs

Returns:

  • (Array<Pathname>)

    The paths of auto-detected docs


328
329
330
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 328

def docs
  path_list.glob([GLOB_PATTERNS[:docs]])
end

#headersArray<Pathname>

Returns the headers of the specification.

Returns:

  • (Array<Pathname>)

    the headers of the specification.


118
119
120
121
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 118

def headers
  extensions = HEADER_EXTENSIONS
  source_files.select { |f| extensions.include?(f.extname) }
end

#inspectString

Returns A string suitable for debugging.

Returns:

  • (String)

    A string suitable for debugging.


72
73
74
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 72

def inspect
  "<#{self.class} spec=#{spec.name} platform=#{platform_name} root=#{root}>"
end

#licensePathname

Returns The path of the license file as indicated in the specification or auto-detected.

Returns:

  • (Pathname)

    The path of the license file as indicated in the specification or auto-detected.


308
309
310
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 308

def license
  spec_license || path_list.glob([GLOB_PATTERNS[:license]]).first
end

#module_mapPathname, Nil

Returns The path of the custom module map file of the specification, if specified.

Returns:

  • (Pathname, Nil)

    The path of the custom module map file of the specification, if specified.


314
315
316
317
318
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 314

def module_map
  if module_map = spec_consumer.module_map
    path_list.root + module_map
  end
end

#non_arc_source_filesArray<Pathname>

Returns the source files of the specification that do not use ARC.

Returns:

  • (Array<Pathname>)

    the source files of the specification that do not use ARC.


105
106
107
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 105

def non_arc_source_files
  source_files - arc_source_files
end

#other_source_filesArray<Pathname] the source files that do not match any of the recognized file extensions

Returns Array<Pathname] the source files that do not match any of the recognized file extensions

Returns:

  • (Array<Pathname] the source files that do not match any of the recognized file extensions)

    Array<Pathname] the source files that do not match any of the recognized file extensions


111
112
113
114
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 111

def other_source_files
  extensions = SOURCE_FILE_EXTENSIONS
  source_files.reject { |f| extensions.include?(f.extname) }
end

#platform_nameSpecification

Returns the platform used to consume the specification.

Returns:

  • (Specification)

    the platform used to consume the specification.


66
67
68
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 66

def platform_name
  spec_consumer.platform_name
end

#prefix_headerPathname

Returns The of the prefix header file of the specification.

Returns:

  • (Pathname)

    The of the prefix header file of the specification.


293
294
295
296
297
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 293

def prefix_header
  if file = spec_consumer.prefix_header_file
    path_list.root + file
  end
end

#preserve_pathsArray<Pathname>

Returns the files of the specification to preserve.

Returns:

  • (Array<Pathname>)

    the files of the specification to preserve.


155
156
157
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 155

def preserve_paths
  paths_for_attribute(:preserve_paths, true)
end

#private_headersArray<Pathname>

Returns The private headers of the specification.

Returns:

  • (Array<Pathname>)

    The private headers of the specification.


143
144
145
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 143

def private_headers
  private_header_files
end

#public_headers(include_frameworks = false) ⇒ Array<Pathname>

Returns the public headers of the specification.

Parameters:

  • include_frameworks (Boolean) (defaults to: false)

    Whether or not to include the headers of the vendored frameworks. Defaults to not include them.

Returns:

  • (Array<Pathname>)

    the public headers of the specification.


129
130
131
132
133
134
135
136
137
138
139
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 129

def public_headers(include_frameworks = false)
  public_headers = public_header_files
  private_headers = private_header_files
  if public_headers.nil? || public_headers.empty?
    header_files = headers
  else
    header_files = public_headers
  end
  header_files += vendored_frameworks_headers if include_frameworks
  header_files - private_headers
end

#readmePathname

Returns The path of the auto-detected README file.

Returns:

  • (Pathname)

    The path of the auto-detected README file.


301
302
303
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 301

def readme
  path_list.glob([GLOB_PATTERNS[:readme]]).first
end

#resource_bundle_filesArray<Pathname>

Returns The paths of the files which should be included in resources bundles by the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the files which should be included in resources bundles by the Pod.


287
288
289
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 287

def resource_bundle_files
  resource_bundles.values.flatten
end

#resource_bundlesHash{String => Array<Pathname>}

Returns A hash that describes the resource bundles of the Pod. The keys represent the name of the bundle while the values the path of the resources.

Returns:

  • (Hash{String => Array<Pathname>})

    A hash that describes the resource bundles of the Pod. The keys represent the name of the bundle while the values the path of the resources.


273
274
275
276
277
278
279
280
281
282
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 273

def resource_bundles
  result = {}
  spec_consumer.resource_bundles.each do |name, file_patterns|
    paths = expanded_paths(file_patterns,
                           :exclude_patterns => spec_consumer.exclude_files,
                           :include_dirs => true)
    result[name] = paths
  end
  result
end

#resourcesArray<Pathname>

Returns the resources of the specification.

Returns:

  • (Array<Pathname>)

    the resources of the specification.


149
150
151
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 149

def resources
  paths_for_attribute(:resources, true)
end

#rootPathname

Returns the directory which contains the files of the Pod.

Returns:

  • (Pathname)

    the directory which contains the files of the Pod.


54
55
56
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 54

def root
  path_list.root if path_list
end

#source_filesArray<Pathname>

Returns the source files of the specification.

Returns:

  • (Array<Pathname>)

    the source files of the specification.


84
85
86
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 84

def source_files
  paths_for_attribute(:source_files)
end

#specSpecification

Returns the specification.

Returns:


60
61
62
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 60

def spec
  spec_consumer.spec
end

#spec_licensePathname

Returns The path of the license file specified in the specification, if it exists

Returns:

  • (Pathname)

    The path of the license file specified in the specification, if it exists


335
336
337
338
339
340
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 335

def spec_license
  if file = spec_consumer.license[:file]
    absolute_path = root + file
    absolute_path if File.exist?(absolute_path)
  end
end

#specsArray<Pathname>

Returns The paths of auto-detected podspecs

Returns:

  • (Array<Pathname>)

    The paths of auto-detected podspecs


322
323
324
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 322

def specs
  path_list.glob([GLOB_PATTERNS[:podspecs]])
end

#vendored_dynamic_artifactsArray<Pathname>

Returns The paths of the dynamic binary artifacts that come shipped with the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the dynamic binary artifacts that come shipped with the Pod.


258
259
260
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 258

def vendored_dynamic_artifacts
  vendored_dynamic_libraries + vendored_dynamic_frameworks
end

#vendored_dynamic_frameworksArray<Pathname>

Returns The paths of the dynamic framework bundles that come shipped with the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the dynamic framework bundles that come shipped with the Pod.


169
170
171
172
173
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 169

def vendored_dynamic_frameworks
  vendored_frameworks.select do |framework|
    dynamic_binary?(framework + framework.basename('.*'))
  end
end

#vendored_dynamic_librariesArray<Pathname>

Returns The paths of the dynamic libraries that come shipped with the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the dynamic libraries that come shipped with the Pod.


242
243
244
245
246
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 242

def vendored_dynamic_libraries
  vendored_libraries.select do |library|
    dynamic_binary?(library)
  end
end

#vendored_frameworksArray<Pathname>

Returns The paths of the framework bundles that come shipped with the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the framework bundles that come shipped with the Pod.


162
163
164
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 162

def vendored_frameworks
  paths_for_attribute(:vendored_frameworks, true)
end

#vendored_frameworks_headersArray<Pathname>

Returns The paths of the framework headers that come shipped with the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the framework headers that come shipped with the Pod.


226
227
228
229
230
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 226

def vendored_frameworks_headers
  vendored_frameworks.flat_map do |framework|
    self.class.vendored_frameworks_headers(framework)
  end.uniq
end

#vendored_librariesArray<Pathname>

Returns The paths of the library bundles that come shipped with the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the library bundles that come shipped with the Pod.


235
236
237
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 235

def vendored_libraries
  paths_for_attribute(:vendored_libraries)
end

#vendored_static_artifactsArray<Pathname>

Returns The paths of the static binary artifacts that come shipped with the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the static binary artifacts that come shipped with the Pod.


265
266
267
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 265

def vendored_static_artifacts
  vendored_static_libraries + vendored_static_frameworks
end

#vendored_static_frameworksArray<Pathname>

Returns The paths of the static (fake) framework bundles that come shipped with the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the static (fake) framework bundles that come shipped with the Pod.


178
179
180
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 178

def vendored_static_frameworks
  vendored_frameworks - vendored_dynamic_frameworks
end

#vendored_static_librariesArray<Pathname>

Returns The paths of the static libraries that come shipped with the Pod.

Returns:

  • (Array<Pathname>)

    The paths of the static libraries that come shipped with the Pod.


251
252
253
# File 'lib/cocoapods/sandbox/file_accessor.rb', line 251

def vendored_static_libraries
  vendored_libraries - vendored_dynamic_libraries
end