lib/mothership/inputs.rb in mothership-0.0.15 vs lib/mothership/inputs.rb in mothership-0.1.0
- old
+ new
@@ -1,30 +1,37 @@
class Mothership
class Inputs
- attr_reader :inputs
+ attr_reader :inputs, :given, :global
- def initialize(command, context = nil, given = {}, inputs = {})
+ def initialize(
+ command, context = nil,
+ inputs = {}, given = {}, global = {})
@command = command
@context = context
- @given = given
@inputs = inputs
+ @given = given
+ @global = global
end
def given?(name)
@inputs.key?(name) || @given.key?(name)
end
def given(name)
- @inputs[name] || @given[name]
+ if @inputs.key?(name)
+ @inputs[name]
+ else
+ @given[name]
+ end
end
def merge(inputs)
- self.class.new(@command, @context, @given, @inputs.merge(inputs))
+ self.class.new(@command, @context, @inputs.merge(inputs), @given)
end
def merge_given(inputs)
- self.class.new(@command, @context, @given.merge(inputs), @inputs)
+ self.class.new(@command, @context, @inputs, @given.merge(inputs))
end
def without(*names)
given = @given.dup
inputs = @inputs.dup
@@ -38,42 +45,61 @@
def [](name, *args)
get(name, @context, *args)
end
+ # search:
+ # 1. cache
+ # 2. cache, singular
+ # 3. given
+ # 4. given, singular
+ # 5. global
+ # 6. global, singular
def get(name, context, *args)
return @inputs[name] if @inputs.key?(name)
- meta = @command.inputs[name]
- return unless meta
+ if meta = @command.inputs[name]
+ # special case so #invoke can be called with singular-named inputs
+ singular = meta[:singular]
+ return @inputs[name] = [@inputs[singular]] if @inputs.key?(singular)
- singular = meta[:singular]
- return @inputs[name] = [@inputs[singular]] if @inputs.key?(singular)
-
- given = @given[name] if @given.key?(name)
- given ||= [@given[singular]] if @given.key?(singular)
-
- # value given; convert if needed
- if given && given != []
- return @inputs[name] = convert_given(meta, context, given, *args)
+ found, val = find_in(@given, name, meta, context, *args)
end
- # no value given; set as default
- val = default_for(meta, context, *args)
-
- unless meta[:forget]
- @inputs[name] = val
+ # if not found locally and the default is nil, search globally
+ if !found && val.nil? && meta = Mothership.global_option(name)
+ found, val = find_in(@global, name, meta, context, *args)
end
- val
+ return val if not found
+
+ @inputs[name] = convert_given(meta, context, val, *args)
end
def forget(name)
@given.delete(name)
@inputs.delete(name)
end
private
+
+ def find_in(where, name, meta, context, *args)
+ singular = meta[:singular]
+
+ if where.key?(name)
+ [true, where[name]]
+ elsif where.key?(singular)
+ [true, [where[singular]]]
+ else
+ # no value given; set as default
+ val = default_for(meta, context, *args)
+
+ # cache default value
+ @inputs[name] = val unless meta[:forget]
+
+ [false, val]
+ end
+ end
def convert_given(meta, context, given, *args)
if convert = meta[:from_given]
if given.is_a?(Array)
given.collect do |i|