uffizzi-cli 0.6.0 → 0.7.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -7
  3. data/exe/uffizzi +1 -1
  4. data/lib/uffizzi/auth_helper.rb +0 -4
  5. data/lib/uffizzi/cli/common.rb +2 -2
  6. data/lib/uffizzi/cli/config.rb +5 -11
  7. data/lib/uffizzi/cli/connect.rb +74 -27
  8. data/lib/uffizzi/cli/disconnect.rb +1 -1
  9. data/lib/uffizzi/cli/login.rb +2 -2
  10. data/lib/uffizzi/cli/logout.rb +1 -1
  11. data/lib/uffizzi/cli/preview/service.rb +8 -7
  12. data/lib/uffizzi/cli/preview.rb +66 -123
  13. data/lib/uffizzi/cli/project/compose.rb +14 -16
  14. data/lib/uffizzi/cli/project/secret.rb +19 -8
  15. data/lib/uffizzi/cli/project.rb +31 -7
  16. data/lib/uffizzi/cli.rb +15 -23
  17. data/lib/uffizzi/clients/api/api_client.rb +66 -21
  18. data/lib/uffizzi/clients/api/api_routes.rb +8 -0
  19. data/lib/uffizzi/clients/api/http_client.rb +47 -45
  20. data/lib/uffizzi/date_helper.rb +45 -0
  21. data/lib/uffizzi/response_helper.rb +11 -7
  22. data/lib/uffizzi/services/command_service.rb +9 -0
  23. data/lib/uffizzi/services/compose_file_service.rb +3 -0
  24. data/lib/uffizzi/services/preview_service.rb +109 -0
  25. data/lib/uffizzi/version.rb +1 -1
  26. data/man/uffizzi-connect +37 -0
  27. data/man/uffizzi-connect-acr +35 -0
  28. data/man/uffizzi-connect-acr.ronn +28 -0
  29. data/man/uffizzi-connect-docker-hub +34 -0
  30. data/man/uffizzi-connect-docker-hub.ronn +27 -0
  31. data/man/uffizzi-connect-ecr +35 -0
  32. data/man/uffizzi-connect-ecr.ronn +28 -0
  33. data/man/uffizzi-connect-gcr +40 -0
  34. data/man/uffizzi-connect-gcr.ronn +32 -0
  35. data/man/uffizzi-connect-ghcr +35 -0
  36. data/man/uffizzi-connect-ghcr.ronn +28 -0
  37. data/man/uffizzi-connect.ronn +31 -0
  38. data/man/uffizzi-disconnect +37 -0
  39. data/man/uffizzi-disconnect.ronn +31 -0
  40. data/man/uffizzi-login +1 -1
  41. data/man/uffizzi-login.ronn +1 -1
  42. data/man/uffizzi-preview-update +34 -0
  43. data/man/uffizzi-preview-update.ronn +33 -0
  44. data/man/uffizzi-project-set-default +34 -0
  45. data/man/uffizzi-project-set-default.html +111 -0
  46. data/man/uffizzi-project-set-default.ronn +26 -0
  47. metadata +23 -2
@@ -3,39 +3,43 @@
3
3
  require 'uffizzi'
4
4
  require 'uffizzi/auth_helper'
5
5
  require 'uffizzi/services/preview_service'
6
+ require 'uffizzi/services/command_service'
6
7
 
7
8
  module Uffizzi
8
- class CLI::Preview < Thor
9
+ class Cli::Preview < Thor
9
10
  include ApiClient
10
11
 
11
- @spinner
12
-
13
- desc 'service', 'service'
12
+ desc 'service', 'Show the preview services info'
14
13
  require_relative 'preview/service'
15
- subcommand 'service', Uffizzi::CLI::Preview::Service
16
-
17
- desc 'list', 'list'
14
+ subcommand 'service', Uffizzi::Cli::Preview::Service
15
+ desc 'list', 'List all previews'
18
16
  def list
19
17
  run('list')
20
18
  end
21
19
 
22
- desc 'create [COMPOSE_FILE]', 'create'
20
+ desc 'create [COMPOSE_FILE]', 'Create a preview'
23
21
  method_option :output, required: false, type: :string, aliases: '-o', enum: ['json', 'github-action']
