MuranoCLI 3.0.8 → 3.1.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,8 +15,8 @@ MSG_SOLUTIONS_NONE_FOUND = 'No solutions found' unless defined? MSG_SOLUTIONS_NO
15
15
  # *** For some commands: let user restrict to specific solution --type.
16
16
  # ---------------------------------------------------------------------
17
17
 
18
- def cmd_add_solntype_pickers(c, exclude_all: false)
19
- # 2017-07-26: HA! The --type option can get masked by aliases.
18
+ def cmd_add_solntype_pickers(cmd, exclude_all: false)
19
+ # 2017-07-26 (landonb): HA! The --type option can get masked by aliases.
20
20
  # For instance, if the option is required ("--type TYPE"), then
21
21
  # murano domain --type product
22
22
  # fails, because the "domain product" alias steals the --type argument,
@@ -31,7 +31,7 @@ def cmd_add_solntype_pickers(c, exclude_all: false)
31
31
  allowed_types += [:all] unless exclude_all
32
32
  allowed_types.map!(&:to_s).sort!
33
33
  default = exclude_all && 'application' || 'all'
34
- c.option(
34
+ cmd.option(
35
35
  '--type [TYPE]',
36
36
  allowed_types,
37
37
  %(Apply to solution(s) of type [#{allowed_types.join('|')}] (default: #{default}))
@@ -194,16 +194,16 @@ end
194
194
  # *** For murano init: specify --business, --application, and/or --product.
195
195
  # -------------------------------------------------------------------------
196
196
 
197
- def cmd_option_application_pickers(c)
198
- c.option('--application-id ID', String, %(ID of Application to use))
199
- c.option('--application-name NAME', String, %(Name of Application to use))
200
- c.option('--application APPLICATION', String, %(Name or ID of Application to use))
197
+ def cmd_option_application_pickers(cmd)
198
+ cmd.option('--application-id ID', String, %(ID of Application to use))
199
+ cmd.option('--application-name NAME', String, %(Name of Application to use))
200
+ cmd.option('--application APPLICATION', String, %(Name or ID of Application to use))
201
201
  end
202
202
 
203
- def cmd_option_product_pickers(c)
204
- c.option('--product-id ID', String, %(ID of Product to use))
205
- c.option('--product-name NAME', String, %(Name of Product to use))
206
- c.option('--product PRODUCT', String, %(Name or ID of Product to use))
203
+ def cmd_option_product_pickers(cmd)
204
+ cmd.option('--product-id ID', String, %(ID of Product to use))
205
+ cmd.option('--product-name NAME', String, %(Name of Product to use))
206
+ cmd.option('--product PRODUCT', String, %(Name or ID of Product to use))
207
207
  end
208
208
 
209
209
  def any_solution_pickers!(options)
@@ -11,14 +11,17 @@ require 'highline'
11
11
 
12
12
  module MrMurano
13
13
  module Pretties
14
- HighLine::Style.new(name: :on_aliceblue, code: "\e[48;5;231m", rgb: [240, 248, 255])
15
14
  PRETTIES_COLORSCHEME = HighLine::ColorScheme.new do |cs|
16
- cs[:subject] = %i[red on_aliceblue]
17
- cs[:timestamp] = [:blue]
18
15
  cs[:json] = [:magenta]
16
+ cs[:record_type] = [:magenta]
17
+ cs[:subject] = [:cyan]
18
+ cs[:timestamp] = [:blue]
19
+ cs[:tracking] = [:yellow]
19
20
  end
20
21
  HighLine.color_scheme = PRETTIES_COLORSCHEME
21
22
 
23
+ TERM_WIDTH, _rows = HighLine::SystemExtensions.terminal_size
24
+
22
25
  # rubocop:disable Style/MethodName: "Use snake_case for method names."
23
26
  def self.makeJsonPretty(data, options, indent: nil, object_nl: nil)
24
27
  if options.pretty
@@ -85,7 +88,14 @@ module MrMurano
85
88
  out + log_pretty_assemble_body(line, options)
86
89
  end
87
90
 
88
- def self.fmt_text_padded(text, style, out, raw, min_width: 0)
91
+ def self.fmt_text_padded(text, style, out, raw, options, min_width: 0)
92
+ inter_spaces = (min_width == 0) && 0 || options.one_line && 1 || 3
93
+ min_width = text.length + inter_spaces unless options.align
94
+ if !options.one_line && options.align && min_width == 0
95
+ prefix = TERM_WIDTH - raw.length - text.length
96
+ out += ' ' * prefix
97
+ raw += ' ' * prefix
98
+ end
89
99
  padding = min_width - text.length
90
100
  padding = ' ' * (padding > 0 && padding || 0)
91
101
  out += HighLine.color(text, style) + padding
@@ -96,30 +106,31 @@ module MrMurano
96
106
  def self.log_pretty_assemble_header(line, options)
97
107
  out = ''
98
108
  raw = ''
99
- out, raw = log_pretty_header_add_abbreviated_sev(line, out, raw, options)
100
- out, raw = log_pretty_header_add_log_record_type(line, out, raw, options)
101
109
  out, raw = log_pretty_header_add_event_timestamp(line, out, raw, options)
102
110
  out, raw = log_pretty_header_add_murano_tracking(line, out, raw, options)
103
- out, _raw = log_pretty_header_add_a_service_event(line, out, raw, options)
111
+ out, raw = log_pretty_header_add_log_record_type(line, out, raw, options)
112
+ out, raw = log_pretty_header_add_abbreviated_sev(line, out, raw, options)
113
+ out, raw = log_pretty_header_add_a_service_event(line, out, raw, options)
114
+ out, _raw = log_pretty_header_add_message(line, out, raw, options)
104
115
  out + "\n"
105
116
  end
106
117
 
107
- def self.log_pretty_header_add_abbreviated_sev(line, out, raw, _options)
108
- fmt_abbreviated_severity(line[:severity], out, raw)
118
+ def self.log_pretty_header_add_abbreviated_sev(line, out, raw, options)
119
+ fmt_abbreviated_severity(line[:severity], out, raw, options)
109
120
  end
110
121
 
111
- def self.log_pretty_header_add_loquacious_sev(line, out, raw, _options)
112
- fmt_loquacious_severity(line[:severity], out, raw)
122
+ def self.log_pretty_header_add_loquacious_sev(line, out, raw, options)
123
+ fmt_loquacious_severity(line[:severity], out, raw, options)
113
124
  end
114
125
 
115
- def self.fmt_abbreviated_severity(severity, out, raw, min_width: 7)
126
+ def self.fmt_abbreviated_severity(severity, out, raw, options, min_width: 7)
116
127
  abbrev, _loquac, style = styled_severity(severity)
117
- fmt_text_padded(abbrev, style, out, raw, min_width: min_width)
128
+ fmt_text_padded(abbrev, style, out, raw, options, min_width: min_width)
118
129
  end
119
130
 
120
- def self.fmt_loquacious_severity(severity, min_width: 11)
131
+ def self.fmt_loquacious_severity(severity, out, raw, options, min_width: 11)
121
132
  _abbrev, loquac, style = styled_severity(severity)
122
- fmt_text_padded(loquac, style, out, raw, min_width: min_width)
133
+ fmt_text_padded(loquac, style, out, raw, options, min_width: min_width)
123
134
  end
124
135
 
125
136
  def self.styled_severity(severity)
@@ -145,14 +156,16 @@ module MrMurano
145
156
  end
146
157
  end
147
158
 
148
- def self.log_pretty_header_add_log_record_type(line, out, raw, _options)
159
+ def self.log_pretty_header_add_log_record_type(line, out, raw, options)
149
160
  log_type = line[:type].to_s.empty? && '--' || line[:type]
150
- fmt_text_padded(log_type.upcase, :magenta, out, raw, min_width: 10)
161
+ fmt_text_padded(log_type.upcase, :record_type, out, raw, options, min_width: 10)
151
162
  end
152
163
 
153
164
  def self.log_pretty_header_add_event_timestamp(line, out, raw, options)
154
165
  curtime = fmt_log_record_timestamp(line, options)
155
- fmt_text_padded(curtime, :timestamp, out, raw, min_width: 18)
166
+ inter_spaces = options.one_line && 1 || 3
167
+ min_width = curtime.length + inter_spaces
168
+ fmt_text_padded(curtime, :timestamp, out, raw, options, min_width: min_width)
156
169
  end
157
170
 
158
171
  def self.fmt_log_record_timestamp(line, options)
@@ -164,7 +177,9 @@ module MrMurano
164
177
  else
165
178
  curtime = time_secs_epoch.gmtime
166
179
  end
167
- curtime = curtime.strftime('%Y-%m-%d %H:%M:%S')
180
+ format = options.sprintf
181
+ format = '%Y-%m-%d %H:%M:%S' if format.to_s.empty?
182
+ curtime = curtime.strftime(format)
168
183
  else
169
184
  curtime = line[:timestamp]
170
185
  end
@@ -177,23 +192,33 @@ module MrMurano
177
192
  def self.log_pretty_header_add_murano_tracking(line, out, raw, options)
178
193
  return [out, raw] unless options.tracking
179
194
  tid = line[:tracking_id].to_s.empty? && '--------' || line[:tracking_id].slice(0, 8)
180
- fmt_text_padded(tid, :yellow, out, raw, min_width: 10)
195
+ fmt_text_padded(tid, :tracking, out, raw, options, min_width: 11)
181
196
  end
182
197
 
183
- def self.log_pretty_header_add_a_service_event(line, out, raw, _options)
198
+ def self.log_pretty_header_add_a_service_event(line, out, raw, options)
199
+ pad = options.align && ' ' || ''
200
+ out += pad
201
+ raw += pad
184
202
  svc_evt = []
185
203
  svc_evt += [line[:service]] unless line[:service].to_s.empty?
186
204
  svc_evt += [line[:event]] unless line[:event].to_s.empty?
187
205
  svc_evt = "[#{svc_evt.join(' ').upcase}]"
188
- out += HighLine.color(svc_evt, :subject)
189
- raw += svc_evt
190
- [out, raw]
206
+ fmt_text_padded(svc_evt, :subject, out, raw, options, min_width: 0)
207
+ end
208
+
209
+ def self.log_pretty_header_add_message(line, out, raw, options)
210
+ return [out, raw] unless options.one_line
211
+ return [out, raw] unless line.key?(:message) && !line[:message].to_s.empty?
212
+ msg = ' ' + line[:message]
213
+ [out + msg, raw + msg]
191
214
  end
192
215
 
193
216
  def self.log_pretty_assemble_body(line, options)
194
217
  out = ''
195
- @body_prefix = ' '
218
+ return out if options.one_line
219
+ @body_prefix = options.indent && ' ' || ''
196
220
  out += log_pretty_assemble_message(line, options)
221
+ return out if options.message_only
197
222
  out += log_pretty_assemble_data(line, options)
198
223
  out += log_pretty_assemble_remainder(line, options)
199
224
  out + log_pretty_assemble_tracking_id(line, options)
@@ -219,7 +244,7 @@ module MrMurano
219
244
 
220
245
  def self.log_pretty_emphasize_entry(entry, hash, options)
221
246
  return '' unless hash.key?(entry) && !hash[entry].empty?
222
- out = @body_prefix + "---------\n"
247
+ out = @body_prefix + "---------\n" if options.separators
223
248
  out += @body_prefix + "#{entry}: "
224
249
  out += log_pretty_json(hash[entry], options)
225
250
  out + "\n"
@@ -232,7 +257,7 @@ module MrMurano
232
257
  ]
233
258
  data = data.reject { |key, _val| known_keys.include?(key) }
234
259
  return '' if data.empty?
235
- out = @body_prefix + "---------\n"
260
+ out = options.separators && (@body_prefix + "---------\n") || ''
236
261
  out + @body_prefix + 'data: ' + log_pretty_json(data, options) + "\n"
237
262
  end
238
263
 
@@ -253,13 +278,15 @@ module MrMurano
253
278
  end
254
279
 
255
280
  def self.log_pretty_assemble_tracking_id(line, options)
281
+ return '' unless options.tracking
256
282
  log_pretty_emphasize_entry(:tracking_id, line, options)
257
283
  end
258
284
 
259
285
  def self.log_pretty_json(hash, options)
260
286
  return '' if hash.empty?
287
+ prefix = @body_prefix.to_s.empty? && ' ' || @body_prefix
261
288
  makeJsonPretty(
262
- hash, options, indent: @body_prefix, object_nl: "\n" + @body_prefix
289
+ hash, options, indent: prefix, object_nl: "\n" + @body_prefix
263
290
  )
264
291
  end
265
292
  end
@@ -26,7 +26,7 @@ module MrMurano
26
26
  # '3.0.0-beta.2' is changed to '3.0.0.pre.beta.2'
27
27
  # which breaks our build (which expects the version to match herein).
28
28
  # So stick to using the '.pre.X' syntax, which ruby/gems knows.
29
- VERSION = '3.0.8'
29
+ VERSION = '3.1.0.beta.1'
30
30
  EXE_NAME = File.basename($PROGRAM_NAME)
31
31
  SIGN_UP_URL = 'https://exosite.com/signup/'
32
32
  end
@@ -0,0 +1,110 @@
1
+ ############################
2
+ Murano CLI WebSocket Servers
3
+ ############################
4
+
5
+ ========
6
+ Overview
7
+ ========
8
+
9
+ There are 2 WebSocket servers under ``spec/fixtures/websocket/``:
10
+
11
+ - ``wss-fake-logs.rb``: Run this for developing. It'll spit out a fake log record every second to any client that connect.
12
+
13
+ - ``wss-echo.rb``: The spec tests use this to test the new logs command code. Whatever the server receives on stdin it just echos to any client that's connected.
14
+
15
+ =====
16
+ Usage
17
+ =====
18
+
19
+ From one terminal, start the fake logs server:
20
+
21
+ .. code-block:: bash
22
+
23
+ cd /path/to/exosite-murcli/spec/fixtures/websocket
24
+
25
+ ./wss-fake-logs.rb
26
+
27
+ From another terminal, you can use any WebSocket client.
28
+
29
+ \1. Using Murano CLI.:
30
+
31
+ .. code-block:: bash
32
+
33
+ murano logs -f -c net.host=127.0.0.1:4180 -c net.protocol=http --tracking --trace
34
+
35
+ \2. Using ``esphen/wsta``:
36
+
37
+ .. code-block:: bash
38
+
39
+ # Locally
40
+ wsta --ping 10 "ws://127.0.0.1:4180/path/does/not/matter?limit=1000"
41
+
42
+ # Against BizAPI.
43
+ wsta --ping 10 "wss://bizapi-dev.hosted.exosite.io/api/v1/solution/m1ti0dv29pb340000/logs?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&limit=1000"
44
+
45
+ \3. Using ``hashrocket/ws``:
46
+
47
+ .. code-block:: bash
48
+
49
+ ws "wss://bizapi-dev.hosted.exosite.io/api/v1/solution/m1ti0dv29pb340000/logs?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&limit=1000"
50
+
51
+ -----------------
52
+ Token Shenanigans
53
+ -----------------
54
+
55
+ To run ``murano logs`` locally, against 127.0.0.1, you'll probably
56
+ need to disable the token mechanism.
57
+
58
+ Add this to ``lib/MrMurano/Account.rb``::
59
+
60
+ def token_fetch
61
+ @token = 'XXX'
62
+ return
63
+
64
+ =========================
65
+ Non-Murano CLI WS Clients
66
+ =========================
67
+
68
+ ---------------
69
+ ``esphen/wsta``
70
+ ---------------
71
+
72
+ - ``esphen/wsta`` is a WebSocket CLI client written in Rust.
73
+
74
+ As of late 2017, it's 1 year old and appears to be the most sophisticated client.
75
+
76
+ https://github.com/esphen/wsta
77
+
78
+ To install:
79
+
80
+ .. code-block:: bash
81
+
82
+ sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/esphen/xUbuntu_16.04/ /' > /etc/apt/sources.list.d/wsta.list"
83
+ wget -nv https://download.opensuse.org/repositories/home:esphen/xUbuntu_16.04/Release.key -O Release.key
84
+ sudo apt-key add - < Release.key
85
+ rm Release.key
86
+ sudo apt-get update
87
+ sudo apt-get install wsta
88
+
89
+ -----------------
90
+ ``hashrocket/ws``
91
+ -----------------
92
+
93
+ - ``hashrocket/ws`` is WebSocket CLI client written in Go.
94
+
95
+ As of late 2017, it's 1 year old.
96
+
97
+ https://github.com/hashrocket/ws
98
+
99
+ To install:
100
+
101
+ .. code-block:: bash
102
+
103
+ go get -u github.com/hashrocket/ws
104
+
105
+ ---------------------------------------
106
+ Browser-based "Simple WebSocket Client"
107
+ ---------------------------------------
108
+
109
+ https://chrome.google.com/webstore/detail/simple-websocket-client/pfdhoblngboilpfeibdedpjgfnlcodoo?hl=en
110
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: MuranoCLI
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.8
4
+ version: 3.1.0.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Conrad Tadpol Tilstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-19 00:00:00.000000000 Z
11
+ date: 2018-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: certified
@@ -627,6 +627,7 @@ files:
627
627
  - spec/fixtures/syncable_content/modules/table_util.lua
628
628
  - spec/fixtures/syncable_content/routes/manyRoutes.lua
629
629
  - spec/fixtures/syncable_content/routes/singleRoute.lua
630
+ - spec/fixtures/websocket/README.rst
630
631
  - spec/fixtures/websocket/logs_blather.rb
631
632
  - spec/fixtures/websocket/logs_faker.rb
632
633
  - spec/fixtures/websocket/simple_connection.rb
@@ -659,9 +660,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
659
660
  version: '2.0'
660
661
  required_rubygems_version: !ruby/object:Gem::Requirement
661
662
  requirements:
662
- - - ">="
663
+ - - ">"
663
664
  - !ruby/object:Gem::Version
664
- version: '0'
665
+ version: 1.3.1
665
666
  requirements: []
666
667
  rubyforge_project:
667
668
  rubygems_version: 2.4.5.2