circleci-cli 4.0.0 → 4.0.2

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
  SHA256:
3
- metadata.gz: 731ca5b1c5a4ea5b73bf0757c37fc83fe13f197069c22c965de5bbe055357dd9
4
- data.tar.gz: 58b7984a871d7d2aac0bfed50c8b0f1e2b30b70d533485e386ae8c7cfdb8b432
3
+ metadata.gz: 48ac9fd488101c5ea586980d9c4d5aae4b227b5857e10fb9d618528e1dcd7f6b
4
+ data.tar.gz: 949fa9b4b2972939f2b1a19e50b76f49209b64fc2880718fe2cd1678adbe7b0d
5
5
  SHA512:
6
- metadata.gz: eaa50c9c638f86a0e3870f252276f1dad8507955dd1220fd4caf0d4e64e53157b74b1981deefef1719bfdc63e1d9fce7c9b0565f52d01e032eb8f6866a38dc31
7
- data.tar.gz: 9d3e1a28d7c4b63fec6577d33a3edb9ff001c19f3386c2dc8efd2da4c7dad3f5f8e8a6686b99483ee7de7633737e8327d647dc9da351fc3f45b560efd9900960
6
+ metadata.gz: 5ada7004394b9515f32c5b8c77b65d43892ddcb7532d8463b9b30c27490ee4f254caeb3a7c78295087e918556032fb795e9568cabd45f64e4133c8d8325468f8
7
+ data.tar.gz: 7972c404010f3647726aa03b654996c1eb249345ea110052e4411060613b50f7cb1abcb340160568da7d2c192c06e6a66d21e7ece2a25b880b69574e54312617
@@ -0,0 +1 @@
1
+ * @unhappychoice
data/.rubocop.yml CHANGED
@@ -5,7 +5,7 @@ AllCops:
5
5
  Style/Documentation:
6
6
  Enabled: false
7
7
 
8
- Styyle/OpenStructUse:
8
+ Style/OpenStructUse:
9
9
  Enabled: false
10
10
 
11
11
  Layout/LineLength:
data/Gemfile CHANGED
@@ -2,5 +2,17 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- # Specify your gem's dependencies in circle.gemspec
6
5
  gemspec
6
+
7
+ gem 'abbrev'
8
+ gem 'base64'
9
+ gem 'bundler'
10
+ gem 'codecov'
11
+ gem 'github_changelog_generator'
12
+ gem 'guard'
13
+ gem 'guard-rspec'
14
+ gem 'guard-rubocop'
15
+ gem 'rake'
16
+ gem 'rspec'
17
+ gem 'rubocop'
18
+ gem 'simplecov'
data/Gemfile.lock CHANGED
@@ -1,88 +1,90 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- circleci-cli (4.0.0)
4
+ circleci-cli (4.0.2)
5
5
  circleci (>= 2.1.0)
6
- faraday (>= 0.14, < 2.8)
7
- highline (>= 1.7.8, < 2.2.0)
8
- launchy (>= 2.4.3, < 3.1.0)
6
+ highline (>= 1.7.8, < 3.2.0)
7
+ launchy (>= 2.4.3, < 3.2.0)
9
8
  pusher-client (~> 0.6.2)
10
- rugged (>= 0.26, < 1.8)
9
+ rugged (>= 0.26, < 1.10)
11
10
  terminal-notifier (~> 2.0.0)
12
- terminal-table (>= 1.8, < 3.1)
13
- thor (>= 0.20, < 1.3)
11
+ terminal-table (>= 1.8, < 4.1)
12
+ thor (>= 0.20, < 1.6)
14
13
 
15
14
  GEM
16
15
  remote: https://rubygems.org/
17
16
  specs:
18
17
  abbrev (0.1.2)
19
- activesupport (6.1.7.6)
20
- concurrent-ruby (~> 1.0, >= 1.0.2)
18
+ activesupport (7.2.3)
19
+ base64
20
+ benchmark (>= 0.3)
21
+ bigdecimal
22
+ concurrent-ruby (~> 1.0, >= 1.3.1)
23
+ connection_pool (>= 2.2.5)
24
+ drb
21
25
  i18n (>= 1.6, < 2)
26
+ logger (>= 1.4.2)
22
27
  minitest (>= 5.1)
23
- tzinfo (~> 2.0)
24
- zeitwerk (~> 2.3)
25
- addressable (2.8.6)
26
- public_suffix (>= 2.0.2, < 6.0)
27
- ast (2.4.2)
28
- async (1.32.1)
29
- console (~> 1.10)
30
- nio4r (~> 2.3)
31
- timers (~> 4.1)
32
- async-http (0.60.2)
33
- async (>= 1.25)
34
- async-io (>= 1.28)
35
- async-pool (>= 0.2)
36
- protocol-http (~> 0.24.0)
37
- protocol-http1 (~> 0.15.0)
38
- protocol-http2 (~> 0.15.0)
39
- traces (>= 0.10.0)
40
- async-http-faraday (0.12.0)
28
+ securerandom (>= 0.3)
29
+ tzinfo (~> 2.0, >= 2.0.5)
30
+ addressable (2.8.8)
31
+ public_suffix (>= 2.0.2, < 8.0)
32
+ ast (2.4.3)
33
+ async (2.24.0)
34
+ console (~> 1.29)
35
+ fiber-annotation
36
+ io-event (~> 1.9)
37
+ metrics (~> 0.12)
38
+ traces (~> 0.15)
39
+ async-http (0.88.0)
40
+ async (>= 2.10.2)
41
+ async-pool (~> 0.9)
42
+ io-endpoint (~> 0.14)
43
+ io-stream (~> 0.6)
44
+ metrics (~> 0.12)
45
+ protocol-http (~> 0.49)
46
+ protocol-http1 (~> 0.30)
47
+ protocol-http2 (~> 0.22)
48
+ traces (~> 0.10)
49
+ async-http-faraday (0.22.0)
41
50
  async-http (~> 0.42)
