rom 0.6.0.beta2 → 0.6.0.beta3
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/README.md +3 -1
- data/lib/rom/env.rb +3 -13
- data/lib/rom/lint/linter.rb +14 -0
- data/lib/rom/lint/repository.rb +18 -2
- data/lib/rom/mapper_registry.rb +5 -0
- data/lib/rom/setup/finalize.rb +17 -7
- data/lib/rom/support/options.rb +24 -21
- data/lib/rom/version.rb +1 -1
- data/spec/unit/rom/mapper_spec.rb +3 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 3860ac36d7e9d938342e022c7fb0e227fc6273e1
         | 
| 4 | 
            +
              data.tar.gz: 1a650f4573310fd5d543839c258338344827989b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b1239e346a1626da09367e8d4c37a222a43d9a7f70dd248d427dc2046fc1272033913859b38c9e5183d316bd31296c72bdbff4d0a55be590ab9f94f9c907d669
         | 
| 7 | 
            +
              data.tar.gz: 4a711b1a776e137d1e953acc7eb8230f5c7c1695d5e8a812b9a7ef23f2673f3fe91619c83b9a93e317dc72e66f2a39b6ce37d082a19ab03110c84abbea8be7e8
         | 
    
        data/README.md
    CHANGED
    
    | @@ -26,6 +26,7 @@ Learn more: | |
| 26 26 | 
             
            ## Adapters
         | 
