rom 3.0.0 → 3.0.1
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 +9 -1
- data/lib/rom/relation/class_interface.rb +10 -2
- data/lib/rom/relation/view_dsl.rb +34 -1
- data/lib/rom/version.rb +1 -1
- data/spec/unit/rom/relation/view_spec.rb +38 -2
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9779926f8873d5ee6b2156b79ea81d295a25d4d6
|
|
4
|
+
data.tar.gz: 1c773434740d811cf17d0719947a362b2195a0d3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bd347260359221fe2e8fb474f59c1d09407ed11a933682e963d80938fbf485eabf45f54e533b211a9e4bbd7f31b803e429cbb7790a31f01b2b9a6a46b3879686
|
|
7
|
+
data.tar.gz: 518d3e583b9bf233ad0624c0a029a83c9ef1d468b9e7ccae429bbd43267a6904cf883c5216dc98546c47fdee2e2e3d5940c9750863a54eda6bace8cfe759b0f7
|
data/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
## v3.0.
|
|
1
|
+
## v3.0.1 2017-02-01
|
|
2
|
+
|
|
3
|
+
## Fixed
|
|
4
|
+
|
|
5
|
+
* ViewDSL exposes schemas that have access to all relations (solnic)
|
|
6
|
+
|
|
7
|
+
[Compare v3.0.0...v3.0.1](https://github.com/rom-rb/rom/compare/v3.0.0...v3.0.1)
|
|
8
|
+
|
|
9
|
+
## v3.0.0 2017-01-29
|
|
2
10
|
|
|
3
11
|
## Added
|
|
4
12
|
|
|
@@ -224,6 +224,14 @@ module ROM
|
|
|
224
224
|
# end
|
|
225
225
|
# end
|
|
226
226
|
#
|
|
227
|
+
# @example View with a schema extended with foreign attributes
|
|
228
|
+
# class Users < ROM::Relation[:sql]
|
|
229
|
+
# view(:index) do
|
|
230
|
+
# schema { append(relations[:tasks][:title]) }
|
|
231
|
+
# relation { |name| where(name: name) }
|
|
232
|
+
# end
|
|
233
|
+
# end
|
|
234
|
+
#
|
|
227
235
|
# @return [Symbol] view method name
|
|
228
236
|
#
|
|
229
237
|
# @api public
|
|
@@ -330,9 +338,9 @@ module ROM
|
|
|
330
338
|
# Hook to finalize a relation after its instance was created
|
|
331
339
|
#
|
|
332
340
|
# @api private
|
|
333
|
-
def finalize(
|
|
341
|
+
def finalize(registry, relation)
|
|
334
342
|
schemas = relation.schemas.reduce({}) do |h, (a, e)|
|
|
335
|
-
h.update(a => e.is_a?(Proc) ? instance_exec(&e) : e)
|
|
343
|
+
h.update(a => e.is_a?(Proc) ? instance_exec(registry, &e) : e)
|
|
336
344
|
end
|
|
337
345
|
relation.schemas.update(schemas)
|
|
338
346
|
relation
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
module ROM
|
|
2
2
|
class Relation
|
|
3
|
+
# ViewDSL is exposed in `Relation.view` method
|
|
4
|
+
#
|
|
5
|
+
# This is used to establish pre-defined relation views with explicit schemas.
|
|
6
|
+
# Such views can be used to compose relations together, even from multiple
|
|
7
|
+
# adapters.
|
|
8
|
+
#
|
|
9
|
+
# @api public
|
|
3
10
|
class ViewDSL
|
|
11
|
+
# @!attribute [r] name
|
|
12
|
+
# @return [Symbol] The view name (relation method)
|
|
4
13
|
attr_reader :name
|
|
5
14
|
|
|
15
|
+
# @!attribute [r] relation_block
|
|
16
|
+
# @return [Proc] The relation block that will be evaluated by the view method
|
|
6
17
|
attr_reader :relation_block
|
|
7
18
|
|
|
19
|
+
# @!attribute [r] new_schema
|
|
20
|
+
# @return [Proc] The schema proc returned by the schema DSL
|
|
8
21
|
attr_reader :new_schema
|
|
9
22
|
|
|
23
|
+
# @api private
|
|
10
24
|
def initialize(name, schema, &block)
|
|
11
25
|
@name = name
|
|
12
26
|
@schema = schema
|
|
@@ -15,14 +29,33 @@ module ROM
|
|
|
15
29
|
instance_eval(&block)
|
|
16
30
|
end
|
|
17
31
|
|
|
32
|
+
# Define a schema for a relation view
|
|
33
|
+
#
|
|
34
|
+
# @return [Proc]
|
|
35
|
+
#
|
|
36
|
+
# @see Relation::ClassInterface.view
|
|
37
|
+
#
|
|
38
|
+
# @api public
|
|
18
39
|
def schema(&block)
|
|
19
|
-
@new_schema = -> { @schema.instance_exec(&block) }
|
|
40
|
+
@new_schema = -> relations { @schema.with(relations: relations).instance_exec(&block) }
|
|
20
41
|
end
|
|
21
42
|
|
|
43
|
+
# Define a relation block for a relation view
|
|
44
|
+
#
|
|
45
|
+
# @return [Proc]
|
|
46
|
+
#
|
|
47
|
+
# @see Relation::ClassInterface.view
|
|
48
|
+
#
|
|
49
|
+
# @api public
|
|
22
50
|
def relation(&block)
|
|
23
51
|
@relation_block = lambda(&block)
|
|
24
52
|
end
|
|
25
53
|
|
|
54
|
+
# Return procs captured by the DSL
|
|
55
|
+
#
|
|
56
|
+
# @return [Array]
|
|
57
|
+
#
|
|
58
|
+
# @api private
|
|
26
59
|
def call
|
|
27
60
|
[name, new_schema, relation_block]
|
|
28
61
|
end
|
data/lib/rom/version.rb
CHANGED
|
@@ -4,6 +4,18 @@ require 'rom/memory'
|
|
|
4
4
|
RSpec.describe ROM::Relation, '.view' do
|
|
5
5
|
subject(:relation) { relation_class.new(ROM::Memory::Dataset.new([])) }
|
|
6
6
|
|
|
7
|
+
let(:registry) do
|
|
8
|
+
{ tasks: tasks }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
let(:tasks) do
|
|
12
|
+
Class.new(ROM::Relation[:memory]) do
|
|
13
|
+
schema do
|
|
14
|
+
attribute :title, ROM::Types::String
|
|
15
|
+
end
|
|
16
|
+
end.new([])
|
|
17
|
+
end
|
|
18
|
+
|
|
7
19
|
it 'returns view method name' do
|
|
8
20
|
klass = Class.new(ROM::Relation[:memory]) {
|
|
9
21
|
schema { attribute :id, ROM::Types::Int }
|
|
@@ -20,6 +32,10 @@ RSpec.describe ROM::Relation, '.view' do
|
|
|
20
32
|
relation << { id: 2, name: 'Jane' }
|
|
21
33
|
end
|
|
22
34
|
|
|
35
|
+
it 'appends foreign attributes' do
|
|
36
|
+
expect(relation.schemas[:foreign_attributes].map(&:name)).to eql(%i[id name title])
|
|
37
|
+
end
|
|
38
|
+
|
|
23
39
|
it 'uses projected schema for view schema' do
|
|
24
40
|
expect(relation.schemas[:names].map(&:name)).to eql(%i[name])
|
|
25
41
|
end
|
|
@@ -44,7 +60,7 @@ RSpec.describe ROM::Relation, '.view' do
|
|
|
44
60
|
context 'with an explicit schema' do
|
|
45
61
|
before do
|
|
46
62
|
# this is normally called automatically during setup
|
|
47
|
-
relation_class.finalize(
|
|
63
|
+
relation_class.finalize(registry, relation)
|
|
48
64
|
end
|
|
49
65
|
|
|
50
66
|
include_context 'relation with views' do
|
|
@@ -55,6 +71,16 @@ RSpec.describe ROM::Relation, '.view' do
|
|
|
55
71
|
attribute :name, ROM::Types::String
|
|
56
72
|
end
|
|
57
73
|
|
|
74
|
+
view(:foreign_attributes) do
|
|
75
|
+
schema do
|
|
76
|
+
append(relations[:tasks][:title])
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
relation do
|
|
80
|
+
self
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
58
84
|
view(:names) do
|
|
59
85
|
schema do
|
|
60
86
|
project(:name)
|
|
@@ -83,7 +109,7 @@ RSpec.describe ROM::Relation, '.view' do
|
|
|
83
109
|
before do
|
|
84
110
|
# this is normally called automatically during setup
|
|
85
111
|
relation_class.schema.finalize!
|
|
86
|
-
relation_class.finalize(
|
|
112
|
+
relation_class.finalize(registry, relation)
|
|
87
113
|
end
|
|
88
114
|
|
|
89
115
|
include_context 'relation with views' do
|
|
@@ -96,6 +122,16 @@ RSpec.describe ROM::Relation, '.view' do
|
|
|
96
122
|
|
|
97
123
|
schema(:users, infer: true)
|
|
98
124
|
|
|
125
|
+
view(:foreign_attributes) do
|
|
126
|
+
schema do
|
|
127
|
+
append(relations[:tasks][:title])
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
relation do
|
|
131
|
+
self
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
99
135
|
view(:names) do
|
|
100
136
|
schema do
|
|
101
137
|
project(:name)
|
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: 3.0.
|
|
4
|
+
version: 3.0.1
|
|
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-01
|
|
11
|
+
date: 2017-02-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: concurrent-ruby
|
|
@@ -397,7 +397,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
397
397
|
version: '0'
|
|
398
398
|
requirements: []
|
|
399
399
|
rubyforge_project:
|
|
400
|
-
rubygems_version: 2.
|
|
400
|
+
rubygems_version: 2.6.9
|
|
401
401
|
signing_key:
|
|
402
402
|
specification_version: 4
|
|
403
403
|
summary: Ruby Object Mapper
|