42
51
  faraday
43
- async-io (1.43.2)
44
- async
45
- async-pool (0.4.0)
52
+ async-pool (0.10.3)
46
53
  async (>= 1.25)
47
54
  base64 (0.3.0)
48
- childprocess (5.0.0)
55
+ benchmark (0.5.0)
56
+ bigdecimal (4.0.1)
57
+ childprocess (5.1.0)
58
+ logger (~> 1.5)
49
59
  circleci (2.1.0)
50
- codecov (0.6.0)
51
- simplecov (>= 0.15, < 0.22)
60
+ codecov (0.2.12)
61
+ json
62
+ simplecov
52
63
  coderay (1.1.3)
53
- concurrent-ruby (1.3.1)
54
- console (1.15.3)
55
- fiber-local
56
- diff-lcs (1.5.1)
57
- docile (1.4.0)
58
- faraday (1.10.3)
59
- faraday-em_http (~> 1.0)
60
- faraday-em_synchrony (~> 1.0)
61
- faraday-excon (~> 1.1)
62
- faraday-httpclient (~> 1.0)
63
- faraday-multipart (~> 1.0)
64
- faraday-net_http (~> 1.0)
65
- faraday-net_http_persistent (~> 1.0)
66
- faraday-patron (~> 1.0)
67
- faraday-rack (~> 1.0)
68
- faraday-retry (~> 1.0)
69
- ruby2_keywords (>= 0.0.4)
70
- faraday-em_http (1.0.0)
71
- faraday-em_synchrony (1.0.0)
72
- faraday-excon (1.1.0)
64
+ concurrent-ruby (1.3.6)
65
+ connection_pool (2.5.5)
66
+ console (1.30.2)
67
+ fiber-annotation
68
+ fiber-local (~> 1.1)
69
+ json
70
+ diff-lcs (1.6.2)
71
+ docile (1.4.1)
72
+ drb (2.2.3)
73
+ faraday (2.14.0)
74
+ faraday-net_http (>= 2.0, < 3.5)
75
+ json
76
+ logger
73
77
  faraday-http-cache (2.5.1)
74
78
  faraday (>= 0.8)
75
- faraday-httpclient (1.0.1)
76
- faraday-multipart (1.0.4)
77
- multipart-post (~> 2)
78
- faraday-net_http (1.0.1)
79
- faraday-net_http_persistent (1.2.0)
80
- faraday-patron (1.0.0)
81
- faraday-rack (1.0.0)
82
- faraday-retry (1.0.3)
83
- ffi (1.17.0)
84
- fiber-local (1.0.0)
85
- formatador (1.1.0)
79
+ faraday-net_http (3.4.2)
80
+ net-http (~> 0.5)
81
+ ffi (1.17.3)
82
+ fiber-annotation (0.2.0)
83
+ fiber-local (1.1.0)
84
+ fiber-storage
85
+ fiber-storage (1.0.1)
86
+ formatador (1.2.3)
87
+ reline
86
88
  github_changelog_generator (1.16.4)
87
89
  activesupport
88
90
  async (>= 1.25.0)
@@ -92,9 +94,10 @@ GEM
92
94
  octokit (~> 4.6)
93
95
  rainbow (>= 2.2.1)
94
96
  rake (>= 10.0)
95
- guard (2.18.1)
97
+ guard (2.20.1)
96
98
  formatador (>= 0.2.4)
97
99
  listen (>= 2.7, < 4.0)
100
+ logger (~> 1.6)
98
101
  lumberjack (>= 1.0.12, < 2.0)
99
102
  nenv (~> 0.1)
100
103
  notiffany (~> 0.0)
@@ -109,103 +112,121 @@ GEM
109
112
  guard-rubocop (1.5.0)
110
113
  guard (~> 2.0)
111
114
  rubocop (< 2.0)
112
- highline (2.1.0)
113
- i18n (1.14.5)
115
+ highline (3.1.2)
116
+ reline
117
+ i18n (1.14.8)
114
118
  concurrent-ruby (~> 1.0)
115
- json (2.7.2)
116
- launchy (3.0.1)
119
+ io-console (0.8.2)
120
+ io-endpoint (0.15.2)
121
+ io-event (1.11.2)
122
+ io-stream (0.6.1)
123
+ json (2.18.1)
124
+ language_server-protocol (3.17.0.5)
125
+ launchy (3.1.1)
117
126
  addressable (~> 2.8)
118
127
  childprocess (~> 5.0)
