rom 0.9.1 → 1.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +30 -12
- data/.travis.yml +1 -1
- data/CHANGELOG.md +24 -0
- data/Gemfile +7 -3
- data/README.md +24 -11
- data/lib/rom.rb +9 -26
- data/lib/rom/command.rb +113 -75
- data/lib/rom/commands/class_interface.rb +115 -0
- data/lib/rom/commands/graph.rb +17 -23
- data/lib/rom/commands/graph/builder.rb +176 -0
- data/lib/rom/commands/graph/class_interface.rb +8 -2
- data/lib/rom/commands/graph/input_evaluator.rb +13 -9
- data/lib/rom/commands/lazy.rb +23 -17
- data/lib/rom/commands/lazy/create.rb +23 -0
- data/lib/rom/commands/lazy/delete.rb +27 -0
- data/lib/rom/commands/lazy/update.rb +34 -0
- data/lib/rom/commands/result.rb +14 -0
- data/lib/rom/commands/update.rb +0 -4
- data/lib/rom/configuration.rb +86 -0
- data/lib/rom/{setup_dsl/setup.rb → configuration_dsl.rb} +9 -7
- data/lib/rom/configuration_dsl/command.rb +43 -0
- data/lib/rom/{setup_dsl → configuration_dsl}/command_dsl.rb +5 -4
- data/lib/rom/configuration_dsl/mapper.rb +37 -0
- data/lib/rom/{setup_dsl → configuration_dsl}/mapper_dsl.rb +11 -5
- data/lib/rom/configuration_dsl/relation.rb +26 -0
- data/lib/rom/configuration_plugin.rb +17 -0
- data/lib/rom/constants.rb +5 -12
- data/lib/rom/container.rb +11 -8
- data/lib/rom/create_container.rb +61 -0
- data/lib/rom/environment.rb +27 -241
- data/lib/rom/gateway.rb +18 -2
- data/lib/rom/global.rb +24 -0
- data/lib/rom/global/plugin_dsl.rb +2 -0
- data/lib/rom/lint/spec.rb +0 -12
- data/lib/rom/lint/test.rb +0 -31
- data/lib/rom/memory/commands.rb +2 -2
- data/lib/rom/memory/gateway.rb +2 -0
- data/lib/rom/pipeline.rb +1 -1
- data/lib/rom/plugin_base.rb +1 -1
- data/lib/rom/plugin_registry.rb +12 -10
- data/lib/rom/plugins/configuration/configuration_dsl.rb +16 -0
- data/lib/rom/plugins/relation/key_inference.rb +31 -0
- data/lib/rom/plugins/relation/view.rb +90 -0
- data/lib/rom/plugins/relation/view/dsl.rb +32 -0
- data/lib/rom/relation.rb +1 -11
- data/lib/rom/relation/class_interface.rb +37 -50
- data/lib/rom/setup.rb +13 -104
- data/lib/rom/setup/auto_registration.rb +55 -0
- data/lib/rom/setup/finalize.rb +113 -127
- data/lib/rom/setup/finalize/commands.rb +67 -0
- data/lib/rom/setup/finalize/mappers.rb +36 -0
- data/lib/rom/setup/finalize/relations.rb +53 -0
- data/lib/rom/support/configurable.rb +21 -7
- data/lib/rom/version.rb +1 -1
- data/rakelib/mutant.rake +4 -1
- data/rom.gemspec +3 -4
- data/spec/fixtures/app/commands/create_user.rb +2 -0
- data/spec/fixtures/app/mappers/user_list.rb +2 -0
- data/spec/fixtures/app/relations/users.rb +2 -0
- data/spec/fixtures/lib/persistence/commands/create_user.rb +6 -0
- data/spec/fixtures/lib/persistence/mappers/user_list.rb +6 -0
- data/spec/fixtures/lib/persistence/relations/users.rb +6 -0
- data/spec/{unit/rom → integration}/command_registry_spec.rb +8 -9
- data/spec/integration/commands/create_spec.rb +17 -13
- data/spec/integration/commands/delete_spec.rb +12 -11
- data/spec/integration/commands/error_handling_spec.rb +5 -4
- data/spec/integration/commands/graph_builder_spec.rb +213 -0
- data/spec/integration/commands/graph_spec.rb +112 -49
- data/spec/integration/commands/update_spec.rb +14 -11
- data/spec/integration/commands_spec.rb +60 -0
- data/spec/integration/mappers/combine_spec.rb +7 -6
- data/spec/integration/mappers/deep_embedded_spec.rb +5 -6
- data/spec/integration/mappers/definition_dsl_spec.rb +19 -18
- data/spec/integration/mappers/embedded_spec.rb +11 -12
- data/spec/integration/mappers/exclude_spec.rb +5 -6
- data/spec/integration/mappers/fold_spec.rb +8 -7
- data/spec/integration/mappers/group_spec.rb +16 -15
- data/spec/integration/mappers/overwrite_attributes_value_spec.rb +5 -5
- data/spec/integration/mappers/prefix_separator_spec.rb +5 -7
- data/spec/integration/mappers/prefix_spec.rb +5 -7
- data/spec/integration/mappers/prefixing_attributes_spec.rb +7 -7
- data/spec/integration/mappers/registering_custom_mappers_spec.rb +4 -5
- data/spec/integration/mappers/renaming_attributes_spec.rb +18 -18
- data/spec/integration/mappers/step_spec.rb +11 -12
- data/spec/integration/mappers/symbolizing_attributes_spec.rb +11 -8
- data/spec/integration/mappers/unfold_spec.rb +9 -10
- data/spec/integration/mappers/ungroup_spec.rb +10 -11
- data/spec/integration/mappers/unwrap_spec.rb +10 -15
- data/spec/integration/mappers/wrap_spec.rb +16 -15
- data/spec/{unit/rom → integration}/memory/commands/create_spec.rb +7 -5
- data/spec/{unit/rom → integration}/memory/commands/delete_spec.rb +7 -5
- data/spec/{unit/rom → integration}/memory/commands/update_spec.rb +7 -5
- data/spec/integration/multi_env_spec.rb +16 -124
- data/spec/integration/multi_repo_spec.rb +9 -9
- data/spec/integration/relations/default_dataset_spec.rb +15 -0
- data/spec/integration/relations/inheritance_spec.rb +5 -7
- data/spec/integration/relations/reading_spec.rb +32 -65
- data/spec/integration/relations/registry_dsl_spec.rb +5 -4
- data/spec/integration/repositories/extending_relations_spec.rb +6 -7
- data/spec/integration/repositories/setting_logger_spec.rb +5 -7
- data/spec/integration/setup_spec.rb +49 -61
- data/spec/shared/command_graph.rb +50 -0
- data/spec/shared/container.rb +9 -0
- data/spec/shared/gateway_only.rb +6 -0
- data/spec/shared/no_container.rb +16 -0
- data/spec/shared/one_behavior.rb +4 -4
- data/spec/shared/users_and_tasks.rb +5 -17
- data/spec/spec_helper.rb +5 -3
- data/spec/test/memory_repository_lint_test.rb +1 -1
- data/spec/unit/rom/auto_registration_spec.rb +54 -0
- data/spec/unit/rom/commands/graph_spec.rb +18 -44
- data/spec/unit/rom/commands/lazy_spec.rb +246 -35
- data/spec/unit/rom/commands/result_spec.rb +56 -0
- data/spec/unit/rom/commands_spec.rb +9 -73
- data/spec/unit/rom/configurable_spec.rb +49 -0
- data/spec/unit/rom/configuration_spec.rb +61 -0
- data/spec/unit/rom/container_spec.rb +39 -33
- data/spec/unit/rom/create_container_spec.rb +151 -0
- data/spec/unit/rom/environment_spec.rb +123 -0
- data/spec/unit/rom/gateway_spec.rb +58 -2
- data/spec/unit/rom/global_spec.rb +10 -7
- data/spec/unit/rom/plugin_spec.rb +44 -25
- data/spec/unit/rom/plugins/relation/key_inference_spec.rb +27 -0
- data/spec/unit/rom/plugins/relation/view_spec.rb +47 -0
- data/spec/unit/rom/relation/composite_spec.rb +20 -20
- data/spec/unit/rom/relation/curried_spec.rb +10 -11
- data/spec/unit/rom/relation/graph_spec.rb +27 -27
- data/spec/unit/rom/relation/lazy/combine_spec.rb +26 -20
- data/spec/unit/rom/relation/lazy_spec.rb +38 -38
- data/spec/unit/rom/relation/loaded_spec.rb +2 -3
- data/spec/unit/rom/relation_spec.rb +39 -2
- metadata +58 -66
- data/lib/rom/commands/abstract.rb +0 -184
- data/lib/rom/environment_plugin.rb +0 -17
- data/lib/rom/environment_plugins/auto_registration.rb +0 -38
- data/lib/rom/repository.rb +0 -16
- data/lib/rom/setup_dsl/command.rb +0 -36
- data/lib/rom/setup_dsl/mapper.rb +0 -32
- data/lib/rom/setup_dsl/relation.rb +0 -30
- data/spec/integration/inline_setup_spec.rb +0 -65
- data/spec/unit/rom/repository_spec.rb +0 -12
- data/spec/unit/rom/setup_spec.rb +0 -253
    
        data/lib/rom/constants.rb
    CHANGED
    
    | @@ -15,23 +15,16 @@ module ROM | |
