# File lib/main/parameter.rb, line 41 def class_for(type) sym = type.to_s.downcase.to_sym c = Types.detect{|t| t.sym == sym} raise ArgumentError, type.inspect unless c c end
# File lib/main/parameter.rb, line 48 def create(type, main, *a, &b) c = class_for(type) obj = c.allocate obj.type = c.sym obj.main = main obj.instance_eval{ initialize(*a, &b) } obj end
# File lib/main/parameter.rb, line 33 def inherited other Types << other end
# File lib/main/parameter.rb, line 79 def initialize(name, *names, &block) @names = Cast.list_of_string(name, *names) @names.map! do |name| if name =~ /^-+/ name.gsub! /^-+/, '' end if name =~ /=.*$/ argument( name =~ /=\s*\[.*$/ ? :optional : :required ) name.gsub! /=.*$/, '' end name end @names = @names.sort_by{|name| name.size}.reverse @names[1..-1].each do |name| raise ArgumentError, "only one long name allowed (#{ @names.inspect })" if name.size > 1 end DSL.evaluate(self, &block) if block sanity_check! end
# File lib/main/parameter.rb, line 37 def sym @sym ||= name.split(/::/).last.downcase.to_sym end
# File lib/main/parameter.rb, line 24 def wrap_errors begin yield rescue => e raise wrapped_error(e) end end
# File lib/main/parameter.rb, line 17 def wrapped_error w e = Error.new "(#{ w.message } (#{ w.class }))" e.wrapped = w e.set_backtrace(w.backtrace || []) e end
# File lib/main/parameter.rb, line 225 def add_handlers e esc = class << e self end this = self %w[ before instead after ].each do |which| getter = "error_handler_#{ which }" query = "error_handler_#{ which }?" if send(query) handler = send getter esc.module_eval do define_method(getter) do |main| main.instance_eval_block self, &handler end end end end end
# File lib/main/parameter.rb, line 126 def add_value value given true values << value end
# File lib/main/parameter.rb, line 247 def adding_handlers begin yield rescue Exception => e add_handlers e raise end end
# File lib/main/parameter.rb, line 201 def apply_casting if cast? op = cast.respond_to?('call') ? cast : Cast[cast] case op.arity when -1 replacement = Parameter.wrap_errors{ op.call(*values) } values.replace(replacement) else values.map! do |val| Parameter.wrap_errors{ op.call val } end end end end
# File lib/main/parameter.rb, line 135 def argument_none? argument.nil? end
# File lib/main/parameter.rb, line 143 def argument_optional? argument and argument.to_s.downcase.to_sym == :optional end
# File lib/main/parameter.rb, line 139 def argument_required? argument and argument.to_s.downcase.to_sym == :required end
# File lib/main/parameter.rb, line 175 def check_arity return true if not given? and optional? ex = values.size == 0 ? NotGiven : Arity (raise ex, "#{ typename })" if values.size.zero? and argument_required?) unless arity == -1 if arity >= 0 min = arity sign = '' else min = arity.abs - 1 sign = '-' end arity = min if values.size < arity if argument_optional? raise ex, "#{ typename }) #{ values.size }/#{ sign }#{ arity }" if(values.size < arity and values.size > 0) elsif argument_required? or argument_none? raise ex, "#{ typename }) #{ values.size }/#{ sign }#{ arity }" if(values.size < arity) end end end
# File lib/main/parameter.rb, line 216 def check_validation if validate? values.each do |value| validate[value] or raise InValid, "invalid: #{ typename }=#{ value.inspect }" end end end
# File lib/main/parameter.rb, line 112 def default(*values) defaults(values) unless values.empty? defaults.first end
# File lib/main/parameter.rb, line 117 def default=(value) default(value) end
# File lib/main/parameter.rb, line 108 def name names.first end
# File lib/main/parameter.rb, line 151 def optional= bool self.required !bool end
# File lib/main/parameter.rb, line 148 def optional? not required? end
# File lib/main/parameter.rb, line 256 def remove main.parameters.delete(self) end
# File lib/main/parameter.rb, line 104 def sanity_check! raise Arity, "#{ name } with arity -1 (zero or more args) cannot be required" if(arity == -1 and required?) end
def setup!
return false unless given? adding_handlers do check_arity apply_casting check_validation end true
end
# File lib/main/parameter.rb, line 167 def setup! adding_handlers do check_arity apply_casting check_validation end end
# File lib/main/parameter.rb, line 121 def typename prefix = '--' if type.to_s =~ /option/ "#{ type }(#{ prefix }#{ name })" end
# File lib/main/parameter.rb, line 131 def value values.first end