bld 0.1.6 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/bin/bld +1 -1
  3. data/bin/build +1 -1
  4. data/lib/commands.rb +154 -24
  5. metadata +65 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23ca92095150f9e2e36d9a2b64946ab21047349387aa7a6eebefc10e7f8227d3
4
- data.tar.gz: f46aba8b557a61ee3ac3b41c366a1be1ea3c608e82e8cbf5ef8d1851fca7022d
3
+ metadata.gz: b5e6157af2b5e12d5ee9490b4343789f7e7acf5932d3cb883bb21ec2fa68e221
4
+ data.tar.gz: 9d46125734793f9bd09a6d78b24bf873d9515b83add285d4ce978262a4cbe18f
5
5
  SHA512:
6
- metadata.gz: 5ca6e41446dbceea06b380d9e47b57e5b5b585f3b6a238c8c50d8a24c4bd6b613619771aa13d538cc7fe5c9f0c2cf63024a78a88a5d46f61048b05969fd089b7
7
- data.tar.gz: d5a535ce8825b02b2d91f4df6fea86f71ccd3f58b285708cd3b21ecff065d8f58be849d973838f208a6cba5f7c79756f3227cfce9cae885acdeb06aad0206856
6
+ metadata.gz: dc0eb8a516a0b3bf1f2d6e827159b73c3ea996049e65b2dbe3a7c9128790a51bbe62a8a694622fc73454ae9cf5bbed32a96ce350b7996c787e7904bf0734fb5c
7
+ data.tar.gz: 5e0aabe38039a3cc9e6f7e1647a5e4cc93e23bd7493f12202c53d6194021ab10bf5673ff64c5af237442598095c5afd4fb5ec1ea67c6e51c0810cf9947c45600
data/bin/bld CHANGED
@@ -20,7 +20,7 @@ class BuildCLI
20
20
 
21
21
  def run
22
22
  program :name, 'Build CLI'
23
- program :version, '0.1.6'
23
+ program :version, '0.1.9'
24
24
  program :description, "Build's Command Line Interface"
25
25
  program :int_block, -> { exit }
26
26
  default_command :help
data/bin/build CHANGED
@@ -20,7 +20,7 @@ class BuildCLI
20
20
 
21
21
  def run
22
22
  program :name, 'Build CLI'
23
- program :version, '0.1.6'
23
+ program :version, '0.1.9'
24
24
  program :description, "Build's Command Line Interface"
25
25
  program :int_block, -> { exit }
26
26
  default_command :help
data/lib/commands.rb CHANGED
@@ -2,6 +2,127 @@
2
2
  class BuildCLICommands
3
3
  def self.index