119
- listen (3.9.0)
128
+ logger (~> 1.6)
129
+ lint_roller (1.1.0)
130
+ listen (3.10.0)
131
+ logger
120
132
  rb-fsevent (~> 0.10, >= 0.10.3)
121
133
  rb-inotify (~> 0.9, >= 0.9.10)
122
- lumberjack (1.2.10)
134
+ logger (1.7.0)
135
+ lumberjack (1.4.2)
123
136
  method_source (1.1.0)
124
- minitest (5.15.0)
125
- multi_json (1.15.0)
126
- multipart-post (2.4.1)
137
+ metrics (0.12.2)
138
+ minitest (5.27.0)
139
+ multi_json (1.19.1)
127
140
  nenv (0.3.0)
128
- nio4r (2.7.3)
141
+ net-http (0.9.1)
142
+ uri (>= 0.11.1)
129
143
  notiffany (0.1.3)
130
144
  nenv (~> 0.1)
131
145
  shellany (~> 0.0)
132
146
  octokit (4.25.1)
133
147
  faraday (>= 1, < 3)
134
148
  sawyer (~> 0.9)
135
- parallel (1.24.0)
136
- parser (3.3.2.0)
149
+ parallel (1.27.0)
150
+ parser (3.3.10.1)
137
151
  ast (~> 2.4.1)
138
152
  racc
139
- protocol-hpack (1.4.2)
140
- protocol-http (0.24.7)
141
- protocol-http1 (0.15.1)
153
+ prism (1.9.0)
154
+ protocol-hpack (1.5.1)
155
+ protocol-http (0.49.0)
156
+ protocol-http1 (0.34.0)
142
157
  protocol-http (~> 0.22)
143
- protocol-http2 (0.15.1)
158
+ protocol-http2 (0.22.1)
144
159
  protocol-hpack (~> 1.4)
145
- protocol-http (~> 0.18)
146
- pry (0.14.2)
160
+ protocol-http (~> 0.47)
161
+ pry (0.16.0)
147
162
  coderay (~> 1.1)
148
163
  method_source (~> 1.0)
149
- public_suffix (4.0.7)
164
+ reline (>= 0.6.0)
165
+ public_suffix (6.0.2)
150
166
  pusher-client (0.6.2)
151
167
  json
152
168
  websocket (~> 1.0)
153
- racc (1.8.0)
169
+ racc (1.8.1)
154
170
  rainbow (3.1.1)
155
- rake (13.2.1)
171
+ rake (13.3.1)
156
172
  rb-fsevent (0.11.2)
157
173
  rb-inotify (0.11.1)
158
174
  ffi (~> 1.0)
159
- regexp_parser (2.9.2)
160
- rexml (3.3.9)
161
- rspec (3.13.0)
175
+ regexp_parser (2.11.3)
176
+ reline (0.6.3)
177
+ io-console (~> 0.5)
178
+ rspec (3.13.2)
162
179
  rspec-core (~> 3.13.0)
163
180
  rspec-expectations (~> 3.13.0)
164
181
  rspec-mocks (~> 3.13.0)
165
- rspec-core (3.13.0)
182
+ rspec-core (3.13.6)
166
183
  rspec-support (~> 3.13.0)
167
- rspec-expectations (3.13.0)
184
+ rspec-expectations (3.13.5)
168
185
  diff-lcs (>= 1.2.0, < 2.0)
169
186
  rspec-support (~> 3.13.0)
170
- rspec-mocks (3.13.1)
187
+ rspec-mocks (3.13.7)
171
188
  diff-lcs (>= 1.2.0, < 2.0)
172
189
  rspec-support (~> 3.13.0)
173
- rspec-support (3.13.1)
174
- rubocop (1.28.2)
190
+ rspec-support (3.13.7)
191
+ rubocop (1.84.1)
192
+ json (~> 2.3)
193
+ language_server-protocol (~> 3.17.0.2)
194
+ lint_roller (~> 1.1.0)
175
195
  parallel (~> 1.10)
176
- parser (>= 3.1.0.0)
196
+ parser (>= 3.3.0.2)
177
197
  rainbow (>= 2.2.2, < 4.0)
178
- regexp_parser (>= 1.8, < 3.0)
179
- rexml
180
- rubocop-ast (>= 1.17.0, < 2.0)
198
+ regexp_parser (>= 2.9.3, < 3.0)
199
+ rubocop-ast (>= 1.49.0, < 2.0)
181
200
  ruby-progressbar (~> 1.7)
182
- unicode-display_width (>= 1.4.0, < 3.0)
183
- rubocop-ast (1.17.0)
184
- parser (>= 3.1.1.0)
201
+ unicode-display_width (>= 2.4.0, < 4.0)
202
+ rubocop-ast (1.49.0)
203
+ parser (>= 3.3.7.2)
204
+ prism (~> 1.7)
185
205
  ruby-progressbar (1.13.0)
186
- ruby2_keywords (0.0.5)
187
- rugged (1.7.2)
188
- sawyer (0.9.2)
206
+ rugged (1.9.0)
207
+ sawyer (0.9.3)
189
208
  addressable (>= 2.3.5)
190
209
  faraday (>= 0.17.3, < 3)
210
+ securerandom (0.4.1)
191
211
  shellany (0.0.1)
