require 'rom/configuration_dsl/relation' require 'rom/configuration_dsl/mapper_dsl' require 'rom/configuration_dsl/command_dsl' module ROM # This extends Configuration class with the DSL methods # # @api public module ConfigurationDSL # Relation definition DSL # # @example # # setup.relation(:users) do # def names # project(:name) # end # end # # @api public def relation(name, options = EMPTY_HASH, &block) klass_opts = { adapter: default_adapter }.merge(options) klass = Relation.build_class(name, klass_opts) klass.register_as(name, deprecation: false) klass.class_eval(&block) if block register_relation(klass) klass end # Mapper definition DSL # # @example # # setup.mappers do # define(:users) do # model name: 'User' # end # # define(:names, parent: :users) do # exclude :id # end # end # # @api public def mappers(&block) register_mapper(*MapperDSL.new(self, mapper_classes, block).mapper_classes) end # Command definition DSL # # @example # # setup.commands(:users) do # define(:create) do # input NewUserParams # result :one # end # # define(:update) do # input UserParams # result :many # end # # define(:delete) do # result :many # end # end # # @api public def commands(name, &block) register_command(*CommandDSL.new(name, default_adapter, &block).command_classes) end # Configures a plugin for a specific adapter to be enabled for all relations # # @example # config = ROM::Configuration.new(:sql, 'sqlite::memory') # # config.plugin(:sql, relations: :instrumentation) do |p| # p.notifications = MyNotificationsBackend # end # # config.plugin(:sql, relations: :pagination) # # @param [Symbol] adapter The adapter identifier # @param [HashSymbol>] spec Component identifier => plugin identifier # # @return [Plugin] # # @api public def plugin(adapter, spec, &block) type, name = spec.flatten(1) plugin = plugin_registry.send(type).adapter(adapter).fetch(name) { plugin_registry.send(type).fetch(name) } if block register_plugin(plugin.configure(&block)) else register_plugin(plugin) end end # @api private def plugin_registry ROM.plugin_registry end end end