Module: Formatter Private

Defined in:
Library/Homebrew/utils/formatter.rb

Overview

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

Helper module for formatting output.

Class Method Summary collapse

Class Method Details

.arrow(string, color: nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


11
12
13
# File 'Library/Homebrew/utils/formatter.rb', line 11

def arrow(string, color: nil)
  prefix("==>", string, color)
end

.columns(*objects, gap_size: 2) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'Library/Homebrew/utils/formatter.rb', line 81

def columns(*objects, gap_size: 2)
  objects = objects.flatten.map(&:to_s)

  fallback = proc do
    return objects.join("\n").concat("\n")
  end

  fallback.call if objects.empty?
  fallback.call if respond_to?(:tty?) ? !tty? : !$stdout.tty?

  console_width = Tty.width
  object_lengths = objects.map { |obj| Tty.strip_ansi(obj).length }
  cols = (console_width + gap_size) / (object_lengths.max + gap_size)

  fallback.call if cols < 2

  rows = (objects.count + cols - 1) / cols
  cols = (objects.count + rows - 1) / rows # avoid empty trailing columns

  col_width = (console_width + gap_size) / cols - gap_size

  gap_string = "".rjust(gap_size)

  output = +""

  rows.times do |row_index|
    item_indices_for_row = row_index.step(objects.size - 1, rows).to_a

    first_n = item_indices_for_row[0...-1].map do |index|
      objects[index] + "".rjust(col_width - object_lengths[index])
    end

    # don't add trailing whitespace to last column
    last = objects.values_at(item_indices_for_row.last)

    output.concat((first_n + last)
          .join(gap_string))
          .concat("\n")
  end

  output.freeze
end

.error(string, label: nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


35
36
37
# File 'Library/Homebrew/utils/formatter.rb', line 35

def error(string, label: nil)
  label(label, string, :red)
end

.headline(string, color: nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


15
16
17
# File 'Library/Homebrew/utils/formatter.rb', line 15

def headline(string, color: nil)
  arrow("#{Tty.bold}#{string}#{Tty.reset}", color: color)
end

.identifier(string) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


19
20
21
# File 'Library/Homebrew/utils/formatter.rb', line 19

def identifier(string)
  "#{Tty.green}#{string}#{Tty.default}"
end

.option(string) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


23
24
25
# File 'Library/Homebrew/utils/formatter.rb', line 23

def option(string)
  "#{Tty.bold}#{string}#{Tty.reset}"
end

.success(string, label: nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


27
28
29
# File 'Library/Homebrew/utils/formatter.rb', line 27

def success(string, label: nil)
  label(label, string, :green)
end

.url(string) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


58
59
60
# File 'Library/Homebrew/utils/formatter.rb', line 58

def url(string)
  "#{Tty.underline}#{string}#{Tty.no_underline}"
end

.warning(string, label: nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


31
32
33
# File 'Library/Homebrew/utils/formatter.rb', line 31

def warning(string, label: nil)
  label(label, string, :yellow)
end

.wrap(s, width = 172) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Wraps text to fit within a given number of columns using regular expressions that:

  1. convert hard-wrapped paragraphs to a single line
  2. add line break and indent to subcommand descriptions
  3. find any option descriptions longer than a pre-set length and wrap between words with a hanging indent, without breaking any words that overflow
  4. wrap any remaining description lines that need wrapping with the same indent
  5. wrap all lines to the given width.

48
49
50
51
52
53
54
55
56
# File 'Library/Homebrew/utils/formatter.rb', line 48

def wrap(s, width = 172)
  desc = OPTION_DESC_WIDTH
  indent = width - desc
  s.gsub(/(?<=\S) *\n(?=\S)/, " ")
   .gsub(/([`>)\]]:) /, "\\1\n    ")
   .gsub(/^( +-.+  +(?=\S.{#{desc}}))(.{1,#{desc}})( +|$)\n?/, "\\1\\2\n#{" " * indent}")
   .gsub(/^( {#{indent}}(?=\S.{#{desc}}))(.{1,#{desc}})( +|$)\n?/, "\\1\\2\n#{" " * indent}")
   .gsub(/(.{1,#{width}})( +|$)\n?/, "\\1\n")
end