4
4
  return {
5
+ "ps": {
6
+ cli_details: { :syntax => "build ps -a <app>", :description => "List all the processes of an app",
7
+ :options => [["-a", "--app=<value>", String, "(required) app to run command against"]] },
8
+ cli_perform: Proc.new { |args, options|
9
+ app_name = options.app
10
+ if app_name.nil? || app_name.strip == ""
11
+ puts(CLI::UI.fmt("{{red:›}} Error: The following error occurred:"))
12
+ puts(CLI::UI.fmt("{{red:›}} {{gray:Missing required flag app}}"))
13
+ puts(CLI::UI.fmt("{{red:›}} See more help with --help"))
14
+ exit(1)
15
+ end
16
+ user_netrc = Netrc.read
17
+ user_token = user_netrc.[]("build.io")&.password
18
+ if user_token.nil?
19
+ puts(CLI::UI.fmt("{{red:›}} Error: not logged in"))
20
+ exit(1)
21
+ end
22
+ auth = "Bearer #{user_token}"
23
+ query_params = {}
24
+ query_params.[]=(:app, app_name)
25
+ query_string = URI.encode_www_form(query_params)
26
+ res = HTTParty.get("#{ANTIMONY_HOST}/api/cli/command/ps?#{query_string}",
27
+ { headers: { "Authorization" => auth } })
28
+ if res.code != 200
29
+ if res.body && res.body != "" && JSON.parse(res.body)&.key?("error")
30
+ puts(CLI::UI.fmt("{{red:›}} Error: #{JSON.parse(res.body).[]("error")}"))
31
+ else
32
+ puts(CLI::UI.fmt("{{red:›}} Error: An unknown error occurred"))
33
+ end
34
+ exit(1)
35
+ end
36
+ processes = JSON.parse(res.body).[]("processes")
37
+ if processes.empty?
38
+ puts(CLI::UI.fmt("{{green:›}} No processes found for app #{app_name}"))
39
+ exit(1)
40
+ end
41
+ processes.each { |process,|
42
+ puts(CLI::UI.fmt("{{gray:===}} {{bold:{{green:#{process.[]("type")}}} ({{cyan:#{process.[]("size")}}}): {{white:#{[
43
+ process.[]("command"), process.[]("args")
44
+ ].compact.join(" ")}}} ({{yellow:#{process.[]("quantity")}}})}}"))
45
+ process.[]("processes").each { |instance,|
46
+ started_at = Time.parse(instance.[]("started_at")).localtime
47
+ status = if instance.[]("status") == "Running"
48
+ "{{green:up}}"
49
+ else
50
+ "{{red:down}}"
51
+ end
52
+ days_ago = ((Time.now - started_at) / 86400).to_i
53
+ hours_ago = ((Time.now - started_at) / 3600).to_i % 24
54
+ minutes_ago = ((Time.now - started_at) / 60).to_i % 60
55
+ seconds_ago = (Time.now - started_at).to_i % 60
56
+ dotiw = ""
57
+ if days_ago > 0
58
+ dotiw = "#{days_ago}d "
59
+ end
60
+ if hours_ago > 0 || days_ago > 0
61
+ dotiw += "#{hours_ago}h "
62
+ end
63
+ if minutes_ago > 0 || hours_ago > 0 || days_ago > 0
64
+ dotiw += "#{minutes_ago}m "
65
+ end
66
+ if seconds_ago > 0 || minutes_ago > 0 || hours_ago > 0 || days_ago > 0
67
+ dotiw += "#{seconds_ago}s"
68
+ end
69
+ if dotiw == ""
70
+ dotiw = "0s"
71
+ end
72
+ puts(CLI::UI.fmt("{{white:#{process.[]("type")}.#{instance.[]("index")}}}: #{status} {{gray:#{started_at} (~ #{dotiw} ago)}}"))
73
+ }
74
+ puts("")
75
+ }
76
+ },
77
+ },
78
+ "ps:restart": {
79
+ cli_details: { :syntax => "build ps:restart [PROCESS] -a <app>", :description => "Restart all the processes of an app",
80
+ :options => [["-a", "--app=<value>", String, "(required) app to run command against"]] },
81
+ cli_perform: Proc.new { |args, options|
82
+ app_name = options.app
83
+ if app_name.nil? || app_name.strip == ""
84
+ puts(CLI::UI.fmt("{{red:›}} Error: The following error occurred:"))
85
+ puts(CLI::UI.fmt("{{red:›}} {{gray:Missing required flag app}}"))
86
+ puts(CLI::UI.fmt("{{red:›}} See more help with --help"))
87
+ exit(1)
88
+ end
89
+ if args.length > 1
90
+ puts(CLI::UI.fmt("{{red:›}} Error: The following error occurred:"))
91
+ puts(CLI::UI.fmt("{{red:›}} {{gray:Too many arguments provided}}"))
92
+ puts(CLI::UI.fmt("{{red:›}} See more help with --help"))
93
+ exit(1)
94
+ end
95
+ process = args.first
96
+ user_netrc = Netrc.read
97
+ user_token = user_netrc.[]("build.io")&.password
98
+ if user_token.nil?
99
+ puts(CLI::UI.fmt("{{red:›}} Error: not logged in"))
100
+ exit(1)
101
+ end
102
+ auth = "Bearer #{user_token}"
103
+ query_params = {}
104
+ query_params.[]=(:app, app_name)
105
+ if process
106
+ query_params.[]=(:process, process)
107
+ end
108
+ query_string = URI.encode_www_form(query_params)
109
+ res = HTTParty.get("#{ANTIMONY_HOST}/api/cli/command/ps/restart?#{query_string}",
110
+ { headers: { "Authorization" => auth } })
111
+ if res.code != 200
112
+ if res.body && res.body != "" && JSON.parse(res.body)&.key?("error")
113
+ puts(CLI::UI.fmt("{{red:›}} Error: #{JSON.parse(res.body).[]("error")}"))
114
+ else
115
+ puts(CLI::UI.fmt("{{red:›}} Error: An unknown error occurred"))
116
+ end
117
+ exit(1)
118
+ end
119
+ if process
120
+ puts(CLI::UI.fmt("{{v}} Restarted process {{cyan:#{process}}} for app {{cyan:#{app_name}}}"))
121
+ else
122
+ puts(CLI::UI.fmt("{{v}} Restarted all processes for app {{cyan:#{app_name}}}"))
123
+ end
124
+ },
125
+ },
5
126
  "config": {
6
127
  cli_details: { :syntax => "build config -a <app>", :description => "Get the config variables for an app",
7
128
  :options => [["-a", "--app=<value>", String, "(required) app to run command against"]] },
@@ -26,13 +147,12 @@ class BuildCLICommands
26
147
  res = HTTParty.get("#{ANTIMONY_HOST}/api/cli/command/config?#{query_string}",
27
148
  { headers: { "Authorization" => auth } })
28
149
  if res.code != 200
29
- if res.body.[]("error")
30
- puts(CLI::UI.fmt("{{red:›}} Error: #{res.body.[]("error")}"))
31
- exit(1)
150
+ if res.body && res.body != "" && JSON.parse(res.body)&.key?("error")
151
+ puts(CLI::UI.fmt("{{red:›}} Error: #{JSON.parse(res.body).[]("error")}"))
32
152
  else
33
153
  puts(CLI::UI.fmt("{{red:›}} Error: An unknown error occurred"))
34
- exit(1)
35
154
  end
155
+ exit(1)
36
156
  end
37
157
  JSON.parse(res.body).each { |key, value|
38
158
  puts("#{key}=#{value}")
@@ -71,13 +191,12 @@ class BuildCLICommands
71
191
  res = HTTParty.get("#{ANTIMONY_HOST}/api/cli/command/config/get?#{query_string}",
72
192
  { headers: { "Authorization" => auth } })
73
193
  if res.code != 200
74
- if res.body.[]("error")
75
- puts(CLI::UI.fmt("{{red:›}} Error: #{res.body.[]("error")}"))
76
- exit(1)
194
+ if res.body && res.body != "" && JSON.parse(res.body)&.key?("error")
195
+ puts(CLI::UI.fmt("{{red:›}} Error: #{JSON.parse(res.body).[]("error")}"))
77
196
  else
78
197
  puts(CLI::UI.fmt("{{red:›}} Error: An unknown error occurred"))
79
- exit(1)
80
198
  end
199
+ exit(1)
81
200
  end
82
201
  puts(res.body)
83
202
  },
@@ -116,8 +235,8 @@ class BuildCLICommands
116
235
  res = HTTParty.get("#{ANTIMONY_HOST}/api/cli/command/config/set?#{query_string}",
117
236
  { headers: { "Authorization" => auth } })
118
237
  if res.code != 200
119
- if res.body && res.body.[]("error")
120
- puts(CLI::UI.fmt("{{red:›}} Error: #{res.body.[]("error")}"))
238
+ if res.body && res.body != "" && JSON.parse(res.body)&.key?("error")
239
+ puts(CLI::UI.fmt("{{red:›}} Error: #{JSON.parse(res.body).[]("error")}"))
121
240
  else
122
241
  puts(CLI::UI.fmt("{{red:›}} Error: An unknown error occurred"))
123
242
  end
@@ -158,8 +277,8 @@ class BuildCLICommands
158
277
  res = HTTParty.get("#{ANTIMONY_HOST}/api/cli/command/config/unset?#{query_string}",
159
278
  { headers: { "Authorization" => auth } })
160
279
  if res.code != 200
161
- if res.body && res.body.[]("error")
162
- puts(CLI::UI.fmt("{{red:›}} Error: #{res.body.[]("error")}"))
280
+ if res.body && res.body != "" && JSON.parse(res.body)&.key?("error")
281
+ puts(CLI::UI.fmt("{{red:›}} Error: #{JSON.parse(res.body).[]("error")}"))
163
282
  else
164
283
  puts(CLI::UI.fmt("{{red:›}} Error: An unknown error occurred"))
165
284
  end
@@ -214,9 +333,10 @@ class BuildCLICommands
214
333
  exit
215
334
  end
216
335
  (user_token, user_email) = nil
336
+ client_secret = SecureRandom.uuid
337
+ oauth_url = "#{ANTIMONY_HOST}/cli_auth/authorize/#{client_secret}"
338
+ puts(CLI::UI.fmt("Opening browser to {{underline:#{oauth_url}}}"))
217
339
  CLI::UI::Spinner.spin("Waiting for login") { |spinner,|
218
- client_secret = SecureRandom.uuid
219
- oauth_url = "#{ANTIMONY_HOST}/cli_auth/authorize/#{client_secret}"
220
340
  Launchy.open(oauth_url)
221
341
  poll_interval = 1
222
342
  timeout = (5 * 60)
@@ -238,10 +358,14 @@ class BuildCLICommands
238
358
  break
239
359
  end
240
360
  }
241
- user_netrc = Netrc.read
242
- user_netrc.[]=("build.io", ["#{user_email}", "#{user_token}"])
243
- user_netrc.save
244
361
  }
362
+ if user_token.nil? || user_email.nil? || user_token.empty? || user_email.empty?
363
+ puts(CLI::UI.fmt("{{red:Login failed}}"))
364
+ exit(1)
365
+ end
366
+ user_netrc = Netrc.read
367
+ user_netrc.[]=("build.io", ["#{user_email}", "#{user_token}"])
368
+ user_netrc.save
245
369
  puts(CLI::UI.fmt("Logged in as {{green:#{user_email}}}"))
246
370
  },
247
371
  },
