Class: Bundler::Thor::Shell::Basic
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
|
|
Inherits: | Object |
Defined in: | lib/bundler/vendor/thor/lib/thor/shell/basic.rb |
Class Method Summary
-
.new ⇒ Basic
constructor
Internal use only
Initialize base, mute and padding to nil.
Instance Attribute Summary
- #base rw
-
#mute
readonly
Mute everything that’s inside given block.
-
#mute? ⇒ Boolean
readonly
Check if base is muted.
- #padding rw
-
#padding=(value)
rw
Sets the output padding, not allowing less than zero values.
- #can_display_colors? ⇒ Boolean readonly protected
- #unix? ⇒ Boolean readonly protected
- #quiet? ⇒ Boolean readonly protected Internal use only
Instance Method Summary
-
#ask(statement, *args)
Asks something to the user and receives a response.
-
#error(statement)
Called if something goes wrong during the execution.
-
#file_collision(destination)
Deals with file collision and returns true if the file should be overwritten and false otherwise.
-
#indent(count = 1)
Sets the output padding while executing a block and resets it.
-
#no?(statement, color = nil) ⇒ Boolean
Asks the user a question and returns true if the user replies “n” or “no”.
-
#print_in_columns(array)
Prints values in columns.
-
#print_table(array, options = {})
Prints a table.
-
#print_wrapped(message, options = {})
Prints a long string, word-wrapping the text to the current width of the terminal display.
-
#say(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
Say (print) something to the user.
-
#say_error(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
Say (print) an error to the user.
-
#say_status(status, message, log_status = true)
Say a status with the given color and appends the message.
-
#yes?(statement, color = nil) ⇒ Boolean
Asks the user a question and returns true if the user replies “y” or “yes”.
- #answer_match(possibilities, answer, case_insensitive) protected
- #ask_filtered(statement, color, options) protected
- #ask_simply(statement, color, options) protected
- #lookup_color(color) protected
- #prepare_message(message, *color) protected
- #stderr protected
- #stdout protected
-
#set_color(string)
Internal use only
Apply color to the given string with optional bold.
- #file_collision_help(block_given) protected Internal use only
- #git_merge_tool protected Internal use only
- #is?(value) ⇒ Boolean protected Internal use only
- #merge(destination, content) protected Internal use only
- #merge_tool protected Internal use only
- #show_diff(destination, content) protected Internal use only
Constructor Details
.new ⇒ Basic
Initialize base, mute and padding to nil.
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 13
def initialize #:nodoc: @base = nil @mute = false @padding = 0 @always_force = false end
Instance Attribute Details
#base (rw)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 8
attr_accessor :base
#can_display_colors? ⇒ Boolean
(readonly, protected)
[ GitHub ]
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 269
def can_display_colors? false end
#mute (readonly)
Mute everything that’s inside given block
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 22
def mute @mute = true yield ensure @mute = false end
#mute? ⇒ Boolean
(readonly)
Check if base is muted
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 31
def mute? @mute end
#padding (rw)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 9
attr_reader :padding
#padding=(value) (rw)
Sets the output padding, not allowing less than zero values.
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 37
def padding=(value) @padding = [0, value].max end
#quiet? ⇒ Boolean
(readonly, protected)
#unix? ⇒ Boolean
(readonly, protected)
[ GitHub ]
Instance Method Details
#answer_match(possibilities, answer, case_insensitive) (protected)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 362
def answer_match(possibilities, answer, case_insensitive) if case_insensitive possibilities.detect{ |possibility| possibility.downcase == answer.downcase } else possibilities.detect{ |possibility| possibility == answer } end end
#ask(statement, *args)
Asks something to the user and receives a response.
If a default value is specified it will be presented to the user and allows them to select that value with an empty response. This option is ignored when limited answers are supplied.
If asked to limit the correct responses, you can pass in an array of acceptable answers. If one of those is not supplied, they will be shown a message stating that one of those answers must be given and re-asked the question.
If asking for sensitive information, the :echo
option can be set to false to mask user input from $stdin.
If the required input is a path, then set the path option to true. This will enable tab completion for file paths relative to the current working directory on systems that support Readline.
Example
ask("What is your name?")
ask("What is the planet furthest from the sun?", :default => "Neptune")
ask("What is your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])
ask("What is your password?", :echo => false)
ask("Where should the file be saved?", :path => true)
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 80
def ask(statement, *args) = args.last.is_a?(Hash) ? args.pop : {} color = args.first if [:limited_to] ask_filtered(statement, color, ) else ask_simply(statement, color, ) end end
#ask_filtered(statement, color, options) (protected)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 349
def ask_filtered(statement, color, ) answer_set = [:limited_to] case_insensitive = .fetch(:case_insensitive, false) correct_answer = nil until correct_answer answers = answer_set.join(", ") answer = ask_simply("#{statement} [#{answers}]", color, ) correct_answer = answer_match(answer_set, answer, case_insensitive) say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer end correct_answer end
#ask_simply(statement, color, options) (protected)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 332
def ask_simply(statement, color, ) default = [:default] = [statement, ("(#{default})" if default), nil].uniq.join(" ") = (, *color) result = Bundler::Thor::LineEditor.readline(, ) return unless result result = result.strip if default && result == "" default else result end end
#error(statement)
Called if something goes wrong during the execution. This is used by ::Bundler::Thor
internally and should not be used inside your scripts. If something went wrong, you can always raise an exception. If you raise a ::Bundler::Thor::Error
, it will be rescued and wrapped in the method below.
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 251
def error(statement) stderr.puts statement end
#file_collision(destination)
Deals with file collision and returns true if the file should be overwritten and false otherwise. If a block is given, it uses the block response as the content for the diff.
Parameters
- destination<String>
-
the destination file to solve conflicts
- block<Proc>
-
an optional block that returns the value to be used in diff and merge
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 207
def file_collision(destination) return true if @always_force = block_given? ? "[Ynaqdhm]" : "[Ynaqh]" loop do answer = ask( %[Overwrite #{destination}? (enter "h" for help) #{}], add_to_history: false ) case answer when nil say "" return true when is?(:yes), is?(:force), "" return true when is?(:no), is?(:skip) return false when is?(:always) return @always_force = true when is?(:quit) say "Aborting..." raise SystemExit when is?(:diff) show_diff(destination, yield) if block_given? say "Retrying..." when is?(:merge) if block_given? && !merge_tool.empty? merge(destination, yield) return nil end say "Please specify merge tool to `THOR_MERGE` env." else say file_collision_help(block_given?) end end end
#file_collision_help(block_given) (protected)
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 296
def file_collision_help(block_given) #:nodoc: help = <<-HELP Y - yes, overwrite n - no, do not overwrite a - all, overwrite this and all others q - quit, abort h - help, show this help HELP if block_given help << <<-HELP d - diff, show the differences between the old and the new m - merge, run merge tool HELP end help end
#git_merge_tool (protected)
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 383
def git_merge_tool #:nodoc: `git config merge.tool`.rstrip rescue "" end
#indent(count = 1)
Sets the output padding while executing a block and resets it.
#is?(value) ⇒ Boolean
(protected)
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 286
def is?(value) #:nodoc: value = value.to_s if value.size == 1 /\A#{value}\z/i else /\A(#{value}|#{value[0, 1]})\z/i end end
#lookup_color(color) (protected)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 273
def lookup_color(color) return color unless color.is_a?(Symbol) self.class.const_get(color.to_s.upcase) end
#merge(destination, content) (protected)
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 370
def merge(destination, content) #:nodoc: require "tempfile" Tempfile.open([File.basename(destination), File.extname(destination)], File.dirname(destination)) do |temp| temp.write content temp.rewind system %(#{merge_tool} "#{temp.path}" "#{destination}") end end
#merge_tool (protected)
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 379
def merge_tool #:nodoc: @merge_tool ||= ENV["THOR_MERGE"] || git_merge_tool end
#no?(statement, color = nil) ⇒ Boolean
Asks the user a question and returns true if the user replies “n” or “no”.
#prepare_message(message, *color) (protected)
[ GitHub ]#print_in_columns(array)
Prints values in columns
Parameters
Array[String, String, …]
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 165
def print_in_columns(array) printer = ColumnPrinter.new(stdout) printer.print(array) end
#print_table(array, options = {})
Prints a table.
Parameters
Array[Array[String, String, …]]
Options
- indent<Integer>
-
Indent the first column by indent value.
- colwidth<Integer>
-
Force the first column to colwidth spaces wide.
- borders<Boolean>
-
Adds ascii borders.
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 180
def print_table(array, = {}) # rubocop:disable Metrics/MethodLength printer = TablePrinter.new(stdout, ) printer.print(array) end
#print_wrapped(message, options = {})
Prints a long string, word-wrapping the text to the current width of the terminal display. Ideal for printing heredocs.
Parameters
String
Options
- indent<Integer>
-
Indent each line of the printed paragraph by indent value.
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 194
def print_wrapped(, = {}) printer = WrappedPrinter.new(stdout, ) printer.print( ) end
#say(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
Say (print) something to the user. If the sentence ends with a whitespace or tab character, a new line is not appended (print + flush). Otherwise are passed straight to puts (behavior got from Highline).
Example
say("I know you knew that.")
#say_error(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
Say (print) an error to the user. If the sentence ends with a whitespace or tab character, a new line is not appended (print + flush). Otherwise are passed straight to puts (behavior got from Highline).
Example
say_error("error: something went wrong")
#say_status(status, message, log_status = true)
Say a status with the given color and appends the message. Since this method is used frequently by actions, it allows nil or false to be given in log_status, avoiding the message from being shown. If a Symbol is given in log_status, it’s used as the color.
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 130
def say_status(status, , log_status = true) return if quiet? || log_status == false spaces = " " * (padding + 1) status = status.to_s.rjust(12) margin = " " * status.length + spaces color = log_status.is_a?(Symbol) ? log_status : :green status = set_color status, color, true if color = .to_s.chomp.gsub(/(?<!\A)^/, margin) buffer = "#{status}#{spaces}#{}\n" stdout.print(buffer) stdout.flush end
#set_color(string)
Apply color to the given string with optional bold. Disabled in the Basic
class.
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 258
def set_color(string, *) #:nodoc: string end
#show_diff(destination, content) (protected)
# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 313
def show_diff(destination, content) #:nodoc: diff_cmd = ENV["THOR_DIFF"] || ENV["RAILS_DIFF"] || "diff -u" require "tempfile" Tempfile.open(File.basename(destination), File.dirname(destination)) do |temp| temp.write content temp.rewind system %(#{diff_cmd} "#{destination}" "#{temp.path}") end end
#stderr (protected)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 282
def stderr $stderr end
#stdout (protected)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor/shell/basic.rb', line 278
def stdout $stdout end
#yes?(statement, color = nil) ⇒ Boolean
Asks the user a question and returns true if the user replies “y” or “yes”.