rails_event_store 0.2.2 → 0.3.0

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: 05020e834d5c97cc237417e4a7be9faaa390e6dd
4
- data.tar.gz: d4a5b24df71b0ab5bc7db11e7b70c9fc44453f32
3
+ metadata.gz: 2d9826553e1956e364b65709bd8e29e713869a6b
4
+ data.tar.gz: 2f30ed66122ba0a9a30b5bd3053f03652eaf94ab
5
5
  SHA512:
6
- metadata.gz: 332ca9bb7abad5c530e016cc3798947077cd94940aafc058cff89ad0fec911a1bedb86ffa76dfbd3efbebd7fa6fe8c4a5d80a7d7ad490116e0863af3eaf64825
7
- data.tar.gz: 4ee55442c067e05d362d358da1cb4d954d488bfed9751e7e34d778067cd990580b1453a5e319a241b0026d6ef0019513d4fe0dfc23798708417783b388a9e537
6
+ metadata.gz: 5b2e74bd009c8369d43507147d7c0c64748787e3a6207f2482b8c14b1671853d003b9aa1647276f404400e0bebe2a201dee8e39b5d26c9c0c44ccf931c6783bb
7
+ data.tar.gz: 1200e2ab68017a246835588778bee2b0a577af0aec61935b1f27c008f19274508b7f56b5a215788ddf5ec24ccd99251eff63d5d8dc4e045c139ca5f032e96cfd
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ### HEAD
2
2
 
3
+ ### 0.3.0 (03.03.2016)
4
+
5
+ * Update to ruby_event_store 0.3.0 - see ruby_event_store changelog for more details
6
+ * Implement reading forward & backward (aliasold methods to read forward)
7
+ * Implement paging when reading from all streams
8
+
3
9
  ### 0.2.2 (25.02.2016)
4
10
 
5
11
  * Restore AggregateRoot in RES, but this time as a dependency on aggregate_root gem
data/README.md CHANGED
@@ -38,16 +38,18 @@ Firstly you have to define own event model extending `RailsEventStore::Event` cl
38
38
  ```ruby
39
39
  class OrderCreated < RailsEventStore::Event
40
40
  end
41
+
42
+ # or
43
+
44
+ OrderCreated = Class.new(RailsEventStore::Event)
41
45
  ```
42
46
 
43
47
  ```ruby
44
48
  stream_name = "order_1"
45
- event_data = {
46
- data: { data: "sample" },
47
- event_id: "b2d506fd-409d-4ec7-b02f-c6d2295c7edd"
48
- }
49
- event = OrderCreated.new(event_data)
50
-
49
+ event = OrderCreated.new(
50
+ data: "sample",
51
+ event_id: "b2d506fd-409d-4ec7-b02f-c6d2295c7edd"
52
+ )
51
53
  #publishing event for specific stream
52
54
  client.publish_event(event, stream_name)
53
55
 
@@ -64,39 +66,97 @@ end
64
66
 
65
67
  ```ruby
66
68
  stream_name = "order_1"
67
- event_data = {
68
- data: { data: "sample" },
69
- event_id: "b2d506fd-409d-4ec7-b02f-c6d2295c7edd"
70
- }
71
- event = OrderCreated.new(event_data)
69
+ event = OrderCreated.new(
70
+ data: "sample",
71
+ event_id: "b2d506fd-409d-4ec7-b02f-c6d2295c7edd"
72
+ )
72
73
  expected_version = "850c347f-423a-4158-a5ce-b885396c5b73" #last event_id
73
74
  client.publish_event(event, stream_name, expected_version)
74
75
  ```
75
76
 
76
- #### Reading stream's events forward in batch
77
+ #### Reading stream's events forward in batch - starting from first event
77
78
 
78
79
  ```ruby
79
80
  stream_name = "order_1"
80
- start = "850c347f-423a-4158-a5ce-b885396c5b73"
81
81
  count = 40
82
- client.read_all_events(stream_name, start, count)
82
+ client.read_events_forward(stream_name, :head, count)
83
83
  ```
84
84
 
85
+ In this case `:head` means first event of the stream.
86
+
87
+ #### Reading stream's events forward in batch - staring from given event
88
+
89
+ ```ruby
90
+ # last_read_event is any domain event read or published by rails_event_store
91
+
92
+ stream_name = "order_1"
93
+ start = last_read_event.event_id
94
+ count = 40
95
+ client.read_events_forward(stream_name, start, count)
96
+ ```
97
+
98
+ #### Reading stream's events backward in batch
99
+
100
+ As in examples above, just use `read_events_backward` instead of `read_events_forward`.
101
+ In this case `:head` means last event of the stream.
102
+
85
103
  #### Reading all events from stream forward
86
104
 
87
105
  This method allows us to load all stream's events ascending.
88
106
 
89
107
  ```ruby
