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