| 15 15 | 
             
              RelationAlreadyDefinedError = Class.new(StandardError)
         | 
| 16 16 | 
             
              NoRelationError = Class.new(StandardError)
         | 
| 17 17 | 
             
              CommandError = Class.new(StandardError)
         | 
| 18 | 
            +
              KeyMissing = Class.new(ROM::CommandError)
         | 
| 18 19 | 
             
              TupleCountMismatchError = Class.new(CommandError)
         | 
| 19 20 | 
             
              MapperMissingError = Class.new(StandardError)
         | 
| 20 21 | 
             
              UnknownPluginError = Class.new(StandardError)
         | 
| 21 22 | 
             
              UnsupportedRelationError = Class.new(StandardError)
         | 
| 23 | 
            +
              MissingAdapterIdentifierError = Class.new(StandardError)
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              DuplicateConfigurationError = Class.new(StandardError)
         | 
| 26 | 
            +
              DuplicateContainerError = Class.new(StandardError)  
         | 
| 22 27 |  | 
| 23 28 | 
             
              InvalidOptionValueError = Class.new(StandardError)
         | 
| 24 29 | 
             
              InvalidOptionKeyError = Class.new(StandardError)
         | 
| 25 | 
            -
             | 
| 26 | 
            -
              class CommandFailure < StandardError
         | 