90
108
  stream_name = "order_1"
91
- client.read_all_events(stream_name)
109
+ client.read_stream_events_forward(stream_name)
110
+ ```
111
+
112
+ #### Reading all events from stream forward
113
+
114
+ This method allows us to load all stream's events descending.
115
+
116
+ ```ruby
117
+ stream_name = "order_1"
118
+ client.read_stream_events_backward(stream_name)
92
119
  ```
93
120
 
94
121
  #### Reading all events forward
95
122
 
96
123
  This method allows us to load all stored events ascending.
97
124
 
125
+ This will read first 100 domain events stored in event store.
126
+
127
+ ```ruby
128
+ client.read_all_streams_forward(:head, 100)
129
+ ```
130
+
131
+ When not specified it reads events starting from `:head` (first domain event
132
+ stored in event store) and reads up to `RailsEventStore::PAGE_SIZE`
133
+ domain events.
134
+
135
+ ```ruby
136
+ client.read_all_streams_forward
137
+ ```
138
+
139
+ You could also read batch of domain events starting from any read or published event.
140
+
141
+ ```ruby
142
+ client.read_all_streams_forward(last_read_event.event_id, 100)
143
+ ```
144
+
145
+ #### Reading all events backward
146
+
147
+ This method allows us to load all stored events descending.
148
+
149
+ This will read last 100 domain events stored in event store.
150
+ ```ruby
151
+ client.read_all_streams_backward(:head, 100)
152
+ ```
153
+
154
+ When not specified it reads events starting from `:head` (last domain event
155
+ stored in event store) and reads up to `RailsEventStore::PAGE_SIZE`
156
+ domain events.
157
+
98
158
  ```ruby
