rom-core 4.0.2 → 4.1.0
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/CHANGELOG.md +20 -0
- data/README.md +1 -1
- data/lib/rom/associations/definitions/abstract.rb +1 -1
- data/lib/rom/associations/through_identifier.rb +2 -2
- data/lib/rom/command_compiler.rb +14 -8
- data/lib/rom/command_proxy.rb +2 -2
- data/lib/rom/commands/class_interface.rb +6 -6
- data/lib/rom/configuration_dsl/command.rb +4 -4
- data/lib/rom/configuration_dsl/relation.rb +2 -2
- data/lib/rom/core.rb +2 -0
- data/lib/rom/gateway.rb +25 -0
- data/lib/rom/mapper_registry.rb +3 -1
- data/lib/rom/memory.rb +1 -0
- data/lib/rom/memory/mapper_compiler.rb +8 -0
- data/lib/rom/memory/relation.rb +7 -0
- data/lib/rom/plugin.rb +1 -1
- data/lib/rom/plugins/command/timestamps.rb +150 -0
- data/lib/rom/registry.rb +10 -0
- data/lib/rom/relation.rb +2 -2
- data/lib/rom/relation/class_interface.rb +20 -2
- data/lib/rom/relation/combined.rb +2 -2
- data/lib/rom/relation/commands.rb +2 -2
- data/lib/rom/schema/associations_dsl.rb +2 -2
- data/lib/rom/setup/auto_registration.rb +2 -2
- data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +4 -4
- data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +2 -2
- data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +2 -2
- data/lib/rom/setup/finalize/finalize_commands.rb +1 -1
- data/lib/rom/setup/finalize/finalize_relations.rb +13 -4
- data/lib/rom/support/inflector.rb +7 -0
- data/lib/rom/support/notifications.rb +10 -0
- data/lib/rom/version.rb +1 -1
- metadata +35 -24
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b493c6e32485de5b046e45b4d152c132da1cc72e
         | 
| 4 | 
            +
              data.tar.gz: 6950b1e104d52dcfdfcbe4e65bf195862589a9d4
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 72e458a263d518a0886f281b0f2eed44b0e819b3405b2f79e9bcd8f23cb8e505a40929721c975b3a0e1862bf81714a46785d2747a6f867b6cc7cde9f642461ab
         | 
| 7 | 
            +
              data.tar.gz: 6d7b2eaf896b27e9b773867c3a92780e27f517fb1e40cb191356472c781c10bb6b121aeabed42c495efcddd3d7af86ebabead413d9b50f16fc42e53acd601856
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,23 @@ | |
| 1 | 
            +
            # v4.1.0 2017-11-17
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ## Added
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Support for providing a custom mapper compiler by adapters (solnic)
         | 
| 6 | 
            +
            * Support for aliased attributes in auto-mapping (solnic)
         | 
| 7 | 
            +
            * Support for command plugin options, ie `use :timestamps, timestamps: %i(created_at, updated_at), datestamps: %i(:written_on)` (GustavoCaso)
         | 
| 8 | 
            +
            * `''configuration.relations.class.ready''` event is triggered with `:adapter` filter (solnic)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            ## Fixed
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            * `'configuration.commands.class.before_build'` event is triggered with `:adapter` set, so that adapters can subscribe only to their events. This fixes a bug where an incorrect adapter would try to handle this event with a command class coming from another adapter (solnic)
         | 
