MuranoCLI 3.0.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +50 -27
  3. data/.trustme.vim +12 -8
  4. data/bin/murano +23 -8
  5. data/docs/basic_example.rst +1 -1
  6. data/docs/completions/murano_completion-bash +88 -0
  7. data/lib/MrMurano/Account.rb +3 -3
  8. data/lib/MrMurano/Business.rb +6 -6
  9. data/lib/MrMurano/Config-Migrate.rb +1 -3
  10. data/lib/MrMurano/Config.rb +16 -8
  11. data/lib/MrMurano/Content.rb +56 -45
  12. data/lib/MrMurano/Gateway.rb +62 -21
  13. data/lib/MrMurano/Mock.rb +27 -19
  14. data/lib/MrMurano/Passwords.rb +7 -7
  15. data/lib/MrMurano/ReCommander.rb +171 -28
  16. data/lib/MrMurano/Setting.rb +38 -40
  17. data/lib/MrMurano/Solution-ServiceConfig.rb +2 -1
  18. data/lib/MrMurano/Solution-Services.rb +196 -61
  19. data/lib/MrMurano/Solution-Users.rb +7 -7
  20. data/lib/MrMurano/Solution.rb +22 -8
  21. data/lib/MrMurano/SolutionId.rb +10 -4
  22. data/lib/MrMurano/SubCmdGroupContext.rb +14 -5
  23. data/lib/MrMurano/SyncAllowed.rb +42 -0
  24. data/lib/MrMurano/SyncUpDown.rb +122 -65
  25. data/lib/MrMurano/Webservice-Cors.rb +9 -3
  26. data/lib/MrMurano/Webservice-Endpoint.rb +39 -33
  27. data/lib/MrMurano/Webservice-File.rb +35 -24
  28. data/lib/MrMurano/commands/business.rb +18 -18
  29. data/lib/MrMurano/commands/content.rb +3 -2
  30. data/lib/MrMurano/commands/devices.rb +137 -22
  31. data/lib/MrMurano/commands/globals.rb +8 -2
  32. data/lib/MrMurano/commands/keystore.rb +3 -2
  33. data/lib/MrMurano/commands/link.rb +13 -13
  34. data/lib/MrMurano/commands/login.rb +3 -2
  35. data/lib/MrMurano/commands/mock.rb +4 -3
  36. data/lib/MrMurano/commands/password.rb +4 -2
  37. data/lib/MrMurano/commands/postgresql.rb +5 -3
  38. data/lib/MrMurano/commands/settings.rb +78 -62
  39. data/lib/MrMurano/commands/show.rb +79 -74
  40. data/lib/MrMurano/commands/solution.rb +6 -4
  41. data/lib/MrMurano/commands/solution_picker.rb +5 -4
  42. data/lib/MrMurano/commands/status.rb +15 -4
  43. data/lib/MrMurano/commands/timeseries.rb +3 -2
  44. data/lib/MrMurano/commands/tsdb.rb +3 -2
  45. data/lib/MrMurano/hash.rb +6 -6
  46. data/lib/MrMurano/http.rb +66 -67
  47. data/lib/MrMurano/makePretty.rb +18 -12
  48. data/lib/MrMurano/progress.rb +9 -2
  49. data/lib/MrMurano/verbosing.rb +14 -2
  50. data/lib/MrMurano/version.rb +2 -2
  51. data/spec/GatewayDevice_spec.rb +190 -149
  52. data/spec/Mock_spec.rb +3 -3
  53. data/spec/Solution-ServiceEventHandler_spec.rb +170 -137
  54. data/spec/SyncUpDown_spec.rb +205 -191
  55. metadata +3 -2
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.16 /coding: utf-8
1
+ # Last Modified: 2017.08.22 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -10,7 +10,7 @@ require 'MrMurano/Business'
10
10
  require 'MrMurano/ReCommander'
11
11
  require 'MrMurano/Solution'
12
12
 
13
- command 'show' do |c|
13
+ command :show do |c|
14
14
  c.syntax = %(murano show)
