MuranoCLI 3.2.0.beta.9 → 3.2.1.pre.beta.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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/Rakefile +5 -0
  4. data/dockers/README.rst +7 -0
  5. data/dockers/RELEASE.rst +6 -3
  6. data/dockers/docker-test.sh +45 -17
  7. data/docs/completions/murano_completion-bash +211 -86
  8. data/lib/MrMurano/Account.rb +72 -4
  9. data/lib/MrMurano/Business.rb +163 -2
  10. data/lib/MrMurano/Commander-Entry.rb +1 -2
  11. data/lib/MrMurano/Config.rb +19 -18
  12. data/lib/MrMurano/Content.rb +26 -19
  13. data/lib/MrMurano/Gateway.rb +51 -10
  14. data/lib/MrMurano/ReCommander.rb +1 -1
  15. data/lib/MrMurano/Solution-Services.rb +80 -35
  16. data/lib/MrMurano/Solution-Users.rb +1 -0
  17. data/lib/MrMurano/SyncRoot.rb +10 -3
  18. data/lib/MrMurano/SyncUpDown-Core.rb +47 -36
  19. data/lib/MrMurano/SyncUpDown-Item.rb +46 -14
  20. data/lib/MrMurano/SyncUpDown.rb +22 -20
  21. data/lib/MrMurano/Webservice-Endpoint.rb +20 -18
  22. data/lib/MrMurano/Webservice-File.rb +63 -20
  23. data/lib/MrMurano/commands/business.rb +14 -1
  24. data/lib/MrMurano/commands/child.rb +148 -0
  25. data/lib/MrMurano/commands/devices.rb +298 -149
  26. data/lib/MrMurano/commands/element.rb +2 -1
  27. data/lib/MrMurano/commands/globals.rb +3 -0
  28. data/lib/MrMurano/commands/network.rb +152 -33
  29. data/lib/MrMurano/commands/sync.rb +2 -2
  30. data/lib/MrMurano/commands.rb +1 -0
  31. data/lib/MrMurano/verbosing.rb +13 -2
  32. data/lib/MrMurano/version.rb +1 -1
  33. data/spec/Account_spec.rb +43 -11
  34. data/spec/Content_spec.rb +5 -3
  35. data/spec/GatewayBase_spec.rb +1 -1
  36. data/spec/GatewayDevice_spec.rb +47 -8
  37. data/spec/GatewayResource_spec.rb +1 -1
  38. data/spec/GatewaySettings_spec.rb +1 -1
  39. data/spec/HttpAuthed_spec.rb +17 -3
  40. data/spec/ProjectFile_spec.rb +59 -23
  41. data/spec/Setting_spec.rb +2 -1
  42. data/spec/Solution-ServiceConfig_spec.rb +1 -1
  43. data/spec/Solution-ServiceEventHandler_spec.rb +27 -20
  44. data/spec/Solution-ServiceModules_spec.rb +7 -5
  45. data/spec/Solution-UsersRoles_spec.rb +7 -1
  46. data/spec/Solution_spec.rb +9 -1
  47. data/spec/SyncRoot_spec.rb +5 -5
  48. data/spec/SyncUpDown_spec.rb +262 -211
  49. data/spec/Verbosing_spec.rb +49 -8
  50. data/spec/Webservice-Cors_spec.rb +10 -1
  51. data/spec/Webservice-Endpoint_spec.rb +84 -65
  52. data/spec/Webservice-File_spec.rb +16 -11
  53. data/spec/Webservice-Setting_spec.rb +7 -1
  54. data/spec/_workspace.rb +9 -0
  55. data/spec/cmd_business_spec.rb +5 -10
  56. data/spec/cmd_common.rb +67 -32
  57. data/spec/cmd_config_spec.rb +9 -14
  58. data/spec/cmd_content_spec.rb +15 -26
  59. data/spec/cmd_cors_spec.rb +9 -12
  60. data/spec/cmd_device_spec.rb +31 -45
  61. data/spec/cmd_domain_spec.rb +12 -10
  62. data/spec/cmd_element_spec.rb +18 -17
  63. data/spec/cmd_exchange_spec.rb +1 -4
  64. data/spec/cmd_init_spec.rb +56 -72
  65. data/spec/cmd_keystore_spec.rb +17 -26
  66. data/spec/cmd_link_spec.rb +13 -17
  67. data/spec/cmd_password_spec.rb +9 -10
  68. data/spec/cmd_setting_application_spec.rb +95 -68
  69. data/spec/cmd_setting_product_spec.rb +59 -37
  70. data/spec/cmd_status_spec.rb +46 -84
  71. data/spec/cmd_syncdown_application_spec.rb +28 -50
  72. data/spec/cmd_syncdown_both_spec.rb +44 -93
  73. data/spec/cmd_syncdown_unit_spec.rb +858 -0
  74. data/spec/cmd_syncup_spec.rb +21 -56
  75. data/spec/cmd_token_spec.rb +0 -3
  76. data/spec/cmd_usage_spec.rb +15 -10
  77. data/spec/dry_run_formatter.rb +1 -0
  78. data/spec/fixtures/dumped_config +4 -4
  79. data/spec/spec_helper.rb +3 -0
  80. metadata +4 -2
