Class: Thor::Shell::Basic

### Home Classes Methods

### In Files

- lib/thor/shell/basic.rb

### Parent

Object

### Methods

- #as_unicode
- #ask
- #ask_filtered
- #ask_simply
- #can_display_colors?
- #dynamic_width
- #dynamic_width_stty
- #dynamic_width_tput
- #error
- #file_collision
- #lookup_color
- #mute
- #mute?
- #no?
- #padding=
- #print_in_columns
- #print_table
- #print_wrapped
- #say
- #say_status
- #stderr
- #stdin
- #stdout
- #terminal_width
- #truncate
- #unix?
- #yes?

### Class/Module Index

Quicksearch

- Thor
- Thor::Actions
- Thor::Actions::ClassMethods
- Thor::Base
- Thor::Base::ClassMethods
- Thor::Command
- Thor::DynamicCommand
- Thor::DynamicTask
- Thor::Error
- Thor::Group
- Thor::HiddenCommand
- Thor::HiddenTask
- Thor::InvocationError
- Thor::MalformattedArgumentError
- Thor::RakeCompat
- Thor::RequiredArgumentMissingError
- Thor::Shell
- Thor::Shell::Basic
- Thor::Shell::Color
- Thor::Shell::HTML
- Thor::Task
- Thor::UndefinedCommandError
- Thor::UndefinedTaskError
- Thor::UnknownArgumentError
- Thor::Util
- Object

No matching classes.

# Thor::Shell::Basic

### Attributes

base[RW]
padding[R]

### Public Instance Methods

ask(statement, *args) click to toggle source

Asks something to the user and receives a response.

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.

#### Example

ask("What is your name?")