| 27 | 
            -
                attr_reader :command
         | 
| 28 | 
            -
                attr_reader :original_error
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                def initialize(command, err)
         | 
| 31 | 
            -
                  super("command: #{command.inspect}; original message: #{err.message}")
         | 
| 32 | 
            -
                  @command = command
         | 
| 33 | 
            -
                  @original_error = err
         | 
| 34 | 
            -
                  set_backtrace(err.backtrace)
         | 
| 35 | 
            -
                end
         | 
| 36 | 
            -
              end
         | 
| 37 30 | 
             
            end
         | 
    
        data/lib/rom/container.rb
    CHANGED
    
    | @@ -1,22 +1,21 @@ | |
| 1 1 | 
             
            require 'rom/relation/loaded'
         | 
| 2 2 | 
             
            require 'rom/commands/graph'
         | 
| 3 | 
            -
            require 'rom/ | 
| 3 | 
            +
            require 'rom/commands/graph/builder'
         | 
| 4 | 
            +
            require 'rom/support/publisher'
         | 
| 4 5 |  | 
| 5 6 | 
             
            module ROM
         | 
| 6 7 | 
             
              # Exposes defined gateways, relations and mappers
         | 
| 7 8 | 
             
              #
         | 
| 8 9 | 
             
              # @api public
         | 
| 9 10 | 
             
              class Container
         | 
| 10 | 
            -
                 | 
| 11 | 
            -
                include Equalizer | 
| 11 | 
            +
                include ROM::Support::Publisher
         | 
| 12 | 
            +
                include Dry::Equalizer(:gateways, :relations, :mappers, :commands)
         | 
| 12 13 |  | 
| 13 14 | 
             
                # @return [Hash] configured gateways
         | 
| 14 15 | 
             
                #
         | 
| 15 16 | 
             
                # @api public
         | 
| 16 17 | 
             
                attr_reader :gateways
         | 
| 17 18 |  | 
| 18 | 
            -
                deprecate :repositories, :gateways
         | 
| 19 | 
            -
             | 
| 20 19 | 
             
                # @return [RelationRegistry] relation registry
         | 
| 21 20 | 
             
                #
         | 