192
- simplecov (0.21.2)
212
+ simplecov (0.22.0)
193
213
  docile (~> 1.1)
194
214
  simplecov-html (~> 0.11)
195
215
  simplecov_json_formatter (~> 0.1)
196
- simplecov-html (0.12.3)
216
+ simplecov-html (0.13.2)
197
217
  simplecov_json_formatter (0.1.4)
198
218
  terminal-notifier (2.0.0)
199
- terminal-table (3.0.2)
200
- unicode-display_width (>= 1.1.1, < 3)
201
- thor (1.2.2)
202
- timers (4.3.5)
203
- traces (0.11.1)
219
+ terminal-table (4.0.0)
220
+ unicode-display_width (>= 1.1.1, < 4)
221
+ thor (1.5.0)
222
+ traces (0.15.2)
204
223
  tzinfo (2.0.6)
205
224
  concurrent-ruby (~> 1.0)
206
- unicode-display_width (2.5.0)
207
- websocket (1.2.10)
208
- zeitwerk (2.6.15)
225
+ unicode-display_width (3.2.0)
226
+ unicode-emoji (~> 4.1)
227
+ unicode-emoji (4.2.0)
228
+ uri (1.1.1)
229
+ websocket (1.2.11)
209
230
 
210
231
  PLATFORMS
211
232
  ruby
data/circleci-cli.gemspec CHANGED
@@ -6,29 +6,14 @@ require 'circleci/cli/version'
6
6
 
7
7
  def production_dependency(spec)
8
8
  spec.add_dependency 'circleci', '>= 2.1.0'
9
- spec.add_dependency 'faraday', '>= 0.14', '< 2.8'
10
- spec.add_dependency 'highline', '>= 1.7.8', '< 2.2.0'
11
- spec.add_dependency 'launchy', '>= 2.4.3', '< 3.1.0'
9
+
10
+ spec.add_dependency 'highline', '>= 1.7.8', '< 3.2.0'
11
+ spec.add_dependency 'launchy', '>= 2.4.3', '< 3.2.0'
12
12
  spec.add_dependency 'pusher-client', '~> 0.6.2'
13
- spec.add_dependency 'rugged', '>= 0.26', '< 1.8'
13
+ spec.add_dependency 'rugged', '>= 0.26', '< 1.10'
14
14
  spec.add_dependency 'terminal-notifier', '~> 2.0.0'
15
- spec.add_dependency 'terminal-table', '>= 1.8', '< 3.1'
16
- spec.add_dependency 'thor', '>= 0.20', '< 1.3'
17
- end
18
-
19
- def development_dependency(spec)
20
- spec.add_development_dependency 'abbrev'
21
- spec.add_development_dependency 'base64'
22
- spec.add_development_dependency 'bundler'
23
- spec.add_development_dependency 'codecov'
24
- spec.add_development_dependency 'github_changelog_generator'
25
- spec.add_development_dependency 'guard'
26
- spec.add_development_dependency 'guard-rspec'
27
- spec.add_development_dependency 'guard-rubocop'
28
- spec.add_development_dependency 'rake'
29
- spec.add_development_dependency 'rspec'
30
- spec.add_development_dependency 'rubocop'
31
- spec.add_development_dependency 'simplecov'
15
+ spec.add_dependency 'terminal-table', '>= 1.8', '< 4.1'
16
+ spec.add_dependency 'thor', '>= 0.20', '< 1.6'
32
17
  end
33
18
 
34
19
  def project_files
@@ -57,5 +42,4 @@ Gem::Specification.new do |spec|
57
42
  }
58
43
 
59
44
  production_dependency spec
60
- development_dependency spec
61
45
  end
@@ -30,8 +30,8 @@ module CircleCI
30
30
  def builds_to_show
31
31
  @builds
32
32
  .reject { |build| @build_numbers_shown.include?(build.build_number) }
33
- .select { |build| @branch.nil? || build.branch.to_s == @branch.to_s }
34
- .select { |build| @user.nil? || build.user.to_s == @user.to_s }
33
+ .select { |build| @branch.nil? || build.branch == @branch }
34
+ .select { |build| @user.nil? || build.user == @user }
35
35
  .sort_by(&:build_number)
36
36
  end
37
37
 
@@ -10,49 +10,109 @@ module CircleCI
10
10
  @build = build
11
11
  @verbose = verbose
12
12
  @messages = Hash.new { |h, k| h[k] = [] }
13
+
14
+ @build_thread = nil
15
+
16
+ @steps = build.steps
17
+ @current_step = nil
18
+ @read_byte = 0
13
19
  end
14
20
 
15
21
  def start
16
- bind_event_handling @build.channel_name
22
+ poll_build
17
23
  notify_started
18
24
  end
19
25
 
20
26
  def stop(status)
21
- client.unsubscribe("#{@build.channel_name}@0")
27
+ update_build
28
+ @build_thread&.kill
22
29
  notify_stopped(status)
23
30
  end
24
31
 
25
32
  private
26
33
 