@@ -283,9 +407,11 @@ class BuildCLICommands
283
407
  res = HTTParty.get("#{ANTIMONY_HOST}/api/apps/#{app_name}/logs/log_url?#{query_string}",
284
408
  { headers: { "Authorization" => auth } })
285
409
  if res.code != 200
286
- puts(CLI::UI.fmt("{{red:›}} Error: Couldn't find that app."))
287
- puts(CLI::UI.fmt("{{red:›}}"))
288
- puts(CLI::UI.fmt("{{red:›}} Error ID: not_found"))
410
+ if res.body && res.body != "" && JSON.parse(res.body)&.key?("error")
411
+ puts(CLI::UI.fmt("{{red:›}} Error: #{JSON.parse(res.body).[]("error")}"))
412
+ else
413
+ puts(CLI::UI.fmt("{{red:›}} Error: An unknown error occurred"))
414
+ end
289
415
  exit(1)
290
416
  end
291
417
  log_url = res.[]("url")
@@ -331,7 +457,11 @@ class BuildCLICommands
331
457
  exit(1)
332
458
  end
333
459
  user_netrc = Netrc.read
334
- user_token = user_netrc.[]("build.io").[](1)
460
+ user_token = user_netrc.[]("build.io")&.password
461
+ if user_token.nil?
462
+ puts(CLI::UI.fmt("{{red:›}} Error: not logged in"))
463
+ exit(1)
464
+ end
335
465
  auth = "Bearer #{user_token}"