99
- client.read_all_streams
159
+ client.read_all_streams_backward
100
160
  ```
101
161
 
102
162
  #### Deleting stream
@@ -1,30 +1,38 @@
1
1
  module RailsEventStore
2
2
  class Client
3
3
 
4
- def initialize(repository = Repositories::EventRepository.new)
4
+ def initialize(repository = Repositories::EventRepository.new, page_size = PAGE_SIZE)
5
5
  @repository = repository
6
+ @page_size = page_size
6
7
  end
7
- attr_reader :repository
8
+ attr_reader :repository, :page_size
8
9
 
9
- def publish_event(event_data, stream_name = GLOBAL_STREAM, expected_version = nil)
10
- event_store.publish_event(event_data, stream_name, expected_version)
10
+ def publish_event(event, stream_name = GLOBAL_STREAM, expected_version = nil)
11
+ event_store.publish_event(event, stream_name, expected_version)
12
+ end
13
+
14
+ def appent_to_stream(event, stream_name = GLOBAL_STREAM, expected_version = nil)
15
+ event_store.appent_to_stream(stream_name, event, expected_version)
11
16
  end
12
17
 
13
18
  def delete_stream(stream_name)
14
19
  event_store.delete_stream(stream_name)
15
20
  end
16
21
 
17
- def read_events(stream_name, start, count)
18
- event_store.read_events(stream_name, start, count)
22
+ def read_events_forward(stream_name, start = :head, count = page_size)
23
+ event_store.read_events_forward(stream_name, start, count)
19
24
  end
25
+ alias :read_events :read_events_forward
20
26
 
21
- def read_all_events(stream_name)
22
- event_store.read_all_events(stream_name)
27
+ def read_stream_events_forward(stream_name)
28
+ event_store.read_stream_events_forward(stream_name)
23
29
  end
30
+ alias :read_all_events :read_stream_events_forward
24
31
 
25
- def read_all_streams
26
- event_store.read_all_streams
32
+ def read_all_streams_forward(start = :head, count = page_size)
33
+ event_store.read_all_streams_forward(start, count)
27
34
  end
35
+ alias :read_all_streams :read_all_streams_forward
28
36
 
29
37
  def subscribe(subscriber, event_types)
30
38
  event_store.subscribe(subscriber, event_types)
@@ -1,3 +1,4 @@
1
1
  module RailsEventStore
2
2
  GLOBAL_STREAM = 'all'.freeze
3
+ PAGE_SIZE = 100.freeze
3
4
  end
@@ -1,19 +1,3 @@
1
1
  module RailsEventStore
2
- class Event < RubyEventStore::Event
3
- def initialize(**args)
4
- attributes = args.except(:event_type, :event_id, :metadata)
5
- singleton_class = (class << self; self; end)
6
- attributes.each do |key, value|
7
- singleton_class.send(:define_method, key) { value }
8
- end
9
-
10
- event_data = {
11
- event_type: args[:event_type] || self.class.name,
12
- data: attributes,
13
- }
14
- event_data[:event_id] = args[:event_id] if args.key?(:event_id)
15
- event_data[:metadata] = args[:metadata] if args.key?(:metadata)
16
- super(event_data)
17
- end
18
- end
2
+ Event = RubyEventStore::Event
19
3
  end
@@ -7,35 +7,82 @@ module RailsEventStore
7
7
  end
8
8
  attr_reader :adapter
9
9
 
10
- def find(condition)
11
- build_event_entity(adapter.where(condition).first)
10
+ def create(event, stream_name)
11
+ data = event.to_h.merge!(stream: stream_name)
12
+ adapter.create(data)
13
+ event
12
14
  end
13
15
 
14
- def create(data)
15
- build_event_entity(adapter.create(data))
16
- rescue ActiveRecord::RecordNotUnique
17
- raise EventCannotBeSaved
18
- end
19
-
20
- def delete(condition)
16
+ def delete_stream(stream_name)
17
+ condition = {stream: stream_name}
21
18
  adapter.destroy_all condition
22
19
  nil
23
20
  end
24
21
 
25
- def get_all_events
26
- adapter.order('id ASC').order('stream').all.map(&method(:build_event_entity))
22
+ def has_event?(event_id)
23
+ adapter.exists?(event_id: event_id)
27
24
  end
28
25
 
29
26
  def last_stream_event(stream_name)
30
27
  build_event_entity(adapter.where(stream: stream_name).last)
31
28
  end
32
29
 
33
- def load_all_events_forward(stream_name)
34
- adapter.where(stream: stream_name).order('id ASC').map(&method(:build_event_entity))
30
+ def get_all_events
31
+ adapter.order('id ASC').order('stream').all.map(&method(:build_event_entity))
32
+ end
33
+
34
+ def read_events_forward(stream_name, start_event_id, count)
35
+ stream = adapter.where(stream: stream_name)
36
+ unless start_event_id.equal?(:head)
37
+ starting_event = adapter.find_by(event_id: start_event_id)
38
+ stream = stream.where('id > ?', starting_event.id)
39
+ end
40
+
41
+ stream.order('id ASC').limit(count)
42
+ .map(&method(:build_event_entity))
43
+ end
44
+
45
+ def read_events_backward(stream_name, start_event_id, count)
46
+ stream = adapter.where(stream: stream_name)
47
+ unless start_event_id.equal?(:head)
48
+ starting_event = adapter.find_by(event_id: start_event_id)
49
+ stream = stream.where('id < ?', starting_event.id)
50
+ end
51
+
52
+ stream.order('id DESC').limit(count)
53
+ .map(&method(:build_event_entity))
54
+ end
55
+
56
+ def read_stream_events_forward(stream_name)
57
+ adapter.where(stream: stream_name).order('id ASC')
58
+ .map(&method(:build_event_entity))
59
+ end
60
+
61
+ def read_stream_events_backward(stream_name)
62
+ adapter.where(stream: stream_name).order('id DESC')
63
+ .map(&method(:build_event_entity))
35
64
  end
36
65
 
37
- def load_events_batch(stream_name, start_point, count)
38
- adapter.where('id >= ? AND stream = ?', start_point, stream_name).limit(count).map(&method(:build_event_entity))
66
+ def read_all_streams_forward(start_event_id, count)
67
+ stream = adapter
68
+ unless start_event_id.equal?(:head)
69
+ starting_event = adapter.find_by(event_id: start_event_id)
70
+ stream = stream.where('id > ?', starting_event.id)
71
+ end
72
+
73
+ stream.order('id ASC').limit(count)
74
+ .map(&method(:build_event_entity))
75
+ end
76
+
77
+ def read_all_streams_backward(start_event_id, count)
78
+ stream = adapter
79
+ unless start_event_id.equal?(:head)
80
+ starting_event = adapter.find_by(event_id: start_event_id)
81
+ stream = stream.where('id < ?', starting_event.id)
82
+ end
83
+
84
+ stream.order('id DESC').limit(count)
85
+ .map(&method(:build_event_entity))
39
86
  end
40
87
 
41
88
  private
@@ -45,7 +92,6 @@ module RailsEventStore
45
92
  ::RailsEventStore::Event.new(record.data.merge(
46
93
  event_type: record.event_type,
47
94
  event_id: record.event_id,
48
- stream: record.stream,
49
95
  metadata: record.metadata))
50
96
  end
51
97
 
@@ -1,3 +1,3 @@
1
1
  module RailsEventStore
2
- VERSION = '0.2.2'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -9,9 +9,9 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ['rybex', 'mpraglowski']
10
10
  spec.email = ['tomek.rybka@gmail.com', 'm@praglowski.com']
11
11
 
12
- spec.summary = %q{Implementation of Event Store in Ruby}
12
+ spec.summary = %q{Event Store in Ruby}
13
13
  spec.description = %q{Implementation of Event Store in Ruby}
14
- spec.homepage = ''
14
+ spec.homepage = 'https://github.com/arkency/rails_event_store'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
17
  spec.bindir = 'exe'
@@ -20,14 +20,14 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.9'
22
22
  spec.add_development_dependency 'rake', '~> 10.0'
23
- spec.add_development_dependency 'pry'
24
- spec.add_development_dependency 'rspec'
25
- spec.add_development_dependency 'rails', '~> 4.2.1'
26
- spec.add_development_dependency 'webmock', '~> 1.21.0'
27
- spec.add_development_dependency 'sqlite3'
23
+ spec.add_development_dependency 'pry', '~> 0'
24
+ spec.add_development_dependency 'rspec', '~> 0'
25
+ spec.add_development_dependency 'rails', '~> 4.2'
26
+ spec.add_development_dependency 'webmock', '~> 1.21'
27
+ spec.add_development_dependency 'sqlite3', '~> 0'
28
28
 
29
- spec.add_dependency 'ruby_event_store', '>= 0.2.0'
30
- spec.add_dependency 'aggregate_root', '>= 0.1.0'
29
+ spec.add_dependency 'ruby_event_store', '~> 0.3'
30
+ spec.add_dependency 'aggregate_root', '~> 0'
31
31
  spec.add_dependency 'activesupport', '>= 3.0'
32
32
  spec.add_dependency 'activemodel', '>= 3.0'
33
33
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_event_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - rybex
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-02-25 00:00:00.000000000 Z
12
+ date: 2016-03-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -43,28 +43,28 @@ dependencies:
43
43
  name: pry
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ">="
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ">="
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rspec
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ">="
60
+ - - "~>"
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ">="
67
+ - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
@@ -73,70 +73,70 @@ dependencies:
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: 4.2.1
76
+ version: '4.2'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: 4.2.1
83
+ version: '4.2'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: webmock
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: 1.21.0
90
+ version: '1.21'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: 1.21.0
97
+ version: '1.21'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: sqlite3
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - ">="
102
+ - - "~>"
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - ">="
109
+ - - "~>"
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: ruby_event_store
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - ">="
116
+ - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: 0.2.0
118
+ version: '0.3'
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ">="
123
+ - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: 0.2.0
125
+ version: '0.3'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: aggregate_root
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - ">="
130
+ - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: 0.1.0
132
+ version: '0'
133
133
  type: :runtime
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - ">="
137
+ - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: 0.1.0
139
+ version: '0'
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: activesupport
142
142
  requirement: !ruby/object:Gem::Requirement
@@ -192,7 +192,7 @@ files:
192
192
  - lib/rails_event_store/repositories/event_repository.rb
193
193
  - lib/rails_event_store/version.rb
194
194
  - rails_event_store.gemspec
195
- homepage: ''
195
+ homepage: https://github.com/arkency/rails_event_store
196
196
  licenses: []
197
197
  metadata: {}
198
198
  post_install_message:
@@ -211,8 +211,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
211
  version: '0'
212
212
  requirements: []
213
213
  rubyforge_project:
214
- rubygems_version: 2.2.5
214
+ rubygems_version: 2.2.3
215
215
  signing_key:
216
216
  specification_version: 4
217
- summary: Implementation of Event Store in Ruby
217
+ summary: Event Store in Ruby
218
218
  test_files: []