| 22 21 | 
             
                # @api private
         | 
| @@ -38,7 +37,6 @@ module ROM | |
| 38 37 | 
             
                  @relations = relations
         | 
| 39 38 | 
             
                  @mappers = mappers
         | 
| 40 39 | 
             
                  @commands = commands
         | 
| 41 | 
            -
                  freeze
         | 
| 42 40 | 
             
                end
         | 
| 43 41 |  | 
| 44 42 | 
             
                # Get lazy relation identified by its name
         | 
| @@ -77,7 +75,6 @@ module ROM | |
| 77 75 | 
             
                    relation
         | 
| 78 76 | 
             
                  end
         | 
| 79 77 | 
             
                end
         | 
| 80 | 
            -
                deprecate :read, :relation, "For mapping append `.map_with(:your_mapper_name)`"
         | 
| 81 78 |  | 
| 82 79 | 
             
                # Returns commands registry for the given relation
         | 
| 83 80 | 
             
                #
         | 
| @@ -99,7 +96,7 @@ module ROM | |
| 99 96 | 
             
                # @return [Command, Command::Graph]
         | 
| 100 97 | 
             
                #
         | 
| 101 98 | 
             
                # @api public
         | 
| 102 | 
            -
                def command(options)
         | 
| 99 | 
            +
                def command(options = nil)
         | 
| 103 100 | 
             
                  case options
         | 
| 104 101 | 
             
                  when Symbol
         | 
| 105 102 | 
             
                    name = options
         | 
| @@ -117,9 +114,15 @@ module ROM | |
| 117 114 | 
             
                    else
         | 
| 118 115 | 
             
                      graph
         | 
| 119 116 | 
             
                    end
         | 
| 117 | 
            +
                  when nil
         | 
| 118 | 
            +
                    Commands::Graph::Builder.new(self)
         | 
| 120 119 | 
             
                  else
         | 
| 121 120 | 
             
                    raise ArgumentError, "#{self.class}#command accepts a symbol or an array"
         | 
| 122 121 | 
             
                  end
         | 
| 123 122 | 
             
                end
         | 
| 123 | 
            +
                
         | 
| 124 | 
            +
                def disconnect
         | 
| 125 | 
            +
                  gateways.each_key(&:disconnect)
         | 
| 126 | 
            +
                end
         | 
| 124 127 | 
             
              end
         | 
| 125 128 | 
             
            end
         | 
| @@ -0,0 +1,61 @@ | |
| 1 | 
            +
            require 'rom/configuration'
         | 
| 2 | 
            +
            require 'rom/environment'
         | 
| 3 | 
            +
            require 'rom/setup'
         | 
| 4 | 
            +
            require 'rom/setup/finalize'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module ROM
         | 
| 7 | 
            +
              class CreateContainer
         | 
| 8 | 
            +
                include ROM::Support::Publisher
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                attr_reader :container
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def initialize(environment, setup)
         | 
| 13 | 
            +
                  @container = finalize(environment, setup)
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                private
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def finalize(environment, setup)
         | 
| 19 | 
            +
                  environment.configure do |config|
         | 
| 20 | 
            +
                    environment.gateways.each_key do |key|
         | 
| 21 | 
            +
                      gateway_config = config.gateways[key]
         | 
| 22 | 
            +
                      gateway_config.infer_relations = true unless gateway_config.key?(:infer_relations)
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  finalize = Finalize.new(
         | 
| 27 | 
            +
                    gateways: environment.gateways,
         | 
| 28 | 
            +
                    gateway_map: environment.gateways_map,
         | 
| 29 | 
            +
                    relation_classes: setup.relation_classes,
         | 
| 30 | 
            +
                    command_classes: setup.command_classes,
         | 
| 31 | 
            +
                    mappers: setup.mapper_classes,
         | 
| 32 | 
            +
                    config: environment.config.dup.freeze
         | 
| 33 | 
            +
                  )
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  finalize.run!
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              class InlineCreateContainer < CreateContainer
         | 
| 40 | 
            +
                def initialize(*args, &block)
         | 
| 41 | 
            +
                  case args.first
         | 
| 42 | 
            +
                  when Configuration
         | 
| 43 | 
            +
                    environment = args.first.environment
         | 
| 44 | 
            +
                    setup = args.first.setup
         | 
| 45 | 
            +
                  when Environment
         | 
