class Turbot::Command::Base
Attributes
args[R]
options[R]
Public Class Methods
namespace()
click to toggle source
# File lib/turbot/command/base.rb, line 4 def self.namespace self.to_s.split('::').last.downcase end
new(args = [], options = {})
click to toggle source
# File lib/turbot/command/base.rb, line 11 def initialize(args = [], options = {}) @args = args @options = options end
Protected Class Methods
alias_command(command_alias, command)
click to toggle source
# File lib/turbot/command/base.rb, line 62 def self.alias_command(command_alias, command) Turbot::Command.command_aliases[command_alias] = command end
extract_description(help)
click to toggle source
# File lib/turbot/command/base.rb, line 114 def self.extract_description(help) help.reject do |line| line =~ /^\s+-(.+)#(.+)/ end.join("\n") end
extract_help(file, line_number)
click to toggle source
# File lib/turbot/command/base.rb, line 88 def self.extract_help(file, line_number) buffer = [] lines = Turbot::Command.files[file] (line_number.to_i - 2).downto(0) do |i| line = lines[i] case line[0..0] when "" when "#" buffer.unshift(line[1..-1]) else break end end buffer end
extract_help_from_caller(line)
click to toggle source
Parse the caller format and identify the file and line number as identified in : www.ruby-doc.org/core/classes/Kernel.html#M001397. This will look for a colon followed by a digit as the delimiter. The biggest complication is windows paths, which have a colon after the drive letter. This regex will match paths as anything from the beginning to a colon directly followed by a number (the line number).
Examples of the caller format :
-
c:/Ruby192/lib/…/lib/turbot/command/addons.rb:8:in `<module:Command>'
-
c:/Ruby192/lib/…/turbot-2.0.1/lib/turbot/command/pg.rb:96:in `<class:Pg>'
-
/Users/ph7/.…./xray-1.1/lib/xray/thread_dump_signal_handler.rb:9
# File lib/turbot/command/base.rb, line 79 def self.extract_help_from_caller(line) # pull out of the caller the information for the file path and line number if line =~ /^(.+?):(\d+)/ extract_help($1, $2) else raise("unable to extract help from caller: #{line}") end end
extract_options(help)
click to toggle source
# File lib/turbot/command/base.rb, line 120 def self.extract_options(help) help.select do |line| line =~ /^\s+-(.+)#(.+)/ end.inject([]) do |options, line| args = line.split('#', 2).first args = args.split(/,\s*/).map {|arg| arg.strip}.sort.reverse name = args.last.split(' ', 2).first[2..-1] options << { :name => name, :args => args } end end
extract_summary(help)
click to toggle source
# File lib/turbot/command/base.rb, line 110 def self.extract_summary(help) extract_description(help).split("\n")[2].to_s.split("\n").first end
inherited(klass)
click to toggle source
# File lib/turbot/command/base.rb, line 28 def self.inherited(klass) unless klass == Turbot::Command::Base help = extract_help_from_caller(caller.first) Turbot::Command.register_namespace( :name => klass.namespace, :description => help.first ) end end
method_added(method)
click to toggle source
# File lib/turbot/command/base.rb, line 39 def self.method_added(method) if self == Turbot::Command::Base || private_method_defined?(method) || protected_method_defined?(method) return end help = extract_help_from_caller(caller.first) resolved_method = (method.to_s == "index") ? nil : method.to_s command = [self.namespace, resolved_method].compact.join(":") banner = extract_banner(help) || command Turbot::Command.register_command( :klass => self, :method => method, :namespace => self.namespace, :command => command, :banner => banner.strip, :help => help.join("\n"), :summary => extract_summary(help), :description => extract_description(help), :options => extract_options(help) ) end
Public Instance Methods
bot()
click to toggle source
# File lib/turbot/command/base.rb, line 16 def bot @bot ||= if options[:bot].is_a?(String) options[:bot] elsif ENV['TURBOT_BOT'] ENV['TURBOT_BOT'] elsif manifest = parse_manifest manifest['bot_id'] end end
Protected Instance Methods
current_command()
click to toggle source
# File lib/turbot/command/base.rb, line 131 def current_command Turbot::Command.current_command end
parse_manifest()
click to toggle source
# File lib/turbot/command/base.rb, line 139 def parse_manifest path = File.join(working_directory, 'manifest.json') if File.exists?(path) begin JSON.load(File.read(path)) rescue JSON::ParserError => e error "`manifest.json` is invalid JSON. Consider validating it at http://pro.jsonlint.com/" end end end
validate_arguments!()
click to toggle source
# File lib/turbot/command/base.rb, line 135 def validate_arguments! Turbot::Command.validate_arguments! end
working_directory()
click to toggle source
# File lib/turbot/command/base.rb, line 150 def working_directory Dir.pwd end