24
22
  def create(file_path = nil)
25
23
  run('create', file_path: file_path)
26
24
  end
27
25
 
28
- desc 'delete [DEPLOYMENT_ID]', 'delete'
26
+ desc 'uffizzi preview update [DEPLOYMENT_ID] [COMPOSE_FILE]', 'create'
27
+ method_option :output, required: false, type: :string, aliases: '-o', enum: ['json', 'github-action']
28
+ def update(deployment_name, file_path)
29
+ run('update', deployment_name: deployment_name, file_path: file_path)
30
+ end
31
+
32
+ desc 'delete [DEPLOYMENT_ID]', 'Delete a preview'
29
33
  def delete(deployment_name)
30
34
  run('delete', deployment_name: deployment_name)
31
35
  end
32
36
 
33
- desc 'describe [DEPLOYMENT_ID]', 'describe'
37
+ desc 'describe [DEPLOYMENT_ID]', 'Display details of a preview'
34
38
  def describe(deployment_name)
35
39
  run('describe', deployment_name: deployment_name)
36
40
  end
37
41
 
38
- desc 'events [DEPLOYMENT_ID]', 'events'
42
+ desc 'events [DEPLOYMENT_ID]', 'Show the deployment event logs for a preview'
39
43
  def events(deployment_name)
40
44
  run('events', deployment_name: deployment_name)
41
45
  end
@@ -48,7 +52,7 @@ module Uffizzi
48
52
  Uffizzi.ui.disable_stdout
49
53
  end
