ruby_event_store-rom 1.3.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/lib/ruby_event_store/rom/changesets/create_events.rb +10 -18
  4. data/lib/ruby_event_store/rom/changesets/create_stream_entries.rb +3 -12
  5. data/lib/ruby_event_store/rom/changesets/update_events.rb +33 -19
  6. data/lib/ruby_event_store/rom/event_repository.rb +65 -61
  7. data/lib/ruby_event_store/rom/index_violation_detector.rb +25 -0
  8. data/lib/ruby_event_store/rom/mappers/event_to_serialized_record.rb +10 -6
  9. data/lib/ruby_event_store/rom/mappers/stream_entry_to_serialized_record.rb +11 -6
  10. data/lib/ruby_event_store/rom/rake_task.rb +5 -0
  11. data/lib/ruby_event_store/rom/relations/events.rb +78 -0
  12. data/lib/ruby_event_store/rom/relations/stream_entries.rb +83 -0
  13. data/lib/ruby_event_store/rom/repositories/events.rb +55 -30
  14. data/lib/ruby_event_store/rom/repositories/stream_entries.rb +15 -16
  15. data/lib/ruby_event_store/rom/tasks/migration_tasks.rake +36 -0
  16. data/lib/ruby_event_store/rom/types.rb +16 -14
  17. data/lib/ruby_event_store/rom/unit_of_work.rb +28 -13
  18. data/lib/ruby_event_store/rom/version.rb +1 -1
  19. data/lib/ruby_event_store/rom.rb +28 -103
  20. data/lib/ruby_event_store-rom.rb +1 -1
  21. metadata +31 -49
  22. data/.rubocop.yml +0 -1
  23. data/.rubocop_todo.yml +0 -84
  24. data/CHANGELOG.md +0 -9
  25. data/Gemfile +0 -12
  26. data/Makefile +0 -57
  27. data/Rakefile +0 -20
  28. data/db/migrate/20180327044629_create_ruby_event_store_tables.rb +0 -54
  29. data/db/migrate/20181026152045_index_by_event_type.rb +0 -9
  30. data/lib/ruby_event_store/rom/adapters/memory/changesets/create_events.rb +0 -19
  31. data/lib/ruby_event_store/rom/adapters/memory/changesets/create_stream_entries.rb +0 -19
  32. data/lib/ruby_event_store/rom/adapters/memory/changesets/update_events.rb +0 -18
  33. data/lib/ruby_event_store/rom/adapters/memory/relations/events.rb +0 -56
  34. data/lib/ruby_event_store/rom/adapters/memory/relations/stream_entries.rb +0 -114
  35. data/lib/ruby_event_store/rom/adapters/memory/unit_of_work.rb +0 -36
  36. data/lib/ruby_event_store/rom/adapters/sql/changesets/create_events.rb +0 -15
  37. data/lib/ruby_event_store/rom/adapters/sql/changesets/update_events.rb +0 -41
  38. data/lib/ruby_event_store/rom/adapters/sql/index_violation_detector.rb +0 -31
  39. data/lib/ruby_event_store/rom/adapters/sql/rake_task.rb +0 -5
  40. data/lib/ruby_event_store/rom/adapters/sql/relations/events.rb +0 -27
  41. data/lib/ruby_event_store/rom/adapters/sql/relations/stream_entries.rb +0 -72
  42. data/lib/ruby_event_store/rom/adapters/sql/tasks/migration_tasks.rake +0 -36
  43. data/lib/ruby_event_store/rom/memory.rb +0 -82
  44. data/lib/ruby_event_store/rom/sql.rb +0 -169
  45. data/lib/ruby_event_store/rom/tuple_uniqueness_error.rb +0 -21
  46. data/lib/ruby_event_store/spec/rom/event_repository_lint.rb +0 -176
  47. data/lib/ruby_event_store/spec/rom/relations/events_lint.rb +0 -75
  48. data/lib/ruby_event_store/spec/rom/relations/stream_entries_lint.rb +0 -198
  49. data/lib/ruby_event_store/spec/rom/spec_helper_lint.rb +0 -15
  50. data/lib/ruby_event_store/spec/rom/unit_of_work_lint.rb +0 -37
  51. data/ruby_event_store-rom.gemspec +0 -37