ask("What is your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])

    # File lib/thor/shell/basic.rb, line 48
    def ask(statement, *args)
      options = args.last.is_a?(Hash) ? args.pop : {}

      options[:limited_to] ? ask_filtered(statement, options[:limited_to], *args) : ask_simply(statement, *args)
    end

error(statement) click to toggle source

Called if something goes wrong during the execution. This is used by Thor internally and should not be used inside your scripts. If something went wrong, you can always raise an exception. If you raise a Thor::Error, it will be rescued and wrapped in the method below.

    # File lib/thor/shell/basic.rb, line 265
    def error(statement)
      stderr.puts statement
    end

file_collision(destination) click to toggle source

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

    # File lib/thor/shell/basic.rb, line 221
    def file_collision(destination)
      return true if @always_force
      options = block_given? ? "[Ynaqdh]" : "[Ynaqh]"

      while true
        answer = ask %[Overwrite #{destination}? (enter "h" for help) #{options}]

        case answer
        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...'
        else
          say file_collision_help
        end
      end
    end

mute() click to toggle source

Mute everything that's inside given block

    # File lib/thor/shell/basic.rb, line 17
    def mute
      @mute = true
      yield
    ensure
      @mute = false
    end

mute?() click to toggle source

Check if base is muted

    # File lib/thor/shell/basic.rb, line 26
    def mute?
      @mute
    end

no?(statement, color=nil) click to toggle source

Make a question the to user and returns true if the user replies "n" or "no".

    # File lib/thor/shell/basic.rb, line 103
    def no?(statement, color=nil)
      !yes?(statement, color)
    end

padding=(value) click to toggle source

Sets the output padding, not allowing less than zero values.

    # File lib/thor/shell/basic.rb, line 32
    def padding=(value)
      @padding = [0, value].max
    end

print_in_columns(array) click to toggle source

Prints values in columns

#### Parameters

Array[String, String, ...]

    # File lib/thor/shell/basic.rb, line 112
    def print_in_columns(array)
      return if array.empty?
      colwidth = (array.map{|el| el.to_s.size}.max || 0) + 2
      array.each_with_index do |value, index|
        # Don't output trailing spaces when printing the last column
        if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
          stdout.puts value
        else
          stdout.printf("%-#{colwidth}s", value)
        end
      end
    end

print_table(array, options={}) click to toggle source

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.

    # File lib/thor/shell/basic.rb, line 134
    def print_table(array, options={})
      return if array.empty?

      formats, indent, colwidth = [], options[:indent].to_i, options[:colwidth]
      options[:truncate] = terminal_width if options[:truncate] == true

      formats << "%-#{colwidth + 2}s" if colwidth
      start = colwidth ? 1 : 0

      colcount = array.max{|a,b| a.size <=> b.size }.size

      maximas = []

      start.upto(colcount - 1) do |index|
        maxima = array.map {|row| row[index] ? row[index].to_s.size : 0 }.max
        maximas << maxima
        if index == colcount - 1
          # Don't output 2 trailing spaces when printing the last column
          formats << "%-s"
        else
          formats << "%-#{maxima + 2}s"
        end
      end

      formats[0] = formats[0].insert(0, " " * indent)
      formats << "%s"

      array.each do |row|
        sentence = ""

        row.each_with_index do |column, index|
          maxima = maximas[index]

          if column.is_a?(Numeric)
            if index == row.size - 1
              # Don't output 2 trailing spaces when printing the last column
              f = "%#{maxima}s"
            else
              f = "%#{maxima}s  "
            end
          else
            f = formats[index]
          end
          sentence << f % column.to_s
        end

        sentence = truncate(sentence, options[:truncate]) if options[:truncate]
        stdout.puts sentence
      end
    end

print_wrapped(message, options={}) click to toggle source

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/thor/shell/basic.rb, line 194
    def print_wrapped(message, options={})
      indent = options[:indent] || 0
      width = terminal_width - indent
      paras = message.split("\n\n")

      paras.map! do |unwrapped|
        unwrapped.strip.gsub(/\n/, " ").squeeze(" ").
        gsub(/.{1,#{width}}(?:\s|\Z)/){($& + 5.chr).
        gsub(/\n\0005/,"\n").gsub(/\0005/,"\n")}
      end

      paras.each do |para|
        para.split("\n").each do |line|
          stdout.puts line.insert(0, " " * indent)
        end
        stdout.puts unless para == paras.last
      end
    end

say(message="", color=nil, force_new_line=(message.to_s !~ /( |\t)\Z/)) click to toggle source

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.")

    # File lib/thor/shell/basic.rb, line 61
    def say(message="", color=nil, force_new_line=(message.to_s !~ /( |\t)\Z/))
      message = message.to_s

      message = set_color(message, *color) if color && can_display_colors?

      spaces = "  " * padding

      if force_new_line
        stdout.puts(spaces + message)
      else
        stdout.print(spaces + message)
      end
      stdout.flush
    end

say_status(status, message, log_status=true) click to toggle source

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/thor/shell/basic.rb, line 81
    def say_status(status, message, log_status=true)
      return if quiet? || log_status == false
      spaces = "  " * (padding + 1)
      color  = log_status.is_a?(Symbol) ? log_status : :green

      status = status.to_s.rjust(12)
      status = set_color status, color, true if color

      stdout.puts "#{status}#{spaces}#{message}"
      stdout.flush
    end

terminal_width() click to toggle source

This code was copied from Rake, available under MIT-LICENSE Copyright (c) 2003, 2004 Jim Weirich

    # File lib/thor/shell/basic.rb, line 249
    def terminal_width
      if ENV['THOR_COLUMNS']
        result = ENV['THOR_COLUMNS'].to_i
      else
        result = unix? ? dynamic_width : 80
      end
      (result < 10) ? 80 : result
    rescue
      80
    end

yes?(statement, color=nil) click to toggle source

Make a question the to user and returns true if the user replies "y" or "yes".

    # File lib/thor/shell/basic.rb, line 96
    def yes?(statement, color=nil)
      !!(ask(statement, color) =~ is?(:yes))
    end

### Protected Instance Methods

as_unicode() click to toggle source

    # File lib/thor/shell/basic.rb, line 363
    def as_unicode
      yield
    end

ask_filtered(statement, answer_set, *args) click to toggle source

    # File lib/thor/shell/basic.rb, line 380
    def ask_filtered(statement, answer_set, *args)
      correct_answer = nil
      until correct_answer
        answer = ask_simply("#{statement} #{answer_set.inspect}", *args)
        correct_answer = answer_set.include?(answer) ? answer : nil
        answers = answer_set.map(&:inspect).join(", ")
        say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
      end
      correct_answer
    end

ask_simply(statement, color=nil) click to toggle source

    # File lib/thor/shell/basic.rb, line 375
    def ask_simply(statement, color=nil)
      say("#{statement} ", color)
      stdin.gets.tap{|text| text.strip! if text}
    end

can_display_colors?() click to toggle source

    # File lib/thor/shell/basic.rb, line 278
    def can_display_colors?
      false
    end

dynamic_width() click to toggle source

Calculate the dynamic width of the terminal

    # File lib/thor/shell/basic.rb, line 335
    def dynamic_width
      @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
    end

dynamic_width_stty() click to toggle source

    # File lib/thor/shell/basic.rb, line 339
    def dynamic_width_stty
      %{stty size 2>/dev/null}.split[1].to_i
    end

dynamic_width_tput() click to toggle source

    # File lib/thor/shell/basic.rb, line 343
    def dynamic_width_tput
      %{tput cols 2>/dev/null}.to_i
    end

lookup_color(color) click to toggle source

    # File lib/thor/shell/basic.rb, line 282
    def lookup_color(color)
      return color unless color.is_a?(Symbol)
      self.class.const_get(color.to_s.upcase)
    end

stderr() click to toggle source

    # File lib/thor/shell/basic.rb, line 295
    def stderr
      $stderr
    end

stdin() click to toggle source

    # File lib/thor/shell/basic.rb, line 291
    def stdin
      $stdin
    end

stdout() click to toggle source

    # File lib/thor/shell/basic.rb, line 287
    def stdout
      $stdout
    end

truncate(string, width) click to toggle source

    # File lib/thor/shell/basic.rb, line 351
    def truncate(string, width)
      as_unicode do
        chars = string.chars.to_a
        if chars.length <= width
          chars.join
        else
          ( chars[0, width-3].join ) + "..."
        end
      end
    end

unix?() click to toggle source

    # File lib/thor/shell/basic.rb, line 347
    def unix?
      RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.