50
54
  raise Uffizzi::Error.new('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
51
- raise Uffizzi::Error.new('This command needs project to be set in config file') unless Uffizzi::AuthHelper.project_set?(options)
55
+ raise Uffizzi::Error.new('This command needs project to be set in config file') unless CommandService.project_set?(options)
52
56
 
53
57
  project_slug = options[:project].nil? ? ConfigFile.read_option(:project) : options[:project]
54
58
 
@@ -57,6 +61,8 @@ module Uffizzi
57
61
  handle_list_command(project_slug)
58
62
  when 'create'
59
63
  handle_create_command(file_path, project_slug)
64
+ when 'update'
65
+ handle_update_command(deployment_name, file_path, project_slug)
60
66
  when 'delete'
61
67
  handle_delete_command(deployment_name, project_slug)
62
68
  when 'describe'
@@ -81,132 +87,56 @@ module Uffizzi
81
87
  response = create_deployment(ConfigFile.read_option(:server), project_slug, params)
82
88
 
83
89
  if ResponseHelper.created?(response)
84
- handle_succeed_create_response(project_slug, response)
90
+ deployment = response[:body][:deployment]
91
+ success_message = "Preview created with name deployment-#{deployment[:id]}"
92
+ PreviewService.start_deploy_containers(project_slug, deployment, success_message)
85
93
  else
86
94
  ResponseHelper.handle_failed_response(response)
87
95
  end
96
+ rescue SystemExit, Interrupt, SocketError
97
+ deployment_id = response[:body][:deployment][:id]
98
+ handle_preview_interruption(deployment_id, hostname, project_slug)
88
99
  end
89
100
 
90
- def handle_events_command(deployment_name, project_slug)
101
+ def handle_update_command(deployment_name, file_path, project_slug)
91
102
  deployment_id = PreviewService.read_deployment_id(deployment_name)
92
103
 
93
104
  return Uffizzi.ui.say("Preview should be specified in 'deployment-PREVIEW_ID' format") if deployment_id.nil?
94
105
 
95
- response = fetch_events(ConfigFile.read_option(:server), project_slug, deployment_id)
106
+ params = prepare_params(file_path)
107
+ response = update_deployment(ConfigFile.read_option(:server), project_slug, deployment_id, params)
96
108
 
97
109
  if ResponseHelper.ok?(response)
98
- handle_succeed_events_response(response)
110
+ deployment = response[:body][:deployment]
111
+ success_message = "Preview with ID deployment-#{deployment_id} was successfully updated."
112
+ PreviewService.start_deploy_containers(project_slug, deployment, success_message)
99
113
  else
100
114
  ResponseHelper.handle_failed_response(response)
101
115
  end
102
116
  end
103
117
 
104
- def handle_succeed_events_response(response)
105
- Uffizzi.ui.pretty_say(response[:body][:events])
106
- end
118
+ def handle_events_command(deployment_name, project_slug)
119
+ deployment_id = PreviewService.read_deployment_id(deployment_name)
107
120
 
108
- def handle_succeed_create_response(project_slug, response)
109
- deployment = response[:body][:deployment]
110
- deployment_id = deployment[:id]
111
- params = { id: deployment_id }
121
+ raise Uffizzi::Error.new("Preview should be specified in 'deployment-PREVIEW_ID' format") if deployment_id.nil?
112
122
 
113
- response = deploy_containers(ConfigFile.read_option(:server), project_slug, deployment_id, params)
123
+ response = fetch_events(ConfigFile.read_option(:server), project_slug, deployment_id)
114
124
 
115
- if ResponseHelper.no_content?(response)
116
- Uffizzi.ui.say("Preview created with name deployment-#{deployment_id}")
117
- print_deployment_progress(deployment, project_slug)
125
+ if ResponseHelper.ok?(response)
126
+ handle_succeed_events_response(response)
118
127
  else
119
128
  ResponseHelper.handle_failed_response(response)
120
129
  end
121
130
  end
122
131
 
123
- def print_deployment_progress(deployment, project_slug)
124
- deployment_id = deployment[:id]
125
-
126
- @spinner = TTY::Spinner.new('[:spinner] Creating containers...', format: :dots)
127
- @spinner.auto_spin
128
-
129
- activity_items = []
130
-
131
- loop do
132
- response = get_activity_items(ConfigFile.read_option(:server), project_slug, deployment_id)
133
- handle_activity_items_response(response)
134
- return unless @spinner.spinning?
135
-
136
- activity_items = response[:body][:activity_items]
137
- break if !activity_items.empty? && activity_items.count == deployment[:containers].count
138
-
139
- sleep(5)
140
- end
141
-
142
- @spinner.success
143
-
144
- Uffizzi.ui.say('Done')
145
-
146
- @spinner = TTY::Spinner::Multi.new('[:spinner] Deploying preview...', format: :dots, style: {
147
- middle: ' ',
148
- bottom: ' ',
149
- })
150
-
151
- containers_spinners = create_containers_spinners(activity_items)
152
-
153
- wait_containers_deploying(project_slug, deployment_id, containers_spinners)
154
-
155
- if options[:output].nil?
156
- Uffizzi.ui.say('Done')
157
- preview_url = "https://#{deployment[:preview_url]}"
158
- Uffizzi.ui.say(preview_url) if @spinner.success?
159
- else
160
- output_data = build_output_data(deployment)
161
- Uffizzi.ui.output(output_data)
162
- end
163
- end
164
-
165
- def wait_containers_deploying(project_slug, deployment_id, containers_spinners)
166
- loop do
167
- response = get_activity_items(ConfigFile.read_option(:server), project_slug, deployment_id)
168
- handle_activity_items_response(response)
169
- return if @spinner.done?
170
-
171
- activity_items = response[:body][:activity_items]
172
- check_activity_items_state(activity_items, containers_spinners)
173
- break if activity_items.all? { |activity_item| activity_item[:state] == 'deployed' || activity_item[:state] == 'failed' }
174
-
175
- sleep(5)
176
- end
177
- end
178
-
179
- def create_containers_spinners(activity_items)
180
- activity_items.map do |activity_item|
181
- container_spinner = @spinner.register("[:spinner] #{activity_item[:name]}")
182
- container_spinner.auto_spin
183
- {
184
- name: activity_item[:name],
185
- spinner: container_spinner,
186
- }
187
- end
188
- end
189
-
190
- def check_activity_items_state(activity_items, containers_spinners)
191
- finished_activity_items = activity_items.filter do |activity_item|
192
- activity_item[:state] == 'deployed' || activity_item[:state] == 'failed'
193
- end
194
- finished_activity_items.each do |activity_item|
195
- container_spinner = containers_spinners.detect { |spinner| spinner[:name] == activity_item[:name] }
196
- spinner = container_spinner[:spinner]
197
- case activity_item[:state]
198
- when 'deployed'
199
- spinner.success
200
- when 'failed'
201
- spinner.error
202
- end
203
- end
132
+ def handle_succeed_events_response(response)
133
+ Uffizzi.ui.pretty_say(response[:body][:events])
204
134
  end
205
135
 
206
136
  def handle_delete_command(deployment_name, project_slug)
207
137
  deployment_id = PreviewService.read_deployment_id(deployment_name)
208
138
 
209
- return Uffizzi.ui.say("Preview should be specified in 'deployment-PREVIEW_ID' format") if deployment_id.nil?
139
+ raise Uffizzi::Error.new("Preview should be specified in 'deployment-PREVIEW_ID' format") if deployment_id.nil?
210
140
 
211
141
  response = delete_deployment(ConfigFile.read_option(:server), project_slug, deployment_id)
212
142
 
@@ -220,7 +150,7 @@ module Uffizzi
220
150
  def handle_describe_command(deployment_name, project_slug)
221
151
  deployment_id = PreviewService.read_deployment_id(deployment_name)
222
152
 
223
- return Uffizzi.ui.say("Preview should be specified in 'deployment-PREVIEW_ID' format") if deployment_id.nil?
153
+ raise Uffizzi::Error.new("Preview should be specified in 'deployment-PREVIEW_ID' format") if deployment_id.nil?
224
154
 
225
155
  response = describe_deployment(ConfigFile.read_option(:server), project_slug, deployment_id)
226
156
 
@@ -231,16 +161,9 @@ module Uffizzi
231
161
  end
232
162
  end
233
163
 
234
- def handle_activity_items_response(response)
235
- unless ResponseHelper.ok?(response)
236
- @spinner.error
237
- ResponseHelper.handle_failed_response(response)
238
- end
239
- end
240
-
241
164
  def handle_succeed_list_response(response)
242
165
  deployments = response[:body][:deployments] || []
243
- return Uffizzi.ui.say('The project has no active deployments') if deployments.empty?
166
+ raise Uffizzi::Error.new('The project has no active deployments') if deployments.empty?
244
167
 
245
168
  deployments.each do |deployment|
246
169
  Uffizzi.ui.say("deployment-#{deployment[:id]}")
@@ -253,11 +176,26 @@ module Uffizzi
253
176
 
254
177
  def handle_succeed_describe_response(response)
255
178
  deployment = response[:body][:deployment]
179
+ deployment[:containers] = deployment[:containers].map do |container|
180
+ unless container[:secret_variables].nil?
181
+ container[:secret_variables] = hide_secrets(container[:secret_variables])
182
+ end
183
+
184
+ container
185
+ end
256
186
  deployment.each_key do |key|
257
187
  Uffizzi.ui.say("#{key}: #{deployment[key]}")
258
188
  end
259
189
  end
260
190
 
191
+ def hide_secrets(secret_variables)
192
+ secret_variables.map do |secret_variable|
193
+ secret_variable[:value] = '******'
194
+
195
+ secret_variable
196
+ end
197
+ end
198
+
261
199
  def prepare_params(file_path)
262
200
  begin
263
201
  compose_file_data = File.read(file_path)
@@ -280,11 +218,16 @@ module Uffizzi
280
218
  }
