lib/simple/service/action.rb in simple-service-0.2.2 vs lib/simple/service/action.rb in simple-service-0.2.3

- old
+ new

@@ -76,17 +76,25 @@ def invoke(args:, flags:) args = convert_argument_array_to_hash(args) if args.is_a?(Array) verify_required_args!(args, flags) + args = args.dup + flags = flags.dup + positionals = build_positional_arguments(args, flags) + + if flags["args"].is_a?(Array) + positionals.concat flags.delete("args") + end + keywords = build_keyword_arguments(args.merge(flags)) # check for extra flags - extra_flags = (flags.keys - keywords.keys.map(&:to_s)).map { |flag| "--#{flag}" } - unless extra_flags.empty? - raise Simple::Service::ArgumentError, "Unknown flag(s): #{extra_flags.join(", ")}." + unknown_flags = (flags.keys - keywords.keys.map(&:to_s)) + unless unknown_flags.empty? + raise Simple::Service::UnknownFlagError.new(name, unknown_flags) end service_instance = Object.new service_instance.extend service @@ -106,11 +114,11 @@ @required_names ||= parameters.select(&:required?).map(&:name).map(&:to_s) missing_parameters = @required_names - args.keys - flags.keys return if missing_parameters.empty? - raise ::Simple::Service::MissingArguments.new(self, missing_parameters) + raise ::Simple::Service::MissingArgumentError.new(self, missing_parameters) end # Enumerating all parameters it puts all named parameters into a Hash # of keyword arguments. def build_keyword_arguments(args) @@ -137,23 +145,23 @@ # Enumerating all parameters it collects all positional parameters into # an Array. def build_positional_arguments(args, flags) positionals = positional_names.each_with_object([]) do |parameter_name, ary| if args.key?(parameter_name) - ary << args[parameter_name] + ary << args.delete(parameter_name) elsif flags.key?(parameter_name) - ary << flags[parameter_name] + ary << flags.delete(parameter_name) end end # A variadic parameter is appended to the positionals array. # It is always optional - but if it exists it must be an Array. if variadic_parameter value = if args.key?(variadic_parameter.name) - args[variadic_parameter.name] + args.delete(variadic_parameter.name) elsif flags.key?(variadic_parameter.name) - flags[variadic_parameter.name] + flags.delete(variadic_parameter.name) end positionals.concat(value) if value end @@ -173,10 +181,10 @@ when 1 # i.e. ary.length > positional_names.length extra_arguments = ary[positional_names.length..] ary = ary[0..positional_names.length] if !extra_arguments.empty? && !variadic_parameter - raise ::Simple::Service::ExtraArguments.new(self, extra_arguments) + raise ::Simple::Service::ExtraArgumentError.new(self, extra_arguments) end existing_positional_names = positional_names when 0 # i.e. ary.length == positional_names.length existing_positional_names = positional_names