right_support 1.4.0 → 1.4.1

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.
@@ -33,9 +33,6 @@ module RightSupport
33
33
  # Maximum characters in sub-stat value line
34
34
  MAX_SUB_STAT_VALUE_WIDTH = 80
35
35
 
36
- # Maximum characters displayed for exception message
37
- MAX_EXCEPTION_MESSAGE_WIDTH = 60
38
-
39
36
  # Separator between stat name and stat value
40
37
  SEPARATOR = " : "
41
38
 
@@ -133,37 +130,67 @@ module RightSupport
133
130
  end
134
131
  end
135
132
 
136
- # Wrap string by breaking it into lines at the specified separator
133
+ # Wrap string by breaking it into lines at the specified separators
134
+ # Allow for presence of color encoding when measuring string length
137
135
  #
138
136
  # === Parameters
139
137
  # string(String):: String to be wrapped
140
- # max_length(Integer):: Maximum length of a line excluding indentation
141
- # indent(String):: Indentation for each line
142
- # separator(String):: Separator at which to make line breaks
138
+ # max_length(Integer|Array):: Maximum length of a line, or array containing
139
+ # maximum length of first line followed by maximum for any subsequent line
140
+ # including indent
141
+ # indent(String):: Indentation for each line after first
142
+ # separators(Regexp):: Separators where string can wrap
143
143
  #
144
144
  # === Return
145
- # (String):: Multi-line string
146
- def self.wrap(string, max_length, indent, separator)
145
+ # (String|Array):: Multi-line string
146
+ def self.wrap(string, max_length, indent, separators)
147
+ # Strip color encoding from string
148
+ strip = lambda { |string| string.gsub(/\e\[[0-9]*m/, "") }
149
+
150
+ # Split string at specified separators and return an array of arrays
151
+ # containing string segments and associated separator
152
+ split = lambda do |string, separators|
153
+ head, sep, tail = string.partition(separators)
154
+ if tail == ""
155
+ [[head, sep]]
156
+ else
157
+ [[head, sep]].concat(split.call(tail, separators))
158
+ end
159
+ end
160
+
147
161
  all = []
148
- line = ""
149
- for l in string.split(separator)
150
- if (line + l).length >= max_length
151
- all.push(line)
152
- line = ""
162
+ line = ["", last_sep = ""]
163
+ limit = max_length.is_a?(Array) ? max_length[0] : max_length
164
+ length = 0
165
+ separators = /#{separators}/ if separators.is_a?(String)
166
+ split.call(string, separators).each do |str, sep|
167
+ if (length + strip.call(str).size + last_sep.size + sep.size) > limit
168
+ all.push(line) unless line[0] == ""
169
+ line = [indent, last_sep = ""]
170
+ length = indent.size
171
+ limit = max_length.is_a?(Array) ? max_length[1] : max_length
153
172
  end
154
- line += line == "" ? l : separator + l
173
+ line[0] += (str = last_sep + str)
174
+ line[1] = last_sep = sep
175
+ length += strip.call(str).size
155
176
  end
156
- all.push(line).join(separator + "\n" + indent)
177
+ all.push(line)
178
+ all[0..-2].inject("") { |a, (str, sep)| a + str + sep + "\n" } + all[-1][0]
157
179
  end
158
180
 
159
181
  # Format UTC time value
160
182
  #
161
183
  # === Parameters
162
184
  # time(Integer):: Time in seconds in Unix-epoch to be formatted
185
+ # with_year(Boolean):: Whether to include year, defaults to false
163
186
  #
164
187
  # (String):: Formatted time string
165
- def self.time_at(time)
166
- Time.at(time).strftime("%a %b %d %H:%M:%S")
188
+ def self.time_at(time, with_year = false)
189
+ if with_year
190
+ Time.at(time).strftime("%a %b %d %H:%M:%S %Y")
191
+ else
192
+ Time.at(time).strftime("%a %b %d %H:%M:%S")
193
+ end
167
194
  end
168
195
 
169
196
  # Sort hash elements by key in ascending order into array of key/value pairs
@@ -192,9 +219,9 @@ module RightSupport
192
219
  # Converts server statistics to a displayable format
193
220
  #
194
221
  # === Parameters
195
- # stats(Hash):: Statistics with generic keys "name", "identity", "hostname", "service uptime",
222
+ # stats(Hash):: Statistics with generic keys "name", "identity", "hostname", "revision", "service uptime",
196
223
  # "machine uptime", "memory KB", "stat time", "last reset time", "version", and "broker" with
197
- # the latter two and "machine uptime", "memory KB", "version", and "broker" being optional;
224
+ # the latter two and "revision", "machine uptime", "memory KB", "version", and "broker" being optional;
198
225
  # any other keys ending with "stats" have an associated hash value that is displayed in sorted
199
226
  # key order, unless "stats" is preceded by a non-blank, in which case that character is prepended
200
227
  # to the key to drive the sort order
@@ -202,7 +229,6 @@ module RightSupport
202
229
  # :name_width(Integer):: Maximum characters in displayed stat name
203
230
  # :sub_name_width(Integer):: Maximum characters in displayed sub-stat name
204
231
  # :sub_stat_value_width(Integer):: Maximum characters in displayed sub-stat value line
205
- # :exception_message_width(Integer):: Maximum characters displayed for exception message
206
232
  #
207
233
  # === Return
208
234
  # (String):: Display string
@@ -211,9 +237,12 @@ module RightSupport
211
237
 
212
238
  str = stats["name"] ? sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "name", stats["name"]) : ""