27
- def bind_event_handling(channel) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
28
- client.bind_event_json(channel, 'newAction') do |json|
29
- if @verbose
30
- print_bordered json['log']['name']
31
- else
32
- print json['log']['name']
34
+ def poll_build
35
+ @build_thread = Thread.new do
36
+ count = 0
37
+ loop do
38
+ update_build if (count % 5).zero?
39
+ update_actions
40
+
41
+ count += 1
42
+ sleep 1
33
43
  end
34
44
  end
45
+ end
35
46
 
36
- client.bind_event_json(channel, 'appendAction') do |json|
37
- if @verbose
38
- Thor::Shell::Basic.new.say(json['out']['message'], nil, false)
47
+ # rubocop:disable Metrics/MethodLength
48
+ def on_new_step(step)
49
+ if @verbose
50
+ print_bordered step.name
51
+ else
52
+ case step.status
53
+ when 'success'
54
+ puts "\e[2K\r#{Printer.colorize_green(step.name)}"
55
+ when 'failed'
56
+ puts "\e[2K\r#{Printer.colorize_red(step.name)}"
39
57
  else
40
- @messages[json['step']] << json['out']['message']
58
+ puts step.name
41
59
  end
42
60
  end
61
+ end
62
+ # rubocop:enable Metrics/MethodLength
43
63
 
44
- client.bind_event_json(channel, 'updateAction') do |json|
45
- next if @verbose
64
+ def on_new_step_status(step)
65
+ return if @verbose
46
66
 
47
- case json['log']['status']
48
- when 'success'
49
- puts "\e[2K\r#{Printer.colorize_green(json['log']['name'])}"
50
- when 'failed'
51
- puts "\e[2K\r#{Printer.colorize_red(json['log']['name'])}"
52
- @messages[json['step']].each(&method(:say))
53
- end
67
+ case step.status
68
+ when 'success'
69
+ puts "\e[1A\e[2K\r#{Printer.colorize_green(step.name)}"
70
+ when 'failed'
71
+ puts "\e[1A\e[2K\r#{Printer.colorize_red(step.name)}"
72
+ @messages[step.name].each(&method(:say))
73
+ end
74
+ end
75
+
76
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
77
+ def update_build
78
+ build = CircleCI::CLI::Response::Build.get(@build.username, @build.reponame, @build.build_number)
79
+
80
+ # Calc actions diff and dispatch event
81
+ build.steps
82
+ .each do |step|
83
+ on_new_step(step) unless @steps.any? { |s| s.name == step.name }
84
+ on_new_step_status(step) if @steps.any? { |s| s.name == step.name && s.status != step.status }
85
+ end
86
+
87
+ @steps = build.steps
88
+
89
+ next_step = build.steps.find { |s| s.status == 'running' }
90
+ @read_byte = 0 if @current_step&.name != next_step&.name
91
+ @current_step = next_step
92
+ end
93
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
94
+
95
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
96
+ def update_actions
97
+ return unless @current_step
98
+
99
+ url = "https://circleci.com/api/private/output/raw/github/#{@build.username}/#{@build.reponame}/#{@build.build_number}/output/#{@current_step.actions.first.index}/#{@current_step.actions.first.step}"
100
+ headers = { 'Range' => "bytes=#{@read_byte}-" }
101
+ res = HTTPClient.get(url, headers)
102
+
103
+ response = res.body
104
+
105
+ return if response.empty?
106
+
107
+ @read_byte += response.bytesize
108
+
109
+ if @verbose
110
+ Thor::Shell::Basic.new.say(response, nil, false)
111
+ else
112
+ @messages[@current_step.name] << response
54
113
  end
55
114
  end
115
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
56
116
 
57
117
  def notify_started
58
118
  say Printer::BuildPrinter.header_for(
@@ -75,10 +135,6 @@ module CircleCI
75
135
  def print_bordered(text)
76
136
  say Terminal::Table.new(rows: [[text]], style: { width: 120 }).to_s
77
137
  end
78
-
79
- def client
80
- @client ||= Networking::CircleCIPusherClient.new.tap(&:connect)
81
- end
82
138
  end
83
139
  end
84
140
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+ require 'json'
5
+
6
+ module CircleCI
7
+ module CLI
8
+ module Networking
9
+ module HTTPClient
10
+ def self.get(url, headers = {})
11
+ uri = URI(url)
12
+ req = Net::HTTP::Get.new(uri)
13
+ headers.each { |key, value| req[key] = value }
14
+ res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
15
+ http.request(req)
16
+ end
17
+ JSON.parse(res.body)
18
+ end
19
+
20
+ def self.post_form(url, params = {})
21
+ uri = URI(url)
22
+ res = Net::HTTP.post_form(uri, params)
23
+ JSON.parse(res.body)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -31,24 +31,15 @@ module CircleCI
31
31
  '1cf6e0e755e419d2ac9a',
32
32
  secure: true,
33
33
  auth_method: proc { |a, b| auth(a, b) },
34
- logger: Logger.new('/dev/null')
34
+ logger: Logger.new(File::NULL)
35
35
  )
36
36
  end
37
37
 
38
38
  def auth(socket_id, channel)
39
39
  token = ENV.fetch('CIRCLE_CI_TOKEN', nil) || ask('Circle CI token ? :')