281
219
  end
282
220
 
283
- def build_output_data(output_data)
284
- {
285
- id: "deployment-#{output_data[:id]}",
286
- url: "https://#{output_data[:preview_url]}",
287
- }
221
+ def handle_preview_interruption(deployment_id, hostname, project_slug)
222
+ deletion_response = delete_deployment(hostname, project_slug, deployment_id)
223
+ deployment_name = "deployment-#{deployment_id}"
224
+ preview_deletion_message = if ResponseHelper.no_content?(deletion_response)
225
+ "The preview #{deployment_name} has been disabled."
226
+ else
227
+ "Couldn't disable the deployment #{deployment_name} - please disable maually."
228
+ end
229
+
230
+ raise Uffizzi::Error.new("The preview creation was interrupted. #{preview_deletion_message}")
288
231
  end
289
232
  end
290
233
  end
@@ -5,22 +5,23 @@ require 'uffizzi/auth_helper'
5
5
  require 'uffizzi/response_helper'
6
6
  require 'uffizzi/services/compose_file_service'
7
7
  require 'uffizzi/services/env_variables_service'
8
+ require 'uffizzi/services/command_service'
8
9
 
9
10
  module Uffizzi
10
- class CLI::Project::Compose < Thor
11
+ class Cli::Project::Compose < Thor
11
12
  include ApiClient
