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 =
"1.2.3"

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:



12
13
14
# File 'lib/simple_command_dispatcher/configure.rb', line 12

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 simply passed 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.



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/simple_command_dispatcher.rb', line 62

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  
      # Calling is_simple_command? returns true if the class pointed to by
      # command_class_constant is a valid SimpleCommand class; that is, 
      # if it prepends module SimpleCommand::ClassMethods.
      if !is_simple_command?(command_class_constant) 
         raise ArgumentError.new("Class \"#{command_class_constant}\" must prepend module SimpleCommand if Configuration#allow_custom_commands is true.")
      end
   end

   if is_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.new("Class \"#{command_class_constant}\" does not respond_to? method ::call.")
   end
end

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

Yields:



16
17
18
# File 'lib/simple_command_dispatcher/configure.rb', line 16

def self.configure
  yield(configuration)
end

.is_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.



109
110
111
# File 'lib/simple_command_dispatcher.rb', line 109

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

.is_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.



98
99
100
# File 'lib/simple_command_dispatcher.rb', line 98

def is_valid_command(klass_constant)
   klass_constant.eigenclass.public_method_defined?(:call)
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.



121
122
123
124
125
# File 'lib/simple_command_dispatcher.rb', line 121

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