module DslOrganizer::Core

Load methods for control dsl commands.

Attributes

dsl_commands[R]

Public Instance Methods

dictionary(commands: []) click to toggle source

@syntax

commands: { <command>:<class executor> }

@example

commands: { after: AfterHook, before: BeforeHook }

@return [Module]

# File lib/dsl_organizer/core.rb, line 9
def dictionary(commands: [])
  CommandContainer.reset

  @dsl_commands = commands
  validate_commands

  dsl_module = new_dsl_module(dsl_operator: new_dsl_operator)
  Module.new do
    singleton_class.send :define_method, :included do |host_class|
      host_class.extend dsl_module
    end
  end
end

Private Instance Methods

new_dsl_module(dsl_operator:) click to toggle source
# File lib/dsl_organizer/core.rb, line 40
def new_dsl_module(dsl_operator:)
  commands = dsl_commands
  Module.new do
    define_method :used_dsl do
      @used_dsl ||= dsl_operator.new
    end

    define_method :dsl_commands do
      @dsl_commands ||= commands
    end

    define_method :dsl_container do
      CommandContainer
    end

    def run(&block)
      used_dsl.instance_eval(&block)
    end
  end
end
new_dsl_operator() click to toggle source
# File lib/dsl_organizer/core.rb, line 61
def new_dsl_operator
  commands = dsl_commands
  Class.new do
    commands.each do |command|
      define_method command do |values = [], &block|
        unless ExportContainer[command].method_defined? :call
          raise(
            Errors::MethodCallNotFound,
            'Not found `call` method for the' \
            " `#{ExportContainer[command].name}` class and" \
            " the `#{command}` command"
          )
        end

        command_instance = CommandContainer[command] ||
                           ExportContainer[command].new

        unless CommandContainer[command]
          CommandContainer[command] = command_instance
        end

        command_instance.call(*values, &block)
      end
    end
  end
end
run(&block) click to toggle source
# File lib/dsl_organizer/core.rb, line 55
def run(&block)
  used_dsl.instance_eval(&block)
end
validate_commands() click to toggle source
# File lib/dsl_organizer/core.rb, line 27
def validate_commands
  if dsl_commands.nil? || dsl_commands.empty?
    raise Errors::DslCommandsNotFound, 'Add DSL commands for work'
  end

  dsl_commands.each do |command|
    unless ExportContainer.real_container.key?(command)
      raise(Errors::DslCommandsNotFound,
            "Add an executor for the `#{command}` command for work")
    end
  end
end