@@ -16,7 +16,7 @@ module MrMurano
16
16
  include AccountBase
17
17
  include Verbose
18
18
 
19
- def businesses(bid: nil, name: nil, fuzzy: nil)
19
+ def businesses(bid: nil, name: nil, fuzzy: nil, options: nil)
20
20
  # Ask user for name and password, if not saved to config and password files.
21
21
  login_info if user.empty?
22
22
  raise 'Missing user?!' if user.empty?
@@ -29,6 +29,77 @@ module MrMurano
29
29
  # 2017-06-30: The data for each message contains a :bizid, :role, and :name.
30
30
  # :role is probably generally "owner".
31
31
 
32
+ if (options && options.network)
33
+ # add network information and sort list
34
+ bizes = add_businesses_network(bizes)
35
+ match_bid_name_fuzzy!(bizes, bid, name, fuzzy)
36
+ else
37
+ # Sort results.
38
+ match_bid_name_fuzzy!(bizes, bid, name, fuzzy)
39
+ bizes.sort_by!(&:name)
40
+ end
41
+ end
42
+
43
+ # ---------------------------------------------------------------------
44
+
45
+ def add_businesses_network(bizes)
46
+ # Get network information
47
+ bizes_without_network = []
48
+ bizes_unconfigured = []
49
+ bizes_in_network = []
50
+ all_bizes = []
51
+
52
+ MrMurano::Verbose.whirly_start 'Fetching Network Information...'
53
+ bizes.each do |biz|
54
+ biz[:network] = ''
55
+ biz[:network_relationship] = ''
56
+ business_tier = get('business/' + biz[:bizid] + '/tier')
57
+ network_enabled = business_tier[:features][:network]
58
+
59
+ if network_enabled # Parents of business networks
60
+ add_network_info_parent!(biz, bizes_in_network, bizes_unconfigured)
61
+ else # check if the biz is a child of a network
62
+ maybe_add_network_info_child!(biz, bizes_without_network, bizes_in_network)
63
+ end
64
+ end
65
+ MrMurano::Verbose.whirly_stop
66
+
67
+ # Assemble the master list so that confgured networks are on top, followed
68
+ # by unconfigured networks, followed by non-network businesses
69
+ all_bizes.concat(bizes_in_network.sort_by! { |biz| biz[:network] })
70
+ all_bizes.concat(bizes_unconfigured.sort_by! { |biz| biz[:name] })
71
+ all_bizes.concat(bizes_without_network.sort_by! { |biz| biz[:name] })
72
+ end
73
+
74
+ # ---------------------------------------------------------------------
75
+ def add_network_info_parent!(biz, bizes_in_network, bizes_unconfigured)
76
+ biz[:network_relationship] = 'parent'
77
+ network_name = get('business/' + biz[:bizid] + '/network')[:name]
78
+ if network_name
79
+ biz[:network] = network_name
80
+ bizes_in_network.push(biz)
81
+ else
82
+ biz[:network] = '--Not configured yet--'
83
+ bizes_unconfigured.push(biz)
84
+ end
85
+ end
86
+
87
+ # ---------------------------------------------------------------------
88
+ def maybe_add_network_info_child!(biz, bizes_without_network, bizes_in_network)
89
+ owner = get('business/' + biz[:bizid] + '/owner')
90
+ if owner.empty?
91
+ biz[:network] = 'N/A'
92
+ bizes_without_network.push(biz)
93
+ else
94
+ biz[:network_relationship] = 'child'
95
+ biz[:network] = owner[:network][:name]
96
+ bizes_in_network.push(biz)
97
+ end
98
+ end
99
+
100
+ # ---------------------------------------------------------------------
101
+ # helper for filtering businesses when using the find command
102
+ def match_bid_name_fuzzy!(bizes, bid, name, fuzzy)
32
103
  match_bid = ensure_array(bid)