| 46 | 
            +
                    environment = args.first
         | 
| 47 | 
            +
                    setup = args[1]
         | 
| 48 | 
            +
                  else
         | 
| 49 | 
            +
                    configuration = Configuration.new(*args, &block)
         | 
| 50 | 
            +
                    environment = configuration.environment
         | 
| 51 | 
            +
                    setup = configuration.setup
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  super(environment, setup)
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              def self.container(*args, &block)
         | 
| 59 | 
            +
                InlineCreateContainer.new(*args, &block).container
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
            end
         | 
    
        data/lib/rom/environment.rb
    CHANGED
    
    | @@ -1,272 +1,58 @@ | |
| 1 | 
            -
            require 'rom/ | 
| 2 | 
            -
            require 'rom/ | 
| 1 | 
            +
            require 'rom/support/configurable'
         | 
| 2 | 
            +
            require 'rom/gateway'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module ROM
         | 
| 5 | 
            -
              #  | 
| 5 | 
            +
              # Core gateway configuration interface
         | 
| 6 6 | 
             
              #
         | 
| 7 7 | 
             
              # @api public
         | 
| 8 8 | 
             
              class Environment
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
                #
         | 
| 11 | 
            -
                # @return [Hash]
         | 
| 12 | 
            -
                #
         | 
| 13 | 
            -
                # @api private
         | 
| 14 | 
            -
                attr_reader :gateways
         | 
| 9 | 
            +
                include Configurable
         | 
| 15 10 |  | 
| 16 | 
            -
                 | 
| 17 | 
            -
                #
         | 
| 18 | 
            -
                # This gets set to nil after setup is finalized
         | 
| 19 | 
            -
                #
         | 
| 20 | 
            -
                # @return [Setup]
         | 
| 21 | 
            -
                #
         | 
| 22 | 
            -
                # @api private
         | 
| 23 | 
            -
                attr_reader :boot
         | 
| 11 | 
            +
                attr_reader :gateways, :gateways_map
         | 
| 24 12 |  | 
| 25 | 
            -
                # Return ROM container configured by the setup
         | 
| 26 | 
            -
                #
         | 
| 27 | 
            -
                # @return [Container]
         | 
| 28 | 
            -
                #
         | 
| 29 13 | 
             
                # @api public
         | 
| 30 | 
            -
                 | 
| 31 | 
            -
                alias_method :env, :container
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                # @api private
         | 
| 34 | 
            -
                def initialize
         | 
| 14 | 
            +
                def initialize(*args)
         | 
| 35 15 | 
             
                  @gateways = {}
         | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
                # @api private
         | 
| 39 | 
            -
                def adapters
         | 
| 40 | 
            -
                  ROM.adapters
         | 
| 41 | 
            -
                end
         | 
| 16 | 
            +
                  @gateways_map = {}
         | 
| 42 17 |  | 
| 43 | 
            -
             | 
| 44 | 
            -
                def plugin_registry
         | 
| 45 | 
            -
                  ROM.plugin_registry
         | 
| 18 | 
            +
                  configure_gateways(*args) unless args.empty?
         | 
| 46 19 | 
             
                end
         | 
| 47 20 |  | 
| 48 | 
            -
                 | 
| 49 | 
            -
                #
         | 
| 50 | 
            -
                # @param [Mixed] The plugin identifier, usually a Symbol
         | 
| 51 | 
            -
                # @param [Hash] Plugin options
         | 
| 52 | 
            -
                #
         | 
| 53 | 
            -
                # @api public
         | 
| 54 | 
            -
                def use(plugin, options = {})
         | 
| 55 | 
            -
                  plugin_registry.environment.fetch(plugin).apply_to(self, options)
         | 
| 56 | 
            -
                end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
                # Starts the setup process for relations, mappers and commands.
         | 
| 59 | 
            -
                #
         | 
| 60 | 
            -
                # @overload setup(type, *args)
         | 
| 61 | 
            -
                #   Sets up a single-gateway environment given a gateway type provided
         | 
| 62 | 
            -
                #   under the ROM umbrella. For custom gateways, create an instance and
         | 
| 63 | 
            -
                #   pass it directly.
         | 
| 64 | 
            -
                #
         | 
| 65 | 
            -
                #   @param [Symbol] type
         | 
| 66 | 
            -
                #   @param [Array] *args
         | 