15
15
  c.summary = %(Show readable information about the current configuration)
16
16
  c.description = %(
@@ -18,89 +18,94 @@ Show readable information about the current configuration.
18
18
  ).strip
19
19
  c.project_not_required = true
20
20
 
21
- c.action do |args, _options|
22
- if args.include?('help')
23
- ::Commander::UI.enable_paging
24
- say MrMurano::SubCmdGroupHelp.new(c).get_help
25
- else
26
- acc = MrMurano::Account.instance
27
- biz = MrMurano::Business.new
28
-
29
- selected_business = nil
30
- selected_business_id = $cfg['business.id']
31
- unless selected_business_id.to_s.empty?
32
- acc.businesses.each do |sol|
33
- selected_business = sol if sol.bizid == selected_business_id
34
- end
35
- end
21
+ c.option '--[no-]ids', 'Show IDs'
36
22
 
37
- selected_application = nil
38
- selected_application_id = $cfg['application.id']
39
- unless selected_application_id.to_s.empty?
40
- MrMurano::Verbose.whirly_start('Fetching Applications...')
41
- biz.applications.each do |sol|
42
- selected_application = sol if sol.apiId == selected_application_id
43
- end
44
- MrMurano::Verbose.whirly_stop
45
- end
23
+ c.action do |args, options|
24
+ c.verify_arg_count!(args)
46
25
 
47
- selected_product = nil
48
- selected_product_id = $cfg['product.id']
49
- unless selected_product_id.to_s.empty?
50
- MrMurano::Verbose.whirly_start('Fetching Products...')
51
- biz.products.each do |sol|
52
- selected_product = sol if sol.apiId == selected_product_id
53
- end
54
- MrMurano::Verbose.whirly_stop
55
- end
26
+ acc = MrMurano::Account.instance
27
+ biz = MrMurano::Business.new
56
28
 
