rom-repository 1.4.0 → 2.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -6
  3. data/{LICENSE.txt → LICENSE} +1 -1
  4. data/README.md +18 -1
  5. data/lib/rom-repository.rb +1 -2
  6. data/lib/rom/repository.rb +9 -216
  7. data/lib/rom/repository/class_interface.rb +16 -33
  8. data/lib/rom/repository/relation_reader.rb +46 -0
  9. data/lib/rom/repository/root.rb +3 -59
  10. data/lib/rom/repository/version.rb +1 -1
  11. metadata +9 -98
  12. data/.gitignore +0 -3
  13. data/.rspec +0 -3
  14. data/.travis.yml +0 -27
  15. data/.yardopts +0 -2
  16. data/Gemfile +0 -38
  17. data/Rakefile +0 -19
  18. data/lib/rom/open_struct.rb +0 -35
  19. data/lib/rom/repository/changeset.rb +0 -155
  20. data/lib/rom/repository/changeset/associated.rb +0 -100
  21. data/lib/rom/repository/changeset/create.rb +0 -16
  22. data/lib/rom/repository/changeset/delete.rb +0 -17
  23. data/lib/rom/repository/changeset/pipe.rb +0 -97
  24. data/lib/rom/repository/changeset/restricted.rb +0 -28
  25. data/lib/rom/repository/changeset/stateful.rb +0 -282
  26. data/lib/rom/repository/changeset/update.rb +0 -82
  27. data/lib/rom/repository/command_compiler.rb +0 -257
  28. data/lib/rom/repository/command_proxy.rb +0 -26
  29. data/lib/rom/repository/header_builder.rb +0 -65
  30. data/lib/rom/repository/mapper_builder.rb +0 -23
  31. data/lib/rom/repository/relation_proxy.rb +0 -337
  32. data/lib/rom/repository/relation_proxy/combine.rb +0 -320
  33. data/lib/rom/repository/relation_proxy/wrap.rb +0 -78
  34. data/lib/rom/repository/struct_builder.rb +0 -83
  35. data/lib/rom/struct.rb +0 -113
  36. data/log/.gitkeep +0 -0
  37. data/rom-repository.gemspec +0 -23
  38. data/spec/integration/changeset_spec.rb +0 -193
  39. data/spec/integration/command_macros_spec.rb +0 -191
  40. data/spec/integration/command_spec.rb +0 -228
  41. data/spec/integration/multi_adapter_spec.rb +0 -73
  42. data/spec/integration/repository/aggregate_spec.rb +0 -58
  43. data/spec/integration/repository_spec.rb +0 -406
  44. data/spec/integration/root_repository_spec.rb +0 -106
  45. data/spec/integration/typed_structs_spec.rb +0 -64
  46. data/spec/shared/database.rb +0 -79
  47. data/spec/shared/mappers.rb +0 -35
  48. data/spec/shared/models.rb +0 -41
  49. data/spec/shared/plugins.rb +0 -66
  50. data/spec/shared/relations.rb +0 -115
  51. data/spec/shared/repo.rb +0 -86
  52. data/spec/shared/seeds.rb +0 -30
  53. data/spec/shared/structs.rb +0 -140
  54. data/spec/spec_helper.rb +0 -83
  55. data/spec/support/mapper_registry.rb +0 -9
  56. data/spec/support/mutant.rb +0 -10
  57. data/spec/unit/changeset/associate_spec.rb +0 -120
  58. data/spec/unit/changeset/map_spec.rb +0 -111
  59. data/spec/unit/changeset_spec.rb +0 -186
  60. data/spec/unit/relation_proxy_spec.rb +0 -202
  61. data/spec/unit/repository/changeset_spec.rb +0 -197
  62. data/spec/unit/repository/inspect_spec.rb +0 -18
  63. data/spec/unit/repository/session_spec.rb +0 -251
  64. data/spec/unit/repository/transaction_spec.rb +0 -42
  65. data/spec/unit/session_spec.rb +0 -46
  66. data/spec/unit/struct_builder_spec.rb +0 -128
