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