12
13
 
13
- desc 'set [OPTIONS]', 'set'
14
+ desc 'set [OPTIONS]', 'Set the configuration of a project with a compose file'
14
15
  def set
15
16
  run('set')
16
17
  end
17
18
 
18
- desc 'unset', 'unset'
19
+ desc 'unset', 'Unset the compose file for a project'
19
20
  def unset
20
21
  run('unset')
21
22
  end
22
23
 
23
- desc 'describe', 'describe'
24
+ desc 'describe', 'Display details of a compose file'
24
25
  def describe
25
26
  run('describe')
26
27
  end
@@ -29,26 +30,25 @@ module Uffizzi
29
30
 
30
31
  def run(command)
31
32
  return Uffizzi.ui.say('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
32
- return Uffizzi.ui.say('This command needs project to be set in config file') unless Uffizzi::AuthHelper.project_set?(options)
33
+ return Uffizzi.ui.say('This command needs project to be set in config file') unless CommandService.project_set?(options)
33
34
 
34
- @project_slug = options[:project].nil? ? ConfigFile.read_option(:project) : options[:project]
35
- @server = ConfigFile.read_option(:server)
35
+ project_slug = options[:project].nil? ? ConfigFile.read_option(:project) : options[:project]
36
36
  file_path = options[:file]
37
37
  case command
38
38
  when 'set'
39
- handle_set_command(file_path)
39
+ handle_set_command(project_slug, file_path)
40
40
  when 'unset'
41
- handle_unset_command
41
+ handle_unset_command(project_slug)
42
42
  when 'describe'
43
- handle_describe_command
43
+ handle_describe_command(project_slug)
44
44
  end
45
45
  end
46
46
 
47
- def handle_set_command(file_path)
47
+ def handle_set_command(project_slug, file_path)
48
48
  return Uffizzi.ui.say('No file provided') if file_path.nil?
49
49
 
50
50
  params = prepare_params(file_path)
51
- response = set_compose_file(@server, params, @project_slug)
51
+ response = set_compose_file(ConfigFile.read_option(:server), params, project_slug)
52
52
 
53
53
  if ResponseHelper.created?(response)
54
54
  Uffizzi.ui.say('compose file created')
@@ -57,9 +57,8 @@ module Uffizzi
57
57
  end
58
58
  end
59
59
 
60
- def handle_unset_command
60
+ def handle_unset_command(project_slug)
61
61
  server = ConfigFile.read_option(:server)
62
- project_slug = ConfigFile.read_option(:project)
63
62
  response = unset_compose_file(server, project_slug)
64
63
 
65
64
  if ResponseHelper.no_content?(response)
@@ -69,9 +68,8 @@ module Uffizzi
69
68
  end
70
69
  end
71
70
 
72
- def handle_describe_command
71
+ def handle_describe_command(project_slug)
73
72
  server = ConfigFile.read_option(:server)
74
- project_slug = ConfigFile.read_option(:project)
75
73
  response = describe_compose_file(server, project_slug)
76
74
  compose_file = response[:body][:compose_file]
77
75
 
@@ -3,23 +3,25 @@
3
3
  require 'uffizzi'
4
4
  require 'uffizzi/auth_helper'
5
5
  require 'uffizzi/response_helper'
6
+ require 'uffizzi/date_helper'
6
7
  require 'uffizzi/shell'
8
+ require 'time'
7
9
 
8
10
  module Uffizzi
9
- class CLI::Project::Secret < Thor
11
+ class Cli::Project::Secret < Thor
10
12
  include ApiClient
11
13
 
12
- desc 'list', 'List Secrets'
14
+ desc 'list', 'Show metadata for all secrets of a project'
13
15
  def list
14
16
  run('list')
15
17
  end
16
18
 
17
- desc 'create [SECRET_ID]', 'Create secrets from $stdout'
19
+ desc 'create [SECRET_ID]', 'Create a secret for a project'
18
20
  def create(id)
19
21
  run('create', id)
20
22
  end
21
23
 
22
- desc 'delete [SECRET_ID]', 'Delete a secret'
24
+ desc 'delete [SECRET_ID]', 'Delete a secret for a project'
23
25
  def delete(id)
24
26
  run('delete', id)
25
27
  end
@@ -30,7 +32,7 @@ module Uffizzi
30
32
  Cli::Common.show_manual(:project, :secret, command) if options[:help] || args.include?('help')
31
33
  return Uffizzi.ui.say('You are not logged in') unless AuthHelper.signed_in?
32
34
 
33
- project_slug = ConfigFile.read_option(:project)
35
+ project_slug = options[:project].nil? ? ConfigFile.read_option(:project) : options[:project]
34
36
  return Uffizzi.ui.say('Please use the --project option to specify the project name') if project_slug.nil?
35
37
 
36
38
  case command
@@ -50,11 +52,20 @@ module Uffizzi
50
52
  def handle_list_command(project_slug)
51
53
  server = ConfigFile.read_option(:server)
52
54
  response = fetch_secrets(server, project_slug)
53
- secrets = response[:body][:secrets].map { |secret| [secret[:name]] }
55
+ secrets = response[:body][:secrets]
56
+
54
57
  return Uffizzi.ui.say('There are no secrets for the project') if secrets.empty?
55
58
 
56
- table_header = 'NAME'
57
- table_data = [[table_header], *secrets]
59
+ current_date = Time.now.utc
60
+ prepared_secrets = secrets.map do |secret|
61
+ [
62
+ secret[:name],
63
+ DateHelper.count_distanse(current_date, Time.parse(secret[:created_at])),
64
+ DateHelper.count_distanse(current_date, Time.parse(secret[:updated_at])),
65
+ ]
66
+ end
67
+ table_header = ['NAME', 'CREATED', 'UPDATED']
68
+ table_data = [table_header, *prepared_secrets]
58
69
  return Uffizzi.ui.print_table(table_data) if ResponseHelper.ok?(response)
59
70
 
60
71
  ResponseHelper.handle_failed_response(response)
@@ -5,31 +5,40 @@ require 'uffizzi/auth_helper'
5
5
  require 'uffizzi/response_helper'
6
6
 
7
7
  module Uffizzi
8
- class CLI::Project < Thor
8
+ class Cli::Project < Thor
9
9
  include ApiClient
10
10
 
11
- desc 'compose', 'compose'
11
+ desc 'compose', 'Manage the compose file for a project'
12
12
  method_option :file, required: false, aliases: '-f'
13
13
  require_relative 'project/compose'
14
- subcommand 'compose', Uffizzi::CLI::Project::Compose
14
+ subcommand 'compose', Uffizzi::Cli::Project::Compose
15
15
 
16
- desc 'secret', 'Secrets Actions'
16
+ desc 'secret', 'Manage secrets for a project'
17
17
  require_relative 'project/secret'
18
- subcommand 'secret', Uffizzi::CLI::Project::Secret
18
+ subcommand 'secret', Uffizzi::Cli::Project::Secret
19
19
 
20
- desc 'list', 'list'
20
+ desc 'list', 'List all projects in the account'
21
21
  def list
22
22
  run('list')
23
23
  end
24
24
 
25
+ desc 'set-default PROJECT_SLUG', 'set-default'
26
+ def set_default(project_slug)
27
+ run('set-default', project_slug: project_slug)
28
+ end
29
+
30
+ map('set-default' => :set_default)
31
+
25
32
  private
26
33
 
27
- def run(command)
34
+ def run(command, project_slug: nil)
28
35
  return Uffizzi.ui.say('You are not logged in.') unless Uffizzi::AuthHelper.signed_in?
29
36
 
30
37
  case command
31
38
  when 'list'
32
39
  handle_list_command
40
+ when 'set-default'
41
+ handle_set_default_command(project_slug)
33
42
  end
34
43
  end
35
44
 
@@ -52,6 +61,21 @@ module Uffizzi
52
61
  print_projects(projects)
53
62
  end
54
63
 
64
+ def handle_set_default_command(project_slug)
65
+ response = describe_project(ConfigFile.read_option(:server), project_slug)
66
+
67
+ if ResponseHelper.ok?(response)
68
+ handle_succeed_set_default_response(response)
69
+ else
70
+ ResponseHelper.handle_failed_response(response)
71
+ end
72
+ end
73
+
74
+ def handle_succeed_set_default_response(response)
75
+ set_default_project(response[:body][:project])
76
+ Uffizzi.ui.say('Default project has been updated.')
77
+ end
78
+
55
79
  def print_projects(projects)
56
80
  projects_list = projects.reduce('') do |acc, project|
57
81
  "#{acc}#{project[:slug]}\n"
data/lib/uffizzi/cli.rb CHANGED
@@ -3,23 +3,20 @@
3
3
  require 'uffizzi'
4
4
 
5
5
  module Uffizzi
6
- class CLI < Thor
7
- require_relative 'cli/common'
8
-
9
- class_option :help, type: :boolean, aliases: HELP_MAPPINGS
6
+ class Cli < Thor
10
7
  class_option :project, type: :string
11
8
 
12
9
  def self.exit_on_failure?
13
10
  true
14
11
  end
15
12
 
16
- desc 'version', 'Show Version'
13
+ desc 'version', 'Print version information for uffizzi CLI'
17
14
  def version
18
15
  require_relative 'version'
19
16
  Uffizzi.ui.say(Uffizzi::VERSION)
20
17
  end
21
18
 
22
- desc 'login [OPTIONS]', 'Login into Uffizzi'
19
+ desc 'login [OPTIONS]', 'Login to Uffizzi to view and manage your previews'
23
20
  method_option :server, required: false, aliases: '-s'
24
21
  method_option :username, required: false, aliases: '-u'
25
22
  def login
@@ -27,38 +24,30 @@ module Uffizzi
27
24
  Login.new(options).run
28
25
  end
29
26
 
30
- desc 'logout', 'Logout from Uffizzi'
27
+ desc 'logout', 'Log out of a Uffizzi user account'
31
28
  def logout
32
29
  require_relative 'cli/logout'
33
30
  Logout.new(options).run
34
31
  end
35
32
 
36
- desc 'projects', 'projects'
37
- def projects
38
- require_relative 'cli/projects'
39
- Projects.new.run
40
- end
41
-
42
33
  desc 'project', 'project'
43
34
  require_relative 'cli/project'
44
- subcommand 'project', CLI::Project
35
+ subcommand 'project', Cli::Project
45
36
 
46
37
  desc 'config', 'config'
47
38
  require_relative 'cli/config'
48
- subcommand 'config', CLI::Config
39
+ subcommand 'config', Cli::Config
49
40
 
50
41
  desc 'preview', 'preview'
51
42
  method_option :project, required: false
52
43
  require_relative 'cli/preview'
53
- subcommand 'preview', CLI::Preview
44
+ subcommand 'preview', Cli::Preview
54
45
 
55
- desc 'connect CREDENTIAL_TYPE', 'Connect credentials into Uffizzi'
56
- def connect(credential_type, credential_file_path = nil)
57
- require_relative 'cli/connect'
58
- Connect.new.run(credential_type, credential_file_path)
59
- end
46
+ desc 'connect', 'connect'
47
+ require_relative 'cli/connect'
48
+ subcommand 'connect', Cli::Connect
60
49
 
61
- desc 'disconect CREDENTIAL_TYPE', 'Disonnect credentials from Uffizzi'
50
+ desc 'disconect CREDENTIAL_TYPE', 'Revoke a Uffizzi user account access to external services'
62
51
  def disconnect(credential_type)
63
52
  require_relative 'cli/disconnect'
64
53
  Disconnect.new.run(credential_type)
@@ -67,11 +56,14 @@ module Uffizzi
67
56
  class << self
68
57
  protected
69
58
 
59
+ require_relative 'cli/common'
70
60
  def dispatch(meth, given_args, given_opts, config)
71
61
  args, opts = Thor::Options.split(given_args)
72
- return Cli::Common.show_manual(filename(args)) if show_help?(args, opts)
62
+ return Common.show_manual(filename(args)) if show_help?(args, opts)
73
63
 
74
64
  super
65
+ rescue SystemExit, Interrupt, SocketError
66
+ raise Uffizzi::Error.new('The command was interrupted')
75
67
  end
76
68
 
77
69
  private