# frozen_string_literal: true require 'cucumber/platform' require 'cucumber/term/ansicolor' Cucumber::Term::ANSIColor.coloring = false unless $stdout.tty? module Cucumber module Formatter # This module allows to format cucumber related outputs using ANSI escape sequences. # # For example, it provides a `passed` method which returns the string with # the ANSI escape sequence to format it green per default. # # To use this, include or extend it in your class. # # Example: # # require 'cucumber/formatter/ansicolor' # # class MyFormatter # extend Cucumber::Term::ANSIColor # # def on_test_step_finished(event) # $stdout.puts undefined(event.test_step) if event.result.undefined? # $stdout.puts passed(event.test_step) if event.result.passed? # end # end # # This module also allows the user to customize the format of cucumber outputs # using environment variables. # # For instance, if your shell has a black background and a green font (like the # "Homebrew" settings for OS X' Terminal.app), you may want to override passed # steps to be white instead of green. # # Example: # # export CUCUMBER_COLORS="passed=white,bold:passed_param=white,bold,underline" # # The colours that you can change are: # # * undefined - defaults to yellow # * pending - defaults to yellow # * pending_param - defaults to yellow,bold # * flaky - defaults to yellow # * flaky_param - defaults to yellow,bold # * failed - defaults to red # * failed_param - defaults to red,bold # * passed - defaults to green # * passed_param - defaults to green,bold # * outline - defaults to cyan # * outline_param - defaults to cyan,bold # * skipped - defaults to cyan # * skipped_param - defaults to cyan,bold # * comment - defaults to grey # * tag - defaults to cyan # # To see what colours and effects are available, just run this in your shell: # # ruby -e "require 'rubygems'; require 'cucumber/term/ansicolor'; puts Cucumber::Term::ANSIColor.attributes" # module ANSIColor include Cucumber::Term::ANSIColor # :stopdoc: ALIASES = Hash.new do |h, k| next unless k.to_s =~ /(.*)_param/ "#{h[Regexp.last_match(1)]},bold" end.merge( 'undefined' => 'yellow', 'pending' => 'yellow', 'flaky' => 'yellow', 'failed' => 'red', 'passed' => 'green', 'outline' => 'cyan', 'skipped' => 'cyan', 'comment' => 'grey', 'tag' => 'cyan' ) # :startdoc: # Apply the custom color scheme # # example: # # apply_custom_colors('passed=white') def self.apply_custom_colors(colors) colors.split(':').each do |pair| a = pair.split('=') ALIASES[a[0]] = a[1] end end apply_custom_colors(ENV['CUCUMBER_COLORS']) if ENV['CUCUMBER_COLORS'] # Define the color-named methods required by Term::ANSIColor. # # Examples: # # def failed(string=nil, &proc) # red(string, &proc) # end # # def failed_param(string=nil, &proc) # red(bold(string, &proc)) + red # end ALIASES.each_key do |method_name| next if method_name.end_with?('_param') define_method(method_name) do |text = nil, &proc| apply_styles(ALIASES[method_name], text, &proc) end define_method("#{method_name}_param") do |text = nil, &proc| apply_styles(ALIASES["#{method_name}_param"], text, &proc) + apply_styles(ALIASES[method_name]) end end # :stopdoc: def cukes(n) ('(::) ' * n).strip end def green_cukes(n) blink(green(cukes(n))) end def red_cukes(n) blink(red(cukes(n))) end def yellow_cukes(n) blink(yellow(cukes(n))) end # :startdoc: private def apply_styles(styles, text = nil, &proc) styles.split(',').reverse.reduce(text) do |result, method_name| send(method_name, result, &proc) end end end end end