@@ -1,198 +0,0 @@
1
- RSpec.shared_examples :stream_entries_relation do |_relation_class|
2
- subject(:relation) { rom_container.relations[:stream_entries] }
3
-
4
- let(:env) { rom_helper.env }
5
- let(:rom_container) { env.rom_container }
6
- let(:rom_db) { rom_container.gateways[:default] }
7
-
8
- around(:each) do |example|
9
- rom_helper.run_lifecycle { example.run }
10
- end
11
-
12
- it 'just created is empty' do
13
- expect(relation.to_a).to be_empty
14
- end
15
-
16
- specify '#insert verifies tuple is unique steam and event_id' do
17
- stream_entries = [
18
- { stream: 'stream', position: 0, event_id: id1 = SecureRandom.uuid },
19
- { stream: 'stream', position: 1, event_id: SecureRandom.uuid },
20
- { stream: 'stream', position: 2, event_id: SecureRandom.uuid }
21
- ]
22
-
23
- relation.command(:create).call(stream_entries)
24
-
25
- conflicting_event_id = { stream: 'stream', position: 3, event_id: id1, created_at: Time.now }
26
-
27
- expect(relation.to_a.size).to eq(3)
28
- expect do
29
- env.handle_error(:unique_violation) { relation.insert(conflicting_event_id) }
30
- end.to raise_error(RubyEventStore::EventDuplicatedInStream)
31
-
32
- conflicting_position = { stream: 'stream', position: 2, event_id: SecureRandom.uuid, created_at: Time.now }
33
-
34
- expect do
35
- env.handle_error(:unique_violation) { relation.insert(conflicting_position) }
36
- end.to raise_error(RubyEventStore::WrongExpectedEventVersion)
37
- end
38
-
39
- specify '#take ignores nil' do
40
- stream_entries = [
41
- { stream: 'stream', position: 0, event_id: id1 = SecureRandom.uuid },
42
- { stream: 'stream', position: 1, event_id: id2 = SecureRandom.uuid },
43
- { stream: 'stream', position: 2, event_id: id3 = SecureRandom.uuid }
44
- ]
45
-
46
- relation.command(:create).call(stream_entries)
47
-
48
- expect(relation.to_a.size).to eq(3)
49
- expect(relation.take(nil).to_a.size).to eq(3)
50
- expect(relation.take(nil).map { |e| e[:event_id] }).to eq([id1, id2, id3])
51
- end
52
-
53
- specify '#take returns specified number of tuples' do
54
- stream_entries = [
55
- { stream: 'stream', position: 0, event_id: id1 = SecureRandom.uuid },
56
- { stream: 'stream', position: 1, event_id: id2 = SecureRandom.uuid },
57
- { stream: 'stream', position: 2, event_id: SecureRandom.uuid }
58
- ]
59
-
60
- relation.command(:create).call(stream_entries)
61
-
62
- expect(relation.to_a.size).to eq(3)
63
- expect(relation.take(2).to_a.size).to eq(2)
64
- expect(relation.take(2).map { |e| e[:event_id] }).to eq([id1, id2])
65
- end
66
-
67
- specify '#by_stream returns tuples for the specified stream' do
68
- stream_entries = [
69
- { stream: 'stream', position: 0, event_id: SecureRandom.uuid },
70
- { stream: 'stream', position: 1, event_id: SecureRandom.uuid },
71
- { stream: 'stream2', position: 2, event_id: SecureRandom.uuid }
72
- ]
73
-
74
- relation.command(:create).call(stream_entries)
75
-
76
- expect(relation.to_a.size).to eq(3)
77
- expect(relation.by_stream(RubyEventStore::Stream.new('stream')).to_a.size).to eq(2)
78
- end
79
-
80
- specify '#by_stream_and_event_id returns a tuple for the specified stream and event_id' do
81
- stream = RubyEventStore::Stream.new('stream')
82
- stream2 = RubyEventStore::Stream.new('stream2')
83
-
84
- stream_entries = [
85
- { stream: stream.name, position: 0, event_id: id = SecureRandom.uuid },
86
- { stream: stream.name, position: 1, event_id: SecureRandom.uuid },
87
- { stream: stream2.name, position: 2, event_id: SecureRandom.uuid }
88
- ]
89
-
90
- relation.command(:create).call(stream_entries)
91
-
92
- expect(relation.to_a.size).to eq(3)
93
- expect(relation.by_stream_and_event_id(stream, id)[:event_id]).to eq(id)
94
- expect { relation.by_stream_and_event_id(stream2, id) }.to raise_error(ROM::TupleCountMismatchError)
95
- end
96
-
97
- specify '#max_position gets the largest position value' do
98
- stream = RubyEventStore::Stream.new('stream')
99
- stream2 = RubyEventStore::Stream.new('stream2')
100
- stream3 = RubyEventStore::Stream.new('stream3')
101
-
102
- stream_entries = [
103
- { stream: stream.name, position: 0, event_id: SecureRandom.uuid },
104
- { stream: stream.name, position: 2, event_id: SecureRandom.uuid },
105
- { stream: stream.name, position: 1, event_id: SecureRandom.uuid },
106
- { stream: stream2.name, position: 1, event_id: SecureRandom.uuid },
107
- { stream: stream2.name, position: 0, event_id: SecureRandom.uuid },
108
- { stream: stream2.name, position: 3, event_id: SecureRandom.uuid },
109
- { stream: stream2.name, position: 2, event_id: SecureRandom.uuid }
110
- ]
111
-
112
- relation.command(:create).call(stream_entries)
113
-
114
- expect(relation.to_a.size).to eq(7)
115
- expect(relation.max_position(stream)).not_to be(nil)
116
- expect(relation.max_position(stream)[:position]).to eq(2)
117
- expect(relation.max_position(stream).to_h.keys).to eq([:position])
118
- expect(relation.max_position(stream3)).to eq(nil)
119
- end
120
-
121
- specify '#ordered gets the stream entries :forward' do
122
- stream = RubyEventStore::Stream.new('stream')
123
- stream2 = RubyEventStore::Stream.new('stream2')
124
-
125
- stream_entries = [
126
- { stream: stream.name, position: 0, event_id: SecureRandom.uuid },
127
- { stream: stream.name, position: 1, event_id: id1 = SecureRandom.uuid },
128
- { stream: stream.name, position: 2, event_id: id2 = SecureRandom.uuid },
129
- { stream: stream2.name, position: 0, event_id: SecureRandom.uuid },
130
- { stream: stream2.name, position: 1, event_id: SecureRandom.uuid },
131
- { stream: stream2.name, position: 2, event_id: SecureRandom.uuid },
132
- { stream: stream2.name, position: 3, event_id: SecureRandom.uuid }
133
- ]
134
-
135
- relation.command(:create).call(stream_entries)
136
-
137
- expect(relation.to_a.size).to eq(7)
138
- expect(relation.ordered(:forward, stream).to_a.size).to eq(3)
139
- expect(relation.ordered(:forward, stream).map { |e| e[:position] }).to eq([0, 1, 2])
140
-
141
- offset1 = relation.by_stream_and_event_id(stream, id1)[:id]
142
- offset2 = relation.by_stream_and_event_id(stream, id2)[:id]
143
-
144
- expect(relation.ordered(:forward, stream, offset1).map { |e| e[:position] }).to eq([2])
145
- expect(relation.ordered(:forward, stream, offset2).map { |e| e[:position] }).to eq([])
146
- end
147
-
148
- specify '#ordered gets the stream entries :backward' do
149
- stream = RubyEventStore::Stream.new('stream')
150
- stream2 = RubyEventStore::Stream.new('stream2')
151
-
152
- stream_entries = [
153
- { stream: stream.name, position: 0, event_id: id1 = SecureRandom.uuid },
154
- { stream: stream.name, position: 1, event_id: id2 = SecureRandom.uuid },
155
- { stream: stream.name, position: 2, event_id: SecureRandom.uuid },
156
- { stream: stream2.name, position: 0, event_id: SecureRandom.uuid },
157
- { stream: stream2.name, position: 1, event_id: SecureRandom.uuid },
158
- { stream: stream2.name, position: 2, event_id: SecureRandom.uuid },
159
- { stream: stream2.name, position: 3, event_id: SecureRandom.uuid }
160
- ]
161
-
162
- relation.command(:create).call(stream_entries)
163
-
164
- expect(relation.to_a.size).to eq(7)
165
- expect(relation.ordered(:backward, stream).to_a.size).to eq(3)
166
- expect(relation.ordered(:backward, stream).map { |e| e[:position] }).to eq([2, 1, 0])
167
-
168
- offset1 = relation.by_stream_and_event_id(stream, id1)[:id]
169
- offset2 = relation.by_stream_and_event_id(stream, id2)[:id]
170
-
171
- expect(relation.ordered(:backward, stream, offset1).map { |e| e[:position] }).to eq([])
172
- expect(relation.ordered(:backward, stream, offset2).map { |e| e[:position] }).to eq([0])
173
- end
174
-
175
- specify 'each method returns proper type' do
176
- stream = RubyEventStore::Stream.new('stream')
177
- stream_entries = [
178
- { stream: 'stream', position: 0, event_id: SecureRandom.uuid },
179
- { stream: 'stream', position: 1, event_id: SecureRandom.uuid },
180
- { stream: 'stream', position: 2, event_id: SecureRandom.uuid }
181
- ]
182
-
183
- relation.command(:create).call(stream_entries)
184
-
185
- expect(relation.take(1)).to be_a(relation.class)
186
- # expect(relation.take(1).one).to be_a(::ROM::Struct)
187
-
188
- expect(relation.by_stream(stream)).to be_a(relation.class)
189
- # expect(relation.by_stream(stream).take(1).one).to be_a(::ROM::Struct)
190
-
191
- # expect(relation.by_stream_and_event_id(stream, id1)).to be_a(::ROM::Struct)
192
-
193
- # expect(relation.max_position(stream)).to be_a(::ROM::Struct)
194
-
195
- expect(relation.ordered(:forward, stream)).to be_a(relation.class)
196
- # expect(relation.ordered(:forward, stream).take(1).one).to be_a(::ROM::Struct)
197
- end
198
- end
@@ -1,15 +0,0 @@
1
- module RubyEventStore::ROM
2
- RSpec.shared_examples :rom_spec_helper do |_rom_spec_helper_class|
3
- let(:env) { rom_helper.env }
4
- let(:rom_container) { env.rom_container }
5
- let(:rom_db) { rom_container.gateways[:default] }
6
-
7
- around(:each) do |example|
8
- rom_helper.run_lifecycle { example.run }
9
- end
10
-
11
- specify '#env gives access to ROM container' do
12
- expect(subject.env.rom_container).to be_a(::ROM::Container)
13
- end
14
- end
15
- end
@@ -1,37 +0,0 @@
1
- module RubyEventStore::ROM
2
- RSpec.shared_examples :unit_of_work do |unit_of_work_class|
3
- subject(:unit_of_work) { unit_of_work_class.new(rom: env) }
4
-
5
- let(:env) { rom_helper.env }
6
- let(:v) { env.rom_container }
7
- let(:rom_db) { rom_container.gateways[:default] }
8
-
9
- around(:each) do |example|
10
- rom_helper.run_lifecycle { example.run }
11
- end
12
-
13
- specify '#env gives access to ROM container' do
14
- expect(subject.env.rom_container).to be_a(::ROM::Container)
15
- end
16
-
17
- specify '#call to throw an exeption' do
18
- expect { subject.call(gateway: nil) {} }.to raise_error(KeyError)
19
- end
20
-
21
- specify '#env is the instance we specified' do
22
- expect(subject.env).to eq(env)
23
- end
24
-
25
- specify '#env is the global instance' do
26
- RubyEventStore::ROM.env = rom_helper.class.new.env
27
-
28
- subject2 = unit_of_work_class.new
29
-
30
- expect(subject2.env).to eq(RubyEventStore::ROM.env)
31
- expect(subject2.env).not_to eq(subject.env)
32
- expect(subject.env).not_to eq(RubyEventStore::ROM.env)
33
-
34
- RubyEventStore::ROM.env = nil
35
- end
36
- end
37
- end
@@ -1,37 +0,0 @@
1
- lib = File.expand_path('lib', __dir__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require 'ruby_event_store/rom/version'
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = 'ruby_event_store-rom'
7
- spec.version = RubyEventStore::ROM::VERSION
8
- spec.licenses = ['MIT']
9
- spec.authors = ['Joel Van Horn']
10
- spec.email = ['joel@joelvanhorn.com']
11
-
12
- spec.summary = 'ROM events repository for Ruby Event Store'
13
- spec.description = "Implementation of events repository based on ROM for Ruby Event Store'"
14
- spec.homepage = 'https://railseventstore.org'
15
- spec.metadata = {
16
- 'homepage_uri' => 'https://railseventstore.org/',
17
- 'changelog_uri' => 'https://github.com/RailsEventStore/rails_event_store/releases',
18
- 'source_code_uri' => 'https://github.com/RailsEventStore/rails_event_store',
19
- 'bug_tracker_uri' => 'https://github.com/RailsEventStore/rails_event_store/issues'
20
- }
21
-
22
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
23
- spec.bindir = 'exe'
24
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
- spec.require_paths = ['lib']
26
-
27
- spec.required_ruby_version = '>= 2.4'
28
-
29
- spec.add_dependency 'dry-container', '>= 0.6'
30
- spec.add_dependency 'dry-initializer', '>= 3.0'
31
- spec.add_dependency 'dry-types', '>= 1.0'
32
- spec.add_dependency 'rom-changeset', '>= 5.0'
33
- spec.add_dependency 'rom-repository', '>= 5.0'
34
- spec.add_dependency 'rom-sql', '>= 3.0'
35
- spec.add_dependency 'ruby_event_store', '= 1.3.1'
36
- spec.add_dependency 'sequel', '>= 5.11.0'
37
- end