33
104
  match_name = ensure_array(name)
34
105
  match_fuzzy = ensure_array(fuzzy)
@@ -47,9 +118,6 @@ module MrMurano
47
118
  end
48
119
 
49
120
  bizes.map! { |meta| MrMurano::Business.new(meta) }
50
-
51
- # Sort results.
52
- bizes.sort_by!(&:name)
53
121
  end
54
122
 
55
123
  # ---------------------------------------------------------------------
@@ -48,6 +48,11 @@ module MrMurano
48
48
  $cfg['business.id'].to_s
49
49
  end
50
50
 
51
+ def cid
52
+ return @cid unless @cid.to_s.empty?
53
+ $cfg['business.child'].to_s
54
+ end
55
+
51
56
  def name
52
57
  return @name unless @name.to_s.empty?
53
58
  $cfg['business.name'].to_s
@@ -89,12 +94,22 @@ module MrMurano
89
94
  raise MrMurano::ConfigError.new(Business.missing_business_id_msg) if bid.to_s.empty?
90
95
  end
91
96
 
97
+ def must_child!
98
+ raise MrMurano::ConfigError.new(Business.missing_child_msg) if cid.to_s.empty?
99
+ end
100
+
92
101
  def self.missing_business_id_msg
93
102
  %(
94
103
  business ID not specified. For hints: #{MrMurano::EXE_NAME} business --help
95
104
  ).strip
96
105
  end
97
106
 
107
+ def self.missing_child_msg
108
+ %(
109
+ network child business ID not specified. For hints: #{MrMurano::EXE_NAME} business --help
110
+ ).strip
111
+ end
112
+
98
113
  def pretty_name_and_id
99
114
  "#{fancy_ticks(Rainbow(name).underline)} <#{bid}>"
100
115
  end
@@ -112,6 +127,9 @@ module MrMurano
112
127
  #end
113
128
 
114
129
  def overview(&block)
130
+ # TODO: (PL) - The overview endpoint has been split up into smaller
131
+ # endpoints that should be used instead of this one
132
+ #
115
133
  # Here are all the goodies that the overview endpoint returns:
116
134
  # {:name=>"XXX", :email=>"XXX", :contact=>"XXX",
117
135
  # :billing=>{
@@ -373,7 +391,6 @@ module MrMurano
373
391
  end
374
392
  end
375
393
  end
376
- # ---------------------------------------------------------------------
377
394
 
378
395
  # ---------------------------------------------------------------------
379
396
 
@@ -390,6 +407,130 @@ module MrMurano
390
407
  end
391
408
  end
392
409
  end
