xcocoapods 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +6303 -0
- data/LICENSE +28 -0
- data/README.md +80 -0
- data/bin/pod +56 -0
- data/bin/sandbox-pod +168 -0
- data/lib/cocoapods.rb +73 -0
- data/lib/cocoapods/command.rb +175 -0
- data/lib/cocoapods/command/cache.rb +28 -0
- data/lib/cocoapods/command/cache/clean.rb +90 -0
- data/lib/cocoapods/command/cache/list.rb +69 -0
- data/lib/cocoapods/command/env.rb +66 -0
- data/lib/cocoapods/command/init.rb +128 -0
- data/lib/cocoapods/command/install.rb +45 -0
- data/lib/cocoapods/command/ipc.rb +19 -0
- data/lib/cocoapods/command/ipc/list.rb +40 -0
- data/lib/cocoapods/command/ipc/podfile.rb +31 -0
- data/lib/cocoapods/command/ipc/podfile_json.rb +30 -0
- data/lib/cocoapods/command/ipc/repl.rb +51 -0
- data/lib/cocoapods/command/ipc/spec.rb +29 -0
- data/lib/cocoapods/command/ipc/update_search_index.rb +24 -0
- data/lib/cocoapods/command/lib.rb +11 -0
- data/lib/cocoapods/command/lib/create.rb +105 -0
- data/lib/cocoapods/command/lib/lint.rb +121 -0
- data/lib/cocoapods/command/list.rb +39 -0
- data/lib/cocoapods/command/options/project_directory.rb +36 -0
- data/lib/cocoapods/command/options/repo_update.rb +34 -0
- data/lib/cocoapods/command/outdated.rb +140 -0
- data/lib/cocoapods/command/repo.rb +29 -0
- data/lib/cocoapods/command/repo/add.rb +103 -0
- data/lib/cocoapods/command/repo/lint.rb +82 -0
- data/lib/cocoapods/command/repo/list.rb +93 -0
- data/lib/cocoapods/command/repo/push.rb +281 -0
- data/lib/cocoapods/command/repo/remove.rb +36 -0
- data/lib/cocoapods/command/repo/update.rb +28 -0
- data/lib/cocoapods/command/setup.rb +103 -0
- data/lib/cocoapods/command/spec.rb +112 -0
- data/lib/cocoapods/command/spec/cat.rb +51 -0
- data/lib/cocoapods/command/spec/create.rb +283 -0
- data/lib/cocoapods/command/spec/edit.rb +87 -0
- data/lib/cocoapods/command/spec/env_spec.rb +53 -0
- data/lib/cocoapods/command/spec/lint.rb +137 -0
- data/lib/cocoapods/command/spec/which.rb +43 -0
- data/lib/cocoapods/command/update.rb +101 -0
- data/lib/cocoapods/config.rb +347 -0
- data/lib/cocoapods/core_overrides.rb +1 -0
- data/lib/cocoapods/downloader.rb +190 -0
- data/lib/cocoapods/downloader/cache.rb +233 -0
- data/lib/cocoapods/downloader/request.rb +86 -0
- data/lib/cocoapods/downloader/response.rb +16 -0
- data/lib/cocoapods/executable.rb +222 -0
- data/lib/cocoapods/external_sources.rb +57 -0
- data/lib/cocoapods/external_sources/abstract_external_source.rb +205 -0
- data/lib/cocoapods/external_sources/downloader_source.rb +30 -0
- data/lib/cocoapods/external_sources/path_source.rb +55 -0
- data/lib/cocoapods/external_sources/podspec_source.rb +54 -0
- data/lib/cocoapods/gem_version.rb +5 -0
- data/lib/cocoapods/generator/acknowledgements.rb +107 -0
- data/lib/cocoapods/generator/acknowledgements/markdown.rb +44 -0
- data/lib/cocoapods/generator/acknowledgements/plist.rb +94 -0
- data/lib/cocoapods/generator/app_target_helper.rb +244 -0
- data/lib/cocoapods/generator/bridge_support.rb +22 -0
- data/lib/cocoapods/generator/constant.rb +19 -0
- data/lib/cocoapods/generator/copy_resources_script.rb +230 -0
- data/lib/cocoapods/generator/dummy_source.rb +31 -0
- data/lib/cocoapods/generator/embed_frameworks_script.rb +215 -0
- data/lib/cocoapods/generator/header.rb +103 -0
- data/lib/cocoapods/generator/info_plist_file.rb +116 -0
- data/lib/cocoapods/generator/module_map.rb +99 -0
- data/lib/cocoapods/generator/prefix_header.rb +60 -0
- data/lib/cocoapods/generator/umbrella_header.rb +46 -0
- data/lib/cocoapods/hooks_manager.rb +132 -0
- data/lib/cocoapods/installer.rb +703 -0
- data/lib/cocoapods/installer/analyzer.rb +972 -0
- data/lib/cocoapods/installer/analyzer/analysis_result.rb +87 -0
- data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +98 -0
- data/lib/cocoapods/installer/analyzer/pod_variant.rb +67 -0
- data/lib/cocoapods/installer/analyzer/pod_variant_set.rb +157 -0
- data/lib/cocoapods/installer/analyzer/podfile_dependency_cache.rb +54 -0
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +240 -0
- data/lib/cocoapods/installer/analyzer/specs_state.rb +84 -0
- data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +53 -0
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +260 -0
- data/lib/cocoapods/installer/installation_options.rb +158 -0
- data/lib/cocoapods/installer/pod_source_installer.rb +202 -0
- data/lib/cocoapods/installer/pod_source_preparer.rb +77 -0
- data/lib/cocoapods/installer/podfile_validator.rb +139 -0
- data/lib/cocoapods/installer/post_install_hooks_context.rb +132 -0
- data/lib/cocoapods/installer/pre_install_hooks_context.rb +51 -0
- data/lib/cocoapods/installer/source_provider_hooks_context.rb +34 -0
- data/lib/cocoapods/installer/user_project_integrator.rb +250 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +463 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +146 -0
- data/lib/cocoapods/installer/xcode.rb +8 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +416 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/aggregate_target_installer.rb +181 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +84 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +334 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +777 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +116 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +86 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +256 -0
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer_helper.rb +68 -0
- data/lib/cocoapods/installer/xcode/target_validator.rb +147 -0
- data/lib/cocoapods/open-uri.rb +33 -0
- data/lib/cocoapods/project.rb +414 -0
- data/lib/cocoapods/resolver.rb +585 -0
- data/lib/cocoapods/resolver/lazy_specification.rb +79 -0
- data/lib/cocoapods/sandbox.rb +404 -0
- data/lib/cocoapods/sandbox/file_accessor.rb +444 -0
- data/lib/cocoapods/sandbox/headers_store.rb +146 -0
- data/lib/cocoapods/sandbox/path_list.rb +220 -0
- data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +85 -0
- data/lib/cocoapods/sandbox/podspec_finder.rb +23 -0
- data/lib/cocoapods/sources_manager.rb +157 -0
- data/lib/cocoapods/target.rb +261 -0
- data/lib/cocoapods/target/aggregate_target.rb +338 -0
- data/lib/cocoapods/target/build_settings.rb +1075 -0
- data/lib/cocoapods/target/pod_target.rb +559 -0
- data/lib/cocoapods/user_interface.rb +459 -0
- data/lib/cocoapods/user_interface/error_report.rb +187 -0
- data/lib/cocoapods/user_interface/inspector_reporter.rb +109 -0
- data/lib/cocoapods/validator.rb +981 -0
- metadata +533 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Pod
|
|
2
|
+
module ExternalSources
|
|
3
|
+
# Provides support for fetching a specification file from a source handled
|
|
4
|
+
# by the downloader. Supports all the options of the downloader
|
|
5
|
+
#
|
|
6
|
+
# @note The podspec must be in the root of the repository and should have a
|
|
7
|
+
# name matching the one of the dependency.
|
|
8
|
+
#
|
|
9
|
+
class DownloaderSource < AbstractExternalSource
|
|
10
|
+
# @see AbstractExternalSource#fetch
|
|
11
|
+
#
|
|
12
|
+
def fetch(sandbox)
|
|
13
|
+
pre_download(sandbox)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @see AbstractExternalSource#description
|
|
17
|
+
#
|
|
18
|
+
def description
|
|
19
|
+
strategy = Downloader.strategy_from_options(params)
|
|
20
|
+
options = params.dup
|
|
21
|
+
url = options.delete(strategy)
|
|
22
|
+
result = "from `#{url}`"
|
|
23
|
+
options.each do |key, value|
|
|
24
|
+
result << ", #{key} `#{value}`"
|
|
25
|
+
end
|
|
26
|
+
result
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Pod
|
|
2
|
+
module ExternalSources
|
|
3
|
+
# Provides support for fetching a specification file from a path local to
|
|
4
|
+
# the machine running the installation.
|
|
5
|
+
#
|
|
6
|
+
class PathSource < AbstractExternalSource
|
|
7
|
+
# @see AbstractExternalSource#fetch
|
|
8
|
+
#
|
|
9
|
+
def fetch(sandbox)
|
|
10
|
+
title = "Fetching podspec for `#{name}` #{description}"
|
|
11
|
+
UI.titled_section(title, :verbose_prefix => '-> ') do
|
|
12
|
+
podspec = podspec_path
|
|
13
|
+
unless podspec.exist?
|
|
14
|
+
raise Informative, "No podspec found for `#{name}` in " \
|
|
15
|
+
"`#{declared_path}`"
|
|
16
|
+
end
|
|
17
|
+
store_podspec(sandbox, podspec, podspec.extname == '.json')
|
|
18
|
+
is_absolute = absolute?(declared_path)
|
|
19
|
+
sandbox.store_local_path(name, podspec, is_absolute)
|
|
20
|
+
sandbox.remove_checkout_source(name)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @see AbstractExternalSource#description
|
|
25
|
+
#
|
|
26
|
+
def description
|
|
27
|
+
"from `#{declared_path}`"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
# @!group Helpers
|
|
33
|
+
|
|
34
|
+
# @return [String] The path as declared by the user.
|
|
35
|
+
#
|
|
36
|
+
def declared_path
|
|
37
|
+
result = params[:path]
|
|
38
|
+
result.to_s if result
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @return [Pathname] The absolute path of the podspec.
|
|
42
|
+
#
|
|
43
|
+
def podspec_path
|
|
44
|
+
path = Pathname(normalized_podspec_path(declared_path))
|
|
45
|
+
path.exist? ? path : Pathname("#{path}.json")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @return [Bool]
|
|
49
|
+
#
|
|
50
|
+
def absolute?(path)
|
|
51
|
+
Pathname(path).absolute? || path.to_s.start_with?('~')
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Pod
|
|
2
|
+
module ExternalSources
|
|
3
|
+
# Provides support for fetching a specification file from an URL. Can be
|
|
4
|
+
# http, file, etc.
|
|
5
|
+
#
|
|
6
|
+
class PodspecSource < AbstractExternalSource
|
|
7
|
+
# @see AbstractExternalSource#fetch
|
|
8
|
+
#
|
|
9
|
+
def fetch(sandbox)
|
|
10
|
+
title = "Fetching podspec for `#{name}` #{description}"
|
|
11
|
+
UI.titled_section(title, :verbose_prefix => '-> ') do
|
|
12
|
+
podspec_path = Pathname(podspec_uri)
|
|
13
|
+
is_json = podspec_path.extname == '.json'
|
|
14
|
+
if podspec_path.exist?
|
|
15
|
+
store_podspec(sandbox, podspec_path, is_json)
|
|
16
|
+
else
|
|
17
|
+
require 'cocoapods/open-uri'
|
|
18
|
+
begin
|
|
19
|
+
open(podspec_uri) { |io| store_podspec(sandbox, io.read, is_json) }
|
|
20
|
+
rescue OpenURI::HTTPError => e
|
|
21
|
+
status = e.io.status.join(' ')
|
|
22
|
+
raise Informative, "Failed to fetch podspec for `#{name}` at `#{podspec_uri}`.\n Error: #{status}"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @see AbstractExternalSource#description
|
|
29
|
+
#
|
|
30
|
+
def description
|
|
31
|
+
"from `#{params[:podspec]}`"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# @!group Helpers
|
|
37
|
+
|
|
38
|
+
# @return [String] The uri of the podspec appending the name of the file
|
|
39
|
+
# and expanding it if necessary.
|
|
40
|
+
#
|
|
41
|
+
# @note If the declared path is expanded only if the represents a path
|
|
42
|
+
# relative to the file system.
|
|
43
|
+
#
|
|
44
|
+
def podspec_uri
|
|
45
|
+
declared_path = params[:podspec].to_s
|
|
46
|
+
if declared_path =~ %r{^.+://}
|
|
47
|
+
declared_path
|
|
48
|
+
else
|
|
49
|
+
normalized_podspec_path(declared_path)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module Pod
|
|
2
|
+
module Generator
|
|
3
|
+
class Acknowledgements
|
|
4
|
+
# @return [Array<Class>] The classes of the acknowledgements generator
|
|
5
|
+
# subclasses.
|
|
6
|
+
#
|
|
7
|
+
def self.generators
|
|
8
|
+
[Plist, Markdown]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# @return [Array<Sandbox::FileAccessor>] the list of the file accessors
|
|
12
|
+
# for the specs of the target that needs to generate the
|
|
13
|
+
# acknowledgements.
|
|
14
|
+
#
|
|
15
|
+
attr_reader :file_accessors
|
|
16
|
+
|
|
17
|
+
# @param [Array<Sandbox::FileAccessor>] @see file_accessors.
|
|
18
|
+
#
|
|
19
|
+
def initialize(file_accessors)
|
|
20
|
+
@file_accessors = file_accessors
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
#-----------------------------------------------------------------------#
|
|
24
|
+
|
|
25
|
+
# !@group Configuration
|
|
26
|
+
|
|
27
|
+
# @return [String] The title of the acknowledgements file.
|
|
28
|
+
#
|
|
29
|
+
def header_title
|
|
30
|
+
'Acknowledgements'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @return [String] A text to present before listing the acknowledgements.
|
|
34
|
+
#
|
|
35
|
+
def header_text
|
|
36
|
+
'This application makes use of the following third party libraries:'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @return [String] The title of the foot notes.
|
|
40
|
+
#
|
|
41
|
+
def footnote_title
|
|
42
|
+
''
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @return [String] the foot notes.
|
|
46
|
+
#
|
|
47
|
+
def footnote_text
|
|
48
|
+
'Generated by CocoaPods - https://cocoapods.org'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
#-----------------------------------------------------------------------#
|
|
52
|
+
|
|
53
|
+
private
|
|
54
|
+
|
|
55
|
+
# !@group Private methods
|
|
56
|
+
|
|
57
|
+
# @return [Array<Specification>] The root specifications for which the
|
|
58
|
+
# acknowledgements should be generated.
|
|
59
|
+
#
|
|
60
|
+
def specs
|
|
61
|
+
file_accessors.map { |accessor| accessor.spec.root }.uniq
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Returns the text of the license for the given spec.
|
|
65
|
+
#
|
|
66
|
+
# @param [Specification] spec
|
|
67
|
+
# the specification for which license is needed.
|
|
68
|
+
#
|
|
69
|
+
# @return [String] The text of the license.
|
|
70
|
+
# @return [Nil] If not license text could be found.
|
|
71
|
+
#
|
|
72
|
+
def license_text(spec)
|
|
73
|
+
return nil unless spec.license
|
|
74
|
+
text = spec.license[:text]
|
|
75
|
+
unless text
|
|
76
|
+
if license_file = spec.license[:file]
|
|
77
|
+
license_path = file_accessor(spec).root + license_file
|
|
78
|
+
if File.exist?(license_path)
|
|
79
|
+
text = IO.read(license_path)
|
|
80
|
+
else
|
|
81
|
+
UI.warn "Unable to read the license file `#{license_file}` " \
|
|
82
|
+
"for the spec `#{spec}`"
|
|
83
|
+
end
|
|
84
|
+
elsif license_file = file_accessor(spec).license
|
|
85
|
+
text = IO.read(license_file)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
text
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
protected
|
|
92
|
+
|
|
93
|
+
# Returns the file accessor for the given spec.
|
|
94
|
+
#
|
|
95
|
+
# @param [Specification] spec
|
|
96
|
+
# the specification for which the file accessor is needed.
|
|
97
|
+
#
|
|
98
|
+
# @return [Sandbox::FileAccessor] The file accessor.
|
|
99
|
+
#
|
|
100
|
+
def file_accessor(spec)
|
|
101
|
+
file_accessors.find { |accessor| accessor.spec.root == spec }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
#-----------------------------------------------------------------------#
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module Pod
|
|
2
|
+
module Generator
|
|
3
|
+
class Markdown < Acknowledgements
|
|
4
|
+
def self.path_from_basepath(path)
|
|
5
|
+
Pathname.new(path.dirname + "#{path.basename}.markdown")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def save_as(path)
|
|
9
|
+
file = File.new(path, 'w')
|
|
10
|
+
file.write(licenses)
|
|
11
|
+
file.close
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# @return [String] The contents of the acknowledgements in Markdown format.
|
|
15
|
+
#
|
|
16
|
+
def generate
|
|
17
|
+
licenses
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def title_from_string(string, level)
|
|
21
|
+
unless string.empty?
|
|
22
|
+
'#' * level << " #{string}"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def string_for_spec(spec)
|
|
27
|
+
if (license_text = license_text(spec))
|
|
28
|
+
"\n" << title_from_string(spec.name, 2) << "\n\n" << license_text << "\n"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def licenses
|
|
33
|
+
licenses_string = "#{title_from_string(header_title, 1)}\n#{header_text}\n"
|
|
34
|
+
specs.each do |spec|
|
|
35
|
+
if (license = string_for_spec(spec))
|
|
36
|
+
license = license.force_encoding('UTF-8') if license.respond_to?(:force_encoding)
|
|
37
|
+
licenses_string += license
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
licenses_string += "#{title_from_string(footnote_title, 2)}#{footnote_text}\n"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require 'stringio'
|
|
2
|
+
|
|
3
|
+
module Pod
|
|
4
|
+
module Generator
|
|
5
|
+
class Plist < Acknowledgements
|
|
6
|
+
def self.path_from_basepath(path)
|
|
7
|
+
Pathname.new(path.dirname + "#{path.basename}.plist")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def save_as(path)
|
|
11
|
+
Xcodeproj::Plist.write_to_path(plist, path)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# @return [String] The contents of the plist
|
|
15
|
+
#
|
|
16
|
+
def generate
|
|
17
|
+
plist = Nanaimo::Plist.new(plist, :xml)
|
|
18
|
+
contents = StringIO.new
|
|
19
|
+
Nanaimo::Writer::XMLWriter.new(plist, :pretty => true, :output => contents, :strict => false).write
|
|
20
|
+
contents.string
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def plist
|
|
24
|
+
{
|
|
25
|
+
:Title => plist_title,
|
|
26
|
+
:StringsTable => plist_title,
|
|
27
|
+
:PreferenceSpecifiers => licenses,
|
|
28
|
+
}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def plist_title
|
|
32
|
+
'Acknowledgements'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def licenses
|
|
36
|
+
licences_array = [header_hash]
|
|
37
|
+
specs.each do |spec|
|
|
38
|
+
if (hash = hash_for_spec(spec))
|
|
39
|
+
licences_array << hash
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
licences_array << footnote_hash
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def hash_for_spec(spec)
|
|
46
|
+
if (license = license_text(spec))
|
|
47
|
+
hash = {
|
|
48
|
+
:Type => 'PSGroupSpecifier',
|
|
49
|
+
:Title => sanitize_encoding(spec.name),
|
|
50
|
+
:FooterText => sanitize_encoding(license),
|
|
51
|
+
}
|
|
52
|
+
hash[:License] = sanitize_encoding(spec.license[:type]) if spec.license[:type]
|
|
53
|
+
|
|
54
|
+
hash
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def header_hash
|
|
59
|
+
{
|
|
60
|
+
:Type => 'PSGroupSpecifier',
|
|
61
|
+
:Title => sanitize_encoding(header_title),
|
|
62
|
+
:FooterText => sanitize_encoding(header_text),
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def footnote_hash
|
|
67
|
+
{
|
|
68
|
+
:Type => 'PSGroupSpecifier',
|
|
69
|
+
:Title => sanitize_encoding(footnote_title),
|
|
70
|
+
:FooterText => sanitize_encoding(footnote_text),
|
|
71
|
+
}
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
#-----------------------------------------------------------------------#
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
# !@group Private methods
|
|
79
|
+
|
|
80
|
+
# Returns the sanitized text with UTF-8 invalid characters eliminated.
|
|
81
|
+
#
|
|
82
|
+
# @param [String] text
|
|
83
|
+
# the text we want to sanitize.
|
|
84
|
+
#
|
|
85
|
+
# @return [String] The sanitized UTF-8 text.
|
|
86
|
+
#
|
|
87
|
+
def sanitize_encoding(text)
|
|
88
|
+
text.encode('UTF-8', :invalid => :replace, :undef => :replace, :replace => '')
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
#-----------------------------------------------------------------------#
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
module Pod
|
|
2
|
+
module Generator
|
|
3
|
+
# Stores the common logic for creating app targets within projects including
|
|
4
|
+
# generating standard import and main files for app hosts.
|
|
5
|
+
#
|
|
6
|
+
module AppTargetHelper
|
|
7
|
+
# Adds a single app target to the given project with the provided name.
|
|
8
|
+
#
|
|
9
|
+
# @param [Project] project
|
|
10
|
+
# the Xcodeproj to generate the target into.
|
|
11
|
+
#
|
|
12
|
+
# @param [Symbol] platform
|
|
13
|
+
# the platform of the target. Can be `:ios` or `:osx`, etc.
|
|
14
|
+
#
|
|
15
|
+
# @param [String] deployment_target
|
|
16
|
+
# the deployment target for the platform.
|
|
17
|
+
#
|
|
18
|
+
# @param [String] name
|
|
19
|
+
# The name to use for the target, defaults to 'App'.
|
|
20
|
+
#
|
|
21
|
+
# @return [PBXNativeTarget] the new target that was created.
|
|
22
|
+
#
|
|
23
|
+
def self.add_app_target(project, platform, deployment_target, name = 'App')
|
|
24
|
+
project.new_target(:application, name, platform, deployment_target)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Creates and links an import file for the given pod target and into the given native target.
|
|
28
|
+
#
|
|
29
|
+
# @param [Project] project
|
|
30
|
+
# the Xcodeproj to generate the target into.
|
|
31
|
+
#
|
|
32
|
+
# @param [PBXNativeTarget] target
|
|
33
|
+
# the native target to link the generated import file into.
|
|
34
|
+
#
|
|
35
|
+
# @param [PodTarget] pod_target
|
|
36
|
+
# the pod target to use for when generating the contents of the import file.
|
|
37
|
+
#
|
|
38
|
+
# @param [Symbol] platform
|
|
39
|
+
# the platform of the target. Can be `:ios` or `:osx`, etc.
|
|
40
|
+
#
|
|
41
|
+
# @param [String] name
|
|
42
|
+
# The name to use for the target, defaults to 'App'.
|
|
43
|
+
#
|
|
44
|
+
# @return [Array<PBXBuildFile>] the created build file references.
|
|
45
|
+
#
|
|
46
|
+
def self.add_app_project_import(project, target, pod_target, platform, name = 'App')
|
|
47
|
+
source_file = AppTargetHelper.create_app_import_source_file(project, pod_target, platform, name)
|
|
48
|
+
group = project[name] || project.new_group(name, name)
|
|
49
|
+
source_file_ref = group.new_file(source_file)
|
|
50
|
+
target.add_file_references([source_file_ref])
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Creates and links an empty Swift file for the given target.
|
|
54
|
+
#
|
|
55
|
+
# @param [Project] project
|
|
56
|
+
# the Xcodeproj to generate the target into.
|
|
57
|
+
#
|
|
58
|
+
# @param [PBXNativeTarget] target
|
|
59
|
+
# the native target to link the generated import file into.
|
|
60
|
+
#
|
|
61
|
+
# @param [String] name
|
|
62
|
+
# The name to use for the target, defaults to 'App'.
|
|
63
|
+
#
|
|
64
|
+
# @return [Array<PBXBuildFile>] the created build file references.
|
|
65
|
+
#
|
|
66
|
+
def self.add_empty_swift_file(project, target, name = 'App')
|
|
67
|
+
swift_file = project.path.dirname.+("#{name}/dummy.swift")
|
|
68
|
+
swift_file.parent.mkpath
|
|
69
|
+
File.write(swift_file, '')
|
|
70
|
+
group = project[name] || project.new_group(name, name)
|
|
71
|
+
swift_file_ref = group.new_file(swift_file)
|
|
72
|
+
target.add_file_references([swift_file_ref])
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Creates and links a default app host 'main.m' file.
|
|
76
|
+
#
|
|
77
|
+
# @param [Project] project
|
|
78
|
+
# the Xcodeproj to generate the target into.
|
|
79
|
+
#
|
|
80
|
+
# @param [PBXNativeTarget] target
|
|
81
|
+
# the native target to link the generated main file into.
|
|
82
|
+
#
|
|
83
|
+
# @param [Symbol] platform
|
|
84
|
+
# the platform of the target. Can be `:ios` or `:osx`, etc.
|
|
85
|
+
#
|
|
86
|
+
# @param [String] name
|
|
87
|
+
# The name to use for the target, defaults to 'App'.
|
|
88
|
+
#
|
|
89
|
+
# @return [Array<PBXBuildFile>] the created build file references.
|
|
90
|
+
#
|
|
91
|
+
def self.add_app_host_main_file(project, target, platform, name = 'App')
|
|
92
|
+
source_file = AppTargetHelper.create_app_host_main_file(project, platform, name)
|
|
93
|
+
source_file_ref = project.new_group(name, name).new_file(source_file)
|
|
94
|
+
target.add_file_references([source_file_ref])
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Adds the xctest framework search paths into the given target.
|
|
98
|
+
#
|
|
99
|
+
# @param [PBXNativeTarget] target
|
|
100
|
+
# the native target to add XCTest into.
|
|
101
|
+
#
|
|
102
|
+
# @return [void]
|
|
103
|
+
#
|
|
104
|
+
def self.add_xctest_search_paths(target)
|
|
105
|
+
target.build_configurations.each do |configuration|
|
|
106
|
+
search_paths = configuration.build_settings['FRAMEWORK_SEARCH_PATHS'] ||= '$(inherited)'
|
|
107
|
+
search_paths << ' "$(PLATFORM_DIR)/Developer/Library/Frameworks"'
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Adds the provided swift version into the given target.
|
|
112
|
+
#
|
|
113
|
+
# @param [PBXNativeTarget] target
|
|
114
|
+
# the native target to add the swift version into.
|
|
115
|
+
#
|
|
116
|
+
# @param [String] swift_version
|
|
117
|
+
# the swift version to set to.
|
|
118
|
+
#
|
|
119
|
+
# @return [void]
|
|
120
|
+
#
|
|
121
|
+
def self.add_swift_version(target, swift_version)
|
|
122
|
+
raise 'Cannot set empty Swift version to target.' if swift_version.blank?
|
|
123
|
+
target.build_configurations.each do |configuration|
|
|
124
|
+
configuration.build_settings['SWIFT_VERSION'] = swift_version
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Creates a default import file for the given pod target.
|
|
129
|
+
#
|
|
130
|
+
# @param [Project] project
|
|
131
|
+
# the Xcodeproj to generate the target into.
|
|
132
|
+
#
|
|
133
|
+
# @param [PodTarget] pod_target
|
|
134
|
+
# the pod target to use for when generating the contents of the import file.
|
|
135
|
+
#
|
|
136
|
+
# @param [Symbol] platform
|
|
137
|
+
# the platform of the target. Can be `:ios` or `:osx`, etc.
|
|
138
|
+
#
|
|
139
|
+
# @param [String] name
|
|
140
|
+
# The name of the folder to use and save the generated main file.
|
|
141
|
+
#
|
|
142
|
+
# @return [Pathname] the new source file that was generated.
|
|
143
|
+
#
|
|
144
|
+
def self.create_app_import_source_file(project, pod_target, platform, name = 'App')
|
|
145
|
+
language = pod_target.uses_swift? ? :swift : :objc
|
|
146
|
+
|
|
147
|
+
if language == :swift
|
|
148
|
+
source_file = project.path.dirname.+("#{name}/main.swift")
|
|
149
|
+
source_file.parent.mkpath
|
|
150
|
+
import_statement = pod_target.should_build? && pod_target.defines_module? ? "import #{pod_target.product_module_name}\n" : ''
|
|
151
|
+
source_file.open('w') { |f| f << import_statement }
|
|
152
|
+
else
|
|
153
|
+
source_file = project.path.dirname.+("#{name}/main.m")
|
|
154
|
+
source_file.parent.mkpath
|
|
155
|
+
import_statement = if pod_target.should_build? && pod_target.defines_module?
|
|
156
|
+
"@import #{pod_target.product_module_name};\n"
|
|
157
|
+
else
|
|
158
|
+
header_name = "#{pod_target.product_module_name}/#{pod_target.product_module_name}.h"
|
|
159
|
+
if pod_target.sandbox.public_headers.root.+(header_name).file?
|
|
160
|
+
"#import <#{header_name}>\n"
|
|
161
|
+
else
|
|
162
|
+
''
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
source_file.open('w') do |f|
|
|
166
|
+
f << "@import Foundation;\n"
|
|
167
|
+
f << "@import UIKit;\n" if platform == :ios || platform == :tvos
|
|
168
|
+
f << "@import Cocoa;\n" if platform == :osx
|
|
169
|
+
f << "#{import_statement}int main() {}\n"
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
source_file
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Creates a default app host 'main.m' file.
|
|
176
|
+
#
|
|
177
|
+
# @param [Project] project
|
|
178
|
+
# the Xcodeproj to generate the target into.
|
|
179
|
+
#
|
|
180
|
+
# @param [Symbol] platform
|
|
181
|
+
# the platform of the target. Can be `:ios` or `:osx`.
|
|
182
|
+
#
|
|
183
|
+
# @param [String] name
|
|
184
|
+
# The name of the folder to use and save the generated main file.
|
|
185
|
+
#
|
|
186
|
+
# @return [Pathname] the new source file that was generated.
|
|
187
|
+
#
|
|
188
|
+
def self.create_app_host_main_file(project, platform, name = 'App')
|
|
189
|
+
source_file = project.path.dirname.+("#{name}/main.m")
|
|
190
|
+
source_file.parent.mkpath
|
|
191
|
+
source_file.open('w') do |f|
|
|
192
|
+
case platform
|
|
193
|
+
when :ios, :tvos
|
|
194
|
+
f << IOS_APP_HOST_MAIN_CONTENTS
|
|
195
|
+
when :osx
|
|
196
|
+
f << MACOS_APP_APP_HOST_MAIN_CONTENTS
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
source_file
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
IOS_APP_HOST_MAIN_CONTENTS = <<EOS.freeze
|
|
203
|
+
#import <Foundation/Foundation.h>
|
|
204
|
+
#import <UIKit/UIKit.h>
|
|
205
|
+
|
|
206
|
+
@interface CPTestAppHostAppDelegate : UIResponder <UIApplicationDelegate>
|
|
207
|
+
|
|
208
|
+
@property (nonatomic, strong) UIWindow *window;
|
|
209
|
+
|
|
210
|
+
@end
|
|
211
|
+
|
|
212
|
+
@implementation CPTestAppHostAppDelegate
|
|
213
|
+
|
|
214
|
+
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
|
215
|
+
{
|
|
216
|
+
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
|
217
|
+
self.window.rootViewController = [UIViewController new];
|
|
218
|
+
|
|
219
|
+
[self.window makeKeyAndVisible];
|
|
220
|
+
|
|
221
|
+
return YES;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
@end
|
|
225
|
+
|
|
226
|
+
int main(int argc, char *argv[])
|
|
227
|
+
{
|
|
228
|
+
@autoreleasepool
|
|
229
|
+
{
|
|
230
|
+
return UIApplicationMain(argc, argv, nil, NSStringFromClass([CPTestAppHostAppDelegate class]));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
EOS
|
|
234
|
+
|
|
235
|
+
MACOS_APP_APP_HOST_MAIN_CONTENTS = <<EOS.freeze
|
|
236
|
+
#import <Cocoa/Cocoa.h>
|
|
237
|
+
|
|
238
|
+
int main(int argc, const char * argv[]) {
|
|
239
|
+
return NSApplicationMain(argc, argv);
|
|
240
|
+
}
|
|
241
|
+
EOS
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|