| 67 | 
            -
                #
         | 
| 68 | 
            -
                # @overload setup(gateway)
         | 
| 69 | 
            -
                #   @param [Gateway] gateway
         | 
| 70 | 
            -
                #
         | 
| 71 | 
            -
                # @overload setup(gateways)
         | 
| 72 | 
            -
                #   Sets up multiple gateways.
         | 
| 73 | 
            -
                #
         | 
| 74 | 
            -
                #   @param [Hash{Symbol=>Symbol,Array}] gateways
         | 
| 75 | 
            -
                #
         | 
| 76 | 
            -
                # @return [Setup] boot object
         | 
| 77 | 
            -
                #
         | 
| 78 | 
            -
                # @example
         | 
| 79 | 
            -
                #   # Use the in-memory adapter shipped with ROM as the default gateway.
         | 
| 80 | 
            -
                #   rom = ROM::Environment.new
         | 
| 81 | 
            -
                #   env = rom.setup(:memory, 'memory://test')
         | 
| 82 | 
            -
                #   # Use `rom-sql` with an in-memory sqlite database as default gateway.
         | 
| 83 | 
            -
                #   rom.setup(:sql, 'sqlite::memory')
         | 
| 84 | 
            -
                #   # Registers a `default` and a `warehouse` gateway.
         | 
| 85 | 
            -
                #   env = rom.setup(
         | 
| 86 | 
            -
                #     default: [:sql, 'sqlite::memory'],
         | 
| 87 | 
            -
                #     warehouse: [:sql, 'postgres://localhost/warehouse']
         | 
| 88 | 
            -
                #   )
         | 
| 89 | 
            -
                #
         | 
| 90 | 
            -
                # @example A full environment
         | 
| 91 | 
            -
                #
         | 
| 92 | 
            -
                #   rom = ROM::Environment.new
         | 
| 93 | 
            -
                #   rom.setup(:memory, 'memory://test')
         | 
| 94 | 
            -
                #
         | 
| 95 | 
            -
                #   rom.relation(:users) do
         | 
| 96 | 
            -
                #     # ...
         | 
| 97 | 
            -
                #   end
         | 
| 98 | 
            -
                #
         | 
| 99 | 
            -
                #   rom.mappers do
         | 
| 100 | 
            -
                #     define(:users) do
         | 
| 101 | 
            -
                #       # ...
         | 
| 102 | 
            -
                #     end
         | 
| 103 | 
            -
                #   end
         | 
| 104 | 
            -
                #
         | 
| 105 | 
            -
                #   rom.commands(:users) do
         | 
| 106 | 
            -
                #     define(:create) do
         | 
| 107 | 
            -
                #       # ...
         | 
| 108 | 
            -
                #     end
         | 
| 109 | 
            -
                #   end
         | 
| 110 | 
            -
                #
         | 
| 111 | 
            -
                #   rom.finalize # builds the container
         | 
| 112 | 
            -
                #   rom.container # returns the container registry
         | 
| 113 | 
            -
                #
         | 
| 114 | 
            -
                # @api public
         | 
| 115 | 
            -
                def setup(*args, &block)
         | 
| 116 | 
            -
                  config = setup_config(*args)
         | 
| 117 | 
            -
                  configured_gateways = setup_gateways(config)
         | 
| 118 | 
            -
             | 
| 119 | 
            -
                  default_adapter = gateways.fetch(
         | 
| 120 | 
            -
                    configured_gateways[:default], adapters.keys.first
         | 
| 121 | 
            -
                  )
         | 
| 21 | 
            +
                private
         | 
| 122 22 |  | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
                  )
         | 
| 23 | 
            +
                def configure_gateways(*args)
         | 
| 24 | 
            +
                  normalized_gateway_args = normalize_gateway_args(*args)
         | 
| 25 | 
            +
                  normalized_gateways = normalize_gateways(normalized_gateway_args)
         | 
| 127 26 |  | 
| 128 | 
            -
                   | 
| 129 | 
            -
                    options = config_args.is_a?(Array) && config_args.last
         | 
| 130 | 
            -
                    load_config(@boot.config.gateways[name], options) if options.is_a?(Hash)
         | 
| 131 | 
            -
                  end
         | 
| 27 | 
            +
                  @gateways, @gateways_map = normalized_gateways.values_at(:gateways, :map)
         | 
