cocoapods-trunk 0.4.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 05d7b8d9b45b2789d9a5ba64682e53f65b6316d8
4
- data.tar.gz: d5c2c20b498a1c9f6ba68486028c7da89b425446
3
+ metadata.gz: 94cb63750c2a1c96259b49e0f5a551cdb70cf456
4
+ data.tar.gz: 52a4b68041e9c1fe535f39e24390b6244a3fbbdb
5
5
  SHA512:
6
- metadata.gz: d01e7c395ee6338c8cb00c1bf2068e680ba01bcd075103aaf0d84f5bdf0945dca2695c06b1cb46722b005451b63e869a335632dc43d0da2ac4fc4c737984ed07
7
- data.tar.gz: ed35d3e3d694edf9542089db96e389b9c47b621a9c776c2e9f5c9f3df21326454bbc6b44a02b5666167a49df8840e02e66cec793ffc47ebf37ac33ee4e6d3cf5
6
+ metadata.gz: 3a71c8f8aae5896c00ecd59fb8693929ae5862e3e9c0d4c2d565a17c75a662418e8fba83e1355e66d67c7ab0a56740e0add1c11a44fbcec576b9c9eed3bc0e46
7
+ data.tar.gz: ee6ba3be0dcc8972b15ad510e7364df215d72372956a09683a902b491d6428e017d2b3db7d436db31e6490bd8e276cfc4f2cdddc40c7b3fe2f01fb88c957a634
@@ -42,6 +42,9 @@ Encoding:
42
42
  TrailingComma:
43
43
  EnforcedStyleForMultiline: comma
44
44
 
45
+ Style/MultilineOperationIndentation:
46
+ EnforcedStyle: indented
47
+
45
48
  # Clashes with CLAide Command#validate!
46
49
  GuardClause:
47
50
  Enabled: false
@@ -50,6 +53,25 @@ GuardClause:
50
53
  Next:
51
54
  Enabled: false
52
55
 
56
+ # Arbitrary max lengths for classes simply do not work and enabling this will
57
+ # lead to a never ending stream of annoyance and changes.
58
+ Metrics/ClassLength:
59
+ Enabled: false
60
+
61
+ # No enforced convention here.
62
+ Metrics/BlockNesting:
63
+ Enabled: false
64
+
65
+ # It will be obvious which code is complex, Rubocop should only lint simple
66
+ # rules for us.
67
+ Metrics/AbcSize:
68
+ Enabled: false
69
+
70
+ # It will be obvious which code is complex, Rubocop should only lint simple
71
+ # rules for us.
72
+ Metrics/CyclomaticComplexity:
73
+ Enabled: false
74
+
53
75
  #- CocoaPods support for Ruby 1.8.7 ------------------------------------------#
54
76
 
55
77
  HashSyntax:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## 0.4.1