40
- res = connection.post(
41
- "/auth/pusher?circle-token=#{token}",
42
- { socket_id:, channel_name: channel.name }
43
- )
44
- JSON.parse(res.body)['auth']
45
- end
46
-
47
- def connection
48
- Faraday.new(url: 'https://circleci.com') do |f|
49
- f.request :url_encoded
50
- f.adapter Faraday.default_adapter
51
- end
40
+ res = HTTPClient.post_form("https://circleci.com/auth/pusher?circle-token=#{token}",
41
+ { socket_id: socket_id, channel_name: channel.name })
42
+ res['auth']
52
43
  end
53
44
  end
54
45
  end
@@ -15,18 +15,18 @@ module CircleCI
15
15
  @steps
16
16
  .group_by(&:type)
17
17
  .each do |key, steps|
18
- t << :separator
19
- t << [{ value: Printer.colorize_green(key), alignment: :center, colspan: 2 }]
20
- steps.each { |s| print_actions(t, s) }
18
+ t << :separator
19
+ t << [{ value: Printer.colorize_green(key), alignment: :center, colspan: 2 }]
20
+ steps.each { |s| print_actions(t, s) }
21
21
  end
22
22
  end.to_s
23
23
  else
24
24
  @steps.group_by(&:type).map do |_, steps|
25
- steps.map do |step|
25
+ steps.flat_map do |step|
26
26
  step.actions.map do |a|
27
27
  "#{colorize_by_status(a.name.slice(0..120), a.status)}\n#{"#{a.log}\n" if a.failed? && a.log}"
28
28
  end
29
- end.flatten.join
29
+ end.join
30
30
  end.join("\n")
31
31
  end
32
32
  end
@@ -4,23 +4,26 @@ module CircleCI
4
4
  module CLI
5
5
  module Response
6
6
  class Action
7
- attr_reader :name, :status, :run_time_millis
7
+ attr_reader :name, :status, :index, :step, :end_time, :run_time_millis
8
8
 
9
9
  def initialize(hash)
10
10
  @hash = hash
11
11
  @name = hash['name']
12
12
  @status = hash['status']
13
+ @index = hash['index']
14
+ @step = hash['step']
15
+ @end_time = hash['end_time']
13
16
  @run_time_millis = hash['run_time_millis']
14
17
  end
15
18
 
16
19
  def log
