Class: String

Inherits:
Object
  • Object
show all
Defined in:
lib/wavefront-cli/stdlib/string.rb,
lib/wavefront-cli/output/hcl/stdlib/string.rb

Overview

Extensions to stdlib String

Instance Method Summary collapse

Instance Method Details

#braced(indent = 0) ⇒ Object



7
8
9
10
# File 'lib/wavefront-cli/output/hcl/stdlib/string.rb', line 7

def braced(indent = 0)
  pad = ' ' * indent
  "\n#{pad}{#{self}\n#{pad}}"
end

#cmd_fold(twidth = TW, indent = 10) ⇒ Object

Fold long command lines. We can’t break on a space after an option or it confuses docopt.

Parameters:

  • twidth (Integer) (defaults to: TW)

    terminal width

  • indent (Integer) (defaults to: 10)

    size of hanging indent, in chars



12
13
14
15
# File 'lib/wavefront-cli/stdlib/string.rb', line 12

def cmd_fold(twidth = TW, indent = 10)
  gsub(/(-\w) /, '\\1^').scan_line(twidth - 12).join("\n#{' ' * indent}")
                        .restored
end

#fold(twidth = TW, indent = 10, prefix = '') ⇒ String

Fold long lines with a hanging indent. Originally a special case for option folding, now addded the prefix parameter to make it more general. Don’t line-break default values, because it also breaks docopt.

Parameters:

  • twidth (Integer) (defaults to: TW)

    terminal width

  • indent (Integer) (defaults to: 10)

    size of hanging indent, in chars

  • prefix (String) (defaults to: '')

    prepended to every line

Returns:

  • (String)

    the folded line



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/wavefront-cli/stdlib/string.rb', line 37

def fold(twidth = TW, indent = 10, prefix = '')
  chunks = gsub('default: ', 'default:^').scan_line(twidth - 8)
  first_line = format("%<padding>s%<text>s\n",
                      padding: prefix,
                      text: chunks.shift)

  return first_line.restored if chunks.empty?

  rest = indent_folded_lines(chunks, twidth, indent, prefix)
  (first_line + rest.join("\n")).restored
end

#opt_fold(twidth = TW, indent = 10) ⇒ String

Wrapper around #fold()

Parameters:

  • twidth (Integer) (defaults to: TW)

    width of terminal, in chars

  • indent (Integer) (defaults to: 10)

    hanging indent of following lines

Returns:

  • (String)

    folded and indented string



23
24
25
# File 'lib/wavefront-cli/stdlib/string.rb', line 23

def opt_fold(twidth = TW, indent = 10)
  fold(twidth, indent, '  ')
end

#restoredObject

We use a carat as a temporary whitespace character to avoid undesirable line breaking. This puts it back



52
53
54
# File 'lib/wavefront-cli/stdlib/string.rb', line 52

def restored
  tr('^', ' ').chomp
end

#scan_line(width) ⇒ Array

Returns original string chunked into an array width elements whose length < width.

Parameters:

  • width (Integer)

    length of longest string (width of terminal less some margin)

Returns:

  • (Array)

    original string chunked into an array width elements whose length < width



69
70
71
# File 'lib/wavefront-cli/stdlib/string.rb', line 69

def scan_line(width)
  scan(/\S.{0,#{width}}\S(?=\s|$)|\S+/)
end

#to_secondsObject



73
74
75
76
77
78
79
80
81
# File 'lib/wavefront-cli/stdlib/string.rb', line 73

def to_seconds
  begin
    number, unit = match(/^(\d+)([smhdw])$/).captures
  rescue NoMethodError
    raise ArgumentError
  end

  number.to_i * unit_factor(unit.to_sym)
end

#to_snakeString

Make a camelCase string be snake_case

Returns:



95
96
97
98
99
# File 'lib/wavefront-cli/stdlib/string.rb', line 95

def to_snake
  gsub(/(.)([A-Z])/) do
    "#{Regexp.last_match[1]}_#{Regexp.last_match[2].downcase}"
  end
end

#unit_factor(unit) ⇒ Integer

How many seconds in the given unit

Parameters:

  • unit (Symbol)

Returns:

  • (Integer)


87
88
89
90
# File 'lib/wavefront-cli/stdlib/string.rb', line 87

def unit_factor(unit)
  factors = { s: 1, m: 60, h: 3600, d: 86_400, w: 604_800 }
  factors[unit] || 1
end

#value_fold(indent = 0, twidth = TW) ⇒ Object

Fold long value lines in two-column output. The returned string is appended to a key, so the first line is not indented.



59
60
61
62
# File 'lib/wavefront-cli/stdlib/string.rb', line 59

def value_fold(indent = 0, twidth = TW)
  max_line_length = twidth - indent - 4
  scan_line(max_line_length).join("\n#{' ' * indent}")
end