module Main::Program::ClassMethods
Public Instance Methods
argument(*a, &b)
click to toggle source
# File lib/main/program/class_methods.rb, line 197 def argument(*a, &b) (parameters << Parameter.create(:argument, main=self, *a, &b)).last end
can_has(ptype, *a, &b)
click to toggle source
# File lib/main/program/class_methods.rb, line 225 def can_has(ptype, *a, &b) key = a.map{|s| s.to_s}.sort_by{|s| -s.size }.first can_has_hash.update key => [ptype, a, b] key end
config(*args, &block)
click to toggle source
# File lib/main/program/class_methods.rb, line 354 def config(*args, &block) unless defined?(@config) require 'yaml' unless defined?(YAML) if test(?s, config_path) @config = Map.for(YAML.load(IO.read(config_path))) else config = args.last lines = case config when Hash config.to_yaml.split(/\n/) when String Util.unindent(config).split(/\n/) else [] end dash = lines.shift if lines.first.to_s =~ /^---/ require 'fileutils' unless defined?(FileUtils) FileUtils.mkdir_p(File.dirname(config_path)) open(config_path, 'w') do |fd| fd.puts "## file: #{ config_path }" fd.puts "#" fd.puts fd.puts lines end editor = ENV['EDITOR'] || ENV['EDIT'] || 'vi' system("#{ editor.inspect } #{ config_path }") @config = Map.for(YAML.load(IO.read(config_path))) end end @config end
config_path(*config_path)
click to toggle source
# File lib/main/program/class_methods.rb, line 388 def config_path(*config_path) @config_path = File.join(state_path, 'config.yml') unless defined?(@config_path) @config_path = File.join(*config_path) unless config_path.empty? @config_path end
daemonizes!(*args)
click to toggle source
# File lib/main/program/class_methods.rb, line 416 def daemonizes!(*args) mode(:daemon){ run { cmd = argv.shift || :usage daemon.cmd(cmd) } } end
db(*args, &block)
click to toggle source
# File lib/main/program/class_methods.rb, line 338 def db(*args, &block) unless defined?(@db) require 'sequel' unless defined?(Sequel) require 'amalgalite' unless defined?(Amalgalite) @db = state_path{ Sequel.amalgalite(db_path) } @db.instance_eval(&block) if block end @db end
db_path(*db_path)
click to toggle source
# File lib/main/program/class_methods.rb, line 348 def db_path(*db_path) @db_path = File.join(state_path, 'db.sqlite') unless defined?(@db_path) @db_path = File.join(*db_path) unless db_path.empty? @db_path end
default_options!()
click to toggle source
# File lib/main/program/class_methods.rb, line 213 def default_options! option 'help', 'h' unless parameters.has_option?('help', 'h') end
dynamically_extend_via_commandline_modes!()
click to toggle source
extend the class based on modules given in argv
# File lib/main/program/class_methods.rb, line 108 def dynamically_extend_via_commandline_modes! self.breadth_first_modes = modes.dup size = modes.size loop do modes.each do |mode| arg = argv.first && /^#{ argv.first }/ if arg and mode.name =~ arg argv.shift modes.clear() breadth_first_modes.clear() evaluate(&mode) self.breadth_first_modes = modes.dup depth_first_modes[mode.name] = mode break end end arg = argv.first && /^#{ argv.first }/ more_modes = ( !modes.empty? and modes.any?{|mode| arg && mode.name =~ arg} ) break unless more_modes end self.modes = depth_first_modes.dup end
environment(*a, &b)
click to toggle source
# File lib/main/program/class_methods.rb, line 209 def environment(*a, &b) (parameters << Parameter.create(:environment, main=self, *a, &b)).last end
evaluate(&block)
click to toggle source
# File lib/main/program/class_methods.rb, line 96 def evaluate(&block) module_eval(&block) end
factory(&block)
click to toggle source
# File lib/main/program/class_methods.rb, line 34 def factory(&block) Factory.new(&block) end
factory=(factory)
click to toggle source
# File lib/main/program/class_methods.rb, line 39 def factory=(factory) @factory = factory end
fully_qualified_mode()
click to toggle source
TODO
# File lib/main/program/class_methods.rb, line 175 def fully_qualified_mode modes.map{|mode| mode.name} end
has(key, *keys)
click to toggle source
# File lib/main/program/class_methods.rb, line 231 def has(key, *keys) keys = [key, *keys].flatten.compact.map{|k| k.to_s} keys.map do |key| ptype, a, b = can_has_hash[key] abort "yo - can *not* has #{ key.inspect }!?" unless(ptype and a and b) send ptype, *a, &b key end end
input(*args, &block)
click to toggle source
# File lib/main/program/class_methods.rb, line 394 def input(*args, &block) first = args.first args.push(:input) unless(first.is_a?(Symbol) or first.is_a?(String)) param = argument(*args, &block) param.cast(:input) param end
io(*args)
click to toggle source
# File lib/main/program/class_methods.rb, line 410 def io(*args) i = input(*[args.shift].compact).default('-') o = output(*[args.shift].compact).default('-') [i, o] end
keyword(*a, &b)
click to toggle source
# File lib/main/program/class_methods.rb, line 205 def keyword(*a, &b) (parameters << Parameter.create(:keyword, main=self, *a, &b)).last end
main_env(*args, &block)
click to toggle source
# File lib/main/program/class_methods.rb, line 272 def main_env(*args, &block) @main_env ||= main_env! if args.empty? @main_env else key = main_env_key_for(args.first) @main_env[key] end end
main_env!()
click to toggle source
# File lib/main/program/class_methods.rb, line 287 def main_env! @main_env = Map.new @main_env[:state] = env['STATE'] @main_env[:state_dirname] = env['STATE_DIRNAME'] @main_env[:state_basename] = env['STATE_BASENAME'] env.each do |key, val| next unless key.to_s =~ /^\s*MAIN_/i k = main_env_key_for(key) @main_env[k] = val end @main_env end
main_env_key_for(key)
click to toggle source
# File lib/main/program/class_methods.rb, line 283 def main_env_key_for(key) key.to_s.strip.downcase.sub(/^main_/, '') end
mixin(name, *names, &block)
click to toggle source
# File lib/main/program/class_methods.rb, line 241 def mixin(name, *names, &block) names = [name, *names].flatten.compact.map{|name| name.to_s} if block names.each do |name| mixin_table[name] = block end else names.each do |name| module_eval(&mixin_table[name]) end end end
mode(name, &block)
click to toggle source
# File lib/main/program/class_methods.rb, line 217 def mode(name, &block) name = name.to_s block.fattr(:name => name) modes[name] = block breadth_first_modes[name] = block block end
mode_name()
click to toggle source
# File lib/main/program/class_methods.rb, line 179 def mode_name return 'main' if modes.empty? fully_qualified_mode.join(' ') end
new()
click to toggle source
# File lib/main/program/class_methods.rb, line 79 def new() instance = allocate instance.instance_eval do pre_initialize() before_initialize() main_initialize() initialize() after_initialize() post_initialize() end instance end
option(*a, &b)
click to toggle source
# File lib/main/program/class_methods.rb, line 201 def option(*a, &b) (parameters << Parameter.create(:option, main=self, *a, &b)).last end
output(*args, &block)
click to toggle source
# File lib/main/program/class_methods.rb, line 402 def output(*args, &block) first = args.first args.push(:output) unless(first.is_a?(Symbol) or first.is_a?(String)) param = argument(*args, &block) param.cast(:output) param end
parameter(*a, &b)
click to toggle source
# File lib/main/program/class_methods.rb, line 193 def parameter(*a, &b) (parameters << Parameter.create(:parameter, main=self, *a, &b)).last end
params()
click to toggle source
# File lib/main/program/class_methods.rb, line 92 def params parameters end
run()
click to toggle source
# File lib/main/program/class_methods.rb, line 143 def run() exit_status = catch :exit do begin parse_parameters if help? puts(usage.to_s) exit end pre_run before_run run! after_run post_run finalize rescue Object => exception self.exit_status ||= exception.status if exception.respond_to?(:status) handle_exception(exception) end nil end self.exit_status ||= (exit_status || exit_success) handle_exit(self.exit_status) end
set_default_options!()
click to toggle source
# File lib/main/program/class_methods.rb, line 100 def set_default_options! option('help', 'h') unless parameters.has_option?('help', 'h') end
state_basename(*args)
click to toggle source
# File lib/main/program/class_methods.rb, line 310 def state_basename(*args) @state_basename = File.join(*args) unless args.empty? @state_basename ||= main_env('STATE_BASENAME') @state_basename ||= ".#{ name }" @state_basename end
state_dirname(*args)
click to toggle source
# File lib/main/program/class_methods.rb, line 303 def state_dirname(*args) @state_dirname = File.join(*args) unless args.empty? @state_dirname ||= main_env('STATE_DIRNAME') @state_dirname ||= Util.home @state_dirname end
state_path(*state_path, &block)
click to toggle source
# File lib/main/program/class_methods.rb, line 317 def state_path(*state_path, &block) unless defined?(@state_path) if main_env('STATE') @state_path = File.expand_path(main_env('STATE')) @state_dirname = File.dirname(@state_path) @state_basename = File.basename(@state_path) else @state_path = File.join(state_dirname, state_basename) end end if block require 'fileutils' unless defined?(FileUtils) FileUtils.mkdir_p(@state_path) unless test(?d, @state_path) Dir.chdir(@state_path, &block) else @state_path end end
usage(*args, &block)
click to toggle source
# File lib/main/program/class_methods.rb, line 185 def usage(*args, &block) usage! unless defined? @usage return @usage if args.empty? and block.nil? key, value, *ignored = args value = block.call if block @usage[key.to_s] = value.to_s end
wrap_run!()
click to toggle source
wrap up users run method to handle errors, etc
# File lib/main/program/class_methods.rb, line 139 def wrap_run! evaluate do alias_method 'run!', 'run' def run() exit_status = catch :exit do begin parse_parameters if help? puts(usage.to_s) exit end pre_run before_run run! after_run post_run finalize rescue Object => exception self.exit_status ||= exception.status if exception.respond_to?(:status) handle_exception(exception) end nil end self.exit_status ||= (exit_status || exit_success) handle_exit(self.exit_status) end end end