17
- request(@hash['output_url'])
18
- .map do |r|
19
- r['message']
20
- .gsub(/\r\n/, "\n")
21
- .gsub(/\e\[A\r\e\[2K/, '')
22
- .scan(/.{1,120}/)
23
- .join("\n")
20
+ HTTPClient.get(@hash['output_url'])
21
+ .map do |r|
22
+ r['message']
23
+ .gsub("\r\n", "\n")
24
+ .gsub("\e[A\r\e[2K", '')
25
+ .scan(/.{1,120}/)
26
+ .join("\n")
24
27
  end
25
28
  .join("\n")
26
29
  end
@@ -28,12 +31,6 @@ module CircleCI
28
31
  def failed?
29
32
  @status == 'timedout' || @status == 'failed'
30
33
  end
31
-
32
- private
33
-
34
- def request(url)
35
- JSON.parse(Faraday.new(url).get.body)
36
- end
37
34
  end
38
35
  end
39
36
  end
@@ -58,7 +58,7 @@ module CircleCI
58
58
  end
59
59
 
60
60
  def finished?
61
- status == 'success' || status == 'canceled' || status == 'failed' || status == 'no_tests'
61
+ %w[success canceled failed no_tests].include?(status)
62
62
  end
63
63
 
64
64
  def channel_name
@@ -82,7 +82,7 @@ module CircleCI
82
82
  end
83
83
 
84
84
  def steps
85
- hash = @hash['steps'].group_by { |s| s['actions'].first['type'] }
85
+ hash = @hash['steps']&.group_by { |s| s['actions'].first['type'] } || {}
86
86
  hash.flat_map { |type, value| value.map { |v| Step.new(type, v) } }
87
87
  end
88
88
 
@@ -4,17 +4,24 @@ module CircleCI
4
4
  module CLI
5
5
  module Response
6
6
  class Step
7
- attr_reader :type, :status
7
+ attr_reader :type, :name
8
8
 
9
9
  def initialize(type, hash)
10
10
  @type = type
11
- @status = hash['status']
11
+ @name = hash['name']
12
12
  @hash = hash
13
13
  end
14
14
 
15
15
  def actions
16
16
  @hash['actions'].map { |a| Action.new(a) }
17
17
  end
18
+
19
+ def status
20
+ return 'running' if actions.any? { |action| action.end_time.nil? }
21
+ return 'failed' if actions.any?(&:failed?)
22
+
23
+ 'success'
24
+ end
18
25
  end
19
26
  end
20
27
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module CircleCI
4
4
  module CLI
5
- VERSION = '4.0.0'
5
+ VERSION = '4.0.2'
6
6
  end
7
7
  end
data/lib/circleci/cli.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'circleci'
4
- require 'faraday'
4
+
5
5
  require 'highline/import'
6
6
  require 'launchy'
7
7
  require 'ostruct'
@@ -14,6 +14,7 @@ require 'circleci/cli/version'
14
14
  require 'circleci/cli/command'
15
15
  require 'circleci/cli/response'
16
16
  require 'circleci/cli/printer'
17
+ require 'circleci/cli/networking/http_client'
17
18
  require 'circleci/cli/networking'
18
19
 
19
20
  module CircleCI
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: circleci-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - unhappychoice
@@ -23,26 +23,6 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: 2.1.0
26
- - !ruby/object:Gem::Dependency
27
- name: faraday
28
- requirement: !ruby/object:Gem::Requirement
29
- requirements:
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: '0.14'
33
- - - "<"
34
- - !ruby/object:Gem::Version
35
- version: '2.8'
36
- type: :runtime
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: '0.14'
43
- - - "<"
44
- - !ruby/object:Gem::Version
45
- version: '2.8'
46
26
  - !ruby/object:Gem::Dependency
47
27
  name: highline
48
28
  requirement: !ruby/object:Gem::Requirement
@@ -52,7 +32,7 @@ dependencies:
52
32
  version: 1.7.8
53
33
  - - "<"
54
34
  - !ruby/object:Gem::Version
55
- version: 2.2.0
35
+ version: 3.2.0
56
36
  type: :runtime
57
37
  prerelease: false
58
38
  version_requirements: !ruby/object:Gem::Requirement
@@ -62,7 +42,7 @@ dependencies:
62
42
  version: 1.7.8
63
43
  - - "<"
64
44
  - !ruby/object:Gem::Version
65
- version: 2.2.0
45
+ version: 3.2.0
66
46
  - !ruby/object:Gem::Dependency
67
47
  name: launchy
68
48
  requirement: !ruby/object:Gem::Requirement
@@ -72,7 +52,7 @@ dependencies:
72
52
  version: 2.4.3
73
53
  - - "<"
74
54
  - !ruby/object:Gem::Version
75
- version: 3.1.0
55
+ version: 3.2.0
76
56
  type: :runtime
77
57
  prerelease: false
78
58
  version_requirements: !ruby/object:Gem::Requirement
@@ -82,7 +62,7 @@ dependencies:
82
62
  version: 2.4.3
83
63
  - - "<"
84
64
  - !ruby/object:Gem::Version
85
- version: 3.1.0
65
+ version: 3.2.0
86
66
  - !ruby/object:Gem::Dependency
87
67
  name: pusher-client
88
68
  requirement: !ruby/object:Gem::Requirement
@@ -106,7 +86,7 @@ dependencies:
106
86
  version: '0.26'
107
87
  - - "<"
108
88
  - !ruby/object:Gem::Version
109
- version: '1.8'
89
+ version: '1.10'
110
90
  type: :runtime
111
91
  prerelease: false
112
92
  version_requirements: !ruby/object:Gem::Requirement
@@ -116,7 +96,7 @@ dependencies:
116
96
  version: '0.26'
117
97
  - - "<"
118
98
  - !ruby/object:Gem::Version
119
- version: '1.8'
99
+ version: '1.10'
120
100
  - !ruby/object:Gem::Dependency
121
101
  name: terminal-notifier
122
102
  requirement: !ruby/object:Gem::Requirement
@@ -140,7 +120,7 @@ dependencies:
140
120
  version: '1.8'
141
121
  - - "<"
142
122
  - !ruby/object:Gem::Version
143
- version: '3.1'
123
+ version: '4.1'
144
124
  type: :runtime
145
125
  prerelease: false
146
126
  version_requirements: !ruby/object:Gem::Requirement
@@ -150,7 +130,7 @@ dependencies:
150
130
  version: '1.8'
151
131
  - - "<"
152
132
  - !ruby/object:Gem::Version
153
- version: '3.1'
133
+ version: '4.1'
154
134
  - !ruby/object:Gem::Dependency
155
135
  name: thor
156
136
  requirement: !ruby/object:Gem::Requirement
@@ -160,7 +140,7 @@ dependencies:
160
140
  version: '0.20'
161
141
  - - "<"
162
142
  - !ruby/object:Gem::Version
163
- version: '1.3'
143
+ version: '1.6'
164
144
  type: :runtime
165
145
  prerelease: false
166
146
  version_requirements: !ruby/object:Gem::Requirement
@@ -170,175 +150,7 @@ dependencies:
170
150
  version: '0.20'
171
151
  - - "<"
172
152
  - !ruby/object:Gem::Version
173
- version: '1.3'
174
- - !ruby/object:Gem::Dependency
175
- name: abbrev
176
- requirement: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
180
- version: '0'
181
- type: :development
182
- prerelease: false
183
- version_requirements: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- - !ruby/object:Gem::Dependency
189
- name: base64
190
- requirement: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: '0'
195
- type: :development
196
- prerelease: false
197
- version_requirements: !ruby/object:Gem::Requirement
198
- requirements:
199
- - - ">="
200
- - !ruby/object:Gem::Version
201
- version: '0'
202
- - !ruby/object:Gem::Dependency
203
- name: bundler
204
- requirement: !ruby/object:Gem::Requirement
205
- requirements:
206
- - - ">="
207
- - !ruby/object:Gem::Version
208
- version: '0'
209
- type: :development
210
- prerelease: false
211
- version_requirements: !ruby/object:Gem::Requirement
212
- requirements:
213
- - - ">="
214
- - !ruby/object:Gem::Version
215
- version: '0'
216
- - !ruby/object:Gem::Dependency
217
- name: codecov
218
- requirement: !ruby/object:Gem::Requirement
219
- requirements:
220
- - - ">="
221
- - !ruby/object:Gem::Version
222
- version: '0'
223
- type: :development
224
- prerelease: false
225
- version_requirements: !ruby/object:Gem::Requirement
226
- requirements:
227
- - - ">="
228
- - !ruby/object:Gem::Version
229
- version: '0'
230
- - !ruby/object:Gem::Dependency
231
- name: github_changelog_generator
232
- requirement: !ruby/object:Gem::Requirement
233
- requirements:
234
- - - ">="
235
- - !ruby/object:Gem::Version
236
- version: '0'
237
- type: :development
238
- prerelease: false
239
- version_requirements: !ruby/object:Gem::Requirement
240
- requirements:
241
- - - ">="
242
- - !ruby/object:Gem::Version
243
- version: '0'
244
- - !ruby/object:Gem::Dependency
245
- name: guard
246
- requirement: !ruby/object:Gem::Requirement
247
- requirements:
248
- - - ">="
249
- - !ruby/object:Gem::Version
250
- version: '0'
251
- type: :development
252
- prerelease: false
253
- version_requirements: !ruby/object:Gem::Requirement
254
- requirements:
255
- - - ">="
256
- - !ruby/object:Gem::Version
257
- version: '0'
258
- - !ruby/object:Gem::Dependency
259
- name: guard-rspec
260
- requirement: !ruby/object:Gem::Requirement
261
- requirements:
262
- - - ">="
263
- - !ruby/object:Gem::Version
264
- version: '0'
265
- type: :development
266
- prerelease: false
267
- version_requirements: !ruby/object:Gem::Requirement
268
- requirements:
269
- - - ">="
270
- - !ruby/object:Gem::Version
271
- version: '0'
272
- - !ruby/object:Gem::Dependency
273
- name: guard-rubocop
274
- requirement: !ruby/object:Gem::Requirement
275
- requirements:
276
- - - ">="
277
- - !ruby/object:Gem::Version
278
- version: '0'
279
- type: :development
280
- prerelease: false
281
- version_requirements: !ruby/object:Gem::Requirement
282
- requirements:
283
- - - ">="
284
- - !ruby/object:Gem::Version
285
- version: '0'
286
- - !ruby/object:Gem::Dependency
287
- name: rake
288
- requirement: !ruby/object:Gem::Requirement
289
- requirements:
290
- - - ">="
291
- - !ruby/object:Gem::Version
292
- version: '0'
293
- type: :development
294
- prerelease: false
295
- version_requirements: !ruby/object:Gem::Requirement
296
- requirements:
297
- - - ">="
298
- - !ruby/object:Gem::Version
299
- version: '0'
300
- - !ruby/object:Gem::Dependency
301
- name: rspec
302
- requirement: !ruby/object:Gem::Requirement
303
- requirements:
304
- - - ">="
305
- - !ruby/object:Gem::Version
306
- version: '0'
307
- type: :development
308
- prerelease: false
309
- version_requirements: !ruby/object:Gem::Requirement
310
- requirements:
311
- - - ">="
312
- - !ruby/object:Gem::Version
313
- version: '0'
314
- - !ruby/object:Gem::Dependency
315
- name: rubocop
316
- requirement: !ruby/object:Gem::Requirement
317
- requirements:
318
- - - ">="
319
- - !ruby/object:Gem::Version
320
- version: '0'
321
- type: :development
322
- prerelease: false
323
- version_requirements: !ruby/object:Gem::Requirement
324
- requirements:
325
- - - ">="
326
- - !ruby/object:Gem::Version
327
- version: '0'
328
- - !ruby/object:Gem::Dependency
329
- name: simplecov
330
- requirement: !ruby/object:Gem::Requirement
331
- requirements:
332
- - - ">="
333
- - !ruby/object:Gem::Version
334
- version: '0'
335
- type: :development
336
- prerelease: false
337
- version_requirements: !ruby/object:Gem::Requirement
338
- requirements:
339
- - - ">="
340
- - !ruby/object:Gem::Version
341
- version: '0'
153
+ version: '1.6'
342
154
  description: A command line tool for CircleCI
343
155
  email:
344
156
  - unhappychoice@gmail.com
@@ -348,6 +160,7 @@ extensions: []
348
160
  extra_rdoc_files: []
349
161
  files:
350
162
  - ".all-contributorsrc"
163
+ - ".github/CODEOWNERS"
351
164
  - ".github/dependabot.yml"
352
165
  - ".github/workflows/release.yaml"
353
166
  - ".github/workflows/test.yml"
@@ -380,6 +193,7 @@ files:
380
193
  - lib/circleci/cli/command/watch_command/build_repository.rb
381
194
  - lib/circleci/cli/command/watch_command/build_watcher.rb
382
195
  - lib/circleci/cli/networking.rb
196
+ - lib/circleci/cli/networking/http_client.rb
383
197
  - lib/circleci/cli/networking/pusher_client.rb
384
198
  - lib/circleci/cli/printer.rb
385
199
  - lib/circleci/cli/printer/build_printer.rb