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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0566fa80999c8309f81d1794f0a46cf0bd388ba
4
- data.tar.gz: e826953ae0a313183e1982f0b9a6a2d7d3cd033b
3
+ metadata.gz: 3860ac36d7e9d938342e022c7fb0e227fc6273e1
4
+ data.tar.gz: 1a650f4573310fd5d543839c258338344827989b
5
5
  SHA512:
6
- metadata.gz: 5854435a14df8841408d3f8b3b2c4fc7226d7050e68198ca148775db4b06fe724c49bca5a54e253d8a81fc9adc428ab9b471fce440f3865f6ceaf0b3639bf07b
7
- data.tar.gz: f375e69352c707c5ea33e512c1a337f0527deab4d864167831af24cf7937b62091bb9e907ca5f7fc4920efb507d54cd6095b812d013c46b6d9db732bcc1c9be0
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(:users).to_a.inspect
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
 
@@ -33,12 +33,12 @@ module ROM
33
33
  attr_reader :mappers
34
34
 
35
35
  # @api private
36
- def initialize(repositories, relations, readers, commands)
36
+ def initialize(repositories, relations, mappers, commands, readers = nil)
37
37
  @repositories = repositories
38
38
  @relations = relations
39
- @readers = readers
39
+ @mappers = mappers
40
40
  @commands = commands
41
- initialize_mappers
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
@@ -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
@@ -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 public
69
- def repository_instance
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
@@ -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) }) {
@@ -50,10 +50,11 @@ module ROM
50
50
  infer_schema_relations
51
51
 
52
52
  relations = load_relations
53
- readers = load_readers(relations)
53
+ mappers = load_mappers
54
54
  commands = load_commands(relations)
55
+ readers = load_readers(relations, mappers)
55
56
 
56
- Env.new(repositories, relations, readers, commands)
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
- Mapper.registry(mapper_classes).each do |name, mappers|
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)
@@ -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 validate_options(options)
89
- options.each do |name, value|
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
- next unless option.default? && !options.key?(name)
97
- options[name] = option.default_value(object)
98
- end
99
- end
97
+ if option.default? && !options.key?(name)
98
+ options[name] = option.default_value(object)
99
+ end
100
100
 
101
- def set_option_values(object, options)
102
- each do |name, option|
103
- object.instance_variable_set("@#{name}", options[name]) if option.reader?
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 validate_option_value(name, value)
114
- option = @options.fetch(name) do
115
- raise InvalidOptionKeyError,
116
- "#{name.inspect} is not a valid option"
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
- definitions = self.class.option_definitions
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
@@ -1,3 +1,3 @@
1
1
  module ROM
2
- VERSION = '0.6.0.beta2'.freeze
2
+ VERSION = '0.6.0.beta3'.freeze
3
3
  end
@@ -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.beta2
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-02-27 00:00:00.000000000 Z
11
+ date: 2015-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: transproc