336
466
  query_params = {}
337
467
  if options.app
@@ -341,10 +471,10 @@ class BuildCLICommands
341
471
  res = HTTParty.get("#{ANTIMONY_HOST}/api/cli/command/run?#{query_string}",
342
472
  { headers: { "Authorization" => auth } })
343
473
  if res.code != 200
344
- if res.body.[]("error")
345
- puts(CLI::UI.fmt("{{red:›}} Error: #{res.body.[]("error")}"))
474
+ if res.body && res.body != "" && JSON.parse(res.body)&.key?("error")
475
+ puts(CLI::UI.fmt("{{red:›}} Error: #{JSON.parse(res.body).[]("error")}"))
346
476
  else
347
- puts(CLI::UI.fmt("{{red:›}} Error: not logged in"))
477
+ puts(CLI::UI.fmt("{{red:›}} Error: An unknown error occurred"))
348
478
  end
349
479
  exit(1)
350
480
  end
metadata CHANGED
@@ -1,15 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bld
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - usiegl00
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-01 00:00:00.000000000 Z
11
+ date: 2024-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: abbrev
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: base64
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bigdecimal
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: csv
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
13
69
  - !ruby/object:Gem::Dependency
14
70
  name: public_suffix
15
71
  requirement: !ruby/object:Gem::Requirement
@@ -124,22 +180,22 @@ dependencies:
124
180
  name: net-ssh
125
181
  requirement: !ruby/object:Gem::Requirement
126
182
  requirements:
127
- - - "~>"
128
- - !ruby/object:Gem::Version
129
- version: '6.1'
130
183
  - - ">="
131
184
  - !ruby/object:Gem::Version
132
185
  version: 6.1.0
186
+ - - "<="
187
+ - !ruby/object:Gem::Version
188
+ version: 7.2.1
133
189
  type: :runtime
134
190
  prerelease: false
135
191
  version_requirements: !ruby/object:Gem::Requirement
136
192
  requirements:
137
- - - "~>"
138
- - !ruby/object:Gem::Version
139
- version: '6.1'
140
193
  - - ">="
141
194
  - !ruby/object:Gem::Version
142
195
  version: 6.1.0
196
+ - - "<="
197
+ - !ruby/object:Gem::Version
198
+ version: 7.2.1
143
199
  description: CLI for build.io
144
200
  email: 50933431+usiegl00@users.noreply.github.com
145
201
  executables:
@@ -181,7 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
237
  - !ruby/object:Gem::Version
182
238
  version: '0'
183
239
  requirements: []
184
- rubygems_version: 3.4.21
240
+ rubygems_version: 3.5.3
185
241
  signing_key:
186
242
  specification_version: 4
187
243
  summary: build cli