410
+
411
+ # ---------------------------------------------------------------------
412
+
413
+ def view_child_businesses(bid)
414
+ return nil unless check_if_biz_network_capable(bid) == true
415
+ get('business/' + bid + '/network/business/') do |request, http|
416
+ response = http.request(request)
417
+ case response
418
+ when Net::HTTPSuccess
419
+ workit_response(response)
420
+ else
421
+ showHttpError(request, response)
422
+ nil
423
+ end
424
+ end
425
+ end
426
+
427
+ # ---------------------------------------------------------------------
428
+
429
+ def add_network_child_business(bid, name)
430
+ return nil unless check_if_biz_network_capable(bid) == true
431
+ post('business/' + bid + '/network/business/', name: name) do |request, http|
432
+ response = http.request(request)
433
+ case response
434
+ when Net::HTTPSuccess
435
+ workit_response(response)
436
+ when Net::HTTPConflict #409 limit reached
437
+ MrMurano::Verbose.error(
438
+ 'You have reached your limit of child businesses in your network.'
439
+ )
440
+ nil
441
+ else
442
+ showHttpError(request, response)
443
+ nil
444
+ end
445
+ end
446
+ end
447
+
448
+ # ---------------------------------------------------------------------
449
+
450
+ def delete_child_business(bid, child_business_id)
451
+ return nil unless check_if_biz_network_capable(bid) == true
452
+ delete(
453
+ 'business/' +
454
+ bid +
455
+ '/network/business/' +
456
+ child_business_id
457
+ ) do |request, http|
458
+ response = http.request(request)
459
+ case response
460
+ when Net::HTTPSuccess
461
+ workit_response(response)
462
+ else
463
+ showHttpError(request, response)
464
+ nil
465
+ end
466
+ end
467
+ end
468
+
469
+ # ---------------------------------------------------------------------
470
+
471
+ def add_member_to_child_business(bid, child_business_id, new_member_email)
472
+ return nil unless check_if_biz_network_capable(bid)
473
+ member_in_parent_biz = check_if_member_is_in_biz(bid, new_member_email)
474
+ unless (member_in_parent_biz)
475
+ MrMurano::Verbose.error(
476
+ 'User is not a member of the parent business.'
477
+ )
478
+ return nil
479
+ end
480
+ member_in_child_biz = check_if_member_is_in_biz(child_business_id, new_member_email)
481
+ if (member_in_child_biz)
482
+ MrMurano::Verbose.error(
483
+ 'User is already a member of the child business.'
484
+ )
485
+ return nil
486
+ end
487
+ put(
488
+ 'business/' +
489
+ bid +
490
+ '/network/business/' +
491
+ child_business_id +
492
+ '/member/' +
493
+ new_member_email
494
+ ) do |request, http|
495
+ response = http.request(request)
496
+ case response
497
+ when Net::HTTPSuccess
498
+ workit_response(response)
499
+ else
500
+ showHttpError(request, response)
501
+ nil
502
+ end
503
+ end
504
+ end
505
+
506
+ # ---------------------------------------------------------------------
507
+
508
+ def remove_member_from_child_business(bid, child_business_id, member_email)
509
+ return nil unless check_if_biz_network_capable(bid)
510
+ member_in_child_biz = check_if_member_is_in_biz(child_business_id, member_email)
511
+ unless (member_in_child_biz)
512
+ MrMurano::Verbose.error(
513
+ 'User is not a member of the child business.'
514
+ )
515
+ return nil
516
+ end
517
+ delete(
518
+ 'business/' +
519
+ child_business_id +
520
+ '/member/' +
521
+ member_email
522
+ ) do |request, http|
523
+ response = http.request(request)
524
+ case response
525
+ when Net::HTTPSuccess
526
+ workit_response(response)
527
+ else
528
+ showHttpError(request, response)
529
+ nil
530
+ end
531
+ end
532
+ end
533
+
393
534
  # ---------------------------------------------------------------------
394
535
 
395
536
  def check_if_biz_network_capable(bid)
@@ -398,7 +539,7 @@ module MrMurano
398
539
  case tier_response
399
540
  when Net::HTTPSuccess
400
541
  parsed_response = workit_response(tier_response)
401
- if parsed_response[:network] != true
542
+ if parsed_response[:features][:network] != true
402
543
  MrMurano::Verbose.error(
403
544
  'Your business does not have access to business network features. Please upgrade your business.'
404
545
  )
@@ -413,6 +554,26 @@ module MrMurano
413
554
  end
414
555
  end
415
556
 
557
+ # ---------------------------------------------------------------------
558
+
559
+ def check_if_member_is_in_biz(business_id, email)
560
+ get('business/' + business_id + '/member/') do |request, http|
561
+ response = http.request(request)
562
+ case response
563
+ when Net::HTTPSuccess
564
+ parsed_response = workit_response(response)
565
+ if (parsed_response.none? { |m| m[:email] == email })
566
+ false
567
+ else
568
+ true
569
+ end
570
+ else
571
+ showHttpError(request, response)
572
+ nil
573
+ end
574
+ end
575
+ end
576
+
416
577
  def self.must_not_be_managed!
417
578
  # Check that the solution(s) are not managed.
418
579
  # NOTE: BizAPI only tells us 'managed' via the business/<bizid>/solutions
@@ -10,7 +10,6 @@ require 'English'
10
10
  require 'highline'
