Class: Thor::Shell::Color

Inherits:
Basic
  • Object
show all
Defined in:
lib/thor/shell/color.rb

Overview

Inherit from Thor::Shell::Basic and add set_color behavior. Check Thor::Shell::Basic to see all available methods.

Constant Summary collapse

CLEAR =

Embed in a String to clear all previous ANSI sequences.

"\e[0m"
BOLD =

The start of an ANSI bold sequence.

"\e[1m"
BLACK =

Set the terminal’s foreground ANSI color to black.

"\e[30m"
RED =

Set the terminal’s foreground ANSI color to red.

"\e[31m"
GREEN =

Set the terminal’s foreground ANSI color to green.

"\e[32m"
YELLOW =

Set the terminal’s foreground ANSI color to yellow.

"\e[33m"
BLUE =

Set the terminal’s foreground ANSI color to blue.

"\e[34m"
MAGENTA =

Set the terminal’s foreground ANSI color to magenta.

"\e[35m"
CYAN =

Set the terminal’s foreground ANSI color to cyan.

"\e[36m"
WHITE =

Set the terminal’s foreground ANSI color to white.

"\e[37m"
ON_BLACK =

Set the terminal’s background ANSI color to black.

"\e[40m"
ON_RED =

Set the terminal’s background ANSI color to red.

"\e[41m"
ON_GREEN =

Set the terminal’s background ANSI color to green.

"\e[42m"
ON_YELLOW =

Set the terminal’s background ANSI color to yellow.

"\e[43m"
ON_BLUE =

Set the terminal’s background ANSI color to blue.

"\e[44m"
ON_MAGENTA =

Set the terminal’s background ANSI color to magenta.

"\e[45m"
ON_CYAN =

Set the terminal’s background ANSI color to cyan.

"\e[46m"
ON_WHITE =

Set the terminal’s background ANSI color to white.

"\e[47m"

Constants inherited from Basic

Basic::DEFAULT_TERMINAL_WIDTH

Instance Attribute Summary

Attributes inherited from Basic

#base, #padding

Instance Method Summary collapse

Methods inherited from Basic

#as_unicode, #ask, #ask_filtered, #ask_simply, #dynamic_width, #dynamic_width_stty, #dynamic_width_tput, #error, #file_collision, #file_collision_help, #indent, #initialize, #is?, #lookup_color, #mute, #mute?, #no?, #prepare_message, #print_in_columns, #print_table, #print_wrapped, #quiet?, #say, #say_status, #stderr, #stdout, #terminal_width, #truncate, #unix?, #yes?

Constructor Details

This class inherits a constructor from Thor::Shell::Basic

Instance Method Details

#can_display_colors?Boolean (protected)

Returns:

  • (Boolean)


99
100
101
# File 'lib/thor/shell/color.rb', line 99

def can_display_colors?
  stdout.tty?
end

#diff_lcs_loaded?Boolean (protected)

Check if Diff::LCS is loaded. If it is, use it to create pretty output for diff.

Returns:

  • (Boolean)


136
137
138
139
140
141
142
143
144
145
146
# File 'lib/thor/shell/color.rb', line 136

def diff_lcs_loaded? #:nodoc:
  return true if defined?(Diff::LCS)
  return @diff_lcs_loaded unless @diff_lcs_loaded.nil?

  @diff_lcs_loaded = begin
    require "diff/lcs"
    true
  rescue LoadError
    false
  end
end

#output_diff_line(diff) ⇒ Object (protected)

:nodoc:



119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/thor/shell/color.rb', line 119

def output_diff_line(diff) #:nodoc:
  case diff.action
  when "-"
    say "- #{diff.old_element.chomp}", :red, true
  when "+"
    say "+ #{diff.new_element.chomp}", :green, true
  when "!"
    say "- #{diff.old_element.chomp}", :red, true
    say "+ #{diff.new_element.chomp}", :green, true
  else
    say "  #{diff.old_element.chomp}", nil, true
  end
end

#set_color(string, *colors) ⇒ Object

Set color by using a string or one of the defined constants. If a third option is set to true, it also adds bold to the string. This is based on Highline implementation and it automatically appends CLEAR to the end of the returned String.

Pass foreground, background and bold options to this method as symbols.

Example:

set_color "Hi!", :red, :on_white, :bold

The available colors are:

:bold
:black
:red
:green
:yellow
:blue
:magenta
:cyan
:white
:on_black
:on_red
:on_green
:on_yellow
:on_blue
:on_magenta
:on_cyan
:on_white


79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/thor/shell/color.rb', line 79

def set_color(string, *colors)
  if colors.compact.empty? || !can_display_colors?
    string
  elsif colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
    ansi_colors = colors.map { |color| lookup_color(color) }
    "#{ansi_colors.join}#{string}#{CLEAR}"
  else
    # The old API was `set_color(color, bold=boolean)`. We
    # continue to support the old API because you should never
    # break old APIs unnecessarily :P
    foreground, bold = colors
    foreground = self.class.const_get(foreground.to_s.upcase) if foreground.is_a?(Symbol)

    bold       = bold ? BOLD : ""
    "#{bold}#{foreground}#{string}#{CLEAR}"
  end
end

#show_diff(destination, content) ⇒ Object (protected)

Overwrite show_diff to show diff with colors if Diff::LCS is available.



106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/thor/shell/color.rb', line 106

def show_diff(destination, content) #:nodoc:
  if diff_lcs_loaded? && ENV["THOR_DIFF"].nil? && ENV["RAILS_DIFF"].nil?
    actual  = File.binread(destination).to_s.split("\n")
    content = content.to_s.split("\n")

    Diff::LCS.sdiff(actual, content).each do |diff|
      output_diff_line(diff)
    end
  else
    super
  end
end