| 132 28 |  | 
| 133 | 
            -
                   | 
| 134 | 
            -
                     | 
| 135 | 
            -
                     | 
| 136 | 
            -
                    finalize.container
         | 
| 137 | 
            -
                  else
         | 
| 138 | 
            -
                    @boot
         | 
| 29 | 
            +
                  normalized_gateway_args.each_with_object(config) do |(name, gateway_config), config|
         | 
| 30 | 
            +
                    options = gateway_config.is_a?(Array) && gateway_config.last
         | 
| 31 | 
            +
                    load_config(config.gateways[name], options) if options.is_a?(Hash)
         | 
| 139 32 | 
             
                  end
         | 
| 140 33 | 
             
                end
         | 
| 141 34 |  | 
| 142 | 
            -
                # Check if auto-registration is enabled for this environment
         | 
| 143 | 
            -
                #
         | 
| 144 | 
            -
                # @api private
         | 
| 145 | 
            -
                def auto_registration?
         | 
| 146 | 
            -
                  false
         | 
| 147 | 
            -
                end
         | 
| 148 | 
            -
             | 
| 149 | 
            -
                # Global relation setup DSL
         | 
| 150 | 
            -
                #
         | 
| 151 | 
            -
                # @example
         | 
| 152 | 
            -
                #   rom = ROM::Environment.new
         | 
| 153 | 
            -
                #   rom.setup(:memory)
         | 
| 154 | 
            -
                #
         | 
| 155 | 
            -
                #   rom.relation(:users) do
         | 
| 156 | 
            -
                #     def by_name(name)
         | 
| 157 | 
            -
                #       restrict(name: name)
         | 
| 158 | 
            -
                #     end
         | 
| 159 | 
            -
                #   end
         | 
| 160 | 
            -
                #
         | 
| 161 | 
            -
                # @api public
         | 
| 162 | 
            -
                def relation(*args, &block)
         | 
| 163 | 
            -
                  boot.relation(*args, &block)
         | 
| 164 | 
            -
                end
         | 
| 165 | 
            -
             | 
| 166 | 
            -
                # Global commands setup DSL
         | 
| 167 | 
            -
                #
         | 
| 168 | 
            -
                # @example
         | 
| 169 | 
            -
                #   rom = ROM::Environment.new
         | 
| 170 | 
            -
                #   rom.setup(:memory)
         | 
| 171 | 
            -
                #
         | 
| 172 | 
            -
                #   rom.commands(:users) do
         | 
| 173 | 
            -
                #     define(:create) do
         | 
| 174 | 
            -
                #       # ..
         | 
| 175 | 
            -
                #     end
         | 
| 176 | 
            -
                #   end
         | 
| 177 | 
            -
                #
         | 
| 178 | 
            -
                # @api public
         | 
| 179 | 
            -
                def commands(*args, &block)
         | 
| 180 | 
            -
                  boot.commands(*args, &block)
         | 
| 181 | 
            -
                end
         | 
| 182 | 
            -
             | 
| 183 | 
            -
                # Global mapper setup DSL
         | 
| 184 | 
            -
                #
         | 
| 185 | 
            -
                # @example
         | 
| 186 | 
            -
                #   rom = ROM::Environment.new
         | 
| 187 | 
            -
                #   rom.setup(:memory)
         | 
| 188 | 
            -
                #
         | 
| 189 | 
            -
                #   rom.mappers do
         | 
| 190 | 
            -
                #     define(:uses) do
         | 
| 191 | 
            -
                #       # ..
         | 
| 192 | 
            -
                #     end
         | 
| 193 | 
            -
                #   end
         | 
| 194 | 
            -
                #
         | 
| 195 | 
            -
                # @api public
         | 
| 196 | 
            -
                def mappers(*args, &block)
         | 
| 197 | 
            -
                  boot.mappers(*args, &block)
         | 
| 198 | 
            -
                end
         | 
| 199 | 
            -
             | 
| 200 | 
            -
                # Finalize the setup and store default global container under
         | 
| 201 | 
            -
                # ROM::Environmrnt#container
         | 
| 202 | 
            -
                #
         | 
| 203 | 
            -
                # @example
         | 
| 204 | 
            -
                #   rom = ROM::Environment.new
         | 
| 205 | 
            -
                #   rom.setup(:memory)
         | 