11
11
  require 'murano-cli-commander/import'
12
12
  require 'pathname'
13
- #require 'pp'
14
13
  require 'rainbow'
15
14
  require 'rubygems'
16
15
  require 'MrMurano'
@@ -84,7 +83,7 @@ $cfg = MrMurano::Config.new(::Commander::Runner.instance)
84
83
  $cfg.load
85
84
  $cfg.validate_cmd
86
85
 
87
- # Look for a (legacy) Solutionfile.json.
86
+ # Look for a Solutionfile.json.
88
87
  $project = MrMurano::ProjectFile.new
89
88
  $project.load
90
89
 
@@ -230,7 +230,6 @@ module MrMurano
230
230
  set_defaults_location_newstyle('location.endpoints', 'routes', 'endpoints')
231
231
  end
232
232
 
233
- # rubocop:disable Style/MethodName: Use snake_case for method names.
234
233
  def set_defaults_location_newstyle(key, formerly, currently)
235
234
  if @project_dir && !@project_dir.join(formerly).exist?
236
235
  set(key, currently, :defaults)
@@ -253,7 +252,7 @@ module MrMurano
253
252
  def set_defaults_endpoints
254
253
  set('endpoints.searchFor', %w[
255
254
  {,../endpoints}/*.lua
256
- {,../endpoints}s/*/*.lua
255
+ {,../endpoints}/*/*.lua
257
256
  ].join(' '), :defaults)
258
257
  set('endpoints.ignoring', %w[
259
258
  *_test.lua
@@ -295,6 +294,8 @@ module MrMurano
295
294
  timer.timer
296
295
  tsdb.exportJob
297
296
  user.account
297
+ config.service
298
+ config.status
298
299
  ].join(' '), :defaults)
299
300
  end
300
301
 
@@ -336,8 +337,12 @@ module MrMurano
336
337
  # Set these so that @known_keys is updated.
337
338
  set('user.name', nil, :defaults)
338
339
  set('business.id', nil, :defaults)
340
+ set('business.child', nil, :defaults)
339
341
  set('application.id', nil, :defaults)
340
- set('solution.id', nil, :defaults)
342
+ set('product.id', nil, :defaults)
343
+ set('business.name', nil, :defaults)
344
+ set('application.name', nil, :defaults)
345
+ set('product.name', nil, :defaults)
341
346
  end
342
347
 
343
348
  ## Find the root of this project Directory.
@@ -395,19 +400,15 @@ module MrMurano
395
400
  # Most commands should be run from within a Murano project (sub-)directory.
396
401
  # If user is running a project command not within a project directory,
397
402
  # we'll print a message now and exit the app from run_active_command later.
398
- unless @runner.nil?
399
- the_cmd = @runner.active_command if the_cmd.nil?
400
- the_cmd = command(cmd) if the_cmd.nil?
401
- the_cmd.project_not_required = false unless defined?(the_cmd.project_not_required)
402
- if the_cmd.name != 'help' && !the_cmd.project_not_required && !@project_exists
403
- error %(The "#{the_cmd.name}" command only works in a Murano project.)
404
- say INVALID_PROJECT_HINT
405
- # Note that commander-rb uses an at_exit hook, which we hack around.
406
- @runner.command_exit = 1
407
- false
408
- end
409
- end
410
- true
403
+ return if @runner.nil?
404
+ the_cmd = @runner.active_command if the_cmd.nil?
405
+ the_cmd = command(cmd) if the_cmd.nil?
406
+ the_cmd.project_not_required = false unless defined?(the_cmd.project_not_required)
407
+ return if the_cmd.name == 'help' || the_cmd.project_not_required || @project_exists
408
+ error %(The "#{the_cmd.name}" command only works in a Murano project.)
409
+ say INVALID_PROJECT_HINT
410
+ # Note that commander-rb uses an at_exit hook, which we hack around.
411
+ @runner.command_exit = 1
411
412
  end
412
413
 
413
414
  def self.fix_modes(path)
@@ -501,7 +502,7 @@ module MrMurano
501
502
  def get(key, scope=CFG_SCOPES)
502
503
  scope = [scope] unless scope.is_a? Array
503
504
  paths = @paths.select { |p| scope.include? p.kind }
504
- paths.reject { |p| @exclude_scopes.include? p.kind }
505
+ paths.reject! { |p| @exclude_scopes.include? p.kind }
505
506
 
506
507
  section, ikey = key.split('.')
507
508
  paths.each do |path|
@@ -693,7 +694,7 @@ module MrMurano
693
694
  locat = ''
694
695
 
695
696
  scope_q = fancy_ticks(scope)
696
- scope_l = "Scope: #{scope_l}\n\n"
697
+ scope_l = "Scope: #{scope_q}\n\n"
697
698
  locat += Rainbow(scope_l).bright.underline
698
699
 
699
700
  cfg_paths = @paths.select { |p| p.kind == scope }
@@ -83,7 +83,9 @@ module MrMurano
83
83
  # ?type=
84
84
  sha256 = Digest::SHA256.new
85
85
  sha256.file(local_path.to_s)
86
- mime = MIME::Types.type_for(local_path.to_s)[0] || MIME::Types['application/octet-stream'][0]
86
+
87
+ mime = MIME::Types.type_for(local_path.to_s)[0]
88
+ mime ||= MIME::Types['application/octet-stream'][0]
87
89
 
88
90
  params = {
89
91
  sha256: sha256.hexdigest,
@@ -97,7 +99,8 @@ module MrMurano
97
99
  ret = get("/#{CGI.escape(name)}/upload?#{URI.encode_www_form(params)}")
98
100
  debug "POST instructions: #{ret}"
99
101
  raise "Method isn't POST!!!" unless ret.is_a?(Hash) && ret[:method] == 'POST'
100
- raise "EncType isn't multipart/form-data" unless ret[:enctype] == 'multipart/form-data'
102
+ is_form_data = ret[:enctype] == 'multipart/form-data'
103
+ raise "EncType isn't multipart/form-data" unless is_form_data
101
104
 
102
105
  uri = URI(ret[:url])
103
106
  request = Net::HTTP::Post.new(uri)
@@ -128,8 +131,8 @@ module MrMurano
128
131
  end
129
132
 
130
133
  return if $cfg['tool.dry']
131
- Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |ihttp|
132
- response = ihttp.request(request)
134
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
135
+ response = http.request(request)
133
136
  case response
134
137
  # rubocop:disable Lint/EmptyWhen
135
138
  # "Avoid when branches without a body."
@@ -160,28 +163,32 @@ module MrMurano
160
163
  ret = get("/#{CGI.escape(name)}/download")
161
164
  debug "GET instructions: #{ret}"
162
165
  raise "Method isn't GET!!!" unless ret.is_a?(Hash) && ret[:method] == 'GET'
163
-
164
166
  uri = URI(ret[:url])
165
167
  request = Net::HTTP::Get.new(uri)
166
168
  request['User-Agent'] = "MrMurano/#{MrMurano::VERSION}"
169
+ download_curldebug(request)
170
+ download_send(uri, request, &block)
171
+ end
167
172
 
168
- if $cfg['tool.curldebug']
169
- a = []
170
- a << %(curl -s)
171
- a << %(-H 'User-Agent: #{request['User-Agent']}')
172
- a << %(-X #{request.method})
173
- a << %('#{request.uri}')
174
- if $cfg.curlfile_f.nil?
175
- puts a.join(' ')
176
- else
177
- $cfg.curlfile_f << a.join(' ') + "\n\n"
178
- $cfg.curlfile_f.flush
179
- end
173
+ def download_curldebug(request)
174
+ return unless $cfg['tool.curldebug']
175
+ args = []
176
+ args << %(curl -s)
177
+ args << %(-H 'User-Agent: #{request['User-Agent']}')
178
+ args << %(-X #{request.method})
179
+ args << %('#{request.uri}')
180
+ if $cfg.curlfile_f.nil?
181
+ puts args.join(' ')
182
+ else
183
+ $cfg.curlfile_f << args.join(' ') + "\n\n"
184
+ $cfg.curlfile_f.flush
180
185
  end
186
+ end
181
187
 
188
+ def download_send(uri, request, &block)
182
189
  return if $cfg['tool.dry']
183
- Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |ihttp|
184
- ihttp.request(request) do |response|
190
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
191
+ http.request(request) do |response|
185
192
  case response
186
193
  when Net::HTTPSuccess
187
194
  if block_given?