213
239
  str += sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "identity", stats["identity"]) +
214
- sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "hostname", stats["hostname"]) +
215
- sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "stat time", time_at(stats["stat time"])) +
216
- sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "last reset", time_at(stats["last reset time"])) +
240
+ sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "hostname", stats["hostname"])
241
+ if stats.has_key?("revision")
242
+ str += sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "revision", stats["revision"])
243
+ end
244
+ str += sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "stat time", time_at(stats["stat time"], with_year = true)) +
245
+ sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "last reset", time_at(stats["last reset time"], with_year = true)) +
217
246
  sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "service up", elapsed(stats["service uptime"]))
218
247
  if stats.has_key?("machine uptime")
219
248
  str += sprintf("%-#{name_width}s#{SEPARATOR}%s\n", "machine up", elapsed(stats["machine uptime"]))
@@ -256,7 +285,6 @@ module RightSupport
256
285
  # :name_width(Integer):: Fixed width for left-justified name display
257
286
  # :sub_name_width(Integer):: Maximum characters in displayed sub-stat name
258
287
  # :sub_stat_value_width(Integer):: Maximum characters in displayed sub-stat value line
259
- # :exception_message_width(Integer):: Maximum characters displayed for exception message
260
288
  #
261
289
  # === Return
262
290
  # str(String):: Broker display with one line per broker plus exceptions
@@ -302,7 +330,8 @@ module RightSupport
302
330
  str += if brokers["returns"].nil? || brokers["returns"].empty?
303
331
  "none\n"
304
332
  else
305
- wrap(activity_str(brokers["returns"]), sub_stat_value_width, sub_value_indent, ", ") + "\n"
333
+ wrap(activity_str(brokers["returns"]), [sub_stat_value_width, sub_stat_value_width + sub_value_indent.size],
334
+ sub_value_indent, /, /) + "\n"
306
335
  end
307
336
  end
308
337
 
@@ -325,7 +354,6 @@ module RightSupport
325
354
  # :name_width(Integer):: Fixed width for left-justified name display
326
355
  # :sub_name_width(Integer):: Maximum characters in displayed sub-stat name
327
356
  # :sub_stat_value_width(Integer):: Maximum characters in displayed sub-stat value line