| 27 27 |  | 
| 28 28 | 
             
              * [rom-sql](https://github.com/rom-rb/rom-sql)
         | 
| 29 | 
            +
              * [rom-yesql](https://github.com/rom-rb/rom-yesql)
         | 
| 29 30 | 
             
              * [rom-mongo](https://github.com/rom-rb/rom-mongo)
         | 
| 30 31 | 
             
              * [rom-yaml](https://github.com/rom-rb/rom-yaml)
         | 
| 31 32 | 
             
              * [rom-csv](https://github.com/rom-rb/rom-csv)
         | 
| @@ -66,6 +67,7 @@ end | |
| 66 67 | 
             
            # could define it explicitly
         | 
| 67 68 | 
             
            class UserMapper < ROM::Mapper
         | 
| 68 69 | 
             
              relation :users
         | 
| 70 | 
            +
              register_as :entity
         | 
| 69 71 |  | 
| 70 72 | 
             
              model User
         | 
| 71 73 |  | 
| @@ -89,7 +91,7 @@ rom.command(:users).create.call(name: "Joe", age: 17) | |
| 89 91 | 
             
            rom.command(:users).create.call(name: "Jane", age: 18)
         | 
| 90 92 |  | 
| 91 93 | 
             
            # reading relations using defined mappers
         | 
| 92 | 
            -
            puts rom.relation(:users) { |r| r.by_name("Jane").adults }.as(: | 
| 94 | 
            +
            puts rom.relation(:users) { |r| r.by_name("Jane").adults }.as(:entity).to_a.inspect
         | 
| 93 95 | 
             
            # => [#<User:0x007fdba161cc48 @id=2, @name="Jane", @age=18>]
         | 
| 94 96 | 
             
            ```
         | 
| 95 97 |  | 
    
        data/lib/rom/env.rb
    CHANGED
    
    | @@ -33,12 +33,12 @@ module ROM | |
| 33 33 | 
             
                attr_reader :mappers
         | 
| 34 34 |  | 
| 35 35 | 
             
                # @api private
         | 
| 36 | 
            -
                def initialize(repositories, relations,  | 
| 36 | 
            +
                def initialize(repositories, relations, mappers, commands, readers = nil)
         | 
| 37 37 | 
             
                  @repositories = repositories
         | 
| 38 38 | 
             
                  @relations = relations
         | 
| 39 | 
            -
                  @ | 
| 39 | 
            +
                  @mappers = mappers
         | 
| 40 40 | 
             
                  @commands = commands
         | 
| 41 | 
            -
                   | 
| 41 | 
            +
                  @readers = readers
         | 
| 42 42 | 
             
                  freeze
         | 
| 43 43 | 
             
                end
         | 
| 44 44 |  | 
| @@ -109,15 +109,5 @@ module ROM | |
| 109 109 | 
             
                def command(name)
         | 
| 110 110 | 
             
                  commands[name]
         | 
| 111 111 | 
             
                end
         | 
| 112 | 
            -
             | 
| 113 | 
            -
                private
         | 
| 114 | 
            -
             | 
| 115 | 
            -
                # @api private
         | 
| 116 | 
            -
                def initialize_mappers
         | 
| 117 | 
            -
                  elements = readers.each_with_object({}) { |(name, reader), h|
         | 
| 118 | 
            -
                    h[name] = reader.mappers
         | 
| 119 | 
            -
                  }
         | 
| 120 | 
            -
                  @mappers = Registry.new(elements)
         | 
| 121 | 
            -
                end
         | 
| 122 112 | 
             
              end
         | 
| 123 113 | 
             
            end
         | 
    
        data/lib/rom/lint/linter.rb
    CHANGED
    
    | @@ -36,7 +36,9 @@ module ROM | |
| 36 36 | 
             
                  #
         | 
| 37 37 | 
             
                  # @api public
         | 
| 38 38 | 
             
                  def lint(name)
         | 
| 39 | 
            +
                    before_lint
         | 
| 39 40 | 
             
                    public_send name
         | 
| 41 | 
            +
                    after_lint
         | 
| 40 42 | 
             
                    true # for assertions
         | 
| 41 43 | 
             
                  end
         | 
| 42 44 |  | 
| @@ -59,6 +61,18 @@ module ROM | |
| 59 61 | 
             
                  def complain(*args)
         | 
| 60 62 | 
             
                    raise Failure, *args
         | 
| 61 63 | 
             
                  end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  # Hook method executed before each lint method run
         | 
| 66 | 
            +
                  #
         | 
| 67 | 
            +
                  # @api private
         | 
| 68 | 
            +
                  def before_lint
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  # Hook method executed after each lint method run
         | 
| 72 | 
            +
                  #
         | 
| 73 | 
            +
                  # @api private
         | 
| 74 | 
            +
                  def after_lint
         | 
| 75 | 
            +
                  end
         | 
| 62 76 | 
             
                end
         | 
| 63 77 | 
             
              end
         | 
| 64 78 | 
             
            end
         | 
    
        data/lib/rom/lint/repository.rb
    CHANGED
    
    | @@ -31,6 +31,7 @@ module ROM | |
| 31 31 | 
             
                    @identifier = identifier
         | 
| 32 32 | 
             
                    @repository = repository
         | 
| 33 33 | 
             
                    @uri = uri
         | 
| 34 | 
            +
                    @repository_instance = setup_repository_instance
         | 
| 34 35 | 
             
                  end
         | 
| 35 36 |  | 
| 36 37 | 
             
                  # Lint: Ensure that +repository+ setups up its instance
         | 
| @@ -63,16 +64,31 @@ module ROM | |
| 63 64 | 
             
                    complain "#{repository_instance} must respond to dataset?"
         | 
| 64 65 | 
             
                  end
         | 
| 65 66 |  | 
| 67 | 
            +
                  private
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  # Repository instance
         | 
| 70 | 
            +
                  #
         | 
| 71 | 
            +
                  # @api private
         | 
| 72 | 
            +
                  attr_reader :repository_instance
         | 
| 73 | 
            +
             | 
| 66 74 | 
             
                  # Setup repository instance
         | 
| 67 75 | 
             
                  #
         | 
| 68 | 
            -
                  # @api  | 
| 69 | 
            -
                  def  | 
| 76 | 
            +
                  # @api private
         | 
| 77 | 
            +
                  def setup_repository_instance
         | 
| 70 78 | 
             
                    if uri
         | 
| 71 79 | 
             
                      ROM::Repository.setup(identifier, uri)
         | 
| 72 80 | 
             
                    else
         | 
| 73 81 | 
             
                      ROM::Repository.setup(identifier)
         | 
| 74 82 | 
             
                    end
         | 
| 75 83 | 
             
                  end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  # Run Repository#disconnect
         | 
| 86 | 
            +
                  #
         | 
| 87 | 
            +
                  # @api private
         | 
| 88 | 
            +
                  def after_lint
         | 
| 89 | 
            +
                    super
         | 
| 90 | 
            +
                    repository_instance.disconnect
         | 
| 91 | 
            +
                  end
         | 
| 76 92 | 
             
                end
         | 
| 77 93 | 
             
              end
         | 
| 78 94 | 
             
            end
         | 
    
        data/lib/rom/mapper_registry.rb
    CHANGED
    
    | @@ -11,6 +11,11 @@ module ROM | |
| 11 11 | 
             
                  elements.fetch(name) { raise(MapperMissingError, name) }
         | 
| 12 12 | 
             
                end
         | 
| 13 13 |  | 
| 14 | 
            +
                # @api private
         | 
| 15 | 
            +
                def key?(name)
         | 
| 16 | 
            +
                  elements.key?(name)
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 14 19 | 
             
                # @api private
         | 
| 15 20 | 
             
                def by_path(path)
         | 
| 16 21 | 
             
                  elements.fetch(paths(path).detect { |name| elements.key?(name) }) {
         | 
    
        data/lib/rom/setup/finalize.rb
    CHANGED
    
    | @@ -50,10 +50,11 @@ module ROM | |
| 50 50 | 
             
                    infer_schema_relations
         | 
| 51 51 |  | 
| 52 52 | 
             
                    relations = load_relations
         | 
| 53 | 
            -
                     | 
| 53 | 
            +
                    mappers = load_mappers
         | 
| 54 54 | 
             
                    commands = load_commands(relations)
         | 
| 55 | 
            +
                    readers = load_readers(relations, mappers)
         | 
| 55 56 |  | 
| 56 | 
            -
                    Env.new(repositories, relations,  | 
| 57 | 
            +
                    Env.new(repositories, relations, mappers, commands, readers)
         | 
| 57 58 | 
             
                  end
         | 
| 58 59 |  | 
| 59 60 | 
             
                  private
         | 
| @@ -81,19 +82,28 @@ module ROM | |
| 81 82 | 
             
                    RelationRegistry.new(relations)
         | 
| 82 83 | 
             
                  end
         | 
| 83 84 |  | 
| 85 | 
            +
                  # @api private
         | 
| 86 | 
            +
                  def load_mappers
         | 
| 87 | 
            +
                    mapper_registry = Mapper.registry(mapper_classes).each_with_object({})
         | 
| 88 | 
            +
                    registry_hash = mapper_registry.each do |(name, mappers), h|
         | 
| 89 | 
            +
                      h[name] = MapperRegistry.new(mappers)
         | 
| 90 | 
            +
                    end
         | 
| 91 | 
            +
                    Registry.new(registry_hash)
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
             | 
| 84 94 | 
             
                  # Build entire reader and mapper registries
         | 
| 85 95 | 
             
                  #
         | 
| 86 96 | 
             
                  # @api private
         | 
| 87 | 
            -
                  def load_readers(relations)
         | 
| 97 | 
            +
                  def load_readers(relations, mappers)
         | 
| 88 98 | 
             
                    readers = {}
         | 
| 89 99 |  | 
| 90 | 
            -
                     | 
| 100 | 
            +
                    mappers.each do |name, rel_mappers|
         | 
| 101 | 
            +
                      next unless rel_mappers.key?(name)
         | 
| 102 | 
            +
             | 
| 91 103 | 
             
                      relation = relations[name]
         | 
| 92 104 | 
             
                      methods = relation.exposed_relations
         | 
| 93 105 |  | 
| 94 | 
            -
                      readers[name] = Reader.build(
         | 
| 95 | 
            -
                        name, relation, MapperRegistry.new(mappers), methods
         | 
| 96 | 
            -
                      )
         | 
| 106 | 
            +
                      readers[name] = Reader.build(name, relation, rel_mappers, methods)
         | 
| 97 107 | 
             
                    end
         | 
| 98 108 |  | 
| 99 109 | 
             
                    ReaderRegistry.new(readers)
         | 
    
        data/lib/rom/support/options.rb
    CHANGED
    
    | @@ -45,12 +45,17 @@ module ROM | |
| 45 45 | 
             
                    @reader = options.fetch(:reader) { false }
         | 
| 46 46 | 
             
                    @allow = options.fetch(:allow) { [] }
         | 
| 47 47 | 
             
                    @default = options.fetch(:default) { Undefined }
         | 
| 48 | 
            +
                    @ivar = :"@#{name}" if @reader
         | 
| 48 49 | 
             
                  end
         | 
| 49 50 |  | 
| 50 51 | 
             
                  def reader?
         | 
| 51 52 | 
             
                    @reader
         | 
| 52 53 | 
             
                  end
         | 
| 53 54 |  | 
| 55 | 
            +
                  def assign_reader_value(object, value)
         | 
| 56 | 
            +
                    object.instance_variable_set(@ivar, value)
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
             | 
| 54 59 | 
             
                  def default?
         | 
| 55 60 | 
             
                    @default != Undefined
         | 
| 56 61 | 
             
                  end
         | 
| @@ -85,22 +90,19 @@ module ROM | |
| 85 90 | 
             
                    @options[option.name] = option
         | 
| 86 91 | 
             
                  end
         | 
| 87 92 |  | 
| 88 | 
            -
                  def  | 
| 89 | 
            -
                    options | 
| 90 | 
            -
                      validate_option_value(name, value)
         | 
| 91 | 
            -
                    end
         | 
| 92 | 
            -
                  end
         | 
| 93 | 
            +
                  def process(object, options)
         | 
| 94 | 
            +
                    ensure_known_options(options)
         | 
| 93 95 |  | 
| 94 | 
            -
                  def set_defaults(object, options)
         | 
| 95 96 | 
             
                    each do |name, option|
         | 
| 96 | 
            -
                       | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
                  end
         | 
| 97 | 
            +
                      if option.default? && !options.key?(name)
         | 
| 98 | 
            +
                        options[name] = option.default_value(object)
         | 
| 99 | 
            +
                      end
         | 
| 100 100 |  | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
                       | 
| 101 | 
            +
                      if options.key?(name)
         | 
| 102 | 
            +
                        validate_option_value(option, name, options[name])
         | 
| 103 | 
            +
                      end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                      option.assign_reader_value(object, options[name]) if option.reader?
         | 
| 104 106 | 
             
                    end
         | 
| 105 107 | 
             
                  end
         | 
| 106 108 |  | 
| @@ -110,12 +112,16 @@ module ROM | |
| 110 112 | 
             
                    @options.each(&block)
         | 
| 111 113 | 
             
                  end
         | 
| 112 114 |  | 
| 113 | 
            -
                  def  | 
| 114 | 
            -
                     | 
| 115 | 
            -
                       | 
| 116 | 
            -
                         | 
| 115 | 
            +
                  def ensure_known_options(options)
         | 
| 116 | 
            +
                    options.each_key do |name|
         | 
| 117 | 
            +
                      @options.fetch(name) do
         | 
| 118 | 
            +
                        raise InvalidOptionKeyError,
         | 
| 119 | 
            +
                          "#{name.inspect} is not a valid option"
         | 
| 120 | 
            +
                      end
         | 
| 117 121 | 
             
                    end
         | 
| 122 | 
            +
                  end
         | 
| 118 123 |  | 
| 124 | 
            +
                  def validate_option_value(option, name, value)
         | 
| 119 125 | 
             
                    unless option.type_matches?(value)
         | 
| 120 126 | 
             
                      raise InvalidOptionValueError,
         | 
| 121 127 | 
             
                        "#{name.inspect}:#{value.inspect} has incorrect type"
         | 
| @@ -178,10 +184,7 @@ module ROM | |
| 178 184 | 
             
                # @param [Array] args
         | 
| 179 185 | 
             
                def initialize(*args)
         | 
| 180 186 | 
             
                  options = args.last ? args.last.dup : {}
         | 
| 181 | 
            -
                   | 
| 182 | 
            -
                  definitions.set_defaults(self, options)
         | 
| 183 | 
            -
                  definitions.validate_options(options)
         | 
| 184 | 
            -
                  definitions.set_option_values(self, options)
         | 
| 187 | 
            +
                  self.class.option_definitions.process(self, options)
         | 
| 185 188 | 
             
                  @options = options.freeze
         | 
| 186 189 | 
             
                end
         | 
| 187 190 | 
             
              end
         | 
    
        data/lib/rom/version.rb
    CHANGED
    
    
| @@ -30,15 +30,17 @@ describe ROM::Mapper do | |
| 30 30 | 
             
              describe '.registry' do
         | 
| 31 31 | 
             
                it 'builds mapper class registry for base and virtual relations' do
         | 
| 32 32 | 
             
                  users = Class.new(ROM::Mapper) { relation(:users) }
         | 
| 33 | 
            +
                  entity = Class.new(ROM::Mapper) { relation(:users); register_as(:entity) }
         | 
| 33 34 | 
             
                  active = Class.new(users) { relation(:active) }
         | 
| 34 35 | 
             
                  admins = Class.new(users) { relation(:admins) }
         | 
| 35 36 | 
             
                  custom = Class.new(users) { register_as(:custom) }
         | 
| 36 37 |  | 
| 37 | 
            -
                  registry = ROM::Mapper.registry([users, active, admins, custom])
         | 
| 38 | 
            +
                  registry = ROM::Mapper.registry([users, entity, active, admins, custom])
         | 
| 38 39 |  | 
| 39 40 | 
             
                  expect(registry).to eql(
         | 
| 40 41 | 
             
                    users: {
         | 
| 41 42 | 
             
                      users: users.build,
         | 
| 43 | 
            +
                      entity: entity.build,
         | 
| 42 44 | 
             
                      active: active.build,
         | 
| 43 45 | 
             
                      admins: admins.build,
         | 
| 44 46 | 
             
                      custom: custom.build
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rom
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.6.0. | 
| 4 | 
            +
              version: 0.6.0.beta3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Piotr Solnica
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2015- | 
| 11 | 
            +
            date: 2015-03-03 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: transproc
         |