rom 0.6.0.beta2 → 0.6.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
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