57
- if $cfg['user.name']
58
- puts %(user: #{$cfg['user.name']})
59
- else
60
- puts 'no user selected'
29
+ selected_business = nil
30
+ selected_business_id = $cfg['business.id']
31
+ unless selected_business_id.to_s.empty?
32
+ acc.businesses.each do |sol|
33
+ selected_business = sol if sol.bizid == selected_business_id
61
34
  end
35
+ end
62
36
 
63
- if selected_business
64
- puts %(business: #{selected_business.name})
65
- else
66
- #puts 'no business selected'
67
- MrMurano::Verbose.error MrMurano::Business.missing_business_id_msg
37
+ selected_application = nil
38
+ selected_application_id = $cfg['application.id']
39
+ unless selected_application_id.to_s.empty?
40
+ MrMurano::Verbose.whirly_start('Fetching Applications...')
41
+ biz.applications.each do |sol|
42
+ selected_application = sol if sol.apiId == selected_application_id
68
43
  end
44
+ MrMurano::Verbose.whirly_stop
45
+ end
69
46
 
70
- id_not_in_biz = false
71
-
72
- # E.g., {:bizid=>"ABC", :type=>"application", :apiId=>"XXX", :sid=>"XXX",
73
- # :name=>"ABC", :domain=>"ABC.apps.exosite.io" }
74
- if selected_application
75
- puts %(application: https://#{selected_application.domain})
76
- elsif selected_application_id
77
- #puts 'selected application not in business'
78
- puts "application ID from config is not in business (#{selected_application_id})"
79
- id_not_in_biz = true
80
- elsif !selected_business
81
- puts 'application ID depends on business ID'
82
- else
83
- #puts 'no application selected'
84
- puts 'application ID not found in config'
47
+ selected_product = nil
48
+ selected_product_id = $cfg['product.id']
49
+ unless selected_product_id.to_s.empty?
50
+ MrMurano::Verbose.whirly_start('Fetching Products...')
51
+ biz.products.each do |sol|
52
+ selected_product = sol if sol.apiId == selected_product_id
85
53
  end
54
+ MrMurano::Verbose.whirly_stop
55
+ end
86
56
 
87
- # E.g., {:bizid=>"ABC", :type=>"product", :apiId=>"XXX", :sid=>"XXX",
88
- # :name=>"ABC", :domain=>"ABC.m2.exosite.io" }
89
- if selected_product
90
- puts %(product: #{selected_product.name})
91
- elsif selected_product_id
92
- #puts 'selected product not in business'
93
- puts "product ID from config is not in business (#{selected_product_id})"
94
- id_not_in_biz = true
95
- elsif !selected_business
96
- puts 'product ID depends on business ID'
97
- else
98
- #puts 'no product selected'
99
- puts 'product ID not found in config'
100
- end
57
+ if $cfg['user.name']
58
+ puts %(user: #{$cfg['user.name']})
59
+ else
60
+ puts 'no user selected'
61
+ end
62
+
63
+ if selected_business
64
+ biz_info = %(business: #{selected_business.name})
65
+ biz_info += %( <#{selected_business.bid}>) if options.ids
66
+ puts biz_info
67
+ else
68
+ #puts 'no business selected'
69
+ MrMurano::Verbose.error MrMurano::Business.missing_business_id_msg
70
+ end
101
71
 
102
- MrMurano::SolutionBase.warn_configfile_env_maybe if id_not_in_biz
72
+ id_not_in_biz = false
73
+
74
+ # E.g., {:bizid=>"ABC", :type=>"application", :apiId=>"XXX", :sid=>"XXX",
75
+ # :name=>"ABC", :domain=>"ABC.apps.exosite.io" }
76
+ if selected_application
77
+ sol_info = %(application: https://#{selected_application.domain})
78
+ sol_info += %( <#{selected_application.sid}>) if options.ids
79
+ puts sol_info
80
+ elsif selected_application_id
81
+ #puts 'selected application not in business'
82
+ puts "application ID from config is not in business (#{selected_application_id})"
83
+ id_not_in_biz = true
84
+ elsif !selected_business
85
+ puts 'application ID depends on business ID'
86
+ else
87
+ #puts 'no application selected'
88
+ puts 'application ID not found in config'
103
89
  end
90
+
91
+ # E.g., {:bizid=>"ABC", :type=>"product", :apiId=>"XXX", :sid=>"XXX",
92
+ # :name=>"ABC", :domain=>"ABC.m2.exosite.io" }
93
+ if selected_product
94
+ sol_info = %(product: #{selected_product.name})
95
+ sol_info += %( <#{selected_product.sid}>) if options.ids
96
+ puts sol_info
97
+ elsif selected_product_id
98
+ #puts 'selected product not in business'
99
+ puts "product ID from config is not in business (#{selected_product_id})"
100
+ id_not_in_biz = true
101
+ elsif !selected_business
102
+ puts 'product ID depends on business ID'
103
+ else
104
+ #puts 'no product selected'
105
+ puts 'product ID not found in config'
106
+ end
107
+
108
+ MrMurano::SolutionBase.warn_configfile_env_maybe if id_not_in_biz
104
109
  end
105
110
  end
106
111
 
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.17 /coding: utf-8
1
+ # Last Modified: 2017.08.23 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -19,9 +19,10 @@ command :solution do |c|
19
19
  Commands for working with Application and Product solutions.
20
20
  ).strip
21
21
  c.project_not_required = true
22
+ c.subcmdgrouphelp = true
22
23
 
23
24
  c.action do |_args, _options|
24
- ::Commander::UI.enable_paging
25
+ ::Commander::UI.enable_paging unless $cfg['tool.no-page']
25
26
  say MrMurano::SubCmdGroupHelp.new(c).get_help
26
27
  end
27
28
  end
@@ -156,7 +157,7 @@ def cmd_solution_del_get_names_and_ids!(biz, args, options)
156
157
  end
157
158
  solz = must_fetch_solutions!(options, args, biz)
158
159
  solz.each do |sol|
159
- nmorids += [[sol.sid, "‘#{sol.name} <#{sol.sid}>", sol]]
160
+ nmorids += [[sol.sid, "#{MrMurano::Verbose.fancy_ticks(sol.name)} <#{sol.sid}>", sol]]
160
161
  end
161
162
  nmorids
162
163
  end
@@ -230,7 +231,8 @@ def solution_delete(name_or_id, use_sol: nil, type: :all, yes: false)
230
231
  n_faulted = 0
231
232
  if solz.empty?
232
233
  if !name_or_id.empty?
233
- MrMurano::Verbose.error("No solution matching ‘#{name_or_id}’ found")
234
+ name_or_id_q = MrMurano::Verbose.fancy_ticks(name_or_id)
235
+ MrMurano::Verbose.error("No solution matching #{name_or_id_q} found")
234
236
  else
235
237
  MrMurano::Verbose.error(MSG_SOLUTIONS_NONE_FOUND)
236
238
  end
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.17 /coding: utf-8
1
+ # Last Modified: 2017.08.23 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -156,12 +156,12 @@ def must_fetch_solutions!(options, args=[], biz=nil)
156
156
 
157
157
  if args.none? && !any_solution_pickers!(options)
158
158
  if !options.all
159
- if $cfg['application.id']
159
+ if %i[all application].include?(options.type) && $cfg['application.id']
160
160
  solz += solution_get_solutions(
161
161
  biz, :application, sid: $cfg['application.id']
162
162
  )
163
163
  end
164
- if $cfg['product.id']
164
+ if %i[all product].include?(options.type) && $cfg['product.id']
165
165
  solz += solution_get_solutions(
166
166
  biz, :product, sid: $cfg['product.id']
167
167
  )
@@ -449,7 +449,8 @@ module MrMurano
449
449
  say "Found #{sol.type_name} #{sol.pretty_desc}"
450
450
  elsif !@searching
451
451
  # The solution ID in the config was not found for this business.
452
- say "The #{sol.type_name} ID ‘#{tried_sid}’ from the config was not found"
452
+ tried_sid = MrMurano::Verbose.fancy_ticks(tried_sid)
453
+ say "The #{sol.type_name} ID #{tried_sid} from the config was not found"
453
454
  end
454
455
  puts ''
455
456
  end
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.18 /coding: utf-8
1
+ # Last Modified: 2017.08.22 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -109,6 +109,7 @@ Endpoints can be selected with a "#<method>#<path glob>" pattern.
109
109
  unless item[:pp_desc].to_s.empty? || item[:pp_desc] == item[:synckey]
110
110
  desc += " (#{item[:pp_desc]})"
111
111
  end
112
+ # NOTE: This path is the endpoint path.
112
113
  desc += " [#{item[:method]} #{item[:path]}]" if item[:method] && item[:path]
113
114
  desc
114
115
  end
@@ -149,6 +150,16 @@ Endpoints can be selected with a "#<method>#<path glob>" pattern.
149
150
  end
150
151
  end
151
152
 
153
+ unless ret[:clash].empty?
154
+ pretty_group_header(
155
+ ret[:clash], 'Conflicting items', 'in conflict', options.grouped
156
+ )
157
+ ret[:clash].each do |item|
158
+ abbrev = $cfg['tool.ascii'] && 'x' || '✗'
159
+ interject " #{abbrev} #{item[:pp_type]} #{highlight_del(fmtr(item, options))}"
160
+ end
161
+ end
162
+
152
163
  return unless options.show_all
153
164
  interject 'Unchanged:' if options.grouped
154
165
  ret[:unchg].each { |item| interject " #{item[:pp_type]} #{fmtr(item, options)}" }
@@ -171,15 +182,15 @@ Endpoints can be selected with a "#<method>#<path glob>" pattern.
171
182
  Rainbow(msg).red.bright
172
183
  end
173
184
 
174
- @grouped = { toadd: [], todel: [], tomod: [], unchg: [], skipd: [] }
185
+ @grouped = { toadd: [], todel: [], tomod: [], unchg: [], skipd: [], clash: [] }
175
186
  def gmerge(ret, type, desc, options)
176
187
  if options.grouped
177
188
  out = @grouped
178
189
  else
179
- out = { toadd: [], todel: [], tomod: [], unchg: [], skipd: [] }
190
+ out = { toadd: [], todel: [], tomod: [], unchg: [], skipd: [], clash: [] }
180
191
  end
181
192
 
182
- %i[toadd todel tomod unchg skipd].each do |kind|
193
+ %i[toadd todel tomod unchg skipd clash].each do |kind|
183
194
  ret[kind].each do |item|
184
195
  item = item.to_h
185
196
  item[:pp_type] = type
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.16 /coding: utf-8
1
+ # Last Modified: 2017.08.22 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -42,9 +42,10 @@ The timeseries sub-commands let you interact directly with the Timeseries
42
42
  instance in a solution. This allows for easier debugging, being able to
43
43
  quickly try out different queries or write test data.
44
44
  ).strip
45
+ c.subcmdgrouphelp = true
45
46
 
46
47
  c.action do |_args, _options|
47
- ::Commander::UI.enable_paging
48
+ ::Commander::UI.enable_paging unless $cfg['tool.no-page']
48
49
  say MrMurano::SubCmdGroupHelp.new(c).get_help
49
50
  end
50
51
  end
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.16 /coding: utf-8
1
+ # Last Modified: 2017.08.22 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -59,9 +59,10 @@ solution. This allows for easier debugging, being able to quickly try out
59
59
  different queries or write test data.
60
60
  ).strip
61
61
  c.project_not_required = true
62
+ c.subcmdgrouphelp = true
62
63
 
63
64
  c.action do |_args, _options|
64
- ::Commander::UI.enable_paging
65
+ ::Commander::UI.enable_paging unless $cfg['tool.no-page']
65
66
  say MrMurano::SubCmdGroupHelp.new(c).get_help
66
67
  end
67
68
  end
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.16 /coding: utf-8
1
+ # Last Modified: 2017.08.20 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -14,8 +14,8 @@ class Hash
14
14
  # Take keys of hash and transform those to symbols.
15
15
  def self.transform_keys_to_symbols(value)
16
16
  return value.map { |v| Hash.transform_keys_to_symbols(v) } if value.is_a?(Array)
17
- return value if not value.is_a?(Hash)
18
- value.inject({}) { |memo, (k,v)| memo[k.to_sym] = Hash.transform_keys_to_symbols(v); memo }
17
+ return value unless value.is_a?(Hash)
18
+ value.inject({}) { |memo, (k, v)| memo[k.to_sym] = Hash.transform_keys_to_symbols(v); memo }
19
19
  end
20
20
 
21
21
  # From:
@@ -24,8 +24,8 @@ class Hash
24
24
  # Take keys of hash and transform those to strings.
25
25
  def self.transform_keys_to_strings(value)
26
26
  return value.map { |v| Hash.transform_keys_to_strings(v) } if value.is_a?(Array)
27
- return value if not value.is_a?(Hash)
28
- value.inject({}) { |memo, (k,v)| memo[k.to_s] = Hash.transform_keys_to_strings(v); memo }
27
+ return value unless value.is_a?(Hash)
28
+ value.inject({}) { |memo, (k, v)| memo[k.to_s] = Hash.transform_keys_to_strings(v); memo }
29
29
  end
30
30
 
31
31
  # From Rails.
@@ -35,7 +35,7 @@ class Hash
35
35
  if this_value.is_a?(Hash) && other_value.is_a?(Hash)
36
36
  self[current_key] = this_value.deep_merge(other_value, &block)
37
37
  elsif block_given? && key?(current_key)
38
- self[current_key] = block.call(current_key, this_value, other_value)
38
+ self[current_key] = yield(current_key, this_value, other_value)
39
39
  else
40
40
  self[current_key] = other_value
41
41
  end
@@ -1,4 +1,4 @@
1
- # Last Modified: 2017.08.14 /coding: utf-8
1
+ # Last Modified: 2017.08.20 /coding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # Copyright © 2016-2017 Exosite LLC.
@@ -30,50 +30,48 @@ module MrMurano
30
30
  end
31
31
 
32
32
  def ensure_token!(tok)
33
- if tok.nil?
34
- error 'Not logged in!'
35
- exit 1
36
- end
33
+ return unless tok.nil?
34
+ error 'Not logged in!'
35
+ exit 1
37
36
  end
38
37
 
39
38
  def json_opts
40
- return @json_opts unless not defined?(@json_opts) or @json_opts.nil?
39
+ return @json_opts unless !defined?(@json_opts) || @json_opts.nil?
41
40
  @json_opts = {
42
- :allow_nan => true,
43
- :symbolize_names => true,
44
- :create_additions => false
41
+ allow_nan: true,
42
+ symbolize_names: true,
43
+ create_additions: false,
45
44
  }
46
45
  end
47
46
 
48
47
  def curldebug(request)
49
- if $cfg['tool.curldebug']
50
- formp = (request.content_type =~ %r{multipart/form-data})
51
- a = []
52
- a << %{curl -s}
53
- if request.key?('Authorization')
54
- a << %{-H 'Authorization: #{request['Authorization']}'}
55
- end
56
- a << %{-H 'User-Agent: #{request['User-Agent']}'}
57
- a << %{-H 'Content-Type: #{request.content_type}'} unless formp
58
- a << %{-X #{request.method}}
59
- a << %{'#{request.uri.to_s}'}
60
- unless request.body.nil?
61
- if formp
62
- m = request.body.match(
63
- %r{form-data;\s+name="(?<name>[^"]+)";\s+filename="(?<filename>[^"]+)"}
64
- )
65
- a << %{-F #{m[:name]}=@#{m[:filename]}} unless m.nil?
66
- else
67
- a << %{-d '#{request.body}'}
68
- end
69
- end
70
- if $cfg.curlfile_f.nil?
71
- MrMurano::Progress.instance.whirly_interject { puts a.join(' ') }
48
+ return unless $cfg['tool.curldebug']
49
+ formp = (request.content_type =~ %r{multipart/form-data})
50
+ a = []
51
+ a << %(curl -s)
52
+ if request.key?('Authorization')
53
+ a << %(-H 'Authorization: #{request['Authorization']}')
54
+ end
55
+ a << %(-H 'User-Agent: #{request['User-Agent']}')
56
+ a << %(-H 'Content-Type: #{request.content_type}') unless formp
57
+ a << %(-X #{request.method})
58
+ a << %('#{request.uri}')
59
+ unless request.body.nil?
60
+ if formp
61
+ m = request.body.match(
62
+ /form-data;\s+name="(?<name>[^"]+)";\s+filename="(?<filename>[^"]+)"/
63
+ )
64
+ a << %(-F #{m[:name]}=@#{m[:filename]}) unless m.nil?
72
65
  else
73
- $cfg.curlfile_f << a.join(' ') + "\n\n"
74
- $cfg.curlfile_f.flush
66
+ a << %(-d '#{request.body}')
75
67
  end
76
68
  end
69
+ if $cfg.curlfile_f.nil?
70
+ MrMurano::Progress.instance.whirly_interject { puts a.join(' ') }
71
+ else
72
+ $cfg.curlfile_f << a.join(' ') + "\n\n"
73
+ $cfg.curlfile_f.flush
74
+ end
77
75
  end
78
76
 
79
77
  # Default endpoint unless Class overrides it.
@@ -83,18 +81,19 @@ module MrMurano
83
81
 
84
82
  def http
85
83
  uri = URI('https://' + $cfg['net.host'])
86
- if not defined?(@http) or @http.nil?
84
+ if !defined?(@http) || @http.nil?
87
85
  @http = Net::HTTP.new(uri.host, uri.port)
88
86
  @http.use_ssl = true
89
87
  @http.start
90
88
  end
91
89
  @http
92
90
  end
91
+
93
92
  def http_reset
94
93
  @http = nil
95
94
  end
96
95
 
97
- def set_def_headers(request)
96
+ def add_headers(request)
98
97
  request.content_type = 'application/json'
99
98
  # 2017-08-14: MrMurano::Account overrides the token method, and
100
99
  # it doesn't exit if no token, and then we end up here.
@@ -104,24 +103,24 @@ module MrMurano
104
103
  request
105
104
  end
106
105
 
106
+ # rubocop:disable Style/MethodName "Use snake_case for method names."
107
+ # 2017-08-20: isJSON and showHttpError are grandparented into lint exceptions.
107
108
  def isJSON(data)
108
- begin
109
- [true, JSON.parse(data, json_opts)]
110
- rescue
111
- [false, data]
112
- end
109
+ [true, JSON.parse(data, json_opts)]
110
+ rescue
111
+ [false, data]
113
112
  end
114
113
 
115
114
  def showHttpError(request, response)
116
115
  if $cfg['tool.debug']
117
- puts "Sent #{request.method} #{request.uri.to_s}"
118
- request.each_capitalized{|k,v| puts "> #{k}: #{v}"}
116
+ puts "Sent #{request.method} #{request.uri}"
117
+ request.each_capitalized { |k, v| puts "> #{k}: #{v}" }
119
118
  if request.body.nil?
120
119
  else
121
120
  puts ">> #{request.body[0..156]}"
122
121
  end
123
122
  puts "Got #{response.code} #{response.message}"
124
- response.each_capitalized{|k,v| puts "< #{k}: #{v}"}
123
+ response.each_capitalized { |k, v| puts "< #{k}: #{v}" }
125
124
  end
126
125
  isj, jsn = isJSON(response.body)
127
126
  resp = "Request Failed: #{response.code}: "
@@ -130,25 +129,25 @@ module MrMurano
130
129
  # to support Ruby 3.0 frozen string literals.
131
130
  if $cfg['tool.fullerror']
132
131
  resp += JSON.pretty_generate(jsn)
133
- elsif jsn.kind_of? Hash
134
- resp += "[#{jsn[:statusCode]}] " if jsn.has_key? :statusCode
135
- resp += jsn[:message] if jsn.has_key? :message
132
+ elsif jsn.is_a? Hash
133
+ resp += "[#{jsn[:statusCode]}] " if jsn.key? :statusCode
134
+ resp += jsn[:message] if jsn.key? :message
136
135
  else
137
136
  resp += jsn.to_s
138
137
  end
139
138
  else
140
- resp += (jsn or 'nil')
139
+ resp += (jsn || 'nil')
141
140
  end
142
141
  # assuming verbosing was included.
143
142
  error resp
144
143
  end
145
144
 
146
- def workit(request, &block)
145
+ def workit(request)
147
146
  curldebug(request)
148
147
  if block_given?
149
- yield request, http()
148
+ yield request, http
150
149
  else
151
- response = http().request(request)
150
+ response = http.request(request)
152
151
  case response
153
152
  when Net::HTTPSuccess
154
153
  workit_response(response)
@@ -174,13 +173,13 @@ module MrMurano
174
173
  def get(path='', query=nil, &block)
175
174
  uri = endpoint(path)
176
175
  uri.query = URI.encode_www_form(query) unless query.nil?
177
- workit(set_def_headers(Net::HTTP::Get.new(uri)), &block)
176
+ workit(add_headers(Net::HTTP::Get.new(uri)), &block)
178
177
  end
179
178
 
180
179
  def post(path='', body={}, &block)
181
180
  uri = endpoint(path)
182
181
  req = Net::HTTP::Post.new(uri)
183
- set_def_headers(req)
182
+ add_headers(req)
184
183
  req.body = JSON.generate(body)
185
184
  workit(req, &block)
186
185
  end
@@ -188,7 +187,7 @@ module MrMurano
188
187
  def postf(path='', form={}, &block)
189
188
  uri = endpoint(path)
190
189
  req = Net::HTTP::Post.new(uri)
191
- set_def_headers(req)
190
+ add_headers(req)
192
191
  req.content_type = 'application/x-www-form-urlencoded; charset=utf-8'
193
192
  req.form_data = form
194
193
  workit(req, &block)
@@ -197,7 +196,7 @@ module MrMurano
197
196
  def put(path='', body={}, &block)
198
197
  uri = endpoint(path)
199
198
  req = Net::HTTP::Put.new(uri)
200
- set_def_headers(req)
199
+ add_headers(req)
201
200
  req.body = JSON.generate(body)
202
201
  workit(req, &block)
203
202
  end
@@ -205,14 +204,14 @@ module MrMurano
205
204
  def patch(path='', body={}, &block)
206
205
  uri = endpoint(path)
207
206
  req = Net::HTTP::Patch.new(uri)
208
- set_def_headers(req)
207
+ add_headers(req)
209
208
  req.body = JSON.generate(body)
210
209
  workit(req, &block)
211
210
  end
212
211
 
213
212
  def delete(path='', &block)
214
213
  uri = endpoint(path)
215
- workit(set_def_headers(Net::HTTP::Delete.new(uri)), &block)
214
+ workit(add_headers(Net::HTTP::Delete.new(uri)), &block)
216
215
  end
217
216
  end
218
217
  end
@@ -238,17 +237,17 @@ if RUBY_VERSION == '2.0.0'
238
237
  end
239
238
 
240
239
  D "opening connection to #{conn_address}:#{conn_port}..."
241
- s = Timeout.timeout(@open_timeout, Net::OpenTimeout) {
240
+ s = Timeout.timeout(@open_timeout, Net::OpenTimeout) do
242
241
  TCPSocket.open(conn_address, conn_port, @local_host, @local_port)
243
- }
242
+ end
244
243
  s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
245
- D "opened"
244
+ D 'opened'
246
245
  if use_ssl?
247
- ssl_parameters = Hash.new
246
+ ssl_parameters = {}
248
247
  iv_list = instance_variables
249
248
  SSL_IVNAMES.each_with_index do |ivname, i|
250
- if iv_list.include?(ivname) and
251
- value = instance_variable_get(ivname)
249
+ if iv_list.include?(ivname)
250
+ value = instance_variable_get(ivname)
252
251
  ssl_parameters[SSL_ATTRIBUTES[i]] = value if value
253
252
  end
254
253
  end
@@ -257,7 +256,7 @@ if RUBY_VERSION == '2.0.0'
257
256
  D "starting SSL for #{conn_address}:#{conn_port}..."
258
257
  s = OpenSSL::SSL::SSLSocket.new(s, @ssl_context)
259
258
  s.sync_close = true
260
- D "SSL established"
259
+ D 'SSL established'
261
260
  end
262
261
  @socket = BufferedIO.new(s)
263
262
  @socket.read_timeout = @read_timeout
@@ -281,8 +280,8 @@ if RUBY_VERSION == '2.0.0'
281
280
  end
282
281
  # Server Name Indication (SNI) RFC 3546
283
282
  s.hostname = @address if s.respond_to? :hostname=
284
- if @ssl_session and
285
- Time.now < @ssl_session.time + @ssl_session.timeout
283
+ if @ssl_session &&
284
+ Time.now < @ssl_session.time + @ssl_session.timeout
286
285
  s.session = @ssl_session if @ssl_session
287
286
  end
288
287
  Timeout.timeout(@open_timeout, Net::OpenTimeout) { s.connect }
@@ -292,7 +291,7 @@ if RUBY_VERSION == '2.0.0'
292
291
  @ssl_session = s.session
293
292
  rescue => exception
294
293
  D "Conn close because of connect error #{exception}"
295
- @socket.close if @socket and not @socket.closed?
294
+ @socket.close if @socket && !@socket.closed?
296
295
  raise exception
297
296
  end
298
297
  end