Class: ShellOpts::Formatter
- Inherits:
-
Object
- Object
- ShellOpts::Formatter
- Defined in:
- lib/shellopts/formatter.rb
Constant Summary collapse
- MARGIN_RIGHT =
Right margin
3
- USAGE_STRING =
String for ‘Usage’ in error messages
"Usage"
- USAGE_INDENT =
Indent to use in usage output
USAGE_STRING.size
- USAGE_MAX_WIDTH =
Width of usage (after usage string)
70
- BRIEF_INDENT =
Indent to use in brief output
2
- BRIEF_COL_SEP =
Number of characters between columns in brief output
2
- BRIEF_COL1_MIN_WIDTH =
Minimum width of first column in brief option and command lists
20
- BRIEF_COL1_MAX_WIDTH =
Maximum width of first column in brief option and command lists
40
- BRIEF_COL2_MIN_WIDTH =
Minimum width of second column in brief option and command lists
30
- BRIEF_COL2_MAX_WIDTH =
Maximum width of second column in brief option and command lists
70
- HELP_INDENT =
Indent to use in help output
4
- HELP_MAX_WIDTH =
Max. width of help text (not including indent)
85
Class Method Summary collapse
-
.brief(subject) ⇒ Object
When the user gives a -h option.
-
.command_of(obj) ⇒ Object
Short-hand to get the Grammar::Command object.
-
.command_prefix ⇒ Object
Command prefix when subject is a sub-command.
-
.compute_columns(width, fields) ⇒ Object
Returns a tuple of [first-column-width, second-column-width].
-
.help(subject) ⇒ Object
When the user gives a –help option.
- .puts_columns(widths, fields) ⇒ Object
- .rest ⇒ Object
-
.usage(subject) ⇒ Object
Usage string in error messages.
- .width ⇒ Object
-
.width=(width) ⇒ Object
Used in rspec.
Class Method Details
.brief(subject) ⇒ Object
When the user gives a -h option
239 240 241 242 243 |
# File 'lib/shellopts/formatter.rb', line 239 def self.brief(subject) command = Grammar::Command.command(subject) @command_prefix = command.ancestors.map { |node| node.name + " " }.join setup_indent(BRIEF_INDENT) { command.puts_brief } end |
.command_of(obj) ⇒ Object
Short-hand to get the Grammar::Command object
253 254 255 256 |
# File 'lib/shellopts/formatter.rb', line 253 def self.command_of(obj) constrain obj, Grammar::Command, ::ShellOpts::Program obj.is_a?(Grammar::Command) ? obj : obj.__grammar__ end |
.command_prefix ⇒ Object
Command prefix when subject is a sub-command
226 |
# File 'lib/shellopts/formatter.rb', line 226 def self.command_prefix() @command_prefix end |
.compute_columns(width, fields) ⇒ Object
Returns a tuple of [first-column-width, second-column-width]. width
is the maximum width of the colunms and the BRIEF_COL_SEP separator. fields
is an array of [subject-string, descr-text] tuples where the descr is an array of words
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
# File 'lib/shellopts/formatter.rb', line 281 def self.compute_columns(width, fields) first_max = fields.map { |first, _| first.size }.select { |size| size <= BRIEF_COL1_MAX_WIDTH }.max || BRIEF_COL1_MIN_WIDTH second_max = fields.map { |_, second| second ? second&.map(&:size).sum + second.size - 1 : 0 }.max first_width = [[first_max, BRIEF_COL1_MIN_WIDTH].max, BRIEF_COL1_MAX_WIDTH].min rest = width - first_width - BRIEF_COL_SEP second_min = [BRIEF_COL2_MIN_WIDTH, second_max].min if rest < second_min first_width = [first_max, width - second_min - BRIEF_COL_SEP].max second_width = [width - first_width - BRIEF_COL_SEP, BRIEF_COL2_MIN_WIDTH].max else second_width = [[rest, BRIEF_COL2_MIN_WIDTH].max, BRIEF_COL2_MAX_WIDTH].min end [first_width, second_width] end |
.help(subject) ⇒ Object
When the user gives a –help option
246 247 248 249 250 |
# File 'lib/shellopts/formatter.rb', line 246 def self.help(subject) subject = Grammar::Command.command(subject) @command_prefix = subject.ancestors.map { |node| node.name + " " }.join setup_indent(HELP_INDENT) { subject.puts_help } end |
.puts_columns(widths, fields) ⇒ Object
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 |
# File 'lib/shellopts/formatter.rb', line 258 def self.puts_columns(widths, fields) l = [] first_width, second_width = *widths second_col = first_width + 2 for (first, second) in fields if first.size > first_width puts first indent(first_width + BRIEF_COL_SEP, ' ') { puts second.wrap(second_width) } if second elsif second indent_size = first_width + BRIEF_COL_SEP printf "%-#{indent_size}s", first indent(indent_size, ' ', bol: false) { puts second.wrap(second_width) } else puts first end end end |
.rest ⇒ Object
308 |
# File 'lib/shellopts/formatter.rb', line 308 def self.rest() width - $stdout.tab end |
.usage(subject) ⇒ Object
Usage string in error messages
229 230 231 232 233 234 235 236 |
# File 'lib/shellopts/formatter.rb', line 229 def self.usage(subject) command = Grammar::Command.command(subject) @command_prefix = command.ancestors.map { |node| node.name + " " }.join setup_indent(1) { print lead = "#{USAGE_STRING}: " indent(lead.size, ' ', bol: false) { command.puts_usage } } end |
.width ⇒ Object
298 299 300 301 |
# File 'lib/shellopts/formatter.rb', line 298 def self.width() @width ||= TermInfo.screen_width - MARGIN_RIGHT @width end |
.width=(width) ⇒ Object
Used in rspec
304 305 306 |
# File 'lib/shellopts/formatter.rb', line 304 def self.width=(width) @width = width end |