module ServiceInterface
Constants
- VERSION
Public Class Methods
new(arguments = {})
click to toggle source
# File lib/service_interface.rb, line 56 def initialize(arguments = {}) _raise_error_if_any_undeclared_arguments_specified(arguments) _set_arguments(arguments) _configure_execute_instance_method end
Public Instance Methods
_arguments()
click to toggle source
Instance methods can't access class-level instance variables (because of the one @, they look for an instance variable), so define a getter method for them to use.
# File lib/service_interface.rb, line 29 def _arguments @_arguments end
_configure_execute_instance_method()
click to toggle source
Mark the execute instance method as private (so no one can initialize the service class manually and call the execute instance method themselves, thereby bypassing the interface).
# File lib/service_interface.rb, line 103 def _configure_execute_instance_method self.class.class_eval do private :execute end end
_raise_error_if_any_required_arguments_not_set(arguments_set)
click to toggle source
# File lib/service_interface.rb, line 94 def _raise_error_if_any_required_arguments_not_set(arguments_set) required_arguments_not_set = self.class._arguments.select(&:required?).reject do |argument| argument.name.in?(arguments_set) end raise ArgumentError, "Required arguments (with no default value) not specified: #{required_arguments_not_set.map(&:name).join(', ')}" if required_arguments_not_set.any? end
_raise_error_if_any_undeclared_arguments_specified(arguments)
click to toggle source
# File lib/service_interface.rb, line 62 def _raise_error_if_any_undeclared_arguments_specified(arguments) undeclared_arguments = arguments.reject do |name, value| name.in?(self.class._arguments.map(&:name)) end raise ArgumentError, "Unrecognized arguments specified: #{undeclared_arguments.keys.join(', ')}" if undeclared_arguments.any? end
_set_arguments(arguments)
click to toggle source
# File lib/service_interface.rb, line 70 def _set_arguments(arguments) arguments_set = _set_specified_arguments(arguments) arguments_set += _set_default_values_for_optional_arguments(arguments_set) _raise_error_if_any_required_arguments_not_set(arguments_set) end
_set_default_values_for_optional_arguments(arguments_already_set)
click to toggle source
Set the values for optional arguments (which have default values) that were not specified at initialization.
# File lib/service_interface.rb, line 84 def _set_default_values_for_optional_arguments(arguments_already_set) self.class._arguments.map do |argument| next if argument.name.in?(arguments_already_set) next unless argument.optional? instance_variable_set("@#{argument.name}", argument.default_value) argument.name end.compact end
_set_specified_arguments(arguments)
click to toggle source
# File lib/service_interface.rb, line 76 def _set_specified_arguments(arguments) arguments.map do |name, value| instance_variable_set("@#{name}", value) name end end
arguments(*arguments)
click to toggle source
Build a collection of arguments, with their names and default values, and store it in a class-level instance variable.
# File lib/service_interface.rb, line 34 def arguments(*arguments) optional_arguments_with_default_values = arguments.extract_options! required_arguments = arguments @_arguments = [] required_arguments.each do |name| @_arguments << Argument.new(name: name, required: true) end optional_arguments_with_default_values.each do |name, default_value| @_arguments << Argument.new(name: name, required: false, default_value: default_value) end end
execute(arguments = {})
click to toggle source
# File lib/service_interface.rb, line 49 def execute(arguments = {}) new(arguments).send(:execute) end