| 206 | 
            -
                #   rom.finalize # => rom
         | 
| 207 | 
            -
                #   rom.boot # => nil
         | 
| 208 | 
            -
                #   rom.container # => the container
         | 
| 209 | 
            -
                #
         | 
| 210 | 
            -
                # @return [ROM]
         | 
| 211 | 
            -
                #
         | 
| 212 | 
            -
                # @api public
         | 
| 213 | 
            -
                def finalize
         | 
| 214 | 
            -
                  @container = boot.finalize
         | 
| 215 | 
            -
                  self
         | 
| 216 | 
            -
                ensure
         | 
| 217 | 
            -
                  @boot = nil
         | 
| 218 | 
            -
                end
         | 
| 219 | 
            -
             | 
| 220 | 
            -
                # Relation subclass registration during setup phase
         | 
| 221 | 
            -
                #
         | 
| 222 | 
            -
                # @api private
         | 
| 223 | 
            -
                def register_relation(klass)
         | 
| 224 | 
            -
                  boot.register_relation(klass) if boot
         | 
| 225 | 
            -
                end
         | 
| 226 | 
            -
             | 
| 227 | 
            -
                # Mapper subclass registration during setup phase
         | 
| 228 | 
            -
                #
         | 
| 229 | 
            -
                # @api private
         | 
| 230 | 
            -
                def register_mapper(klass)
         | 
| 231 | 
            -
                  boot.register_mapper(klass) if boot
         | 
| 232 | 
            -
                end
         | 
| 233 | 
            -
             | 
| 234 | 
            -
                # Command subclass registration during setup phase
         | 
| 235 | 
            -
                #
         | 
| 236 | 
            -
                # @api private
         | 
| 237 | 
            -
                def register_command(klass)
         | 
| 238 | 
            -
                  boot.register_command(klass) if boot
         | 
| 239 | 
            -
                end
         | 
| 240 | 
            -
             | 
| 241 | 
            -
                # Return gateway config that was used to setup this environment's container
         | 
| 242 | 
            -
                #
         | 
| 243 | 
            -
                # @return [Configurable::Config]
         | 
| 244 | 
            -
                #
         | 
| 245 | 
            -
                # @api public
         | 
| 246 | 
            -
                def config
         | 
| 247 | 
            -
                  boot.config
         | 
| 248 | 
            -
                end
         | 
| 249 35 |  | 
| 250 | 
            -
                private
         | 
| 251 | 
            -
             | 
| 252 | 
            -
                # Helper method to handle single- or multi-repo setup options
         | 
| 253 | 
            -
                #
         | 
| 254 36 | 
             
                # @api private
         | 
| 255 | 
            -
                def  | 
| 256 | 
            -
                  args.first.is_a?(Hash) ? args.first : { | 
| 37 | 
            +
                def normalize_gateway_args(*args)
         | 
| 38 | 
            +
                  args.first.is_a?(Hash) ? args.first : {default: args}
         | 
| 257 39 | 
             
                end
         | 
| 258 40 |  | 
| 259 41 | 
             
                # Build gateways using the setup interface
         | 
| 260 42 | 
             
                #
         | 
| 261 43 | 
             
                # @api private
         | 
| 262 | 
            -
                def  | 
| 263 | 
            -
                   | 
| 44 | 
            +
                def normalize_gateways(gateways_config)
         | 
| 45 | 
            +
                  gateways_config.each_with_object({map: {}, gateways: {}}) do |(name, spec), hash|
         | 
| 264 46 | 
             
                    identifier, *args = Array(spec)
         | 
| 265 47 |  | 
| 266 | 
            -
                     | 
| 267 | 
            -
             | 
| 48 | 
            +
                    if identifier.is_a?(Gateway)
         | 
| 49 | 
            +
                      gateway = identifier
         | 
| 50 | 
            +
                    else
         | 
| 51 | 
            +
                      gateway = Gateway.setup(identifier, *(args.flatten))
         | 
| 52 | 
            +
                      hash[:map][gateway] = identifier
         | 
| 53 | 
            +
                    end
         | 
| 268 54 |  | 
| 269 | 
            -
                    gateways[ | 
| 55 | 
            +
                    hash[:gateways][name] = gateway
         | 
| 270 56 | 
             
                  end
         | 
| 271 57 | 
             
                end
         | 
| 272 58 |  |