module Cucumber::Formatter::Console

This module contains helper methods that are used by formatters that print output to the terminal.

FORMAT is a hash of Proc objects, keyed by step-definition types, e.g. “FORMAT”. The Proc is called for each line of the step's output.

format_step calls format_string, format_string calls format_for to obtain the formatting Proc.

Example:

The ANSI color console formatter defines a map of step-type to output color (e.g. “passed” to “green”), then builds methods named for the step-types (e.g. “def passed”), which themselves wrap the corresponding color-named methods provided by Term::ANSIColor (e.g. “def red”).

During output, each line is processed by passing it to the formatter Proc which returns the formatted (e.g. colored) string.

Constants

FORMATS

Public Instance Methods

attach(src, media_type) click to toggle source
# File lib/cucumber/formatter/console.rb, line 170
def attach(src, media_type)
  return unless media_type == 'text/x.cucumber.log+plain'
  return unless @io
  @io.puts
  @io.puts(format_string(src, :tag))
  @io.flush
end
collect_snippet_data(test_step, ast_lookup) click to toggle source
# File lib/cucumber/formatter/console.rb, line 115
def collect_snippet_data(test_step, ast_lookup)
  # collect snippet data for undefined steps
  keyword = ast_lookup.snippet_step_keyword(test_step)
  @snippets_input << Console::SnippetData.new(keyword, test_step)
end
collect_undefined_parameter_type_names(undefined_parameter_type) click to toggle source
# File lib/cucumber/formatter/console.rb, line 121
def collect_undefined_parameter_type_names(undefined_parameter_type)
  @undefined_parameter_types << undefined_parameter_type.type_name
end
do_print_passing_wip(passed_messages) click to toggle source
# File lib/cucumber/formatter/console.rb, line 161
def do_print_passing_wip(passed_messages)
  if passed_messages.any?
    @io.puts format_string("\nThe --wip switch was used, so I didn't expect anything to pass. These scenarios passed:", :failed)
    print_element_messages(passed_messages, :passed, 'scenarios')
  else
    @io.puts format_string("\nThe --wip switch was used, so the failures were expected. All is good.\n", :passed)
  end
end
do_print_profile_information(profiles) click to toggle source
# File lib/cucumber/formatter/console.rb, line 183
def do_print_profile_information(profiles)
  profiles_sentence = if profiles.size == 1
                        profiles.first
                      else
                        "#{profiles[0...-1].join(', ')} and #{profiles.last}"
                      end

  @io.puts "Using the #{profiles_sentence} profile#{'s' if profiles.size > 1}..."
end
do_print_snippets(snippet_text_proc) click to toggle source
# File lib/cucumber/formatter/console.rb, line 138
def do_print_snippets(snippet_text_proc)
  snippets = @snippets_input.map do |data|
    snippet_text_proc.call(data.actual_keyword, data.step.text, data.step.multiline_arg)
  end.uniq

  text = "\nYou can implement step definitions for undefined steps with these snippets:\n\n"
  text += snippets.join("\n\n")
  @io.puts format_string(text, :undefined)

  @io.puts
  @io.flush
end
do_print_undefined_parameter_type_snippet(type_name) click to toggle source
# File lib/cucumber/formatter/console.rb, line 193
def do_print_undefined_parameter_type_snippet(type_name)
  camelized = type_name.split(/_|-/).collect(&:capitalize).join

  @io.puts [
    "The parameter #{type_name} is not defined. You can define a new one with:",
    '',
    'ParameterType(',
    "  name:        '#{type_name}',",
    '  regexp:      /some regexp here/,',
    "  type:        #{camelized},",
    '  # The transformer takes as many arguments as there are capture groups in the regexp,',
    '  # or just one if there are none.',
    "  transformer: ->(s) { #{camelized}.new(s) }",
    ')',
    ''
  ].join("\n")
end
exception_message_string(e, indent_amount) click to toggle source
# File lib/cucumber/formatter/console.rb, line 102
def exception_message_string(e, indent_amount)
  message = "#{e.message} (#{e.class})".dup.force_encoding('UTF-8')
  message = linebreaks(message, ENV['CUCUMBER_TRUNCATE_OUTPUT'].to_i)

  indent("#{message}\n#{e.backtrace.join("\n")}", indent_amount)
end
format_step(keyword, step_match, status, source_indent) click to toggle source
# File lib/cucumber/formatter/console.rb, line 35
def format_step(keyword, step_match, status, source_indent)
  comment = if source_indent
              c = indent(('# ' + step_match.location.to_s), source_indent)
              format_string(c, :comment)
            else
              ''
            end

  format = format_for(status, :param)
  line = keyword + step_match.format_args(format) + comment
  format_string(line, status)
end
format_string(o, status) click to toggle source
# File lib/cucumber/formatter/console.rb, line 48
def format_string(o, status)
  fmt = format_for(status)
  o.to_s.split("\n").map do |line|
    if Proc == fmt.class
      fmt.call(line)
    else
      fmt % line
    end
  end.join("\n")
end
indent(string, padding) click to toggle source
# File lib/cucumber/formatter/console.rb, line 211
def indent(string, padding)
  if padding >= 0
    string.gsub(/^/, ' ' * padding)
  else
    string.gsub(/^ {0,#{-padding}}/, '')
  end
end
linebreaks(msg, max) click to toggle source

blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/10655

# File lib/cucumber/formatter/console.rb, line 110
def linebreaks(msg, max)
  return msg unless max && max > 0
  msg.gsub(/.{1,#{max}}(?:\s|\Z)/) { ($& + 5.chr).gsub(/\n\005/, "\n").gsub(/\005/, "\n") }.rstrip
end
print_element_messages(element_messages, status, kind) click to toggle source
print_elements(elements, status, kind) click to toggle source
print_exception(e, status, indent) click to toggle source
print_passing_wip(config, passed_test_cases, ast_lookup) click to toggle source
print_profile_information() click to toggle source
print_snippets(options) click to toggle source
print_statistics(duration, config, counts, issues) click to toggle source

Private Instance Methods

element_messages(elements, status) click to toggle source
# File lib/cucumber/formatter/console.rb, line 230
def element_messages(elements, status)
  elements.map do |element|
    if status == :failed
      exception_message_string(element.exception, 0)
    else
      linebreaks(element.backtrace_line, ENV['CUCUMBER_TRUNCATE_OUTPUT'].to_i)
    end
  end
end
format_for(*keys) click to toggle source
# File lib/cucumber/formatter/console.rb, line 223
def format_for(*keys)
  key = keys.join('_').to_sym
  fmt = FORMATS[key]
  raise "No format for #{key.inspect}: #{FORMATS.inspect}" if fmt.nil?
  fmt
end
snippet_text(step_keyword, step_name, multiline_arg) click to toggle source
# File lib/cucumber/formatter/console.rb, line 240
def snippet_text(step_keyword, step_name, multiline_arg)
  keyword = Cucumber::Gherkin::I18n.code_keyword_for(step_keyword).strip
  config.snippet_generators.map do |generator|
    generator.call(keyword, step_name, multiline_arg, config.snippet_type)
  end.join("\n")
end