328
- # :exception_message_width(Integer):: Maximum characters displayed for exception message
329
357
  #
330
358
  # === Return
331
359
  # (String):: Single line display of stat
@@ -349,13 +377,15 @@ module RightSupport
349
377
  if v.empty? || v["total"] == 0
350
378
  "none"
351
379
  elsif v["total"]
352
- wrap(activity_str(v), sub_stat_value_width, sub_value_indent, ", ")
380
+ wrap(activity_str(v), [sub_stat_value_width, sub_stat_value_width + sub_value_indent.size],
381
+ sub_value_indent, ", ")
353
382
  elsif k =~ /last$/
354
383
  last_activity_str(v)
355
384
  elsif k == "exceptions"
356
385
  exceptions_str(v, sub_value_indent, options)
357
386
  else
358
- wrap(hash_str(v), sub_stat_value_width, sub_value_indent, ", ")
387
+ wrap(hash_str(v), [sub_stat_value_width, sub_stat_value_width + sub_value_indent.size],
388
+ sub_value_indent, /, /)
359
389
  end
360
390
  else
361
391
  "#{v || "none"}"
@@ -427,20 +457,19 @@ module RightSupport
427
457
  # "recent"(Array):: Most recent as a hash of "count", "type", "message", "when", and "where"
428
458
  # indent(String):: Indentation for each line
429
459
  # options(Hash):: Formatting options
430
- # :exception_message_width(Integer):: Maximum characters displayed for exception message
460
+ # :sub_stat_value_width(Integer):: Maximum characters in displayed sub-stat value line
431
461
  #
432
462
  # === Return
433
463
  # (String):: Exceptions in displayable format with line separators
434
464
  def self.exceptions_str(exceptions, indent, options = {})
435
- exception_message_width = options[:exception_message_width] || MAX_EXCEPTION_MESSAGE_WIDTH
465
+ sub_stat_value_width = options[:sub_stat_value_width] || MAX_SUB_STAT_VALUE_WIDTH
436
466
  indent2 = indent + (" " * 4)
437
467
  exceptions.to_a.sort.map do |k, v|
438
468
  sprintf("%s total: %d, most recent:\n", k, v["total"]) + v["recent"].reverse.map do |e|
439
- message = e["message"]
440
- if message && message.size > (exception_message_width - 3)
441
- message = e["message"][0, exception_message_width - 3] + "..."
442
- end
443
- indent + "(#{e["count"]}) #{time_at(e["when"])} #{e["type"]}: #{message}\n" + indent2 + "#{e["where"]}"
469
+ where = " IN #{e["where"]}" if e["where"]
470
+ indent + wrap("(#{e["count"]}) #{time_at(e["when"])} #{e["type"]}: #{e["message"]}#{where}",
471
+ [sub_stat_value_width, sub_stat_value_width + indent2.size],
472
+ indent2, / |\/\/|\/|::|\.|-/)
444
473
  end.join("\n")
445
474
  end.join("\n" + indent)
446
475
  end
@@ -7,8 +7,8 @@ spec = Gem::Specification.new do |s|
7
7
  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
8
8
 
9
9
  s.name = 'right_support'
10
- s.version = '1.4.0'
11
- s.date = '2012-04-12'
10
+ s.version = '1.4.1'
11
+ s.date = '2012-05-01'
12
12
 
13
13
  s.authors = ['Tony Spataro', 'Sergey Sergyenko', 'Ryan Williamson', 'Lee Kirchhoff']
14
14
  s.email = 'support@rightscale.com'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: right_support
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 5
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 4
9
- - 0
10
- version: 1.4.0
9
+ - 1
10
+ version: 1.4.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tony Spataro
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2012-04-12 00:00:00 -07:00
21
+ date: 2012-05-01 00:00:00 -07:00
22
22
  default_executable:
23
23
  dependencies: []
24
24