cocoapods 1.0.0 → 1.0.1
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 +4 -4
- data/CHANGELOG.md +44 -0
- data/lib/cocoapods/command.rb +1 -1
- data/lib/cocoapods/command/init.rb +1 -1
- data/lib/cocoapods/command/ipc.rb +18 -0
- data/lib/cocoapods/command/ipc/list.rb +40 -0
- data/lib/cocoapods/command/ipc/podfile.rb +31 -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 +3 -207
- data/lib/cocoapods/command/lib/create.rb +105 -0
- data/lib/cocoapods/command/lib/lint.rb +107 -0
- data/lib/cocoapods/command/repo/push.rb +1 -2
- data/lib/cocoapods/config.rb +4 -1
- data/lib/cocoapods/executable.rb +1 -1
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/copy_resources_script.rb +2 -2
- data/lib/cocoapods/installer/analyzer/target_inspector.rb +1 -1
- data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +21 -0
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +2 -3
- data/lib/cocoapods/sandbox/path_list.rb +9 -9
- data/lib/cocoapods/sources_manager.rb +1 -2
- data/lib/cocoapods/user_interface.rb +1 -4
- data/lib/cocoapods/validator.rb +1 -1
- metadata +14 -7
- data/lib/cocoapods/command/inter_process_communication.rb +0 -177
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eeda2d6ab232bd8f105714f6a51b3986ca80b775
|
4
|
+
data.tar.gz: 5fbdf86b804049c847b316843922500fd3d187d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 871f362cd52240407bf82ae6d82c120fb44e4d00c2cf5d0c6ce1f71c05eea7efccbfa046224600b8a268357992bab0603e6d66b13544ef573427e49ef8fc3d69
|
7
|
+
data.tar.gz: 74971c13eded91890a16897f00dfab17a1d9d3248ba7e2a1b19fbb924ced964f76f711ff607cb065790b552d906c8d6ab6d476c05fb1fc302d465e51500f4e42
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,50 @@ To install or update CocoaPods see this [guide](http://docs.cocoapods.org/guides
|
|
4
4
|
|
5
5
|
To install release candidates run `[sudo] gem install cocoapods --pre`
|
6
6
|
|
7
|
+
## 1.0.1 (2016-06-02)
|
8
|
+
|
9
|
+
##### Enhancements
|
10
|
+
|
11
|
+
* None.
|
12
|
+
|
13
|
+
##### Bug Fixes
|
14
|
+
|
15
|
+
* Symlink the header folders in the framework bundle's root directory
|
16
|
+
by a new shell script build phase if `header_mappings_dir` is used
|
17
|
+
with frameworks.
|
18
|
+
[Marius Rackwitz](https://github.com/mrackwitz)
|
19
|
+
[#5313](https://github.com/CocoaPods/CocoaPods/issues/5313)
|
20
|
+
|
21
|
+
* Removed emojis in Build Phases names — as it seems that some third party tools have trouble with them.
|
22
|
+
[Olivier Halligon](https://github.com/AliSoftware)
|
23
|
+
[#5382](https://github.com/CocoaPods/CocoaPods/pull/5382)
|
24
|
+
|
25
|
+
* Ensure `Set` is defined before using it.
|
26
|
+
[Samuel Giddins](https://github.com/segiddins)
|
27
|
+
[#5287](https://github.com/CocoaPods/CocoaPods/issues/5287)
|
28
|
+
|
29
|
+
* Add --target-device to ibtool invocation for XIBs
|
30
|
+
[Juan Civile](https://github.com/champo)
|
31
|
+
[#5282](https://github.com/CocoaPods/CocoaPods/issues/5282)
|
32
|
+
|
33
|
+
* Fix error when executables cannot be found.
|
34
|
+
[Jan Berkel](https://github.com/jberkel)
|
35
|
+
[#5319](https://github.com/CocoaPods/CocoaPods/pull/5319)
|
36
|
+
|
37
|
+
* Avoid removing all files when root directory contains unicode characters.
|
38
|
+
[Marc Boquet](https://github.com/marcboquet)
|
39
|
+
[#5294](https://github.com/CocoaPods/CocoaPods/issues/5294)
|
40
|
+
|
41
|
+
* Guarding from crash if pod lib create has a + character in the name.
|
42
|
+
[William Entriken](https://github.com/fulldecent)
|
43
|
+
[CocoaPods/pod-template#69](https://github.com/CocoaPods/pod-template/issues/69)
|
44
|
+
|
45
|
+
* Use target product types to determine whether a target is a test target when
|
46
|
+
running `pod init`.
|
47
|
+
[Samuel Giddins](https://github.com/segiddins)
|
48
|
+
[#5378](https://github.com/CocoaPods/CocoaPods/issues/5378)
|
49
|
+
|
50
|
+
|
7
51
|
## 1.0.0 (2016-05-10)
|
8
52
|
|
9
53
|
##### Enhancements
|
data/lib/cocoapods/command.rb
CHANGED
@@ -22,7 +22,7 @@ module Pod
|
|
22
22
|
require 'cocoapods/command/env'
|
23
23
|
require 'cocoapods/command/init'
|
24
24
|
require 'cocoapods/command/install'
|
25
|
-
require 'cocoapods/command/
|
25
|
+
require 'cocoapods/command/ipc'
|
26
26
|
require 'cocoapods/command/lib'
|
27
27
|
require 'cocoapods/command/list'
|
28
28
|
require 'cocoapods/command/outdated'
|
@@ -63,7 +63,7 @@ module Pod
|
|
63
63
|
# Split out the targets into app and test targets
|
64
64
|
test_targets, app_targets = project.native_targets.
|
65
65
|
sort_by { |t| t.name.downcase }.
|
66
|
-
partition
|
66
|
+
partition(&:test_target_type?)
|
67
67
|
|
68
68
|
app_targets.each do |app_target|
|
69
69
|
test_targets_for_app = test_targets.select do |target|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'cocoapods/command/ipc/list'
|
2
|
+
require 'cocoapods/command/ipc/podfile'
|
3
|
+
require 'cocoapods/command/ipc/repl'
|
4
|
+
require 'cocoapods/command/ipc/spec'
|
5
|
+
require 'cocoapods/command/ipc/update_search_index'
|
6
|
+
|
7
|
+
module Pod
|
8
|
+
class Command
|
9
|
+
class IPC < Command
|
10
|
+
self.abstract_command = true
|
11
|
+
self.summary = 'Inter-process communication'
|
12
|
+
|
13
|
+
def output_pipe
|
14
|
+
STDOUT
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class IPC < Command
|
4
|
+
class List < IPC
|
5
|
+
self.summary = 'Lists the specifications known to CocoaPods'
|
6
|
+
self.description = <<-DESC
|
7
|
+
Prints to STDOUT a YAML dictionary where the keys are the name of the
|
8
|
+
specifications and each corresponding value is a dictionary with
|
9
|
+
the following keys:
|
10
|
+
- defined_in_file
|
11
|
+
- version
|
12
|
+
- authors
|
13
|
+
- summary
|
14
|
+
- description
|
15
|
+
- platforms
|
16
|
+
DESC
|
17
|
+
|
18
|
+
def run
|
19
|
+
require 'yaml'
|
20
|
+
sets = config.sources_manager.aggregate.all_sets
|
21
|
+
result = {}
|
22
|
+
sets.each do |set|
|
23
|
+
begin
|
24
|
+
spec = set.specification
|
25
|
+
result[spec.name] = {
|
26
|
+
'authors' => spec.authors.keys,
|
27
|
+
'summary' => spec.summary,
|
28
|
+
'description' => spec.description,
|
29
|
+
'platforms' => spec.available_platforms.map { |p| p.name.to_s },
|
30
|
+
}
|
31
|
+
rescue DSLError
|
32
|
+
next
|
33
|
+
end
|
34
|
+
end
|
35
|
+
output_pipe.puts result.to_yaml
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class IPC < Command
|
4
|
+
class Podfile < IPC
|
5
|
+
include ProjectDirectory
|
6
|
+
|
7
|
+
self.summary = 'Converts a Podfile to YAML'
|
8
|
+
self.description = 'Converts a Podfile to YAML and prints it to STDOUT.'
|
9
|
+
self.arguments = [
|
10
|
+
CLAide::Argument.new('PATH', true),
|
11
|
+
]
|
12
|
+
|
13
|
+
def initialize(argv)
|
14
|
+
@path = argv.shift_argument
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def validate!
|
19
|
+
super
|
20
|
+
help! 'A Podfile path is required.' unless @path
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
require 'yaml'
|
25
|
+
podfile = Pod::Podfile.from_file(@path)
|
26
|
+
output_pipe.puts podfile.to_yaml
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class IPC < Command
|
4
|
+
class Repl < IPC
|
5
|
+
include ProjectDirectory
|
6
|
+
|
7
|
+
END_OF_OUTPUT_SIGNAL = "\n\r".freeze
|
8
|
+
|
9
|
+
self.summary = 'The repl listens to commands on standard input'
|
10
|
+
self.description = <<-DESC
|
11
|
+
The repl listens to commands on standard input and prints their
|
12
|
+
result to standard output.
|
13
|
+
It accepts all the other ipc subcommands. The repl will signal the
|
14
|
+
end of output with the the ASCII CR+LF `\\n\\r`.
|
15
|
+
DESC
|
16
|
+
|
17
|
+
def run
|
18
|
+
print_version
|
19
|
+
signal_end_of_output
|
20
|
+
listen
|
21
|
+
end
|
22
|
+
|
23
|
+
def print_version
|
24
|
+
output_pipe.puts "version: '#{Pod::VERSION}'"
|
25
|
+
end
|
26
|
+
|
27
|
+
def signal_end_of_output
|
28
|
+
output_pipe.puts(END_OF_OUTPUT_SIGNAL)
|
29
|
+
STDOUT.flush
|
30
|
+
end
|
31
|
+
|
32
|
+
def listen
|
33
|
+
while repl_command = STDIN.gets
|
34
|
+
execute_repl_command(repl_command)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def execute_repl_command(repl_command)
|
39
|
+
unless repl_command == '\n'
|
40
|
+
repl_commands = repl_command.split
|
41
|
+
subcommand = repl_commands.shift.capitalize
|
42
|
+
arguments = repl_commands
|
43
|
+
subcommand_class = Pod::Command::IPC.const_get(subcommand)
|
44
|
+
subcommand_class.new(CLAide::ARGV.new(arguments)).run
|
45
|
+
signal_end_of_output
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class IPC < Command
|
4
|
+
class Spec < IPC
|
5
|
+
self.summary = 'Converts a podspec to JSON'
|
6
|
+
self.description = 'Converts a podspec to JSON and prints it to STDOUT.'
|
7
|
+
self.arguments = [
|
8
|
+
CLAide::Argument.new('PATH', true),
|
9
|
+
]
|
10
|
+
|
11
|
+
def initialize(argv)
|
12
|
+
@path = argv.shift_argument
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def validate!
|
17
|
+
super
|
18
|
+
help! 'A specification path is required.' unless @path
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
require 'json'
|
23
|
+
spec = Specification.from_file(@path)
|
24
|
+
output_pipe.puts(spec.to_pretty_json)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class IPC < Command
|
4
|
+
class UpdateSearchIndex < IPC
|
5
|
+
self.summary = 'Updates the search index'
|
6
|
+
self.description = <<-DESC
|
7
|
+
Updates the search index and prints its path to standard output.
|
8
|
+
The search index is a YAML encoded dictionary where the keys
|
9
|
+
are the names of the Pods and the values are a dictionary containing
|
10
|
+
the following information:
|
11
|
+
- version
|
12
|
+
- summary
|
13
|
+
- description
|
14
|
+
- authors
|
15
|
+
DESC
|
16
|
+
|
17
|
+
def run
|
18
|
+
config.sources_manager.updated_search_index
|
19
|
+
output_pipe.puts(config.sources_manager.search_index_path)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,215 +1,11 @@
|
|
1
|
+
require 'cocoapods/command/lib/create'
|
2
|
+
require 'cocoapods/command/lib/lint'
|
3
|
+
|
1
4
|
module Pod
|
2
5
|
class Command
|
3
6
|
class Lib < Command
|
4
7
|
self.abstract_command = true
|
5
8
|
self.summary = 'Develop pods'
|
6
|
-
|
7
|
-
#-----------------------------------------------------------------------#
|
8
|
-
|
9
|
-
class Create < Lib
|
10
|
-
self.summary = 'Creates a new Pod'
|
11
|
-
|
12
|
-
self.description = <<-DESC
|
13
|
-
Creates a scaffold for the development of a new Pod named `NAME`
|
14
|
-
according to the CocoaPods best practices.
|
15
|
-
If a `TEMPLATE_URL`, pointing to a git repo containing a compatible
|
16
|
-
template, is specified, it will be used in place of the default one.
|
17
|
-
DESC
|
18
|
-
|
19
|
-
self.arguments = [
|
20
|
-
CLAide::Argument.new('NAME', true),
|
21
|
-
]
|
22
|
-
|
23
|
-
def self.options
|
24
|
-
[
|
25
|
-
['--template-url=URL', 'The URL of the git repo containing a ' \
|
26
|
-
'compatible template'],
|
27
|
-
].concat(super)
|
28
|
-
end
|
29
|
-
|
30
|
-
def initialize(argv)
|
31
|
-
@name = argv.shift_argument
|
32
|
-
@template_url = argv.option('template-url', TEMPLATE_REPO)
|
33
|
-
super
|
34
|
-
@additional_args = argv.remainder!
|
35
|
-
end
|
36
|
-
|
37
|
-
def validate!
|
38
|
-
super
|
39
|
-
help! 'A name for the Pod is required.' unless @name
|
40
|
-
help! 'The Pod name cannot contain spaces.' if @name =~ /\s/
|
41
|
-
help! "The Pod name cannot begin with a '.'" if @name[0, 1] == '.'
|
42
|
-
end
|
43
|
-
|
44
|
-
def run
|
45
|
-
clone_template
|
46
|
-
configure_template
|
47
|
-
print_info
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
#----------------------------------------#
|
53
|
-
|
54
|
-
# !@group Private helpers
|
55
|
-
|
56
|
-
extend Executable
|
57
|
-
executable :git
|
58
|
-
|
59
|
-
TEMPLATE_REPO = 'https://github.com/CocoaPods/pod-template.git'
|
60
|
-
TEMPLATE_INFO_URL = 'https://github.com/CocoaPods/pod-template'
|
61
|
-
CREATE_NEW_POD_INFO_URL = 'http://guides.cocoapods.org/making/making-a-cocoapod'
|
62
|
-
|
63
|
-
# Clones the template from the remote in the working directory using
|
64
|
-
# the name of the Pod.
|
65
|
-
#
|
66
|
-
# @return [void]
|
67
|
-
#
|
68
|
-
def clone_template
|
69
|
-
UI.section("Cloning `#{template_repo_url}` into `#{@name}`.") do
|
70
|
-
git! ['clone', template_repo_url, @name]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# Runs the template configuration utilities.
|
75
|
-
#
|
76
|
-
# @return [void]
|
77
|
-
#
|
78
|
-
def configure_template
|
79
|
-
UI.section("Configuring #{@name} template.") do
|
80
|
-
Dir.chdir(@name) do
|
81
|
-
if File.exist?('configure')
|
82
|
-
system('./configure', @name, *@additional_args)
|
83
|
-
else
|
84
|
-
UI.warn 'Template does not have a configure file.'
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
# Runs the template configuration utilities.
|
91
|
-
#
|
92
|
-
# @return [void]
|
93
|
-
#
|
94
|
-
def print_info
|
95
|
-
UI.puts "\nTo learn more about the template see `#{template_repo_url}`."
|
96
|
-
UI.puts "To learn more about creating a new pod, see `#{CREATE_NEW_POD_INFO_URL}`."
|
97
|
-
end
|
98
|
-
|
99
|
-
# Checks if a template URL is given else returns the TEMPLATE_REPO URL
|
100
|
-
#
|
101
|
-
# @return String
|
102
|
-
#
|
103
|
-
def template_repo_url
|
104
|
-
@template_url || TEMPLATE_REPO
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
#-----------------------------------------------------------------------#
|
109
|
-
|
110
|
-
class Lint < Lib
|
111
|
-
self.summary = 'Validates a Pod'
|
112
|
-
|
113
|
-
self.description = <<-DESC
|
114
|
-
Validates the Pod using the files in the working directory.
|
115
|
-
DESC
|
116
|
-
|
117
|
-
def self.options
|
118
|
-
[
|
119
|
-
['--quick', 'Lint skips checks that would require to download and build the spec'],
|
120
|
-
['--allow-warnings', 'Lint validates even if warnings are present'],
|
121
|
-
['--subspec=NAME', 'Lint validates only the given subspec'],
|
122
|
-
['--no-subspecs', 'Lint skips validation of subspecs'],
|
123
|
-
['--no-clean', 'Lint leaves the build directory intact for inspection'],
|
124
|
-
['--fail-fast', 'Lint stops on the first failing platform or subspec'],
|
125
|
-
['--use-libraries', 'Lint uses static libraries to install the spec'],
|
126
|
-
['--sources=https://github.com/artsy/Specs,master', 'The sources from which to pull dependent pods ' \
|
127
|
-
'(defaults to https://github.com/CocoaPods/Specs.git). ' \
|
128
|
-
'Multiple sources must be comma-delimited.'],
|
129
|
-
['--private', 'Lint skips checks that apply only to public specs'],
|
130
|
-
].concat(super)
|
131
|
-
end
|
132
|
-
|
133
|
-
def initialize(argv)
|
134
|
-
@quick = argv.flag?('quick')
|
135
|
-
@allow_warnings = argv.flag?('allow-warnings')
|
136
|
-
@clean = argv.flag?('clean', true)
|
137
|
-
@fail_fast = argv.flag?('fail-fast', false)
|
138
|
-
@subspecs = argv.flag?('subspecs', true)
|
139
|
-
@only_subspec = argv.option('subspec')
|
140
|
-
@use_frameworks = !argv.flag?('use-libraries')
|
141
|
-
@source_urls = argv.option('sources', 'https://github.com/CocoaPods/Specs.git').split(',')
|
142
|
-
@private = argv.flag?('private', false)
|
143
|
-
@podspecs_paths = argv.arguments!
|
144
|
-
super
|
145
|
-
end
|
146
|
-
|
147
|
-
def validate!
|
148
|
-
super
|
149
|
-
end
|
150
|
-
|
151
|
-
def run
|
152
|
-
UI.puts
|
153
|
-
podspecs_to_lint.each do |podspec|
|
154
|
-
validator = Validator.new(podspec, @source_urls)
|
155
|
-
validator.local = true
|
156
|
-
validator.quick = @quick
|
157
|
-
validator.no_clean = !@clean
|
158
|
-
validator.fail_fast = @fail_fast
|
159
|
-
validator.allow_warnings = @allow_warnings
|
160
|
-
validator.no_subspecs = !@subspecs || @only_subspec
|
161
|
-
validator.only_subspec = @only_subspec
|
162
|
-
validator.use_frameworks = @use_frameworks
|
163
|
-
validator.ignore_public_only_results = @private
|
164
|
-
validator.validate
|
165
|
-
|
166
|
-
unless @clean
|
167
|
-
UI.puts "Pods workspace available at `#{validator.validation_dir}/App.xcworkspace` for inspection."
|
168
|
-
UI.puts
|
169
|
-
end
|
170
|
-
if validator.validated?
|
171
|
-
UI.puts "#{validator.spec.name} passed validation.".green
|
172
|
-
else
|
173
|
-
spec_name = podspec
|
174
|
-
spec_name = validator.spec.name if validator.spec
|
175
|
-
message = "#{spec_name} did not pass validation, due to #{validator.failure_reason}."
|
176
|
-
|
177
|
-
if @clean
|
178
|
-
message << "\nYou can use the `--no-clean` option to inspect " \
|
179
|
-
'any issue.'
|
180
|
-
end
|
181
|
-
raise Informative, message
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
private
|
187
|
-
|
188
|
-
#----------------------------------------#
|
189
|
-
|
190
|
-
# !@group Private helpers
|
191
|
-
|
192
|
-
# @return [Pathname] The path of the podspec found in the current
|
193
|
-
# working directory.
|
194
|
-
#
|
195
|
-
# @raise If no podspec is found.
|
196
|
-
# @raise If multiple podspecs are found.
|
197
|
-
#
|
198
|
-
def podspecs_to_lint
|
199
|
-
if !@podspecs_paths.empty?
|
200
|
-
Array(@podspecs_paths)
|
201
|
-
else
|
202
|
-
podspecs = Pathname.glob(Pathname.pwd + '*.podspec{.json,}')
|
203
|
-
if podspecs.count.zero?
|
204
|
-
raise Informative, 'Unable to find a podspec in the working ' \
|
205
|
-
'directory'
|
206
|
-
end
|
207
|
-
podspecs
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
#-----------------------------------------------------------------------#
|
213
9
|
end
|
214
10
|
end
|
215
11
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class Lib < Command
|
4
|
+
class Create < Lib
|
5
|
+
self.summary = 'Creates a new Pod'
|
6
|
+
|
7
|
+
self.description = <<-DESC
|
8
|
+
Creates a scaffold for the development of a new Pod named `NAME`
|
9
|
+
according to the CocoaPods best practices.
|
10
|
+
If a `TEMPLATE_URL`, pointing to a git repo containing a compatible
|
11
|
+
template, is specified, it will be used in place of the default one.
|
12
|
+
DESC
|
13
|
+
|
14
|
+
self.arguments = [
|
15
|
+
CLAide::Argument.new('NAME', true),
|
16
|
+
]
|
17
|
+
|
18
|
+
def self.options
|
19
|
+
[
|
20
|
+
['--template-url=URL', 'The URL of the git repo containing a ' \
|
21
|
+
'compatible template'],
|
22
|
+
].concat(super)
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(argv)
|
26
|
+
@name = argv.shift_argument
|
27
|
+
@template_url = argv.option('template-url', TEMPLATE_REPO)
|
28
|
+
super
|
29
|
+
@additional_args = argv.remainder!
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate!
|
33
|
+
super
|
34
|
+
help! 'A name for the Pod is required.' unless @name
|
35
|
+
help! 'The Pod name cannot contain spaces.' if @name =~ /\s/
|
36
|
+
help! 'The Pod name cannot contain plusses.' if @name =~ /\+/
|
37
|
+
help! "The Pod name cannot begin with a '.'" if @name[0, 1] == '.'
|
38
|
+
end
|
39
|
+
|
40
|
+
def run
|
41
|
+
clone_template
|
42
|
+
configure_template
|
43
|
+
print_info
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
#----------------------------------------#
|
49
|
+
|
50
|
+
# !@group Private helpers
|
51
|
+
|
52
|
+
extend Executable
|
53
|
+
executable :git
|
54
|
+
|
55
|
+
TEMPLATE_REPO = 'https://github.com/CocoaPods/pod-template.git'.freeze
|
56
|
+
TEMPLATE_INFO_URL = 'https://github.com/CocoaPods/pod-template'.freeze
|
57
|
+
CREATE_NEW_POD_INFO_URL = 'http://guides.cocoapods.org/making/making-a-cocoapod'.freeze
|
58
|
+
|
59
|
+
# Clones the template from the remote in the working directory using
|
60
|
+
# the name of the Pod.
|
61
|
+
#
|
62
|
+
# @return [void]
|
63
|
+
#
|
64
|
+
def clone_template
|
65
|
+
UI.section("Cloning `#{template_repo_url}` into `#{@name}`.") do
|
66
|
+
git! ['clone', template_repo_url, @name]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Runs the template configuration utilities.
|
71
|
+
#
|
72
|
+
# @return [void]
|
73
|
+
#
|
74
|
+
def configure_template
|
75
|
+
UI.section("Configuring #{@name} template.") do
|
76
|
+
Dir.chdir(@name) do
|
77
|
+
if File.exist?('configure')
|
78
|
+
system('./configure', @name, *@additional_args)
|
79
|
+
else
|
80
|
+
UI.warn 'Template does not have a configure file.'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Runs the template configuration utilities.
|
87
|
+
#
|
88
|
+
# @return [void]
|
89
|
+
#
|
90
|
+
def print_info
|
91
|
+
UI.puts "\nTo learn more about the template see `#{template_repo_url}`."
|
92
|
+
UI.puts "To learn more about creating a new pod, see `#{CREATE_NEW_POD_INFO_URL}`."
|
93
|
+
end
|
94
|
+
|
95
|
+
# Checks if a template URL is given else returns the TEMPLATE_REPO URL
|
96
|
+
#
|
97
|
+
# @return String
|
98
|
+
#
|
99
|
+
def template_repo_url
|
100
|
+
@template_url || TEMPLATE_REPO
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module Pod
|
2
|
+
class Command
|
3
|
+
class Lib < Command
|
4
|
+
class Lint < Lib
|
5
|
+
self.summary = 'Validates a Pod'
|
6
|
+
|
7
|
+
self.description = <<-DESC
|
8
|
+
Validates the Pod using the files in the working directory.
|
9
|
+
DESC
|
10
|
+
|
11
|
+
def self.options
|
12
|
+
[
|
13
|
+
['--quick', 'Lint skips checks that would require to download and build the spec'],
|
14
|
+
['--allow-warnings', 'Lint validates even if warnings are present'],
|
15
|
+
['--subspec=NAME', 'Lint validates only the given subspec'],
|
16
|
+
['--no-subspecs', 'Lint skips validation of subspecs'],
|
17
|
+
['--no-clean', 'Lint leaves the build directory intact for inspection'],
|
18
|
+
['--fail-fast', 'Lint stops on the first failing platform or subspec'],
|
19
|
+
['--use-libraries', 'Lint uses static libraries to install the spec'],
|
20
|
+
['--sources=https://github.com/artsy/Specs,master', 'The sources from which to pull dependent pods ' \
|
21
|
+
'(defaults to https://github.com/CocoaPods/Specs.git). ' \
|
22
|
+
'Multiple sources must be comma-delimited.'],
|
23
|
+
['--private', 'Lint skips checks that apply only to public specs'],
|
24
|
+
].concat(super)
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(argv)
|
28
|
+
@quick = argv.flag?('quick')
|
29
|
+
@allow_warnings = argv.flag?('allow-warnings')
|
30
|
+
@clean = argv.flag?('clean', true)
|
31
|
+
@fail_fast = argv.flag?('fail-fast', false)
|
32
|
+
@subspecs = argv.flag?('subspecs', true)
|
33
|
+
@only_subspec = argv.option('subspec')
|
34
|
+
@use_frameworks = !argv.flag?('use-libraries')
|
35
|
+
@source_urls = argv.option('sources', 'https://github.com/CocoaPods/Specs.git').split(',')
|
36
|
+
@private = argv.flag?('private', false)
|
37
|
+
@podspecs_paths = argv.arguments!
|
38
|
+
super
|
39
|
+
end
|
40
|
+
|
41
|
+
def validate!
|
42
|
+
super
|
43
|
+
end
|
44
|
+
|
45
|
+
def run
|
46
|
+
UI.puts
|
47
|
+
podspecs_to_lint.each do |podspec|
|
48
|
+
validator = Validator.new(podspec, @source_urls)
|
49
|
+
validator.local = true
|
50
|
+
validator.quick = @quick
|
51
|
+
validator.no_clean = !@clean
|
52
|
+
validator.fail_fast = @fail_fast
|
53
|
+
validator.allow_warnings = @allow_warnings
|
54
|
+
validator.no_subspecs = !@subspecs || @only_subspec
|
55
|
+
validator.only_subspec = @only_subspec
|
56
|
+
validator.use_frameworks = @use_frameworks
|
57
|
+
validator.ignore_public_only_results = @private
|
58
|
+
validator.validate
|
59
|
+
|
60
|
+
unless @clean
|
61
|
+
UI.puts "Pods workspace available at `#{validator.validation_dir}/App.xcworkspace` for inspection."
|
62
|
+
UI.puts
|
63
|
+
end
|
64
|
+
if validator.validated?
|
65
|
+
UI.puts "#{validator.spec.name} passed validation.".green
|
66
|
+
else
|
67
|
+
spec_name = podspec
|
68
|
+
spec_name = validator.spec.name if validator.spec
|
69
|
+
message = "#{spec_name} did not pass validation, due to #{validator.failure_reason}."
|
70
|
+
|
71
|
+
if @clean
|
72
|
+
message << "\nYou can use the `--no-clean` option to inspect " \
|
73
|
+
'any issue.'
|
74
|
+
end
|
75
|
+
raise Informative, message
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
#----------------------------------------#
|
83
|
+
|
84
|
+
# !@group Private helpers
|
85
|
+
|
86
|
+
# @return [Pathname] The path of the podspec found in the current
|
87
|
+
# working directory.
|
88
|
+
#
|
89
|
+
# @raise If no podspec is found.
|
90
|
+
# @raise If multiple podspecs are found.
|
91
|
+
#
|
92
|
+
def podspecs_to_lint
|
93
|
+
if !@podspecs_paths.empty?
|
94
|
+
Array(@podspecs_paths)
|
95
|
+
else
|
96
|
+
podspecs = Pathname.glob(Pathname.pwd + '*.podspec{.json,}')
|
97
|
+
if podspecs.count.zero?
|
98
|
+
raise Informative, 'Unable to find a podspec in the working ' \
|
99
|
+
'directory'
|
100
|
+
end
|
101
|
+
podspecs
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -49,14 +49,13 @@ module Pod
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def validate!
|
52
|
+
super
|
52
53
|
help! 'A spec-repo name is required.' unless @repo
|
53
54
|
unless @source.repo.directory?
|
54
55
|
raise Informative,
|
55
56
|
"Unable to find the `#{@repo}` repo. " \
|
56
57
|
'If it has not yet been cloned, add it via `pod repo add`.'
|
57
58
|
end
|
58
|
-
|
59
|
-
super
|
60
59
|
end
|
61
60
|
|
62
61
|
def run
|
data/lib/cocoapods/config.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/multibyte/unicode'
|
2
|
+
|
1
3
|
module Pod
|
2
4
|
# Stores the global configuration of CocoaPods.
|
3
5
|
#
|
@@ -145,7 +147,8 @@ module Pod
|
|
145
147
|
# Podfile is located.
|
146
148
|
#
|
147
149
|
def installation_root
|
148
|
-
|
150
|
+
current_dir = ActiveSupport::Multibyte::Unicode.normalize(Dir.pwd)
|
151
|
+
current_path = Pathname.new(current_dir)
|
149
152
|
unless @installation_root
|
150
153
|
until current_path.root?
|
151
154
|
if podfile_path_in_dir(current_path)
|
data/lib/cocoapods/executable.rb
CHANGED
@@ -108,7 +108,7 @@ module Pod
|
|
108
108
|
#
|
109
109
|
def self.which!(program)
|
110
110
|
which(program).tap do |bin|
|
111
|
-
raise Informative, "Unable to locate the executable `#{
|
111
|
+
raise Informative, "Unable to locate the executable `#{program}`" unless bin
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
@@ -144,8 +144,8 @@ EOM
|
|
144
144
|
ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$RESOURCE_PATH\\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
|
145
145
|
;;
|
146
146
|
*\.xib)
|
147
|
-
echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$RESOURCE_PATH\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT}"
|
148
|
-
ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$RESOURCE_PATH\\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}"
|
147
|
+
echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$RESOURCE_PATH\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
|
148
|
+
ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\"$RESOURCE_PATH\\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
|
149
149
|
;;
|
150
150
|
*.framework)
|
151
151
|
echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
|
@@ -32,6 +32,7 @@ module Pod
|
|
32
32
|
target.file_accessors.flat_map(&:public_headers).map(&:basename)
|
33
33
|
end
|
34
34
|
end
|
35
|
+
create_build_phase_to_symlink_header_folders
|
35
36
|
end
|
36
37
|
create_prefix_header
|
37
38
|
create_dummy_source
|
@@ -216,6 +217,26 @@ module Pod
|
|
216
217
|
end
|
217
218
|
end
|
218
219
|
|
220
|
+
# Creates a build phase which links the versioned header folders
|
221
|
+
# of the OS X into the framework bundle's root root directory.
|
222
|
+
# This is only necessary because the way how headers are copied
|
223
|
+
# via custom copy file build phases in combination with
|
224
|
+
# header_mappings_dir interferes with xcodebuild's expectations
|
225
|
+
# about the existence of private or public headers.
|
226
|
+
#
|
227
|
+
# @return [void]
|
228
|
+
#
|
229
|
+
def create_build_phase_to_symlink_header_folders
|
230
|
+
return unless target.platform.name == :osx && header_mappings_dir
|
231
|
+
|
232
|
+
build_phase = native_target.new_shell_script_build_phase('Create Symlinks to Header Folders')
|
233
|
+
build_phase.shell_script = <<-eos.strip_heredoc
|
234
|
+
cd "$CONFIGURATION_BUILD_DIR/$WRAPPER_NAME"
|
235
|
+
ln -fs ${PUBLIC_HEADERS_FOLDER_PATH\#$WRAPPER_NAME/} ${PUBLIC_HEADERS_FOLDER_PATH\#\$CONTENTS_FOLDER_PATH/}
|
236
|
+
ln -fs ${PRIVATE_HEADERS_FOLDER_PATH\#\$WRAPPER_NAME/} ${PRIVATE_HEADERS_FOLDER_PATH\#\$CONTENTS_FOLDER_PATH/}
|
237
|
+
eos
|
238
|
+
end
|
239
|
+
|
219
240
|
# Creates a prefix header file which imports `UIKit` or `Cocoa` according
|
220
241
|
# to the platform of the target. This file also include any prefix header
|
221
242
|
# content reported by the specification of the pods.
|
@@ -11,7 +11,7 @@ module Pod
|
|
11
11
|
|
12
12
|
# @return [String] the PACKAGE emoji to use as prefix for every build phase aded to the user project
|
13
13
|
#
|
14
|
-
BUILD_PHASE_PREFIX =
|
14
|
+
BUILD_PHASE_PREFIX = '[CP] '.freeze
|
15
15
|
|
16
16
|
# @return [String] the name of the check manifest phase
|
17
17
|
#
|
@@ -215,8 +215,7 @@ module Pod
|
|
215
215
|
def create_or_update_build_phase(target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
|
216
216
|
prefixed_phase_name = BUILD_PHASE_PREFIX + phase_name
|
217
217
|
build_phases = target.build_phases.grep(phase_class)
|
218
|
-
build_phases.find { |phase| phase.name
|
219
|
-
build_phases.find { |phase| phase.name == phase_name }.tap { |p| p.name = prefixed_phase_name if p } ||
|
218
|
+
build_phases.find { |phase| phase.name && phase.name.end_with?(phase_name) }.tap { |p| p.name = prefixed_phase_name if p } ||
|
220
219
|
target.project.new(phase_class).tap do |phase|
|
221
220
|
UI.message("Adding Build Phase '#{prefixed_phase_name}' to project.") do
|
222
221
|
phase.name = prefixed_phase_name
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/multibyte/unicode'
|
2
|
+
|
1
3
|
module Pod
|
2
4
|
class Sandbox
|
3
5
|
# The PathList class is designed to perform multiple glob matches against
|
@@ -20,7 +22,8 @@ module Pod
|
|
20
22
|
# @param [Pathname] root The root of the PathList.
|
21
23
|
#
|
22
24
|
def initialize(root)
|
23
|
-
|
25
|
+
root_dir = ActiveSupport::Multibyte::Unicode.normalize(root.to_s)
|
26
|
+
@root = Pathname.new(root_dir)
|
24
27
|
@glob_cache = {}
|
25
28
|
end
|
26
29
|
|
@@ -47,15 +50,12 @@ module Pod
|
|
47
50
|
unless root.exist?
|
48
51
|
raise Informative, "Attempt to read non existent folder `#{root}`."
|
49
52
|
end
|
50
|
-
root_length = root.to_s.length + 1
|
51
53
|
escaped_root = escape_path_for_glob(root)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
@files = relative_paths - relative_dirs
|
58
|
-
@dirs = relative_dirs.map { |d| d.gsub(/\/\.\.?$/, '') }.reject { |d| d == '.' || d == '..' } .uniq
|
54
|
+
absolute_paths = Pathname.glob(escaped_root + '**/*', File::FNM_DOTMATCH)
|
55
|
+
dirs_and_files = absolute_paths.reject { |path| path.basename.to_s =~ /^\.\.?$/ }
|
56
|
+
relative_paths = dirs_and_files.map { |path| path.relative_path_from(root) }
|
57
|
+
sorted_paths = relative_paths.map(&:to_s).sort_by(&:upcase)
|
58
|
+
@dirs, @files = sorted_paths.partition { |path| File.directory?(root + path) }
|
59
59
|
@glob_cache = {}
|
60
60
|
end
|
61
61
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'cocoapods-core/source'
|
2
|
+
require 'set'
|
2
3
|
|
3
4
|
module Pod
|
4
5
|
class Source
|
@@ -141,8 +142,6 @@ module Pod
|
|
141
142
|
"CocoaPods #{latest_cocoapods_version} is available.".green,
|
142
143
|
"To update use: `#{install_message}`".green,
|
143
144
|
("[!] This is a test version we'd love you to try.".yellow if rc),
|
144
|
-
("Until we reach version 1.0 the features of CocoaPods can and will change.\n" \
|
145
|
-
'We strongly recommend that you use the latest version at all times.'.yellow unless rc),
|
146
145
|
'',
|
147
146
|
'For more information, see https://blog.cocoapods.org ' \
|
148
147
|
'and the CHANGELOG for this version at ' \
|
@@ -7,7 +7,7 @@ module Pod
|
|
7
7
|
module UserInterface
|
8
8
|
require 'colored'
|
9
9
|
|
10
|
-
@title_colors = %w( yellow green
|
10
|
+
@title_colors = %w( yellow green )
|
11
11
|
@title_level = 0
|
12
12
|
@indentation_level = 2
|
13
13
|
@treat_titles_as_messages = false
|
@@ -117,9 +117,6 @@ module Pod
|
|
117
117
|
self.title_level -= 1
|
118
118
|
end
|
119
119
|
|
120
|
-
# def title(title, verbose_prefix = '', relative_indentation = 2)
|
121
|
-
# end
|
122
|
-
|
123
120
|
# Prints a verbose message taking an optional verbose prefix and
|
124
121
|
# a relative indentation valid for the UI action in the passed
|
125
122
|
# block.
|
data/lib/cocoapods/validator.rb
CHANGED
@@ -575,7 +575,7 @@ module Pod
|
|
575
575
|
end
|
576
576
|
non_source_files = header_files - file_accessor.source_files
|
577
577
|
unless non_source_files.empty?
|
578
|
-
error(attr_name, 'The pattern includes header files that are not listed' \
|
578
|
+
error(attr_name, 'The pattern includes header files that are not listed ' \
|
579
579
|
"in source_files (#{non_source_files.join(', ')}).")
|
580
580
|
end
|
581
581
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eloy Duran
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2016-
|
14
|
+
date: 2016-06-02 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: cocoapods-core
|
@@ -19,14 +19,14 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - '='
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.0.
|
22
|
+
version: 1.0.1
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - '='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.0.
|
29
|
+
version: 1.0.1
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: claide
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -207,7 +207,7 @@ dependencies:
|
|
207
207
|
requirements:
|
208
208
|
- - '>='
|
209
209
|
- !ruby/object:Gem::Version
|
210
|
-
version: 1.
|
210
|
+
version: 1.1.0
|
211
211
|
- - <
|
212
212
|
- !ruby/object:Gem::Version
|
213
213
|
version: '2.0'
|
@@ -217,7 +217,7 @@ dependencies:
|
|
217
217
|
requirements:
|
218
218
|
- - '>='
|
219
219
|
- !ruby/object:Gem::Version
|
220
|
-
version: 1.
|
220
|
+
version: 1.1.0
|
221
221
|
- - <
|
222
222
|
- !ruby/object:Gem::Version
|
223
223
|
version: '2.0'
|
@@ -363,8 +363,15 @@ files:
|
|
363
363
|
- lib/cocoapods/command/env.rb
|
364
364
|
- lib/cocoapods/command/init.rb
|
365
365
|
- lib/cocoapods/command/install.rb
|
366
|
-
- lib/cocoapods/command/
|
366
|
+
- lib/cocoapods/command/ipc.rb
|
367
|
+
- lib/cocoapods/command/ipc/list.rb
|
368
|
+
- lib/cocoapods/command/ipc/podfile.rb
|
369
|
+
- lib/cocoapods/command/ipc/repl.rb
|
370
|
+
- lib/cocoapods/command/ipc/spec.rb
|
371
|
+
- lib/cocoapods/command/ipc/update_search_index.rb
|
367
372
|
- lib/cocoapods/command/lib.rb
|
373
|
+
- lib/cocoapods/command/lib/create.rb
|
374
|
+
- lib/cocoapods/command/lib/lint.rb
|
368
375
|
- lib/cocoapods/command/list.rb
|
369
376
|
- lib/cocoapods/command/options/project_directory.rb
|
370
377
|
- lib/cocoapods/command/options/repo_update.rb
|
@@ -1,177 +0,0 @@
|
|
1
|
-
module Pod
|
2
|
-
class Command
|
3
|
-
class IPC < Command
|
4
|
-
self.abstract_command = true
|
5
|
-
self.summary = 'Inter-process communication'
|
6
|
-
|
7
|
-
def output_pipe
|
8
|
-
STDOUT
|
9
|
-
end
|
10
|
-
|
11
|
-
#-----------------------------------------------------------------------#
|
12
|
-
|
13
|
-
class Spec < IPC
|
14
|
-
self.summary = 'Converts a podspec to JSON'
|
15
|
-
self.description = 'Converts a podspec to JSON and prints it to STDOUT.'
|
16
|
-
self.arguments = [
|
17
|
-
CLAide::Argument.new('PATH', true),
|
18
|
-
]
|
19
|
-
|
20
|
-
def initialize(argv)
|
21
|
-
@path = argv.shift_argument
|
22
|
-
super
|
23
|
-
end
|
24
|
-
|
25
|
-
def validate!
|
26
|
-
super
|
27
|
-
help! 'A specification path is required.' unless @path
|
28
|
-
end
|
29
|
-
|
30
|
-
def run
|
31
|
-
require 'json'
|
32
|
-
spec = Specification.from_file(@path)
|
33
|
-
output_pipe.puts(spec.to_pretty_json)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
#-----------------------------------------------------------------------#
|
38
|
-
|
39
|
-
class Podfile < IPC
|
40
|
-
include ProjectDirectory
|
41
|
-
|
42
|
-
self.summary = 'Converts a Podfile to YAML'
|
43
|
-
self.description = 'Converts a Podfile to YAML and prints it to STDOUT.'
|
44
|
-
self.arguments = [
|
45
|
-
CLAide::Argument.new('PATH', true),
|
46
|
-
]
|
47
|
-
|
48
|
-
def initialize(argv)
|
49
|
-
@path = argv.shift_argument
|
50
|
-
super
|
51
|
-
end
|
52
|
-
|
53
|
-
def validate!
|
54
|
-
super
|
55
|
-
help! 'A Podfile path is required.' unless @path
|
56
|
-
end
|
57
|
-
|
58
|
-
def run
|
59
|
-
require 'yaml'
|
60
|
-
podfile = Pod::Podfile.from_file(@path)
|
61
|
-
output_pipe.puts podfile.to_yaml
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
#-----------------------------------------------------------------------#
|
66
|
-
|
67
|
-
class List < IPC
|
68
|
-
self.summary = 'Lists the specifications known to CocoaPods'
|
69
|
-
self.description = <<-DESC
|
70
|
-
Prints to STDOUT a YAML dictionary where the keys are the name of the
|
71
|
-
specifications and each corresponding value is a dictionary with
|
72
|
-
the following keys:
|
73
|
-
|
74
|
-
- defined_in_file
|
75
|
-
- version
|
76
|
-
- authors
|
77
|
-
- summary
|
78
|
-
- description
|
79
|
-
- platforms
|
80
|
-
DESC
|
81
|
-
|
82
|
-
def run
|
83
|
-
require 'yaml'
|
84
|
-
sets = config.sources_manager.aggregate.all_sets
|
85
|
-
result = {}
|
86
|
-
sets.each do |set|
|
87
|
-
begin
|
88
|
-
spec = set.specification
|
89
|
-
result[spec.name] = {
|
90
|
-
'authors' => spec.authors.keys,
|
91
|
-
'summary' => spec.summary,
|
92
|
-
'description' => spec.description,
|
93
|
-
'platforms' => spec.available_platforms.map { |p| p.name.to_s },
|
94
|
-
}
|
95
|
-
rescue DSLError
|
96
|
-
next
|
97
|
-
end
|
98
|
-
end
|
99
|
-
output_pipe.puts result.to_yaml
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
#-----------------------------------------------------------------------#
|
104
|
-
|
105
|
-
class UpdateSearchIndex < IPC
|
106
|
-
self.summary = 'Updates the search index'
|
107
|
-
self.description = <<-DESC
|
108
|
-
Updates the search index and prints its path to standard output.
|
109
|
-
The search index is a YAML encoded dictionary where the keys
|
110
|
-
are the names of the Pods and the values are a dictionary containing
|
111
|
-
the following information:
|
112
|
-
|
113
|
-
- version
|
114
|
-
- summary
|
115
|
-
- description
|
116
|
-
- authors
|
117
|
-
DESC
|
118
|
-
|
119
|
-
def run
|
120
|
-
config.sources_manager.updated_search_index
|
121
|
-
output_pipe.puts(config.sources_manager.search_index_path)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
#-----------------------------------------------------------------------#
|
126
|
-
|
127
|
-
class Repl < IPC
|
128
|
-
include ProjectDirectory
|
129
|
-
|
130
|
-
END_OF_OUTPUT_SIGNAL = "\n\r"
|
131
|
-
|
132
|
-
self.summary = 'The repl listens to commands on standard input'
|
133
|
-
self.description = <<-DESC
|
134
|
-
The repl listens to commands on standard input and prints their
|
135
|
-
result to standard output.
|
136
|
-
|
137
|
-
It accepts all the other ipc subcommands. The repl will signal the
|
138
|
-
end of output with the the ASCII CR+LF `\\n\\r`.
|
139
|
-
DESC
|
140
|
-
|
141
|
-
def run
|
142
|
-
print_version
|
143
|
-
signal_end_of_output
|
144
|
-
listen
|
145
|
-
end
|
146
|
-
|
147
|
-
def print_version
|
148
|
-
output_pipe.puts "version: '#{Pod::VERSION}'"
|
149
|
-
end
|
150
|
-
|
151
|
-
def signal_end_of_output
|
152
|
-
output_pipe.puts(END_OF_OUTPUT_SIGNAL)
|
153
|
-
STDOUT.flush
|
154
|
-
end
|
155
|
-
|
156
|
-
def listen
|
157
|
-
while repl_command = STDIN.gets
|
158
|
-
execute_repl_command(repl_command)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
def execute_repl_command(repl_command)
|
163
|
-
if (repl_command != "\n")
|
164
|
-
repl_commands = repl_command.split
|
165
|
-
subcommand = repl_commands.shift.capitalize
|
166
|
-
arguments = repl_commands
|
167
|
-
subcommand_class = Pod::Command::IPC.const_get(subcommand)
|
168
|
-
subcommand_class.new(CLAide::ARGV.new(arguments)).run
|
169
|
-
signal_end_of_output
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
#-----------------------------------------------------------------------#
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|