circleci-cli 0.6.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.
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Circler
4
+ class BuildPrinter
5
+ def initialize(builds, pretty: true)
6
+ @builds = builds
7
+ @pretty = pretty
8
+ end
9
+
10
+ def to_s
11
+ @pretty ? print_pretty : print_compact
12
+ end
13
+
14
+ private
15
+
16
+ def print_compact
17
+ rows.map { |row| pad_columns_by_space(row, max_row_widths) }.join("\n")
18
+ end
19
+
20
+ def print_pretty
21
+ Terminal::Table.new(title: title, headings: headings, rows: rows).to_s
22
+ end
23
+
24
+ def title
25
+ build = @builds.first
26
+ "Recent Builds / #{build.project_name}".green
27
+ end
28
+
29
+ def headings
30
+ %w[Number Status Branch Author Commit Duration StartTime]
31
+ end
32
+
33
+ def rows
34
+ @builds.map(&:information)
35
+ end
36
+
37
+ def max_row_widths
38
+ @builds
39
+ .map(&:information)
40
+ .map { |array| array.map(&:to_s).map(&:size) }
41
+ .transpose
42
+ .map(&:max)
43
+ end
44
+
45
+ def pad_columns_by_space(columns, max_widths)
46
+ columns
47
+ .map
48
+ .with_index { |column, i| pad_column_by_space(column, max_widths, i) }
49
+ .join(' ')
50
+ .to_s
51
+ end
52
+
53
+ def pad_column_by_space(column, max_widths, index)
54
+ column_string = column.to_s
55
+ spaces = ' ' * (max_widths[index] - column_string.size)
56
+ column_string + spaces
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Circler
4
+ class ProjectPrinter
5
+ attr_accessor :compact
6
+ def initialize(projects, pretty: true)
7
+ @projects = projects
8
+ @pretty = pretty
9
+ end
10
+
11
+ def to_s
12
+ @pretty ? print_pretty : print_compact
13
+ end
14
+
15
+ private
16
+
17
+ def print_compact
18
+ @projects
19
+ .map(&:information)
20
+ .map { |array| array.join('/').to_s }
21
+ .sort
22
+ .join("\n")
23
+ end
24
+
25
+ def print_pretty
26
+ Terminal::Table.new(
27
+ title: 'Projects'.green,
28
+ headings: ['User name', 'Repository name'],
29
+ rows: @projects.map(&:information)
30
+ ).to_s
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Circler
4
+ class StepPrinter
5
+ def initialize(steps, pretty: true)
6
+ @steps = steps
7
+ @pretty = pretty
8
+ end
9
+
10
+ def to_s
11
+ Terminal::Table.new do |t|
12
+ @steps
13
+ .group_by(&:type)
14
+ .each do |key, steps|
15
+ t << :separator
16
+ t << [{ value: key.green, alignment: :center, colspan: 2 }]
17
+ steps.each { |s| print_actions(t, s) }
18
+ end
19
+ end.to_s
20
+ end
21
+
22
+ private
23
+
24
+ def colorize_by_status(string, status)
25
+ case status
26
+ when 'success', 'fixed' then string.green
27
+ when 'canceled' then string.yellow
28
+ when 'failed', 'timedout' then string.red
29
+ when 'no_tests', 'not_run' then string.light_black
30
+ else string
31
+ end
32
+ end
33
+
34
+ def format_time(time)
35
+ return '' unless time
36
+
37
+ minute = format('%02d', time / 1000 / 60)
38
+ second = format('%02d', (time / 1000) % 60)
39
+ "#{minute}:#{second}"
40
+ end
41
+
42
+ def print_actions(table, step)
43
+ table << :separator
44
+ step.actions.each do |a|
45
+ table << [
46
+ colorize_by_status(a.name.slice(0..120), a.status),
47
+ format_time(a.run_time_millis)
48
+ ]
49
+ table << [{ value: a.log, alignment: :left, colspan: 2 }] if a.failed? && a.log
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Circler
4
+ class Account
5
+ def initialize(hash)
6
+ @hash = hash
7
+ end
8
+
9
+ def user_name
10
+ @hash['name']
11
+ end
12
+
13
+ def self.me
14
+ Account.new(CircleCi::User.me.body)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Circler
4
+ class Action
5
+ attr_reader :name, :status, :run_time_millis
6
+ def initialize(hash)
7
+ @hash = hash
8
+ @name = hash['name']
9
+ @status = hash['status']
10
+ @run_time_millis = hash['run_time_millis']
11
+ end
12
+
13
+ def log
14
+ request(@hash['output_url'])
15
+ .map do |r|
16
+ r['message']
17
+ .gsub(/\r\n/, "\n")
18
+ .gsub(/\e\[A\r\e\[2K/, '')
19
+ .scan(/.{1,120}/)
20
+ .join("\n")
21
+ end
22
+ .join("\n")
23
+ end
24
+
25
+ def failed?
26
+ @status == 'timedout' || @status == 'failed'
27
+ end
28
+
29
+ private
30
+
31
+ def request(url)
32
+ JSON.parse(Faraday.new(url).get.body)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Circler
4
+ class Build
5
+ class << self
6
+ def all(username, reponame)
7
+ CircleCi::Project.new(username, reponame, 'github').recent_builds
8
+ .body
9
+ .map { |b| Build.new(b) }
10
+ end
11
+
12
+ def branch(username, reponame, branch)
13
+ CircleCi::Project.new(username, reponame, 'github').recent_builds_branch(branch)
14
+ .body
15
+ .map { |b| Build.new(b) }
16
+ end
17
+
18
+ def get(username, reponame, number)
19
+ Build.new(CircleCi::Build.new(username, reponame, 'github', number).get.body)
20
+ end
21
+
22
+ def retry(username, reponame, number)
23
+ Build.new(CircleCi::Build.new(username, reponame, 'github', number).retry.body)
24
+ end
25
+
26
+ def cancel(username, reponame, number)
27
+ Build.new(CircleCi::Build.new(username, reponame, 'github', number).cancel.body)
28
+ end
29
+ end
30
+
31
+ def initialize(hash)
32
+ @hash = hash
33
+ end
34
+
35
+ def username
36
+ @hash['username']
37
+ end
38
+
39
+ def reponame
40
+ @hash['reponame']
41
+ end
42
+
43
+ def status
44
+ @hash['status']
45
+ end
46
+
47
+ def build_number
48
+ @hash['build_num']
49
+ end
50
+
51
+ def running?
52
+ status == 'running'
53
+ end
54
+
55
+ def channel_name
56
+ "private-#{username}@#{reponame}@#{build_number}@vcs-github@0"
57
+ end
58
+
59
+ def project_name
60
+ "#{username}/#{reponame}"
61
+ end
62
+
63
+ def information
64
+ [
65
+ @hash['build_num'],
66
+ colorize_by_status(@hash['status'], @hash['status']),
67
+ colorize_by_status(@hash['branch'], @hash['status']),
68
+ @hash['author_name'],
69
+ (@hash['subject'] || '').slice(0..60),
70
+ format_time(@hash['build_time_millis']),
71
+ @hash['start_time']
72
+ ]
73
+ end
74
+
75
+ def steps
76
+ hash = @hash['steps'].group_by { |s| s['actions'].first['type'] }
77
+ hash.flat_map { |type, value| value.map { |v| Step.new(type, v) } }
78
+ end
79
+
80
+ private
81
+
82
+ def colorize_by_status(string, status)
83
+ case status
84
+ when 'success', 'fixed' then string.green
85
+ when 'canceled' then string.yellow
86
+ when 'failed' then string.red
87
+ when 'no_tests', 'not_run' then string.light_black
88
+ else string
89
+ end
90
+ end
91
+
92
+ def format_time(time)
93
+ return '' unless time
94
+
95
+ minute = format('%02d', time / 1000 / 60)
96
+ second = format('%02d', (time / 1000) % 60)
97
+ "#{minute}:#{second}"
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Circler
4
+ class Project
5
+ def initialize(hash)
6
+ @hash = hash
7
+ end
8
+
9
+ def information
10
+ [@hash['username'], @hash['reponame']]
11
+ end
12
+
13
+ def self.all
14
+ CircleCi::Projects.new.get.body.map { |p| Project.new(p) }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Circler
4
+ class Step
5
+ attr_reader :type
6
+ attr_reader :status
7
+
8
+ def initialize(type, hash)
9
+ @type = type
10
+ @status = hash['status']
11
+ @hash = hash
12
+ end
13
+
14
+ def actions
15
+ @hash['actions'].map { |a| Action.new(a) }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Circler
4
+ VERSION = '0.6.3'
5
+ end
Binary file
metadata ADDED
@@ -0,0 +1,363 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: circleci-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.3
5
+ platform: ruby
6
+ authors:
7
+ - unhappychoice
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-09-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: circleci
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: colorize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.8.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.8.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0.14'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '0.16'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0.14'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.16'
61
+ - !ruby/object:Gem::Dependency
62
+ name: highline
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 1.7.8
68
+ - - "<"
69
+ - !ruby/object:Gem::Version
70
+ version: 2.1.0
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 1.7.8
78
+ - - "<"
79
+ - !ruby/object:Gem::Version
80
+ version: 2.1.0
81
+ - !ruby/object:Gem::Dependency
82
+ name: launchy
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: 2.4.3
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: 2.4.3
95
+ - !ruby/object:Gem::Dependency
96
+ name: pusher-client
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: 0.6.2
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 0.6.2
109
+ - !ruby/object:Gem::Dependency
110
+ name: rugged
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0.26'
116
+ - - "<"
117
+ - !ruby/object:Gem::Version
118
+ version: '0.29'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0.26'
126
+ - - "<"
127
+ - !ruby/object:Gem::Version
128
+ version: '0.29'
129
+ - !ruby/object:Gem::Dependency
130
+ name: terminal-notifier
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: 2.0.0
136
+ type: :runtime
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: 2.0.0
143
+ - !ruby/object:Gem::Dependency
144
+ name: terminal-table
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: 1.8.0
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: 1.8.0
157
+ - !ruby/object:Gem::Dependency
158
+ name: thor
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: 0.20.0
164
+ type: :runtime
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: 0.20.0
171
+ - !ruby/object:Gem::Dependency
172
+ name: bundler
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ - !ruby/object:Gem::Dependency
186
+ name: codecov
187
+ requirement: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ type: :development
193
+ prerelease: false
194
+ version_requirements: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ - !ruby/object:Gem::Dependency
200
+ name: guard
201
+ requirement: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ - !ruby/object:Gem::Dependency
214
+ name: guard-rspec
215
+ requirement: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - ">="
218
+ - !ruby/object:Gem::Version
219
+ version: '0'
220
+ type: :development
221
+ prerelease: false
222
+ version_requirements: !ruby/object:Gem::Requirement
223
+ requirements:
224
+ - - ">="
225
+ - !ruby/object:Gem::Version
226
+ version: '0'
227
+ - !ruby/object:Gem::Dependency
228
+ name: guard-rubocop
229
+ requirement: !ruby/object:Gem::Requirement
230
+ requirements:
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ version: '0'
234
+ type: :development
235
+ prerelease: false
236
+ version_requirements: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - ">="
239
+ - !ruby/object:Gem::Version
240
+ version: '0'
241
+ - !ruby/object:Gem::Dependency
242
+ name: rake
243
+ requirement: !ruby/object:Gem::Requirement
244
+ requirements:
245
+ - - ">="
246
+ - !ruby/object:Gem::Version
247
+ version: '0'
248
+ type: :development
249
+ prerelease: false
250
+ version_requirements: !ruby/object:Gem::Requirement
251
+ requirements:
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ version: '0'
255
+ - !ruby/object:Gem::Dependency
256
+ name: rspec
257
+ requirement: !ruby/object:Gem::Requirement
258
+ requirements:
259
+ - - ">="
260
+ - !ruby/object:Gem::Version
261
+ version: '0'
262
+ type: :development
263
+ prerelease: false
264
+ version_requirements: !ruby/object:Gem::Requirement
265
+ requirements:
266
+ - - ">="
267
+ - !ruby/object:Gem::Version
268
+ version: '0'
269
+ - !ruby/object:Gem::Dependency
270
+ name: rubocop
271
+ requirement: !ruby/object:Gem::Requirement
272
+ requirements:
273
+ - - ">="
274
+ - !ruby/object:Gem::Version
275
+ version: '0'
276
+ type: :development
277
+ prerelease: false
278
+ version_requirements: !ruby/object:Gem::Requirement
279
+ requirements:
280
+ - - ">="
281
+ - !ruby/object:Gem::Version
282
+ version: '0'
283
+ - !ruby/object:Gem::Dependency
284
+ name: simplecov
285
+ requirement: !ruby/object:Gem::Requirement
286
+ requirements:
287
+ - - ">="
288
+ - !ruby/object:Gem::Version
289
+ version: '0'
290
+ type: :development
291
+ prerelease: false
292
+ version_requirements: !ruby/object:Gem::Requirement
293
+ requirements:
294
+ - - ">="
295
+ - !ruby/object:Gem::Version
296
+ version: '0'
297
+ description: A command line tool for CircleCI
298
+ email:
299
+ - unhappychoice@gmail.com
300
+ executables:
301
+ - circle
302
+ extensions: []
303
+ extra_rdoc_files: []
304
+ files:
305
+ - ".circleci/config.yml"
306
+ - ".rubocop.yml"
307
+ - CODE_OF_CONDUCT.md
308
+ - Gemfile
309
+ - Gemfile.lock
310
+ - Guardfile
311
+ - LICENSE.txt
312
+ - README.md
313
+ - Rakefile
314
+ - bin/circle
315
+ - bin/console
316
+ - bin/setup
317
+ - circler.gemspec
318
+ - exe/circle
319
+ - lib/circler.rb
320
+ - lib/circler/cli.rb
321
+ - lib/circler/command/base_command.rb
322
+ - lib/circler/command/browse_command.rb
323
+ - lib/circler/command/build_command.rb
324
+ - lib/circler/command/builds_command.rb
325
+ - lib/circler/command/cancel_command.rb
326
+ - lib/circler/command/projects_command.rb
327
+ - lib/circler/command/retry_command.rb
328
+ - lib/circler/command/watch_command.rb
329
+ - lib/circler/networking/pusher_client.rb
330
+ - lib/circler/printer/build_printer.rb
331
+ - lib/circler/printer/project_printer.rb
332
+ - lib/circler/printer/step_printer.rb
333
+ - lib/circler/response/account.rb
334
+ - lib/circler/response/action.rb
335
+ - lib/circler/response/build.rb
336
+ - lib/circler/response/project.rb
337
+ - lib/circler/response/step.rb
338
+ - lib/circler/version.rb
339
+ - movie/rec.gif
340
+ homepage: https://github.com/unhappychoice/circler
341
+ licenses:
342
+ - MIT
343
+ metadata: {}
344
+ post_install_message:
345
+ rdoc_options: []
346
+ require_paths:
347
+ - lib
348
+ required_ruby_version: !ruby/object:Gem::Requirement
349
+ requirements:
350
+ - - ">="
351
+ - !ruby/object:Gem::Version
352
+ version: '0'
353
+ required_rubygems_version: !ruby/object:Gem::Requirement
354
+ requirements:
355
+ - - ">="
356
+ - !ruby/object:Gem::Version
357
+ version: '0'
358
+ requirements: []
359
+ rubygems_version: 3.0.3
360
+ signing_key:
361
+ specification_version: 4
362
+ summary: CLI tool for CircleCI
363
+ test_files: []