rom-repository 1.4.0 → 2.0.0.beta1

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.
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