2
+
3
+ ##### Enhancements
4
+
5
+ * Improved code readability and structure by splitting subcommands
6
+ into individual files.
7
+ [Olivier Halligon](https://github.com/alisoftware)
8
+ [#21](https://github.com/CocoaPods/CocoaPods/issues/21)
9
+
10
+ ##### Bug Fixes
11
+
12
+ * Updates for changes in CocoaPods regarding `--allow-warnings`.
13
+ [Kyle Fuller](https://github.com/kylef)
14
+ [Cocoapods#2831](https://github.com/CocoaPods/CocoaPods/pull/2831)
15
+
16
+
1
17
  ## 0.4.0
2
18
 
3
19
  ##### Bug Fixes
data/Gemfile CHANGED
@@ -17,6 +17,6 @@ group :development do
17
17
  gem 'prettybacon'
18
18
 
19
19
  gem 'codeclimate-test-reporter', :require => nil
20
- gem 'rubocop', '~> 0.26.0'
20
+ gem 'rubocop'
21
21
  end
22
22
 
data/Gemfile.lock CHANGED
@@ -1,20 +1,20 @@
1
1
  GIT
2
2
  remote: https://github.com/CocoaPods/CLAide.git
3
- revision: 00986e2b185c6eca9d30a7d50073f2a819a0f61a
3
+ revision: b1eccc296b68b1a432e42ecf0c4b799d8551c75c
4
4
  branch: master
5
5
  specs:
6
6
  claide (0.7.0)
7
7
 
8
8
  GIT
9
9
  remote: https://github.com/CocoaPods/CocoaPods.git
10
- revision: e7bb85be814527b65a3785ed93d869f75df3e932
10
+ revision: 1703a3464674baecf54bd7e766f4b37ed8fc43f7
11
11
  branch: master
12
12
  specs:
13
- cocoapods (0.35.0.rc1)
13
+ cocoapods (0.35.0.rc2)
14
14
  activesupport (>= 3.2.15)
15
15
  claide (~> 0.7.0)
16
- cocoapods-core (= 0.35.0.rc1)
17
- cocoapods-downloader (~> 0.7.2)
16
+ cocoapods-core (= 0.35.0.rc2)
17
+ cocoapods-downloader (~> 0.8.0)
18
18
  cocoapods-plugins (~> 0.3.1)
19
19
  cocoapods-trunk (~> 0.4.0)
20
20
  cocoapods-try (~> 0.4.2)
@@ -23,14 +23,14 @@ GIT
23
23
  molinillo (~> 0.1.1)
24
24
  nap (~> 0.8)
25
25
  open4 (~> 1.3)
26
- xcodeproj (~> 0.20.1)
26
+ xcodeproj (~> 0.20.2)
27
27
 
28
28
  GIT
29
29
  remote: https://github.com/CocoaPods/Core.git
30
- revision: 4c7709ceb26c1d555a765d8a8ec8198bcb94fc0c
30
+ revision: 60a486e8141323390dc5ff7f6676cf893a251a48
31
31
  branch: master
32
32
  specs:
33
- cocoapods-core (0.35.0.rc1)
33
+ cocoapods-core (0.35.0.rc2)
34
34
  activesupport (>= 3.2.15)
35
35
  fuzzy_match (~> 2.0.4)
36
36
  nap (~> 0.8.0)
@@ -38,14 +38,14 @@ GIT
38
38
  PATH
39
39
  remote: .
40
40
  specs:
41
- cocoapods-trunk (0.4.0)
41
+ cocoapods-trunk (0.4.1)
42
42
  nap (>= 0.8)
43
43
  netrc (= 0.7.8)
44
44
 
45
45
  GEM
46
46
  remote: https://rubygems.org/
47
47
  specs:
48
- activesupport (4.1.7)
48
+ activesupport (4.1.8)
49
49
  i18n (~> 0.6, >= 0.6.9)
50
50
  json (~> 1.7, >= 1.7.7)
51
51
  minitest (~> 5.1)
@@ -55,7 +55,7 @@ GEM
55
55
  astrolabe (1.3.0)
56
56
  parser (>= 2.2.0.pre.3, < 3.0)
57
57
  bacon (1.2.0)
58
- cocoapods-downloader (0.7.2)
58
+ cocoapods-downloader (0.8.0)
59
59
  cocoapods-plugins (0.3.2)
60
60
  nap
61
61
  cocoapods-try (0.4.2)
@@ -76,7 +76,7 @@ GEM
76
76
  rb-inotify (>= 0.9)
77
77
  rb-kqueue (>= 0.2)
78
78
  metaclass (0.0.4)
79
- minitest (5.4.2)
79
+ minitest (5.4.3)
80
80
  mocha (1.1.0)
81
81
  metaclass (~> 0.0.1)
82
82
  mocha-on-bacon (0.2.2)
@@ -100,9 +100,9 @@ GEM
100
100
  ffi (>= 0.5.0)
101
101
  rb-kqueue (0.2.3)
102
102
  ffi (>= 0.5.0)
103
- rubocop (0.26.1)
103
+ rubocop (0.27.1)
104
104
  astrolabe (~> 1.3)
105
- parser (>= 2.2.0.pre.4, < 3.0)
105
+ parser (>= 2.2.0.pre.7, < 3.0)
106
106
  powerpack (~> 0.0.6)
107
107
  rainbow (>= 1.99.1, < 3.0)
108
108
  ruby-progressbar (~> 1.4)
@@ -116,7 +116,7 @@ GEM
116
116
  thread_safe (0.3.4)
117
117
  tzinfo (1.2.2)
118
118
  thread_safe (~> 0.1)
119
- xcodeproj (0.20.1)
119
+ xcodeproj (0.20.2)
120
120
  activesupport (>= 3)
121
121
  colored (~> 1.2)
122
122
 
@@ -137,4 +137,4 @@ DEPENDENCIES
137
137
  mocha-on-bacon
138
138
  prettybacon
139
139
  rake
140
- rubocop (~> 0.26.0)
140
+ rubocop
@@ -1,11 +1,11 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'trunk/version'
4
+ require 'cocoapods_trunk'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "cocoapods-trunk"
8
- spec.version = Cocoapods::Trunk::VERSION
8
+ spec.version = CocoaPodsTrunk::VERSION
9
9
  spec.authors = ["Eloy Durán"]
10
10
  spec.email = ["eloy.de.enige@gmail.com"]
11
11
  spec.summary = "Interact with trunk.cocoapods.org"
@@ -0,0 +1,3 @@
1
+ module CocoaPodsTrunk
2
+ VERSION = '0.4.1'
3
+ end
@@ -13,334 +13,10 @@ module Pod
13
13
  SCHEME_AND_HOST = ENV['TRUNK_SCHEME_AND_HOST'] || 'https://trunk.cocoapods.org'
14
14
  BASE_URL = "#{SCHEME_AND_HOST}/api/v1"
15
15
 
16
- class Register < Trunk
17
- self.summary = 'Manage sessions'
18
- self.description = <<-DESC
19
- Register a new account, or create a new session.
20
-
21
- If this is your first registration, both an `EMAIL` address and your
22
- `NAME` are required. If you've already registered with trunk, you may
23
- omit the `NAME` (unless you would like to change it).
24
-
25
- It is recommended that you provide a description of the session, so
26
- that it will be easier to identify later on. For instance, when you
27
- would like to clean-up your sessions. A common example is to specify
28
- the location where the machine, that you are using the session for, is
29
- physically located.
30
-
31
- Examples:
32
-
33
- $ pod trunk register eloy@example.com 'Eloy Durán' --description='Personal Laptop'
34
- $ pod trunk register eloy@example.com --description='Work Laptop'
35
- $ pod trunk register eloy@example.com
36
- DESC
37
-
38
- self.arguments = [
39
- CLAide::Argument.new('EMAIL', true),
40
- CLAide::Argument.new('NAME', false),
41
- ]
42
-
43
- def self.options
44
- [
45
- ['--description=DESCRIPTION', 'An arbitrary description to ' \
46
- 'easily identify your session ' \
47
- 'later on.'],
48
- ].concat(super)
49
- end
50
-
51
- def initialize(argv)
52
- @session_description = argv.option('description')
53
- @email, @name = argv.shift_argument, argv.shift_argument
54
- super
55
- end
56
-
57
- def validate!
58
- super
59
- unless @email
60
- help! 'Specify at least your email address.'
61
- end
62
- end
63
-
64
- def run
65
- body = {
66
- 'email' => @email,
67
- 'name' => @name,
68
- 'description' => @session_description,
69
- }.to_json
70
- json = json(request_path(:post, 'sessions', body, default_headers))
71
- save_token(json['token'])
72
- # TODO UI.notice inserts an empty line :/
73
- puts '[!] Please verify the session by clicking the link in the ' \
74
- "verification email that has been sent to #{@email}".yellow
75
- rescue REST::Error => e
76
- raise Informative, 'There was an error registering with trunk: ' \
77
- "#{e.message}"
78
- end
79
-
80
- def save_token(token)
81
- netrc['trunk.cocoapods.org'] = @email, token
82
- netrc.save
83
- end
84
- end
85
-
86
- class Me < Trunk
87
- self.summary = 'Display information about your sessions'
88
- self.description = <<-DESC
89
- Includes information about your registration, followed by all your
90
- sessions.
91
-
92
- These are your current session, other valid sessions, unverified
93
- sessions, and expired sessions.
94
- DESC
95
-
96
- def validate!
97
- super
98
- unless token
99
- help! 'You need to register a session first.'
100
- end
101
- end
102
-
103
- def run
104
- me = json(request_path(:get, 'sessions', auth_headers))
105
- owner = json(request_path(:get, "owners/#{me['email']}"))
106
- UI.labeled 'Name', owner['name']
107
- UI.labeled 'Email', owner['email']
108
- UI.labeled 'Since', formatted_time(owner['created_at'])
109
-
110
- pods = owner['pods'] || []
111
- pods = pods.map { |pod| pod['name'] }
112
- pods = 'None' unless pods.any?
113
- UI.labeled 'Pods', pods
114
-
115
- sessions = me['sessions'].map do |session|
116
- hash = {
117
- :created_at => formatted_time(session['created_at']),
118
- :valid_until => formatted_time(session['valid_until']),
119
- :created_from_ip => session['created_from_ip'],
120
- :description => session['description'],
121
- }
122
- if Time.parse(session['valid_until']) <= Time.now.utc
123
- hash[:color] = :red
124
- elsif session['verified']
125
- hash[:color] = session['current'] ? :cyan : :green
126
- else
127
- hash[:color] = :yellow
128
- hash[:valid_until] = 'Unverified'
129
- end
130
- hash
131
- end
132
-
133
- columns = [:created_at, :valid_until, :created_from_ip, :description].map do |key|
134
- find_max_size(sessions, key)
135
- end
136
-
137
- sessions = sessions.map do |session|
138
- created_at = session[:created_at].ljust(columns[0])
139
- valid_until = session[:valid_until].rjust(columns[1])
140
- created_from_ip = session[:created_from_ip].ljust(columns[2])
141
- description = session[:description]
142
- msg = "#{created_at} - #{valid_until}. IP: #{created_from_ip}"
143
- msg << " Description: #{description}" if description
144
- msg.send(session[:color])
145
- end
146
-
147
- UI.labeled 'Sessions', sessions
148
-
149
- rescue REST::Error => e
150
- raise Informative, 'There was an error fetching your info ' \
151
- "from trunk: #{e.message}"
152
- end
153
-
154
- private
155
-
156
- def find_max_size(sessions, key)
157
- sessions.map { |s| (s[key] || '').size }.max
158
- end
159
-
160
- class CleanSessions < Me
161
- self.summary = 'Remove sessions'
162
- self.description = <<-DESC
163
- By default this will clean-up your sessions by removing expired and
164
- unverified sessions.
165
-
166
- To remove all your sessions, except for the one you are currently
167
- using, specify the `--all` flag.
168
- DESC
169
-
170
- def self.options
171
- [
172
- ['--all', 'Removes all your sessions, except for the current one'],
173
- ].concat(super)
174
- end
175
-
176
- def initialize(argv)
177
- @remove_all = argv.flag?('all', false)
178
- super
179
- end
180
-
181
- def validate!
182
- super
183
- unless token
184
- help! 'You need to register a session first.'
185
- end
186
- end
187
-
188
- def run
189
- path = @remove_all ? 'sessions/all' : 'sessions'
190
- request_path(:delete, path, auth_headers)
191
- rescue REST::Error => e
192
- raise Informative, 'There was an error cleaning up your ' \
193
- "sessions from trunk: #{e.message}"
194
- end
195
- end
196
- end
197
-
198
- class AddOwner < Trunk
199
- self.summary = 'Add an owner to a pod'
200
- self.description = <<-DESC
201
- Adds the registered user with specified `OWNER-EMAIL` as an owner
202
- of the given `POD`.
203
- An ‘owner’ is a registered user whom is allowed to make changes to a
204
- pod, such as pushing new versions and adding other ‘owners’.
205
- DESC
206
-
207
- self.arguments = [
208
- CLAide::Argument.new('POD', true),
209
- CLAide::Argument.new('OWNER-EMAIL', true),
210
- ]
211
-
212
- def initialize(argv)
213
- @pod, @email = argv.shift_argument, argv.shift_argument
214
- super
215
- end
216
-
217
- def validate!
218
- super
219
- unless token
220
- help! 'You need to register a session first.'
221
- end
222
- unless @pod && @email
223
- help! 'Specify the pod name and the new owner’s email address.'
224
- end
225
- end
226
-
227
- def run
228
- body = { 'email' => @email }.to_json
229
- json = json(request_path(:patch, "pods/#{@pod}/owners", body, auth_headers))
230
- UI.labeled 'Owners', json.map { |o| "#{o['name']} <#{o['email']}>" }
231
- rescue REST::Error => e
232
- raise Informative, "There was an error adding #{@email} to " \
233
- "#{@pod} on trunk: #{e.message}"
234
- end
235
- end
236
-
237
- class Push < Trunk
238
- self.summary = 'Publish a podspec'
239
- self.description = <<-DESC
240
- Publish the podspec at `PATH` to make it available to all users of
241
- the ‘master’ spec-repo. If `PATH` is not provided, defaults to the
242
- current directory.
243
-
244
- Before pushing the podspec to cocoapods.org, this will perform a local
245
- lint of the podspec, including a build of the library. However, it
246
- remains *your* responsibility to ensure that the published podspec
247
- will actually work for your users. Thus it is recommended that you
248
- *first* try to use the podspec to integrate the library into your demo
249
- and/or real application.
250
-
251
- If this is the first time you publish a spec for this pod, you will
252
- automatically be registered as the ‘owner’ of this pod. (Note that
253
- ‘owner’ in this case implies a person that is allowed to publish new
254
- versions and add other ‘owners’, not necessarily the library author.)
255
- DESC
256
-
257
- self.arguments = [
258
- CLAide::Argument.new('PATH', false),
259
- ]
260
-
261
- def self.options
262
- [
263
- ['--allow-warnings', 'Allows push even if there are lint warnings'],
264
- ].concat(super)
265
- end
266
-
267
- def initialize(argv)
268
- @allow_warnings = argv.flag?('allow-warnings')
269
- @path = argv.shift_argument || '.'
270
- find_podspec_file if File.directory?(@path)
271
- super
272
- end
273
-
274
- def validate!
275
- super
276
- unless token
277
- help! 'You need to register a session first.'
278
- end
279
- unless @path
280
- help! 'Please specify the path to the podspec file.'
281
- end
282
- unless File.exist?(@path) && !File.directory?(@path)
283
- help! "The specified path `#{@path}` does not point to " \
284
- 'an existing podspec file.'
285
- end
286
- end
287
-
288
- def run
289
- validate_podspec
290
- response = request_path(:post, 'pods', spec.to_json, auth_headers)
291
- url = response.headers['location'].first
292
- json = json(request_url(:get, url, default_headers))
293
-
294
- # Using UI.labeled here is dangerous, as it wraps the URL and indents
295
- # it, which breaks the URL when you try to copy-paste it.
296
- $stdout.puts " - Data URL: #{json['data_url']}"
297
-
298
- messages = json['messages'].map do |entry|
299
- at, message = entry.to_a.flatten
300
- "#{formatted_time(at)}: #{message}"
301
- end
302
- UI.labeled 'Log messages', messages
303
- rescue REST::Error => e
304
- raise Informative, 'There was an error pushing a new version ' \
305
- "to trunk: #{e.message}"
306
- end
307
-
308
- private
309
-
310
- def find_podspec_file
311
- podspecs = Dir[Pathname(@path) + '*.podspec{.json,}']
312
- case podspecs.count
313
- when 0
314
- UI.notice "No podspec found in directory `#{@path}`"
315
- when 1
316
- UI.notice "Found podspec `#{podspecs[0]}`"
317
- else
318
- UI.notice "Multiple podspec files in directory `#{@path}`. " \
319
- 'You need to explicitly specify which one to use.'
320
- end
321
- @path = (podspecs.count == 1) ? podspecs[0] : nil
322
- end
323
-
324
- def spec
325
- @spec ||= Pod::Specification.from_file(@path)
326
- rescue Informative # TODO: this should be a more specific error
327
- raise Informative, 'Unable to interpret the specified path as a ' \
328
- 'podspec.'
329
- end
330
-
331
- # Performs a full lint against the podspecs.
332
- #
333
- # TODO: Currently copied verbatim from `pod push`.
334
- def validate_podspec
335
- UI.puts 'Validating podspec'.yellow
336
- validator = Validator.new(spec, %w(https://github.com/CocoaPods/Specs.git))
337
- validator.only_errors = @allow_warnings
338
- validator.validate
339
- unless validator.validated?
340
- raise Informative, 'The podspec does not validate.'
341
- end
342
- end
343
- end
16
+ require 'pod/command/trunk/register'
17
+ require 'pod/command/trunk/me'
18
+ require 'pod/command/trunk/add_owner'
19
+ require 'pod/command/trunk/push'
344
20
 
345
21
  private
346
22
 
@@ -0,0 +1,44 @@
1
+ module Pod
2
+ class Command
3
+ class Trunk
4
+ class AddOwner < Trunk
5
+ self.summary = 'Add an owner to a pod'
6
+ self.description = <<-DESC
7
+ Adds the registered user with specified `OWNER-EMAIL` as an owner
8
+ of the given `POD`.
9
+ An ‘owner’ is a registered user whom is allowed to make changes to a
10
+ pod, such as pushing new versions and adding other ‘owners’.
11
+ DESC
12
+
13
+ self.arguments = [
14
+ CLAide::Argument.new('POD', true),
15
+ CLAide::Argument.new('OWNER-EMAIL', true),
16
+ ]
17
+
18
+ def initialize(argv)
19
+ @pod, @email = argv.shift_argument, argv.shift_argument
20
+ super
21
+ end
22
+
23
+ def validate!
24
+ super
25
+ unless token
26
+ help! 'You need to register a session first.'
27
+ end
28
+ unless @pod && @email
29
+ help! 'Specify the pod name and the new owner’s email address.'
30
+ end
31
+ end
32
+
33
+ def run
34
+ body = { 'email' => @email }.to_json
35
+ json = json(request_path(:patch, "pods/#{@pod}/owners", body, auth_headers))
36
+ UI.labeled 'Owners', json.map { |o| "#{o['name']} <#{o['email']}>" }
37
+ rescue REST::Error => e
38
+ raise Informative, "There was an error adding #{@email} to " \
39
+ "#{@pod} on trunk: #{e.message}"
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,117 @@
1
+ module Pod
2
+ class Command
3
+ class Trunk
4
+ class Me < Trunk
5
+ self.summary = 'Display information about your sessions'
6
+ self.description = <<-DESC
7
+ Includes information about your registration, followed by all your
8
+ sessions.
9
+
10
+ These are your current session, other valid sessions, unverified
11
+ sessions, and expired sessions.
12
+ DESC
13
+
14
+ def validate!
15
+ super
16
+ unless token
17
+ help! 'You need to register a session first.'
18
+ end
19
+ end
20
+
21
+ def run
22
+ me = json(request_path(:get, 'sessions', auth_headers))
23
+ owner = json(request_path(:get, "owners/#{me['email']}"))
24
+ UI.labeled 'Name', owner['name']
25
+ UI.labeled 'Email', owner['email']
26
+ UI.labeled 'Since', formatted_time(owner['created_at'])
27
+
28
+ pods = owner['pods'] || []
29
+ pods = pods.map { |pod| pod['name'] }
30
+ pods = 'None' unless pods.any?
31
+ UI.labeled 'Pods', pods
32
+
33
+ sessions = me['sessions'].map do |session|
34
+ hash = {
35
+ :created_at => formatted_time(session['created_at']),
36
+ :valid_until => formatted_time(session['valid_until']),
37
+ :created_from_ip => session['created_from_ip'],
38
+ :description => session['description'],
39
+ }
40
+ if Time.parse(session['valid_until']) <= Time.now.utc
41
+ hash[:color] = :red
42
+ elsif session['verified']
43
+ hash[:color] = session['current'] ? :cyan : :green
44
+ else
45
+ hash[:color] = :yellow
46
+ hash[:valid_until] = 'Unverified'
47
+ end
48
+ hash
49
+ end
50
+
51
+ columns = [:created_at, :valid_until, :created_from_ip, :description].map do |key|
52
+ find_max_size(sessions, key)
53
+ end
54
+
55
+ sessions = sessions.map do |session|
56
+ created_at = session[:created_at].ljust(columns[0])
57
+ valid_until = session[:valid_until].rjust(columns[1])
58
+ created_from_ip = session[:created_from_ip].ljust(columns[2])
59
+ description = session[:description]
60
+ msg = "#{created_at} - #{valid_until}. IP: #{created_from_ip}"
61
+ msg << " Description: #{description}" if description
62
+ msg.send(session[:color])
63
+ end
64
+
65
+ UI.labeled 'Sessions', sessions
66
+
67
+ rescue REST::Error => e
68
+ raise Informative, 'There was an error fetching your info ' \
69
+ "from trunk: #{e.message}"
70
+ end
71
+
72
+ private
73
+
74
+ def find_max_size(sessions, key)
75
+ sessions.map { |s| (s[key] || '').size }.max
76
+ end
77
+
78
+ class CleanSessions < Me
79
+ self.summary = 'Remove sessions'
80
+ self.description = <<-DESC
81
+ By default this will clean-up your sessions by removing expired and
82
+ unverified sessions.
83
+
84
+ To remove all your sessions, except for the one you are currently
85
+ using, specify the `--all` flag.
86
+ DESC
87
+
88
+ def self.options
89
+ [
90
+ ['--all', 'Removes all your sessions, except for the current one'],
91
+ ].concat(super)
92
+ end
93
+
94
+ def initialize(argv)
95
+ @remove_all = argv.flag?('all', false)
96
+ super
97
+ end
98
+
99
+ def validate!
100
+ super
101
+ unless token
102
+ help! 'You need to register a session first.'
103
+ end
104
+ end
105
+
106
+ def run
107
+ path = @remove_all ? 'sessions/all' : 'sessions'
108
+ request_path(:delete, path, auth_headers)
109
+ rescue REST::Error => e
110
+ raise Informative, 'There was an error cleaning up your ' \
111
+ "sessions from trunk: #{e.message}"
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,114 @@
1
+ module Pod
2
+ class Command
3
+ class Trunk
4
+ class Push < Trunk
5
+ self.summary = 'Publish a podspec'
6
+ self.description = <<-DESC
7
+ Publish the podspec at `PATH` to make it available to all users of
8
+ the ‘master’ spec-repo. If `PATH` is not provided, defaults to the
9
+ current directory.
10
+
11
+ Before pushing the podspec to cocoapods.org, this will perform a local
12
+ lint of the podspec, including a build of the library. However, it
13
+ remains *your* responsibility to ensure that the published podspec
14
+ will actually work for your users. Thus it is recommended that you
15
+ *first* try to use the podspec to integrate the library into your demo
16
+ and/or real application.
17
+
18
+ If this is the first time you publish a spec for this pod, you will
19
+ automatically be registered as the ‘owner’ of this pod. (Note that
20
+ ‘owner’ in this case implies a person that is allowed to publish new
21
+ versions and add other ‘owners’, not necessarily the library author.)
22
+ DESC
23
+
24
+ self.arguments = [
25
+ CLAide::Argument.new('PATH', false),
26
+ ]
27
+
28
+ def self.options
29
+ [
30
+ ['--allow-warnings', 'Allows push even if there are lint warnings'],
31
+ ].concat(super)
32
+ end
33
+
34
+ def initialize(argv)
35
+ @allow_warnings = argv.flag?('allow-warnings')
36
+ @path = argv.shift_argument || '.'
37
+ find_podspec_file if File.directory?(@path)
38
+ super
39
+ end
40
+
41
+ def validate!
42
+ super
43
+ unless token
44
+ help! 'You need to register a session first.'
45
+ end
46
+ unless @path
47
+ help! 'Please specify the path to the podspec file.'
48
+ end
49
+ unless File.exist?(@path) && !File.directory?(@path)
50
+ help! "The specified path `#{@path}` does not point to " \
51
+ 'an existing podspec file.'
52
+ end
53
+ end
54
+
55
+ def run
56
+ validate_podspec
57
+ response = request_path(:post, 'pods', spec.to_json, auth_headers)
58
+ url = response.headers['location'].first
59
+ json = json(request_url(:get, url, default_headers))
60
+
61
+ # Using UI.labeled here is dangerous, as it wraps the URL and indents
62
+ # it, which breaks the URL when you try to copy-paste it.
63
+ $stdout.puts " - Data URL: #{json['data_url']}"
64
+
65
+ messages = json['messages'].map do |entry|
66
+ at, message = entry.to_a.flatten
67
+ "#{formatted_time(at)}: #{message}"
68
+ end
69
+ UI.labeled 'Log messages', messages
70
+ rescue REST::Error => e
71
+ raise Informative, 'There was an error pushing a new version ' \
72
+ "to trunk: #{e.message}"
73
+ end
74
+
75
+ private
76
+
77
+ def find_podspec_file
78
+ podspecs = Dir[Pathname(@path) + '*.podspec{.json,}']
79
+ case podspecs.count
80
+ when 0
81
+ UI.notice "No podspec found in directory `#{@path}`"
82
+ when 1
83
+ UI.notice "Found podspec `#{podspecs[0]}`"
84
+ else
85
+ UI.notice "Multiple podspec files in directory `#{@path}`. " \
86
+ 'You need to explicitly specify which one to use.'
87
+ end
88
+ @path = (podspecs.count == 1) ? podspecs[0] : nil
89
+ end
90
+
91
+ def spec
92
+ @spec ||= Pod::Specification.from_file(@path)
93
+ rescue Informative # TODO: this should be a more specific error
94
+ raise Informative, 'Unable to interpret the specified path as a ' \
95
+ 'podspec.'
96
+ end
97
+
98
+ # Performs a full lint against the podspecs.
99
+ #
100
+ # TODO: Currently copied verbatim from `pod push`.
101
+ def validate_podspec
102
+ UI.puts 'Validating podspec'.yellow
103
+
104
+ validator = Validator.new(spec, %w(https://github.com/CocoaPods/Specs.git))
105
+ validator.allow_warnings = @allow_warnings
106
+ validator.validate
107
+ unless validator.validated?
108
+ raise Informative, 'The podspec does not validate.'
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,75 @@
1
+ module Pod
2
+ class Command
3
+ class Trunk
4
+ class Register < Trunk
5
+ self.summary = 'Manage sessions'
6
+ self.description = <<-DESC
7
+ Register a new account, or create a new session.
8
+
9
+ If this is your first registration, both an `EMAIL` address and your
10
+ `NAME` are required. If you've already registered with trunk, you may
11
+ omit the `NAME` (unless you would like to change it).
12
+
13
+ It is recommended that you provide a description of the session, so
14
+ that it will be easier to identify later on. For instance, when you
15
+ would like to clean-up your sessions. A common example is to specify
16
+ the location where the machine, that you are using the session for, is
17
+ physically located.
18
+
19
+ Examples:
20
+
21
+ $ pod trunk register eloy@example.com 'Eloy Durán' --description='Personal Laptop'
22
+ $ pod trunk register eloy@example.com --description='Work Laptop'
23
+ $ pod trunk register eloy@example.com
24
+ DESC
25
+
26
+ self.arguments = [
27
+ CLAide::Argument.new('EMAIL', true),
28
+ CLAide::Argument.new('NAME', false),
29
+ ]
30
+
31
+ def self.options
32
+ [
33
+ ['--description=DESCRIPTION', 'An arbitrary description to ' \
34
+ 'easily identify your session ' \
35
+ 'later on.'],
36
+ ].concat(super)
37
+ end
38
+
39
+ def initialize(argv)
40
+ @session_description = argv.option('description')
41
+ @email, @name = argv.shift_argument, argv.shift_argument
42
+ super
43
+ end
44
+
45
+ def validate!
46
+ super
47
+ unless @email
48
+ help! 'Specify at least your email address.'
49
+ end
50
+ end
51
+
52
+ def run
53
+ body = {
54
+ 'email' => @email,
55
+ 'name' => @name,
56
+ 'description' => @session_description,
57
+ }.to_json
58
+ json = json(request_path(:post, 'sessions', body, default_headers))
59
+ save_token(json['token'])
60
+ # TODO UI.notice inserts an empty line :/
61
+ puts '[!] Please verify the session by clicking the link in the ' \
62
+ "verification email that has been sent to #{@email}".yellow
63
+ rescue REST::Error => e
64
+ raise Informative, 'There was an error registering with trunk: ' \
65
+ "#{e.message}"
66
+ end
67
+
68
+ def save_token(token)
69
+ netrc['trunk.cocoapods.org'] = @email, token
70
+ netrc.save
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -30,7 +30,7 @@ module Pod
30
30
  # Execute `pod trunk push` with this dir as parameter
31
31
  command = Command.parse(%w( trunk push ) + [dir])
32
32
  path = command.instance_eval { @path }
33
- return path ? File.basename(path) : nil
33
+ return File.basename(path) if path
34
34
  end
35
35
  end
36
36
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-trunk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Durán
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-06 00:00:00.000000000 Z
11
+ date: 2014-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nap
@@ -87,9 +87,12 @@ files:
87
87
  - Rakefile
88
88
  - cocoapods-trunk.gemspec
89
89
  - lib/cocoapods_plugin.rb
90
+ - lib/cocoapods_trunk.rb
90
91
  - lib/pod/command/trunk.rb
91
- - lib/trunk.rb
92
- - lib/trunk/version.rb
92
+ - lib/pod/command/trunk/add_owner.rb
93
+ - lib/pod/command/trunk/me.rb
94
+ - lib/pod/command/trunk/push.rb
95
+ - lib/pod/command/trunk/register.rb
93
96
  - spec/command/trunk/addowner_spec.rb
94
97
  - spec/command/trunk/me_spec.rb
95
98
  - spec/command/trunk/push_spec.rb
data/lib/trunk.rb DELETED
@@ -1,7 +0,0 @@
1
- require 'cocoapods/trunk/version'
2
-
3
- module Cocoapods
4
- module Trunk
5
- # Your code goes here...
6
- end
7
- end
data/lib/trunk/version.rb DELETED
@@ -1,5 +0,0 @@
1
- module Cocoapods
2
- module Trunk
3
- VERSION = '0.4.0'
4
- end
5
- end