| 13 | 
            +
            * Command compiler no longer uses global temporary registry (solnic)
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            ## Changed
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            * Uses `dry-inflector` now (solnic)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            [Compare v4.0.2...v4.1.0](https://github.com/rom-rb/rom/compare/v4.0.2...v4.1.0)
         | 
| 20 | 
            +
             | 
| 1 21 | 
             
            # v4.0.2 2017-11-02
         | 
| 2 22 |  | 
| 3 23 | 
             
            ## Added
         | 
    
        data/README.md
    CHANGED
    
    
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require ' | 
| 1 | 
            +
            require 'rom/support/inflector'
         | 
| 2 2 |  | 
| 3 3 | 
             
            module ROM
         | 
| 4 4 | 
             
              module Associations
         | 
| @@ -20,7 +20,7 @@ module ROM | |
| 20 20 |  | 
| 21 21 | 
             
                  # @api private
         | 
| 22 22 | 
             
                  def self.default_assoc_name(relation)
         | 
| 23 | 
            -
                     | 
| 23 | 
            +
                    Inflector.singularize(relation).to_sym
         | 
| 24 24 | 
             
                  end
         | 
| 25 25 |  | 
| 26 26 | 
             
                  # @api private
         | 
    
        data/lib/rom/command_compiler.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require ' | 
| 1 | 
            +
            require 'rom/support/inflector'
         | 
| 2 2 |  | 
| 3 3 | 
             
            require 'rom/initializer'
         | 
| 4 4 | 
             
            require 'rom/commands'
         | 
| @@ -17,7 +17,7 @@ module ROM | |
| 17 17 |  | 
| 18 18 | 
             
                # @api private
         | 
| 19 19 | 
             
                def self.registry
         | 
| 20 | 
            -
                   | 
| 20 | 
            +
                  Hash.new { |h, k| h[k] = {} }
         | 
| 21 21 | 
             
                end
         | 
| 22 22 |  | 
| 23 23 | 
             
                # @!attribute [r] gateways
         | 
| @@ -52,6 +52,10 @@ module ROM | |
| 52 52 | 
             
                #   @return [Array<Symbol>] a list of optional plugins that will be enabled for commands
         | 
| 53 53 | 
             
                option :plugins, optional: true, default: -> { EMPTY_ARRAY }
         | 
| 54 54 |  | 
| 55 | 
            +
                # @!attribute [r] plugins_options
         | 
| 56 | 
            +
                #   @return [Hash] a hash of options for the plugins
         | 
| 57 | 
            +
                option :plugins_options, optional: true, default: -> { EMPTY_HASH }
         | 
| 58 | 
            +
             | 
| 55 59 | 
             
                # @!attribute [r] meta
         | 
| 56 60 | 
             
                #   @return [Array<Symbol>] Meta data for a command
         | 
| 57 61 | 
             
                option :meta, optional: true
         | 
| @@ -82,12 +86,13 @@ module ROM | |
| 82 86 | 
             
                # @api private
         | 
| 83 87 | 
             
                def call(*args)
         | 
| 84 88 | 
             
                  cache.fetch_or_store(args.hash) do
         | 
| 85 | 
            -
                    type, adapter, ast, plugins, meta = args
         | 
| 89 | 
            +
                    type, adapter, ast, plugins, plugins_options, meta = args
         | 
| 86 90 |  | 
| 87 91 | 
             
                    compiler = with(
         | 
| 88 92 | 
             
                      id: type,
         | 
| 89 93 | 
             
                      adapter: adapter,
         | 
| 90 94 | 
             
                      plugins: Array(plugins),
         | 
| 95 | 
            +
                      plugins_options: plugins_options,
         | 
| 91 96 | 
             
                      meta: meta
         | 
| 92 97 | 
             
                    )
         | 
| 93 98 |  | 
| @@ -107,7 +112,7 @@ module ROM | |
| 107 112 |  | 
| 108 113 | 
             
                # @api private
         | 
| 109 114 | 
             
                def type
         | 
| 110 | 
            -
                  @_type ||= Commands.const_get( | 
| 115 | 
            +
                  @_type ||= Commands.const_get(Inflector.classify(id))[adapter]
         | 
| 111 116 | 
             
                rescue NameError
         | 
| 112 117 | 
             
                  nil
         | 
| 113 118 | 
             
                end
         | 
| @@ -132,7 +137,7 @@ module ROM | |
| 132 137 | 
             
                      if meta[:combine_type] == :many
         | 
| 133 138 | 
             
                        name
         | 
| 134 139 | 
             
                      else
         | 
| 135 | 
            -
                        {  | 
| 140 | 
            +
                        { Inflector.singularize(name).to_sym => name }
         | 
| 136 141 | 
             
                      end
         | 
| 137 142 |  | 
| 138 143 | 
             
                    mapping =
         | 
| @@ -191,14 +196,15 @@ module ROM | |
| 191 196 | 
             
                    end
         | 
| 192 197 |  | 
| 193 198 | 
             
                    plugins.each do |plugin|
         | 
| 194 | 
            -
                       | 
| 199 | 
            +
                      plugin_options = plugins_options.fetch(plugin) { EMPTY_HASH }
         | 
| 200 | 
            +
                      klass.use(plugin, plugin_options)
         | 
| 195 201 | 
             
                    end
         | 
| 196 202 |  | 
| 197 203 | 
             
                    gateway = gateways[relation.gateway]
         | 
| 198 204 |  | 
| 199 205 | 
             
                    notifications.trigger(
         | 
| 200 206 | 
             
                      'configuration.commands.class.before_build',
         | 
| 201 | 
            -
                      command: klass, gateway: gateway, dataset: relation.dataset
         | 
| 207 | 
            +
                      command: klass, gateway: gateway, dataset: relation.dataset, adapter: adapter
         | 
| 202 208 | 
             
                    )
         | 
| 203 209 |  | 
| 204 210 | 
             
                    klass.extend_for_relation(relation) if klass.restrictable
         | 
| @@ -227,7 +233,7 @@ module ROM | |
| 227 233 | 
             
                    if relation.associations.key?(parent_relation)
         | 
| 228 234 | 
             
                      parent_relation
         | 
| 229 235 | 
             
                    else
         | 
| 230 | 
            -
                      singular_name =  | 
| 236 | 
            +
                      singular_name = Inflector.singularize(parent_relation).to_sym
         | 
| 231 237 | 
             
                      singular_name if relation.associations.key?(singular_name)
         | 
| 232 238 | 
             
                    end
         | 
| 233 239 |  | 
    
        data/lib/rom/command_proxy.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require ' | 
| 1 | 
            +
            require 'rom/support/inflector'
         | 
| 2 2 |  | 
| 3 3 | 
             
            module ROM
         | 
| 4 4 | 
             
              # TODO: look into making command graphs work without the root key in the input
         | 
| @@ -9,7 +9,7 @@ module ROM | |
| 9 9 | 
             
                attr_reader :command, :root
         | 
| 10 10 |  | 
| 11 11 | 
             
                # @api private
         | 
| 12 | 
            -
                def initialize(command, root =  | 
| 12 | 
            +
                def initialize(command, root = Inflector.singularize(command.name.relation).to_sym)
         | 
| 13 13 | 
             
                  @command = command
         | 
| 14 14 | 
             
                  @root = root
         | 
| 15 15 | 
             
                end
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            require 'dry/core/class_builder'
         | 
| 2 | 
            -
            require ' | 
| 2 | 
            +
            require 'rom/support/inflector'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module ROM
         | 
| 5 5 | 
             
              # Base command class with factory class-level interface and setup-related logic
         | 
| @@ -39,7 +39,7 @@ module ROM | |
| 39 39 | 
             
                  #
         | 
| 40 40 | 
             
                  # @api public
         | 
| 41 41 | 
             
                  def [](adapter)
         | 
| 42 | 
            -
                    adapter_namespace(adapter).const_get( | 
| 42 | 
            +
                    adapter_namespace(adapter).const_get(Inflector.demodulize(name))
         | 
| 43 43 | 
             
                  end
         | 
| 44 44 |  | 
| 45 45 | 
             
                  # Return namespaces that contains command subclasses of a specific adapter
         | 
| @@ -85,7 +85,7 @@ module ROM | |
| 85 85 | 
             
                  # @api public
         | 
| 86 86 | 
             
                  def create_class(name, type, &block)
         | 
| 87 87 | 
             
                    klass = Dry::Core::ClassBuilder
         | 
| 88 | 
            -
                      .new(name: "#{ | 
| 88 | 
            +
                      .new(name: "#{Inflector.classify(type)}[:#{name}]", parent: type)
         | 
| 89 89 | 
             
                      .call
         | 
| 90 90 |  | 
| 91 91 | 
             
                    if block
         | 
| @@ -109,8 +109,8 @@ module ROM | |
| 109 109 | 
             
                  # @option _options [Symbol] :adapter (:default) first adapter to check for plugin
         | 
| 110 110 | 
             
                  #
         | 
| 111 111 | 
             
                  # @api public
         | 
| 112 | 
            -
                  def use(plugin,  | 
| 113 | 
            -
                    ROM.plugin_registry.commands.fetch(plugin, adapter).apply_to(self)
         | 
| 112 | 
            +
                  def use(plugin, options = EMPTY_HASH)
         | 
| 113 | 
            +
                    ROM.plugin_registry.commands.fetch(plugin, adapter).apply_to(self, options)
         | 
| 114 114 | 
             
                  end
         | 
| 115 115 |  | 
| 116 116 | 
             
                  # Extend a command class with relation view methods
         | 
| @@ -235,7 +235,7 @@ module ROM | |
| 235 235 | 
             
                  #
         | 
| 236 236 | 
             
                  # @api private
         | 
| 237 237 | 
             
                  def default_name
         | 
| 238 | 
            -
                     | 
| 238 | 
            +
                    Inflector.underscore(Inflector.demodulize(name)).to_sym
         | 
| 239 239 | 
             
                  end
         | 
| 240 240 |  | 
| 241 241 | 
             
                  # Return default options based on class macros
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require ' | 
| 1 | 
            +
            require 'rom/support/inflector'
         | 
| 2 2 | 
             
            require 'dry/core/class_builder'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module ROM
         | 
| @@ -14,7 +14,7 @@ module ROM | |
| 14 14 | 
             
                  # @api private
         | 
| 15 15 | 
             
                  def self.build_class(name, relation, options = EMPTY_HASH, &block)
         | 
| 16 16 | 
             
                    type = options.fetch(:type) { name }
         | 
| 17 | 
            -
                    command_type =  | 
| 17 | 
            +
                    command_type = Inflector.classify(type)
         | 
| 18 18 | 
             
                    adapter = options.fetch(:adapter)
         | 
| 19 19 | 
             
                    parent = ROM::Command.adapter_namespace(adapter).const_get(command_type)
         | 
| 20 20 | 
             
                    class_name = generate_class_name(adapter, command_type, relation)
         | 
| @@ -31,9 +31,9 @@ module ROM | |
| 31 31 | 
             
                  # @api private
         | 
| 32 32 | 
             
                  def self.generate_class_name(adapter, command_type, relation)
         | 
| 33 33 | 
             
                    pieces = ['ROM']
         | 
| 34 | 
            -
                    pieces <<  | 
| 34 | 
            +
                    pieces << Inflector.classify(adapter)
         | 
| 35 35 | 
             
                    pieces << 'Commands'
         | 
| 36 | 
            -
                    pieces << "#{command_type}[#{ | 
| 36 | 
            +
                    pieces << "#{command_type}[#{Inflector.classify(relation)}s]"
         | 
| 37 37 | 
             
                    pieces.join('::')
         | 
| 38 38 | 
             
                  end
         | 
| 39 39 | 
             
                end
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            require 'dry/core/class_builder'
         | 
| 2 | 
            -
            require ' | 
| 2 | 
            +
            require 'rom/support/inflector'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module ROM
         | 
| 5 5 | 
             
              module ConfigurationDSL
         | 
| @@ -13,7 +13,7 @@ module ROM | |
| 13 13 | 
             
                  #
         | 
| 14 14 | 
             
                  # @api private
         | 
| 15 15 | 
             
                  def self.build_class(name, options = EMPTY_HASH)
         | 
| 16 | 
            -
                    class_name = "ROM::Relation[#{ | 
| 16 | 
            +
                    class_name = "ROM::Relation[#{Inflector.camelize(name)}]"
         | 
| 17 17 | 
             
                    adapter = options.fetch(:adapter)
         | 
| 18 18 |  | 
| 19 19 | 
             
                    Dry::Core::ClassBuilder.new(name: class_name, parent: ROM::Relation[adapter]).call do |klass|
         | 
    
        data/lib/rom/core.rb
    CHANGED
    
    | @@ -29,6 +29,7 @@ require 'rom/create_container' | |
| 29 29 | 
             
            require 'rom/plugins/relation/registry_reader'
         | 
| 30 30 | 
             
            require 'rom/plugins/relation/instrumentation'
         | 
| 31 31 | 
             
            require 'rom/plugins/command/schema'
         | 
| 32 | 
            +
            require 'rom/plugins/command/timestamps'
         | 
| 32 33 | 
             
            require 'rom/plugins/schema/timestamps'
         | 
| 33 34 |  | 
| 34 35 | 
             
            module ROM
         | 
| @@ -40,5 +41,6 @@ module ROM | |
| 40 41 | 
             
                register :registry_reader, ROM::Plugins::Relation::RegistryReader, type: :relation
         | 
| 41 42 | 
             
                register :instrumentation, ROM::Plugins::Relation::Instrumentation, type: :relation
         | 
| 42 43 | 
             
                register :schema, ROM::Plugins::Command::Schema, type: :command
         | 
| 44 | 
            +
                register :timestamps, ROM::Plugins::Command::Timestamps, type: :command
         | 
| 43 45 | 
             
              end
         | 
| 44 46 | 
             
            end
         | 
    
        data/lib/rom/gateway.rb
    CHANGED
    
    | @@ -32,6 +32,22 @@ module ROM | |
| 32 32 | 
             
                #    @param [Symbol] adapter The adapter identifier
         | 
| 33 33 | 
             
                defines :adapter
         | 
| 34 34 |  | 
| 35 | 
            +
                # @!method self.mapper_compiler
         | 
| 36 | 
            +
                #  Get or set gateway-specific mapper compiler class
         | 
| 37 | 
            +
                #
         | 
| 38 | 
            +
                #  @overload mapper_compiler
         | 
| 39 | 
            +
                #    Return mapper compiler class
         | 
| 40 | 
            +
                #    @return [Class]
         | 
| 41 | 
            +
                #
         | 
| 42 | 
            +
                #  @overload mapper_compiler(klass)
         | 
| 43 | 
            +
                #    @example
         | 
| 44 | 
            +
                #      class MyGateway < ROM::Gateway
         | 
| 45 | 
            +
                #        mapper_compiler MyMapperCompiler
         | 
| 46 | 
            +
                #      end
         | 
| 47 | 
            +
                #
         | 
| 48 | 
            +
                #    @param [Class] klass The mapper compiler class
         | 
| 49 | 
            +
                defines :mapper_compiler
         | 
| 50 | 
            +
             | 
| 35 51 | 
             
                # @!attribute [r] connection
         | 
| 36 52 | 
             
                #   @return [Object] The gateway's connection object (type varies across adapters)
         | 
| 37 53 | 
             
                attr_reader :connection
         | 
| @@ -178,6 +194,15 @@ module ROM | |
| 178 194 | 
             
                  transaction_runner(opts).run(opts, &block)
         | 
| 179 195 | 
             
                end
         | 
| 180 196 |  | 
| 197 | 
            +
                # Return configured mapper compiler class
         | 
| 198 | 
            +
                #
         | 
| 199 | 
            +
                # @return [Class]
         | 
| 200 | 
            +
                #
         | 
| 201 | 
            +
                # @api private
         | 
| 202 | 
            +
                def mapper_compiler
         | 
| 203 | 
            +
                  self.class.mapper_compiler
         | 
| 204 | 
            +
                end
         | 
| 205 | 
            +
             | 
| 181 206 | 
             
                private
         | 
| 182 207 |  | 
| 183 208 | 
             
                # @api private
         | 
    
        data/lib/rom/mapper_registry.rb
    CHANGED
    
    | @@ -12,7 +12,9 @@ module ROM | |
| 12 12 |  | 
| 13 13 | 
             
                # @!attribute [r] compiler
         | 
| 14 14 | 
             
                #   @return [MapperCompiler] A mapper compiler instance
         | 
| 15 | 
            -
                option :compiler, default: ->  | 
| 15 | 
            +
                option :compiler, default: -> do
         | 
| 16 | 
            +
                  MapperCompiler.new(cache: cache)
         | 
| 17 | 
            +
                end
         | 
| 16 18 |  | 
| 17 19 | 
             
                # @see Registry
         | 
| 18 20 | 
             
                # @api public
         | 
    
        data/lib/rom/memory.rb
    CHANGED
    
    
    
        data/lib/rom/memory/relation.rb
    CHANGED
    
    
    
        data/lib/rom/plugin.rb
    CHANGED
    
    
| @@ -0,0 +1,150 @@ | |
| 1 | 
            +
            require 'set'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ROM
         | 
| 4 | 
            +
              module Plugins
         | 
| 5 | 
            +
                module Command
         | 
| 6 | 
            +
                  # A plugin for automatically adding timestamp values
         | 
| 7 | 
            +
                  # when executing a command
         | 
| 8 | 
            +
                  #
         | 
| 9 | 
            +
                  # Set up attributes to timestamp when the command is called
         | 
| 10 | 
            +
                  #
         | 
| 11 | 
            +
                  # @example
         | 
| 12 | 
            +
                  #   class CreateTask < ROM::Commands::Create[:sql]
         | 
| 13 | 
            +
                  #     result :one
         | 
| 14 | 
            +
                  #     use :timestamps, timestamps: %i(created_at, updated_at), datestamps: %i(:written)
         | 
| 15 | 
            +
                  #   end
         | 
| 16 | 
            +
                  #
         | 
| 17 | 
            +
                  #   create_user = rom.command(:user).create.curry(name: 'Jane')
         | 
| 18 | 
            +
                  #
         | 
| 19 | 
            +
                  #   result = create_user.call
         | 
| 20 | 
            +
                  #   result[:created_at]  #=> Time.now.utc
         | 
| 21 | 
            +
                  #
         | 
| 22 | 
            +
                  # @api public
         | 
| 23 | 
            +
                  class Timestamps < Module
         | 
| 24 | 
            +
                    attr_reader :timestamps, :datestamps
         | 
| 25 | 
            +
                    def initialize(timestamps: [], datestamps: [])
         | 
| 26 | 
            +
                      @timestamps = store_attributes(timestamps)
         | 
| 27 | 
            +
                      @datestamps = store_attributes(datestamps)
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    # @api private
         | 
| 31 | 
            +
                    def store_attributes(attr)
         | 
| 32 | 
            +
                      attr.is_a?(Array) ? attr : Array[attr]
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    # @api private
         | 
| 36 | 
            +
                    def included(klass)
         | 
| 37 | 
            +
                      initialize_timestamp_attributes(klass)
         | 
| 38 | 
            +
                      klass.include(InstanceMethods)
         | 
| 39 | 
            +
                      klass.extend(ClassInterface)
         | 
| 40 | 
            +
                      super
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    def initialize_timestamp_attributes(klass)
         | 
| 44 | 
            +
                      klass.defines :timestamp_columns, :datestamp_columns
         | 
| 45 | 
            +
                      klass.timestamp_columns Set.new
         | 
| 46 | 
            +
                      klass.datestamp_columns Set.new
         | 
| 47 | 
            +
                      klass.before :set_timestamps
         | 
| 48 | 
            +
                      klass.timestamp_columns klass.timestamp_columns.merge(timestamps) if timestamps.any?
         | 
| 49 | 
            +
                      klass.datestamp_columns klass.datestamp_columns.merge(datestamps) if datestamps.any?
         | 
| 50 | 
            +
                    end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    module InstanceMethods
         | 
| 53 | 
            +
                      # @api private
         | 
| 54 | 
            +
                      def timestamp_columns
         | 
| 55 | 
            +
                        self.class.timestamp_columns
         | 
| 56 | 
            +
                      end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                      # @api private
         | 
| 59 | 
            +
                      def datestamp_columns
         | 
| 60 | 
            +
                        self.class.datestamp_columns
         | 
| 61 | 
            +
                      end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                      # Set the timestamp attributes on the given tuples
         | 
| 64 | 
            +
                      #
         | 
| 65 | 
            +
                      # @param [Array<Hash>, Hash] tuples the input tuple(s)
         | 
| 66 | 
            +
                      #
         | 
| 67 | 
            +
                      # @return [Array<Hash>, Hash]
         | 
| 68 | 
            +
                      #
         | 
| 69 | 
            +
                      # @api private
         | 
| 70 | 
            +
                      def set_timestamps(tuples, *)
         | 
| 71 | 
            +
                        timestamps = build_timestamps
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                        case tuples
         | 
| 74 | 
            +
                        when Hash
         | 
| 75 | 
            +
                          timestamps.merge(tuples)
         | 
| 76 | 
            +
                        when Array
         | 
| 77 | 
            +
                          tuples.map { |t| timestamps.merge(t) }
         | 
| 78 | 
            +
                        end
         | 
| 79 | 
            +
                      end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                      private
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                      # @api private
         | 
| 84 | 
            +
                      def build_timestamps
         | 
| 85 | 
            +
                        time        = Time.now.utc
         | 
| 86 | 
            +
                        date        = Date.today
         | 
| 87 | 
            +
                        timestamps  = {}
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                        timestamp_columns.each do |column|
         | 
| 90 | 
            +
                          timestamps[column.to_sym] = time
         | 
| 91 | 
            +
                        end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                        datestamp_columns.each do |column|
         | 
| 94 | 
            +
                          timestamps[column.to_sym] = date
         | 
| 95 | 
            +
                        end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                        timestamps
         | 
| 98 | 
            +
                      end
         | 
| 99 | 
            +
                    end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                    module ClassInterface
         | 
| 102 | 
            +
                      # @api private
         | 
| 103 | 
            +
                      # Set up attributes to timestamp when the command is called
         | 
| 104 | 
            +
                      #
         | 
| 105 | 
            +
                      # @example
         | 
| 106 | 
            +
                      #   class CreateTask < ROM::Commands::Create[:sql]
         | 
| 107 | 
            +
                      #     result :one
         | 
| 108 | 
            +
                      #     use :timestamps
         | 
| 109 | 
            +
                      #     timestamps :created_at, :updated_at
         | 
| 110 | 
            +
                      #   end
         | 
| 111 | 
            +
                      #
         | 
| 112 | 
            +
                      #   create_user = rom.command(:user).create.curry(name: 'Jane')
         | 
| 113 | 
            +
                      #
         | 
| 114 | 
            +
                      #   result = create_user.call
         | 
| 115 | 
            +
                      #   result[:created_at]  #=> Time.now.utc
         | 
| 116 | 
            +
                      #
         | 
| 117 | 
            +
                      # @param [Array<Symbol>] names A list of attribute names
         | 
| 118 | 
            +
                      #
         | 
| 119 | 
            +
                      # @api public
         | 
| 120 | 
            +
                      def timestamps(*names)
         | 
| 121 | 
            +
                        timestamp_columns timestamp_columns.merge(names)
         | 
| 122 | 
            +
                      end
         | 
| 123 | 
            +
                      alias timestamp timestamps
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                      # Set up attributes to datestamp when the command is called
         | 
| 126 | 
            +
                      #
         | 
| 127 | 
            +
                      # @example
         | 
| 128 | 
            +
                      #   class CreateTask < ROM::Commands::Create[:sql]
         | 
| 129 | 
            +
                      #     result :one
         | 
| 130 | 
            +
                      #     use :timestamps
         | 
| 131 | 
            +
                      #     datestamps :created_on, :updated_on
         | 
| 132 | 
            +
                      #   end
         | 
| 133 | 
            +
                      #
         | 
| 134 | 
            +
                      #   create_user = rom.command(:user).create.curry(name: 'Jane')
         | 
| 135 | 
            +
                      #
         | 
| 136 | 
            +
                      #   result = create_user.call
         | 
| 137 | 
            +
                      #   result[:created_at]  #=> Date.today
         | 
| 138 | 
            +
                      #
         | 
| 139 | 
            +
                      # @param [Array<Symbol>] names A list of attribute names
         | 
| 140 | 
            +
                      #
         | 
| 141 | 
            +
                      # @api public
         | 
| 142 | 
            +
                      def datestamps(*names)
         | 
| 143 | 
            +
                        datestamp_columns datestamp_columns.merge(names)
         | 
| 144 | 
            +
                      end
         | 
| 145 | 
            +
                      alias datestamp datestamps
         | 
| 146 | 
            +
                    end
         | 
| 147 | 
            +
                  end
         | 
| 148 | 
            +
                end
         | 
| 149 | 
            +
              end
         | 
| 150 | 
            +
            end
         | 
    
        data/lib/rom/registry.rb
    CHANGED
    
    | @@ -37,6 +37,16 @@ module ROM | |
| 37 37 | 
             
                  ElementNotFoundError
         | 
| 38 38 | 
             
                end
         | 
| 39 39 |  | 
| 40 | 
            +
                # @api private
         | 
| 41 | 
            +
                def merge(other)
         | 
| 42 | 
            +
                  self.class.new(Hash(other), options)
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                # @api private
         | 
| 46 | 
            +
                def to_hash
         | 
| 47 | 
            +
                  elements
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 40 50 | 
             
                # @api private
         | 
| 41 51 | 
             
                def map(&block)
         | 
| 42 52 | 
             
                  new_elements = elements.each_with_object({}) do |(name, element), h|
         | 
    
        data/lib/rom/relation.rb
    CHANGED
    
    | @@ -175,7 +175,7 @@ module ROM | |
| 175 175 |  | 
| 176 176 | 
             
                # @!attribute [r] mappers
         | 
| 177 177 | 
             
                #   @return [MapperRegistry] an optional mapper registry (empty by default)
         | 
| 178 | 
            -
                option :mappers, default: -> {  | 
| 178 | 
            +
                option :mappers, default: -> { self.class.mapper_registry }
         | 
| 179 179 |  | 
| 180 180 | 
             
                # @!attribute [r] commands
         | 
| 181 181 | 
             
                #   @return [CommandRegistry] Command registry
         | 
| @@ -602,7 +602,7 @@ module ROM | |
| 602 602 | 
             
                  if attr
         | 
| 603 603 | 
             
                    attr.name
         | 
| 604 604 | 
             
                  else
         | 
| 605 | 
            -
                    :"#{ | 
| 605 | 
            +
                    :"#{Inflector.singularize(name.dataset)}_id"
         | 
| 606 606 | 
             
                  end
         | 
| 607 607 | 
             
                end
         | 
| 608 608 |  | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require 'set'
         | 
| 2 2 |  | 
| 3 | 
            -
            require ' | 
| 3 | 
            +
            require 'rom/support/inflector'
         | 
| 4 4 |  | 
| 5 5 | 
             
            require 'rom/constants'
         | 
| 6 6 | 
             
            require 'rom/relation/name'
         | 
| @@ -250,6 +250,24 @@ module ROM | |
| 250 250 | 
             
                    ROM.plugin_registry.relations.fetch(plugin, adapter).apply_to(self, options)
         | 
| 251 251 | 
             
                  end
         | 
| 252 252 |  | 
| 253 | 
            +
                  # Build default mapper registry
         | 
| 254 | 
            +
                  #
         | 
| 255 | 
            +
                  # @return [MapperRegistry]
         | 
| 256 | 
            +
                  #
         | 
| 257 | 
            +
                  # @api private
         | 
| 258 | 
            +
                  def mapper_registry(opts = EMPTY_HASH)
         | 
| 259 | 
            +
                    adapter_ns = ROM.adapters[adapter]
         | 
| 260 | 
            +
             | 
| 261 | 
            +
                    compiler =
         | 
| 262 | 
            +
                      if adapter_ns && adapter_ns.const_defined?(:MapperCompiler)
         | 
| 263 | 
            +
                        adapter_ns.const_get(:MapperCompiler)
         | 
| 264 | 
            +
                      else
         | 
| 265 | 
            +
                        MapperCompiler
         | 
| 266 | 
            +
                      end
         | 
| 267 | 
            +
             | 
| 268 | 
            +
                    MapperRegistry.new({}, { compiler: compiler.new(opts) }.merge(opts))
         | 
| 269 | 
            +
                  end
         | 
| 270 | 
            +
             | 
| 253 271 | 
             
                  # @api private
         | 
| 254 272 | 
             
                  def curried
         | 
| 255 273 | 
             
                    Curried
         | 
| @@ -274,7 +292,7 @@ module ROM | |
| 274 292 | 
             
                  #
         | 
| 275 293 | 
             
                  # @api private
         | 
| 276 294 | 
             
                  def default_name
         | 
| 277 | 
            -
                    Name[ | 
| 295 | 
            +
                    Name[Inflector.underscore(name).tr('/', '_').to_sym]
         | 
| 278 296 | 
             
                  end
         | 
| 279 297 |  | 
| 280 298 | 
             
                  # @api private
         | 
| @@ -70,10 +70,10 @@ module ROM | |
| 70 70 | 
             
                  # Return a new combined relation with adjusted node returned from a block
         | 
| 71 71 | 
             
                  #
         | 
| 72 72 | 
             
                  # @example with a node identifier
         | 
| 73 | 
            -
                  #    | 
| 73 | 
            +
                  #   combine(:tasks).node(:tasks) { |tasks| tasks.prioritized }
         | 
| 74 74 | 
             
                  #
         | 
| 75 75 | 
             
                  # @example with a nested path
         | 
| 76 | 
            -
                  #    | 
| 76 | 
            +
                  #   combine(tasks: :tags).node(tasks: :tags) { |tags| tags.where(name: 'red') }
         | 
| 77 77 | 
             
                  #
         | 
| 78 78 | 
             
                  # @param [Symbol] name The node relation name
         | 
| 79 79 | 
             
                  #
         | 
| @@ -35,8 +35,8 @@ module ROM | |
| 35 35 | 
             
                  # @return [ROM::Command]
         | 
| 36 36 | 
             
                  #
         | 
| 37 37 | 
             
                  # @api public
         | 
| 38 | 
            -
                  def command(type, mapper: nil, use: EMPTY_ARRAY, **opts)
         | 
| 39 | 
            -
                    base_command = commands.key?(type) ? commands[type] : commands[type, adapter, to_ast, use, opts]
         | 
| 38 | 
            +
                  def command(type, mapper: nil, use: EMPTY_ARRAY, plugins_options: EMPTY_HASH, **opts)
         | 
| 39 | 
            +
                    base_command = commands.key?(type) ? commands[type] : commands[type, adapter, to_ast, use, plugins_options, opts]
         | 
| 40 40 |  | 
| 41 41 | 
             
                    command =
         | 
| 42 42 | 
             
                      if mapper
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require ' | 
| 1 | 
            +
            require 'rom/support/inflector'
         | 
| 2 2 |  | 
| 3 3 | 
             
            require 'rom/associations/definitions'
         | 
| 4 4 |  | 
| @@ -197,7 +197,7 @@ module ROM | |
| 197 197 |  | 
| 198 198 | 
             
                  # @api private
         | 
| 199 199 | 
             
                  def dataset_name(name)
         | 
| 200 | 
            -
                     | 
| 200 | 
            +
                    Inflector.pluralize(name).to_sym
         | 
| 201 201 | 
             
                  end
         | 
| 202 202 | 
             
                end
         | 
| 203 203 | 
             
              end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require 'pathname'
         | 
| 2 2 |  | 
| 3 | 
            -
            require ' | 
| 3 | 
            +
            require 'rom/support/inflector'
         | 
| 4 4 |  | 
| 5 5 | 
             
            require 'rom/types'
         | 
| 6 6 | 
             
            require 'rom/initializer'
         | 
| @@ -94,7 +94,7 @@ module ROM | |
| 94 94 | 
             
                        ).call
         | 
| 95 95 | 
             
                      end
         | 
| 96 96 |  | 
| 97 | 
            -
                     | 
| 97 | 
            +
                    Inflector.constantize(klass_name)
         | 
| 98 98 | 
             
                  end
         | 
| 99 99 | 
             
                end
         | 
| 100 100 | 
             
              end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require 'pathname'
         | 
| 2 2 |  | 
| 3 | 
            -
            require ' | 
| 3 | 
            +
            require 'rom/support/inflector'
         | 
| 4 4 | 
             
            require 'rom/types'
         | 
| 5 5 | 
             
            require 'rom/setup/auto_registration_strategies/base'
         | 
| 6 6 |  | 
| @@ -28,7 +28,7 @@ module ROM | |
| 28 28 |  | 
| 29 29 | 
             
                    path_arr.reverse.each do |dir|
         | 
| 30 30 | 
             
                      const_fragment = potential.unshift(
         | 
| 31 | 
            -
                         | 
| 31 | 
            +
                        Inflector.camelize(dir)
         | 
| 32 32 | 
             
                      ).join("::")
         | 
| 33 33 |  | 
| 34 34 | 
             
                      constant = "#{namespace}::#{const_fragment}"
         | 
| @@ -40,7 +40,7 @@ module ROM | |
| 40 40 |  | 
| 41 41 | 
             
                    # If we have reached this point, its means constant is not defined and
         | 
| 42 42 | 
             
                    # NameError will be thrown if we attempt to camelize something like:
         | 
| 43 | 
            -
                    # `"#{namespace}::#{ | 
| 43 | 
            +
                    # `"#{namespace}::#{Inflector.camelize(filename)}"`
         | 
| 44 44 | 
             
                    # so we can assume naming convention was not respected in required
         | 
| 45 45 | 
             
                    # file.
         | 
| 46 46 |  | 
| @@ -63,7 +63,7 @@ module ROM | |
| 63 63 |  | 
| 64 64 | 
             
                  # @api private
         | 
| 65 65 | 
             
                  def ns_const
         | 
| 66 | 
            -
                    @namespace_constant ||=  | 
| 66 | 
            +
                    @namespace_constant ||= Inflector.constantize(namespace)
         | 
| 67 67 | 
             
                  end
         | 
| 68 68 |  | 
| 69 69 | 
             
                  # @api private
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require 'pathname'
         | 
| 2 2 |  | 
| 3 | 
            -
            require ' | 
| 3 | 
            +
            require 'rom/support/inflector'
         | 
| 4 4 | 
             
            require 'rom/types'
         | 
| 5 5 | 
             
            require 'rom/setup/auto_registration_strategies/base'
         | 
| 6 6 |  | 
| @@ -22,7 +22,7 @@ module ROM | |
| 22 22 | 
             
                  #
         | 
| 23 23 | 
             
                  # @api private
         | 
| 24 24 | 
             
                  def call
         | 
| 25 | 
            -
                     | 
| 25 | 
            +
                    Inflector.camelize(
         | 
| 26 26 | 
             
                      file.sub(/^#{directory}\/#{entity}\//, '').sub(EXTENSION_REGEX, '')
         | 
| 27 27 | 
             
                    )
         | 
| 28 28 | 
             
                  end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require 'pathname'
         | 
| 2 2 |  | 
| 3 | 
            -
            require ' | 
| 3 | 
            +
            require 'rom/support/inflector'
         | 
| 4 4 | 
             
            require 'rom/setup/auto_registration_strategies/base'
         | 
| 5 5 |  | 
| 6 6 | 
             
            module ROM
         | 
| @@ -18,7 +18,7 @@ module ROM | |
| 18 18 | 
             
                  #
         | 
| 19 19 | 
             
                  # @api private
         | 
| 20 20 | 
             
                  def call
         | 
| 21 | 
            -
                     | 
| 21 | 
            +
                    Inflector.camelize(
         | 
| 22 22 | 
             
                      file.sub(/^#{directory.dirname}\//, '').sub(EXTENSION_REGEX, '')
         | 
| 23 23 | 
             
                    )
         | 
| 24 24 | 
             
                  end
         | 
| @@ -31,7 +31,7 @@ module ROM | |
| 31 31 |  | 
| 32 32 | 
             
                      notifications.trigger(
         | 
| 33 33 | 
             
                        'configuration.commands.class.before_build',
         | 
| 34 | 
            -
                        command: klass, gateway: gateway, dataset: relation.dataset
         | 
| 34 | 
            +
                        command: klass, gateway: gateway, dataset: relation.dataset, adapter: relation.adapter
         | 
| 35 35 | 
             
                      )
         | 
| 36 36 |  | 
| 37 37 | 
             
                      klass.extend_for_relation(relation) if klass.restrictable
         | 
| @@ -43,7 +43,7 @@ module ROM | |
| 43 43 |  | 
| 44 44 | 
             
                        klass.use(:registry_reader, relation_names)
         | 
| 45 45 |  | 
| 46 | 
            -
                        notifications.trigger('configuration.relations.class.ready', relation: klass)
         | 
| 46 | 
            +
                        notifications.trigger('configuration.relations.class.ready', relation: klass, adapter: klass.adapter)
         | 
| 47 47 |  | 
| 48 48 | 
             
                        relations[key] = build_relation(klass, registry)
         | 
| 49 49 | 
             
                      end
         | 
| @@ -101,13 +101,22 @@ module ROM | |
| 101 101 | 
             
                      dataset: dataset, relation: klass, adapter: klass.adapter
         | 
| 102 102 | 
             
                    )
         | 
| 103 103 |  | 
| 104 | 
            -
                     | 
| 105 | 
            -
             | 
| 106 | 
            -
                    options = { __registry__: registry, mappers: mappers, schema: schema, **plugin_options }
         | 
| 104 | 
            +
                    options = { __registry__: registry, mappers: mapper_registry(rel_key, klass), schema: schema, **plugin_options }
         | 
| 107 105 |  | 
| 108 106 | 
             
                    klass.new(dataset, options)
         | 
| 109 107 | 
             
                  end
         | 
| 110 108 |  | 
| 109 | 
            +
                  # @api private
         | 
| 110 | 
            +
                  def mapper_registry(rel_key, rel_class)
         | 
| 111 | 
            +
                    registry = rel_class.mapper_registry(cache: @mappers.cache)
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                    if @mappers.key?(rel_key)
         | 
| 114 | 
            +
                      registry.merge(@mappers[rel_key])
         | 
| 115 | 
            +
                    else
         | 
| 116 | 
            +
                      registry
         | 
| 117 | 
            +
                    end
         | 
| 118 | 
            +
                  end
         | 
| 119 | 
            +
             | 
| 111 120 | 
             
                  # @api private
         | 
| 112 121 | 
             
                  def plugin_options
         | 
| 113 122 | 
             
                    relation_plugins.map(&:config).map(&:to_hash).reduce(:merge) || EMPTY_HASH
         | 
| @@ -103,6 +103,16 @@ module ROM | |
| 103 103 | 
             
                    @payload.fetch(name)
         | 
| 104 104 | 
             
                  end
         | 
| 105 105 |  | 
| 106 | 
            +
                  # Coerce an event to a hash
         | 
| 107 | 
            +
                  #
         | 
| 108 | 
            +
                  # @return [Hash]
         | 
| 109 | 
            +
                  #
         | 
| 110 | 
            +
                  # @api public
         | 
| 111 | 
            +
                  def to_h
         | 
| 112 | 
            +
                    @payload
         | 
| 113 | 
            +
                  end
         | 
| 114 | 
            +
                  alias_method :to_hash, :to_h
         | 
| 115 | 
            +
             | 
| 106 116 | 
             
                  # Get or set a payload
         | 
| 107 117 | 
             
                  #
         | 
| 108 118 | 
             
                  # @overload
         | 
    
        data/lib/rom/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rom-core
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 4.0 | 
| 4 | 
            +
              version: 4.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Piotr Solnica
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017-11- | 
| 11 | 
            +
            date: 2017-11-17 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: concurrent-ruby
         | 
| @@ -24,6 +24,34 @@ dependencies: | |
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '1.0'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: dry-core
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - "~>"
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '0.3'
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - "~>"
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '0.3'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: dry-inflector
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '0.1'
         | 
| 48 | 
            +
              type: :runtime
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '0.1'
         | 
| 27 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 56 | 
             
              name: dry-container
         | 
| 29 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -72,20 +100,6 @@ dependencies: | |
| 72 100 | 
             
                - - ">="
         | 
| 73 101 | 
             
                  - !ruby/object:Gem::Version
         | 
| 74 102 | 
             
                    version: 0.12.1
         | 
| 75 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 76 | 
            -
              name: dry-core
         | 
| 77 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 78 | 
            -
                requirements:
         | 
| 79 | 
            -
                - - "~>"
         | 
| 80 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 81 | 
            -
                    version: '0.3'
         | 
| 82 | 
            -
              type: :runtime
         | 
| 83 | 
            -
              prerelease: false
         | 
| 84 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 85 | 
            -
                requirements:
         | 
| 86 | 
            -
                - - "~>"
         | 
| 87 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 88 | 
            -
                    version: '0.3'
         | 
| 89 103 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 90 104 | 
             
              name: dry-initializer
         | 
| 91 105 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -106,20 +120,14 @@ dependencies: | |
| 106 120 | 
             
                requirements:
         | 
| 107 121 | 
             
                - - "~>"
         | 
| 108 122 | 
             
                  - !ruby/object:Gem::Version
         | 
| 109 | 
            -
                    version: '1. | 
| 110 | 
            -
                - - ">="
         | 
| 111 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 112 | 
            -
                    version: 1.0.2
         | 
| 123 | 
            +
                    version: '1.1'
         | 
| 113 124 | 
             
              type: :runtime
         | 
| 114 125 | 
             
              prerelease: false
         | 
| 115 126 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 116 127 | 
             
                requirements:
         | 
| 117 128 | 
             
                - - "~>"
         | 
| 118 129 | 
             
                  - !ruby/object:Gem::Version
         | 
| 119 | 
            -
                    version: '1. | 
| 120 | 
            -
                - - ">="
         | 
| 121 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 122 | 
            -
                    version: 1.0.2
         | 
| 130 | 
            +
                    version: '1.1'
         | 
| 123 131 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 124 132 | 
             
              name: rake
         | 
| 125 133 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -226,6 +234,7 @@ files: | |
| 226 234 | 
             
            - lib/rom/memory/commands.rb
         | 
| 227 235 | 
             
            - lib/rom/memory/dataset.rb
         | 
| 228 236 | 
             
            - lib/rom/memory/gateway.rb
         | 
| 237 | 
            +
            - lib/rom/memory/mapper_compiler.rb
         | 
| 229 238 | 
             
            - lib/rom/memory/relation.rb
         | 
| 230 239 | 
             
            - lib/rom/memory/schema.rb
         | 
| 231 240 | 
             
            - lib/rom/memory/storage.rb
         | 
| @@ -235,6 +244,7 @@ files: | |
| 235 244 | 
             
            - lib/rom/plugin_base.rb
         | 
| 236 245 | 
             
            - lib/rom/plugin_registry.rb
         | 
| 237 246 | 
             
            - lib/rom/plugins/command/schema.rb
         | 
| 247 | 
            +
            - lib/rom/plugins/command/timestamps.rb
         | 
| 238 248 | 
             
            - lib/rom/plugins/relation/instrumentation.rb
         | 
| 239 249 | 
             
            - lib/rom/plugins/relation/registry_reader.rb
         | 
| 240 250 | 
             
            - lib/rom/plugins/schema/timestamps.rb
         | 
| @@ -268,6 +278,7 @@ files: | |
| 268 278 | 
             
            - lib/rom/setup/finalize/finalize_mappers.rb
         | 
| 269 279 | 
             
            - lib/rom/setup/finalize/finalize_relations.rb
         | 
| 270 280 | 
             
            - lib/rom/support/configurable.rb
         | 
| 281 | 
            +
            - lib/rom/support/inflector.rb
         | 
| 271 282 | 
             
            - lib/rom/support/memoizable.rb
         | 
| 272 283 | 
             
            - lib/rom/support/notifications.rb
         | 
| 273 284 | 
             
            - lib/rom/transaction.rb
         |