An abstract class that encapsulates the executable code for all three executables.
@param args [Array<String>] The command-line arguments
# File lib/sass/exec.rb, line 10 def initialize(args) @args = args @options = {} end
Parses the command-line arguments and runs the executable. This does not handle exceptions or exit the program.
@see parse!
# File lib/sass/exec.rb, line 37 def parse @opts = OptionParser.new(&method(:set_opts)) @opts.parse!(@args) process_result @options end
Parses the command-line arguments and runs the executable. Calls `Kernel#exit` at the end, so it never returns.
@see parse
# File lib/sass/exec.rb, line 19 def parse! begin parse rescue Exception => e raise e if @options[:trace] || e.is_a?(SystemExit) $stderr.print "#{e.class}: " unless e.class == RuntimeError $stderr.puts "#{e.message}" $stderr.puts " Use --trace for backtrace." exit 1 end exit 0 end
@return [String] A description of the executable
# File lib/sass/exec.rb, line 47 def to_s @opts.to_s end
Wraps the given string in terminal escapes causing it to have the given color. If terminal esapes aren't supported on this platform, just returns the string instead.
@param color [Symbol] The name of the color to use.
Can be `:red`, `:green`, or `:yellow`.
@param str [String] The string to wrap in the given color. @return [String] The wrapped string.
# File lib/sass/exec.rb, line 148 def color(color, str) raise "[BUG] Unrecognized color #{color}" unless COLORS[color] # Almost any real Unix terminal will support color, # so we just filter for Windows terms (which don't set TERM) # and not-real terminals, which aren't ttys. return str if ENV["TERM"].nil? || ENV["TERM"].empty? || !STDOUT.tty? return "\e[#{COLORS[color]}m#{str}\e[0m" end
Finds the line of the source template on which an exception was raised.
@param exception [Exception] The exception @return [String] The line number
# File lib/sass/exec.rb, line 58 def get_line(exception) # SyntaxErrors have weird line reporting # when there's trailing whitespace return (exception.message.scan(%r:(\d+)/).first || ["??"]).first if exception.is_a?(::SyntaxError) (exception.backtrace[0].scan(%r:(\d+)/).first || ["??"]).first end
Processes the options set by the command-line arguments. In particular, sets `@options` and `@options` to appropriate IO streams.
This is meant to be overridden by subclasses so they can run their respective programs.
# File lib/sass/exec.rb, line 102 def process_result input, output = @options[:input], @options[:output] args = @args.dup input ||= begin filename = args.shift @options[:filename] = filename open_file(filename) || $stdin end output ||= args.shift || $stdout @options[:input], @options[:output] = input, output end
Same as {Kernel.puts}, but doesn't print anything if the `--quiet` option is set.
@param args [Array] Passed on to {Kernel.puts}
# File lib/sass/exec.rb, line 134 def puts(*args) return if @options[:for_engine][:quiet] Kernel.puts(*args) end
Prints a status message about performing the given action, colored using the given color (via terminal escapes) if possible.
@param name [to_s] A short name for the action being performed.
Shouldn't be longer than 11 characters.
@param color [Symbol] The name of the color to use for this action.
Can be `:red`, `:green`, or `:yellow`.
# File lib/sass/exec.rb, line 125 def puts_action(name, color, arg) return if @options[:for_engine][:quiet] printf color(color, "%11s %s\n"), name, arg STDOUT.flush end
Tells optparse how to parse the arguments available for all executables.
This is meant to be overridden by subclasses so they can add their own options.
@param opts [OptionParser]
# File lib/sass/exec.rb, line 72 def set_opts(opts) opts.on('-s', '--stdin', :NONE, 'Read input from standard input instead of an input file') do @options[:input] = $stdin end opts.on('--trace', :NONE, 'Show a full traceback on error') do @options[:trace] = true end opts.on('--unix-newlines', 'Use Unix-style newlines in written files.') do @options[:unix_newlines] = true if ::Sass::Util.windows? end opts.on_tail("-?", "-h", "--help", "Show this message") do puts opts exit end opts.on_tail("-v", "--version", "Print version") do puts("Sass #{::Sass.version[:string]}") exit end end
# File lib/sass/exec.rb, line 158 def write_output(text, destination) if destination.is_a?(String) open_file(destination, 'w') {|file| file.write(text)} else destination.write(text) end end