Module: SimpleCommand::Dispatcher

Extended by:
KlassTransform
Defined in:
lib/simple_command_dispatcher.rb,
lib/simple_command_dispatcher/version.rb,
lib/simple_command_dispatcher/configure.rb,
lib/simple_command_dispatcher/configuration.rb

Overview

Provides a way to call SimpleCommands or your own custom commands in a more dymanic manner.

For information about the simple_command gem, visit https://rubygems.org/gems/simple_command

Defined Under Namespace

Classes: Configuration

Constant Summary collapse

VERSION =
'3.0.4'

Class Attribute Summary collapse

Class Method Summary collapse

Methods included from KlassTransform

camelize, ensure_options, to_class_string, to_constantized_class, to_constantized_class_string, to_modules_string, validate_klass, validate_klass_modules

Class Attribute Details

.configurationConfiguration

Returns the application configuration object.

Returns:



14
15
16
# File 'lib/simple_command_dispatcher/configure.rb', line 14

def self.configuration
  @configuration ||= Configuration.new
end

Class Method Details

.call(command = '', command_modules = {}, options = {}, *command_parameters) ⇒ SimpleCommand, Object

Calls a SimpleCommand or Command given the command name, the modules the command belongs to and the parameters to pass to the command.

Examples:


# Below call equates to the following:
# Api::Carz4Rent::V1::Authenticate.call({ email: '[email protected]', password: 'AskM3!' })
SimpleCommand::Dispatcher.call(:Authenticate,
   { api: :Api, app_name: :Carz4Rent, api_version: :V1 },
   { email: '[email protected]', password: 'AskM3!' } ) # => SimpleCommand result

# Below equates to the following: Api::Carz4Rent::V2::Authenticate.call('[email protected]', 'AskM3!')
SimpleCommand::Dispatcher.call(:Authenticate,
   ['Api', 'Carz4Rent', 'V2'], '[email protected]', 'AskM3!') # => SimpleCommand result

# Below equates to the following:
# Api::Auth::JazzMeUp::V1::Authenticate.call('[email protected]', 'JazzM3!')
SimpleCommand::Dispatcher.call(:Authenticate, ['Api::Auth::JazzMeUp', :V1],
   '[email protected]', 'JazzM3!') # => SimpleCommand result

Parameters:

  • command (Symbol, String) (defaults to: '')

    the name of the SimpleCommand or Command to call.

  • command_modules (Hash, Array) (defaults to: {})

    the ruby modules that qualify the SimpleCommand to call. When passing a Hash, the Hash keys serve as documentation only. For example, [‘Api’, ‘AppName’, ‘V1’] and { :api :Api, app_name: :AppName, api_version: :V1 } will both produce ‘Api::AppName::V1’, this string will be prepended to the command to form the SimpleCommand to call (e.g. ‘Api::AppName::V1::MySimpleCommand’ = Api::AppName::V1::MySimpleCommand.call(*command_parameters)).

  • options (Hash) (defaults to: {})

    the options that determine how command and command_module are transformed.

  • command_parameters (Array<Symbol>)

    the parameters to pass to the call method of the SimpleCommand. This parameter is simplypassed through to the call method of the SimpleCommand/Command.

Options Hash (options):

  • :camelize (Boolean) — default: false

    determines whether or not both class and module names should be camelized.

  • :titleize (Boolean) — default: false

    determines whether or not both class and module names should be titleized.

  • :class_titleize (Boolean) — default: false

    determines whether or not class names should be titleized.

  • :class_camelized (Boolean) — default: false

    determines whether or not class names should be camelized.

  • :module_titleize (Boolean) — default: false

    determines whether or not module names should be titleized.

  • :module_camelized (Boolean) — default: false

    determines whether or not module names should be camelized.

Returns:

  • (SimpleCommand, Object)

    the SimpleCommand or Object returned as a result of calling the SimpleCommand#call method or the Command#call method respectfully.



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/simple_command_dispatcher.rb', line 70

def call(command = '', command_modules = {}, options = {}, *command_parameters)
  # Create a constantized class from our command and command_modules...
  command_class_constant = to_constantized_class(command, command_modules, options)

  # If we're NOT allowing custom commands, make sure we're dealing with a a command class
  # that prepends the SimpleCommand module.
  if !SimpleCommand::Dispatcher.configuration.allow_custom_commands && !simple_command?(command_class_constant)
    raise ArgumentError,
      "Class \"#{command_class_constant}\" " \
      'must prepend module SimpleCommand if Configuration#allow_custom_commands is true.'
  end

  if valid_command?(command_class_constant)
    # We know we have a valid SimpleCommand; all we need to do is call #call,
    # pass the command_parameter variable arguments to the call, and return the results.
    run_command(command_class_constant, command_parameters)
  else
    raise NameError, "Class \"#{command_class_constant}\" does not respond_to? method ::call."
  end
end

.configure {|configuration| ... } ⇒ Object

Yields:



18
19
20
# File 'lib/simple_command_dispatcher/configure.rb', line 18

def self.configure
  yield(configuration)
end

.run_command(klass_constant, parameters) ⇒ Object

Runs the command given the parameters and returns the result.

Parameters:

  • klass_constant (String)

    a class constant that will be called.

  • parameters (Array)

    an array of parameters to pass to the command that will be called.

Returns:

  • (Object)

    returns the object (if any) that results from calling the command.



129
130
131
132
133
# File 'lib/simple_command_dispatcher.rb', line 129

def run_command(klass_constant, parameters)
  klass_constant.call(*parameters)
  # rescue NameError
  #   raise NameError.new("Class \"#{klass_constant}\" does not respond_to? method ::call.")
end

.simple_command?(klass_constant) ⇒ Boolean

Returns true or false depending on whether or not the class constant prepends module

SimpleCommand::ClassMethods.

Parameters:

  • klass_constant (String)

    a class constant that will be validated to see whether or not the class prepends module SimpleCommand::ClassMethods.

Returns:

  • (Boolean)

    true if klass_constant prepends Module SimpleCommand::ClassMethods, false otherwise.



117
118
119
# File 'lib/simple_command_dispatcher.rb', line 117

def simple_command?(klass_constant)
  klass_constant.eigenclass.included_modules.include? SimpleCommand::ClassMethods
end

.valid_command?(klass_constant) ⇒ Boolean

Returns true or false depending on whether or not the class constant has a public class method named ::call defined. Commands that do not have a public class method named ::call, are considered invalid.

Parameters:

  • klass_constant (String)

    a class constant that will be validated to see whether or not the class is a valid command.

Returns:

  • (Boolean)

    true if klass_constant has a public class method named ::call defined, false otherwise.



104
105
106
# File 'lib/simple_command_dispatcher.rb', line 104

def valid_command?(klass_constant)
  klass_constant.eigenclass.public_method_defined?(:call)
end