Class: ROM::CommandCompiler Private

Inherits:
Object
  • Object
show all
Extended by:
Initializer
Defined in:
lib/rom/command_compiler.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Builds commands for relations.

This class is used by repositories to automatically create commands for their relations. This is used both by Repository#command method and commands repository class macros.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#adapterSymbol (readonly)

Returns The adapter identifier ie :sql or :http.

Returns:

  • (Symbol)

    The adapter identifier ie :sql or :http


47
# File 'lib/rom/command_compiler.rb', line 47

option :adapter, optional: true

#cacheCache (readonly)

Returns local cache instance.

Returns:

  • (Cache)

    local cache instance


67
# File 'lib/rom/command_compiler.rb', line 67

option :cache, default: -> { Cache.new }

#commandsROM::Registry (readonly)

Returns Command registries with custom commands.

Returns:


35
# File 'lib/rom/command_compiler.rb', line 35

param :commands

#gatewaysROM::Registry (readonly)

Returns Gateways used for command extensions.

Returns:


27
# File 'lib/rom/command_compiler.rb', line 27

param :gateways

#idSymbol (readonly)

Returns The command type registry identifier.

Returns:

  • (Symbol)

    The command type registry identifier


43
# File 'lib/rom/command_compiler.rb', line 43

option :id, optional: true

#inflectorDry::Inflector (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns String inflector.

Returns:

  • (Dry::Inflector)

    String inflector


72
# File 'lib/rom/command_compiler.rb', line 72

option :inflector, default: -> { Inflector }

#metaArray<Symbol> (readonly)

Returns Meta data for a command.

Returns:

  • (Array<Symbol>)

    Meta data for a command


63
# File 'lib/rom/command_compiler.rb', line 63

option :meta, optional: true

#notificationsNotifications::EventBus (readonly)

Returns Configuration notifications event bus.

Returns:


39
# File 'lib/rom/command_compiler.rb', line 39

param :notifications

#pluginsArray<Symbol> (readonly)

Returns a list of optional plugins that will be enabled for commands.

Returns:

  • (Array<Symbol>)

    a list of optional plugins that will be enabled for commands


55
# File 'lib/rom/command_compiler.rb', line 55

option :plugins, optional: true, default: -> { EMPTY_ARRAY }

#plugins_optionsHash (readonly)

Returns a hash of options for the plugins.

Returns:

  • (Hash)

    a hash of options for the plugins


59
# File 'lib/rom/command_compiler.rb', line 59

option :plugins_options, optional: true, default: -> { EMPTY_HASH }

#registryHash (readonly)

Returns local registry where commands will be stored during compilation.

Returns:

  • (Hash)

    local registry where commands will be stored during compilation


51
# File 'lib/rom/command_compiler.rb', line 51

option :registry, optional: true, default: -> { self.class.registry }

#relationsROM::RelationRegistry (readonly)

Returns Relations used with a given compiler.

Returns:


31
# File 'lib/rom/command_compiler.rb', line 31

param :relations

Class Method Details

.registryObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


21
22
23
# File 'lib/rom/command_compiler.rb', line 21

def self.registry
  Hash.new { |h, k| h[k] = {} }
end

Instance Method Details

#[](type, adapter, ast, plugins, meta) ⇒ Command, CommandProxy Also known as: []

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Return a specific command type for a given adapter and relation AST

This class holds its own registry where all generated commands are being stored

CommandProxy is returned for complex command graphs as they expect root relation name to be present in the input, which we don't want to have in repositories. It might be worth looking into removing this requirement from rom core Command::Graph API.

Parameters:

  • type (Symbol)

    The type of command

  • adapter (Symbol)

    The adapter identifier

  • ast (Array)

    The AST representation of a relation

  • plugins (Array<Symbol>)

    A list of optional command plugins that should be used

  • meta (Hash)

    Meta data for a command

Returns:


94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/rom/command_compiler.rb', line 94

def call(*args)
  cache.fetch_or_store(args.hash) do
    type, adapter, ast, plugins, plugins_options, meta = args

    compiler = with(
      id: type,
      adapter: adapter,
      plugins: Array(plugins),
      plugins_options: plugins_options,
      meta: meta
    )

    graph_opts = compiler.visit(ast)
    command = ROM::Commands::Graph.build(registry, graph_opts)

    if command.graph?
      root = inflector.singularize(command.name.relation).to_sym
      CommandProxy.new(command, root)
    elsif command.lazy?
      command.unwrap
    else
      command
    end
  end
end

#typeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


122
123
124
125
126
# File 'lib/rom/command_compiler.rb', line 122

def type
  @_type ||= Commands.const_get(inflector.classify(id))[adapter]
rescue NameError
  nil
end

#visit(ast, *args) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


129
130
131
132
# File 'lib/rom/command_compiler.rb', line 129

def visit(ast, *args)
  name, node = ast
  __send__(:"visit_#{name}", node, *args)
end