@@ -1,197 +0,0 @@
1
- RSpec.describe ROM::Repository, '#changeset' do
2
- subject(:repo) do
3
- Class.new(ROM::Repository) { relations :users }.new(rom)
4
- end
5
-
6
- include_context 'database'
7
- include_context 'relations'
8
-
9
- describe ROM::Changeset::Create do
10
- context 'with a hash' do
11
- let(:changeset) do
12
- repo.changeset(:users, name: 'Jane')
13
- end
14
-
15
- it 'has data' do
16
- expect(changeset.to_h).to eql(name: 'Jane')
17
- end
18
-
19
- it 'has relation' do
20
- expect(changeset.relation).to be(repo.users)
21
- end
22
-
23
- it 'can be commited' do
24
- expect(changeset.commit).to eql(id: 1, name: 'Jane')
25
- end
26
- end
27
-
28
- context 'with an array' do
29
- let(:changeset) do
30
- repo.changeset(:users, data)
31
- end
32
-
33
- let(:data) do
34
- [{ name: 'Jane' }, { name: 'Joe' }]
35
- end
36
-
37
- it 'has data' do
38
- expect(changeset.to_a).to eql(data)
39
- end
40
-
41
- it 'has relation' do
42
- expect(changeset.relation).to be(repo.users)
43
- end
44
-
45
- it 'can be commited' do
46
- expect(changeset.commit).to eql([{ id: 1, name: 'Jane' }, { id: 2, name: 'Joe' }])
47
- end
48
- end
49
- end
50
-
51
- describe ROM::Changeset::Update do
52
- let(:data) do
53
- { name: 'Jane Doe' }
54
- end
55
-
56
- shared_context 'a valid update changeset' do
57
- let!(:jane) do
58
- repo.command(:create, repo.users).call(name: 'Jane')
59
- end
60
-
61
- let!(:joe) do
62
- repo.command(:create, repo.users).call(name: 'Joe')
63
- end
64
-
65
- it 'has data' do
66
- expect(changeset.to_h).to eql(name: 'Jane Doe')
67
- end
68
-
69
- it 'has diff' do
70
- expect(changeset.diff).to eql(name: 'Jane Doe')
71
- end
72
-
73
- it 'has relation' do
74
- expect(changeset.relation.one).to eql(repo.users.by_pk(jane[:id]).one)
75
- end
76
-
77
- it 'can be commited' do
78
- expect(changeset.commit).to eql(id: 1, name: 'Jane Doe')
79
- expect(repo.users.by_pk(joe[:id]).one).to eql(joe)
80
- end
81
- end
82
-
83
- context 'using PK to restrict a relation' do
84
- let(:changeset) do
85
- repo.changeset(:users, jane[:id], data)
86
- end
87
-
88
- include_context 'a valid update changeset'
89
- end
90
-
91
- context 'using custom relation' do
92
- let(:changeset) do
93
- repo.changeset(update: repo.users.by_pk(jane[:id])).data(data)
94
- end
95
-
96
- include_context 'a valid update changeset'
97
- end
98
- end
99
-
100
- describe ROM::Changeset::Delete do
101
- let(:changeset) do
102
- repo.changeset(delete: relation)
103
- end
104
-
105
- let(:relation) do
106
- repo.users.by_pk(user[:id])
107
- end
108
-
109
- let(:user) do
110
- repo.command(:create, repo.users).call(name: 'Jane')
111
- end
112
-
113
- it 'has relation' do
114
- expect(changeset.relation).to eql(relation)
115
- end
116
-
117
- it 'can be commited' do
118
- expect(changeset.commit.to_h).to eql(id: 1, name: 'Jane')
119
- expect(relation.one).to be(nil)
120
- end
121
- end
122
-
123
- describe 'custom changeset class' do
124
- context 'with a Create' do
125
- let(:changeset) do
126
- repo.changeset(changeset_class[:users]).data({})
127
- end
128
-
129
- let(:changeset_class) do
130
- Class.new(ROM::Changeset::Create) do
131
- def to_h
132
- __data__.merge(name: 'Jane')
133
- end
134
- end
135
- end
136
-
137
- it 'has data' do
138
- expect(changeset.to_h).to eql(name: 'Jane')
139
- end
140
-
141
- it 'has relation' do
142
- expect(changeset.relation).to be(repo.users)
143
- end
144
-
145
- it 'can be commited' do
146
- expect(changeset.commit).to eql(id: 1, name: 'Jane')
147
- end
148
- end
149
-
150
- context 'with an Update' do
151
- let(:changeset) do
152
- repo.changeset(changeset_class).by_pk(user.id, name: 'Jade')
153
- end
154
-
155
- let(:changeset_class) do
156
- Class.new(ROM::Changeset::Update[:users]) do
157
- map { |t| t.merge(name: "#{t[:name]} Doe") }
158
- end
159
- end
160
-
161
- let(:user) do
162
- repo.command(:create, repo.users).call(name: 'Jane')
163
- end
164
-
165
- it 'has data' do
166
- expect(changeset.to_h).to eql(name: 'Jade Doe')
167
- end
168
-
169
- it 'has relation restricted by pk' do
170
- expect(changeset.relation.dataset).to eql(repo.users.by_pk(user.id).dataset)
171
- end
172
-
173
- it 'can be commited' do
174
- expect(changeset.commit).to eql(id: 1, name: 'Jade Doe')
175
- end
176
- end
177
- end
178
-
179
- it 'raises ArgumentError when unknown type was used' do
180
- expect { repo.changeset(not_here: repo.users) }.
181
- to raise_error(
182
- ArgumentError,
183
- '+:not_here+ is not a valid changeset type. Must be one of: [:create, :update, :delete]'
184
- )
185
- end
186
-
187
- it 'raises ArgumentError when unknown class was used' do
188
- klass = Class.new {
189
- def self.name
190
- 'SomeClass'
191
- end
192
- }
193
-
194
- expect { repo.changeset(klass) }.
195
- to raise_error(ArgumentError, /SomeClass/)
196
- end
197
- end
@@ -1,18 +0,0 @@
1
- RSpec.describe ROM::Repository, '#inspect' do
2
- subject(:repo) do
3
- Class.new(ROM::Repository) do
4
- relations :users
5
-
6
- def self.to_s
7
- 'UserRepo'
8
- end
9
- end.new(rom)
10
- end
11
-
12
- include_context 'database'
13
- include_context 'relations'
14
-
15
- specify do
16
- expect(repo.inspect).to eql('#<UserRepo relations=[:users]>')
17
- end
18
- end
@@ -1,251 +0,0 @@
1
- RSpec.describe ROM::Repository, '#session' do
2
- subject(:repo) do
3
- Class.new(ROM::Repository) { relations :users, :posts, :labels }.new(rom)
4
- end
5
-
6
- include_context 'database'
7
- include_context 'relations'
8
-
9
- describe 'with :create command' do
10
- let(:user_changeset) do
11
- repo.changeset(:users, name: 'Jane')
12
- end
13
-
14
- it 'saves data in a transaction' do
15
- repo.session do |s|
16
- s.add(user_changeset)
17
- end
18
-
19
- user = repo.users.where(name: 'Jane').one
20
- expect(user.to_h).to eql(id: 1, name: 'Jane')
21
- end
22
- end
23
-
24
- describe 'with :update command' do
25
- let(:user_changeset) do
26
- repo.changeset(:users, user.id, user.to_h.merge(name: 'Jane Doe'))
27
- end
28
-
29
- let(:user) do
30
- repo.users.where(name: 'Jane').one
31
- end
32
-
33
- before do
34
- repo.command(:create, repo.users).call(name: 'John')
35
- repo.command(:create, repo.users).call(name: 'Jane')
36
- end
37
-
38
- it 'saves data in a transaction' do
39
- repo.session do |s|
40
- s.add(user_changeset)
41
- end
42
-
43
- updated_user = repo.users.fetch(user.id)
44
-
45
- expect(updated_user).to eql(id: 2, name: 'Jane Doe')
46
- end
47
- end
48
-
49
- describe 'with :delete command' do
50
- let(:user) do
51
- repo.users.where(name: 'Jane').one
52
- end
53
-
54
- before do
55
- repo.command(:create, repo.users).call(name: 'John')
56
- repo.command(:create, repo.users).call(name: 'Jane')
57
- end
58
-
59
- let(:user_changeset) do
60
- repo.changeset(delete: repo.users.by_pk(user.id))
61
- end
62
-
63
- it 'saves data in a transaction' do
64
- repo.session do |t|
65
- t.add(user_changeset)
66
- end
67
-
68
- expect(repo.users.by_pk(user.id).one).to be(nil)
69
- expect(repo.users.count).to be(1)
70
- end
71
- end
72
-
73
- describe 'with :custom command', :postgres do
74
- before do
75
- configuration.commands(:users) do
76
- define(:create) do
77
- register_as :custom
78
- end
79
- end
80
- end
81
-
82
- let(:user_changeset) do
83
- repo.changeset(:users, name: 'John').with(command_type: :custom)
84
- end
85
-
86
- it 'saves data in a transaction' do
87
- repo.session do |t|
88
- t.add(user_changeset)
89
- end
90
-
91
- user = repo.users.first
92
-
93
- expect(user.id).to_not be(nil)
94
- expect(user.name).to eql('John')
95
- expect(repo.users.count).to be(1)
96
- end
97
- end
98
-
99
- describe 'creating a user with its posts' do
100
- let(:posts_changeset) do
101
- repo.changeset(:posts, [{ title: 'Post 1' }, { title: 'Post 2' }])
102
- end
103
-
104
- let(:user_changeset) do
105
- repo.changeset(:users, name: 'Jane')
106
- end
107
-
108
- it 'saves data in a transaction' do
109
- repo.session do |s|
110
- s.add(user_changeset.associate(posts_changeset, :author))
111
- end
112
-
113
- user = repo.users.combine(:posts).one
114
-
115
- expect(user.name).to eql('Jane')
116
- expect(user.posts.size).to be(2)
117
- expect(user.posts[0].title).to eql('Post 1')
118
- expect(user.posts[1].title).to eql('Post 2')
119
- end
120
- end
121
-
122
- describe 'creating a user with its posts and their labels' do
123
- let(:posts_data) do
124
- { title: 'Post 1' }
125
- end
126
-
127
- let(:posts_changeset) do
128
- repo.
129
- changeset(:posts, posts_data).
130
- associate(labels_changeset, :posts)
131
- end
132
-
133
- let(:labels_changeset) do
134
- repo.changeset(:labels, [{ name: 'red' }, { name: 'green' }])
135
- end
136
-
137
- let(:user_changeset) do
138
- repo.
139
- changeset(:users, name: 'Jane').
140
- associate(posts_changeset, :author)
141
- end
142
-
143
- it 'saves data in a transaction' do
144
- repo.session do |t|
145
- t.add(user_changeset)
146
- end
147
-
148
- user = repo.users.combine(posts: [:labels]).one
149
-
150
- expect(user.name).to eql('Jane')
151
- expect(user.posts.size).to be(1)
152
- expect(user.posts[0].title).to eql('Post 1')
153
- expect(user.posts[0].labels.size).to be(2)
154
- expect(user.posts[0].labels[0].name).to eql('red')
155
- expect(user.posts[0].labels[1].name).to eql('green')
156
- end
157
-
158
- context 'with invalid data' do
159
- let(:posts_data) do
160
- [{ title: nil }]
161
- end
162
-
163
- it 'rolls back the transaction' do
164
- expect {
165
- repo.session do |t|
166
- t.add(user_changeset)
167
- end
168
- }.to raise_error(ROM::SQL::ConstraintError)
169
-
170
- expect(repo.users.count).to be(0)
171
- expect(repo.posts.count).to be(0)
172
- expect(repo.labels.count).to be(0)
173
- end
174
- end
175
- end
176
-
177
- describe 'creating new posts for existing user' do
178
- let(:posts_changeset) do
179
- repo.
180
- changeset(:posts, [{ title: 'Post 1' }, { title: 'Post 2' }]).
181
- associate(user, :author)
182
- end
183
-
184
- let(:user) do
185
- repo.command(:create, repo.users).call(name: 'Jane')
186
- end
187
-
188
- it 'saves data in a transaction' do
189
- repo.session do |s|
190
- s.add(posts_changeset)
191
- end
192
-
193
- user = repo.users.combine(:posts).one
194
-
195
- expect(user.posts.size).to be(2)
196
- expect(user.posts[0].title).to eql('Post 1')
197
- expect(user.posts[1].title).to eql('Post 2')
198
- end
199
- end
200
-
201
- describe 'nesting sessions' do
202
- let(:user_changeset) do
203
- repo.changeset(:users, name: 'Jane')
204
- end
205
-
206
- let(:posts_changeset) do
207
- repo.changeset(:posts, post_data)
208
- end
209
-
210
- let(:user) do
211
- repo.users.where(name: 'Jane').one
212
- end
213
-
214
- context 'when data is valid' do
215
- let(:post_data) do
216
- [{ title: 'Post 1' }, { title: 'Post 2' }]
217
- end
218
-
219
- it 'saves data in transactions' do
220
- repo.send(:transaction) do |t|
221
- repo.session { |s| s.add(user_changeset) }
222
- repo.session { |s| s.add(posts_changeset.associate(user, :author)) }
223
- end
224
-
225
- user = repo.users.combine(:posts).one
226
-
227
- expect(user.posts.size).to be(2)
228
- expect(user.posts[0].title).to eql('Post 1')
229
- expect(user.posts[1].title).to eql('Post 2')
230
- end
231
- end
232
-
233
- context 'when data is not valid' do
234
- let(:post_data) do
235
- [{ title: 'Post 1' }, { title: nil }]
236
- end
237
-
238
- it 'rolls back transaction' do
239
- expect {
240
- repo.send(:transaction) do |t|
241
- repo.session { |s| s.add(user_changeset) }
242
- repo.session { |s| s.add(posts_changeset.associate(user, :author)) }
243
- end
244
- }.to raise_error(ROM::SQL::ConstraintError, /title/)
245
-
246
- expect(repo.users.count).to be(0)
247
- expect(repo.posts.count).to be(0)
248
- end
249
- end
250
- end
251
- end