lib/cucumber/gherkin/formatter/ansi_escapes.rb



# frozen_string_literal: true

module Cucumber
  module Gherkin
    module Formatter
      # Defines aliases for ANSI coloured output. Default colours can be overridden by defining
      # a <tt>GHERKIN_COLORS</tt> variable in your shell, very much like how you can
      # tweak the familiar POSIX command <tt>ls</tt> with
      # $LSCOLORS: http://linux-sxs.org/housekeeping/lscolors.html
      #
      # The colours that you can change are:
      #
      # <tt>undefined</tt>::     defaults to <tt>yellow</tt>
      # <tt>pending</tt>::       defaults to <tt>yellow</tt>
      # <tt>pending_arg</tt>::   defaults to <tt>yellow,bold</tt>
      # <tt>executing</tt>::     defaults to <tt>grey</tt>
      # <tt>executing_arg</tt>:: defaults to <tt>grey,bold</tt>
      # <tt>failed</tt>::        defaults to <tt>red</tt>
      # <tt>failed_arg</tt>::    defaults to <tt>red,bold</tt>
      # <tt>passed</tt>::        defaults to <tt>green</tt>
      # <tt>passed_arg</tt>::    defaults to <tt>green,bold</tt>
      # <tt>outline</tt>::       defaults to <tt>cyan</tt>
      # <tt>outline_arg</tt>::   defaults to <tt>cyan,bold</tt>
      # <tt>skipped</tt>::       defaults to <tt>cyan</tt>
      # <tt>skipped_arg</tt>::   defaults to <tt>cyan,bold</tt>
      # <tt>comment</tt>::       defaults to <tt>grey</tt>
      # <tt>tag</tt>::           defaults to <tt>cyan</tt>
      #
      # 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. Examples:
      #
      #   export GHERKIN_COLORS="passed=white"
      #   export GHERKIN_COLORS="passed=white,bold:passed_arg=white,bold,underline"
      #
      # (If you're on Windows, use SET instead of export).
      # To see what colours and effects are available, just run this in your shell:
      #
      #   ruby -e "require 'rubygems'; require 'term/ansicolor'; puts Term::ANSIColor.attributes"
      #
      # Although not listed, you can also use <tt>grey</tt>
      module AnsiEscapes
        COLORS = {
          'black'   => "\e[30m",
          'red'     => "\e[31m",
          'green'   => "\e[32m",
          'yellow'  => "\e[33m",
          'blue'    => "\e[34m",
          'magenta' => "\e[35m",
          'cyan'    => "\e[36m",
          'white'   => "\e[37m",
          'grey'    => "\e[90m",
          'bold'    => "\e[1m"
        }.freeze

        ALIASES = Hash.new do |h, k|
          h[Regexp.last_match(1)] + ',bold' if k.to_s =~ /(.*)_arg/
        end.merge(
          'undefined' => 'yellow',
          'pending'   => 'yellow',
          'executing' => 'grey',
          'failed'    => 'red',
          'passed'    => 'green',
          'outline'   => 'cyan',
          'skipped'   => 'cyan',
          'comments'  => 'grey',
          'tag'       => 'cyan'
        )

        if ENV['GHERKIN_COLORS'] # Example: export GHERKIN_COLORS="passed=red:failed=yellow"
          ENV['GHERKIN_COLORS'].split(':').each do |pair|
            a = pair.split('=')
            ALIASES[a[0]] = a[1]
          end
        end

        ALIASES.keys.each do |key|
          define_method(key) do
            ALIASES[key].split(',').map { |color| COLORS[color] }.join('')
          end

          define_method("#{key}_arg") do
            ALIASES["#{key}_arg"].split(',').map { |color| COLORS[color] }.join('')
          end
        end

        def reset
          "\e[0m"
        end

        def up(n)
          "\e[#{n}A"
        end
      end
    end
  end
end