event_store 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- M2RiODAwYTcyMjZiZWUwNjZjOGNjZDZhMDQ3MTU3YjM1ZjJmZGJhOA==
4
+ ZTgxNzVkNDg1ZTRiYTYxYmExMTQwYTExZTViMWNmM2E5NzkxMzQ0MA==
5
5
  data.tar.gz: !binary |-
6
- YjMyYTNkY2Y4MmRjNjMyYTI1MGU3NGM0MjlhNTBlZWEyYTBkMTVmZA==
6
+ NGNlZTcwMDdkNjcyYmQyMmVlMDY1NTRiNDc5MGVkNmM5ZTMwNWVhMA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MGVhZWRjOWJhMzBlNDBjZGJjNjZkM2U2NDUyMjg5ZmI3MzFkOTQxZGZjYzc3
10
- OGFkMGVlODcwN2Q4MWM5NTZjMDg3ZWZlMzczMmFkYjIxMTUyYzk1ZmVhYWNk
11
- OTk1MmQ3OGUwNmRhYzQyMWQyOTBhMmY3ODQ3NjE0ZWU0NDgyMjQ=
9
+ MGRhZjc4MzU5ZjlmMGIzOTgxNmU5NjQ3NzVhYjhkNzViMWFkNWI5NmY2MmE3
10
+ MGM4ZmQxNDVkZTBlMmQ4MmIzOTVlYzNkMGI5NTM3YTEzODdlN2RjZjUzMGFj
11
+ ZTIxZDA4OGM5OGM2Mjc4NWE4N2E3NmNiMGRmZmUwN2UyNjI3YmI=
12
12
  data.tar.gz: !binary |-
13
- MmM0NTc1MzBmN2VjNmMzN2U5YjFmYzEwNzlkZWE1NjliODRiYjc2YWQzNTVh
14
- ZDJiNWQ5MTAwOTY1MGNlZDFmMzA2Y2UxNzc1ZWE0MWU5YjI2NTEzMjczMzRk
15
- NzE4ZGRmOTM2NTcxMmVlZjQ2MGFiNGU3YjQwMjE0NjQ0M2Y4NzE=
13
+ MWFjYjRiYWY4NDY5ZDRhZmZlYjMxZGQ5M2NiNjlmZmIwNDQ3MTFhN2JkOWEw
14
+ YWJiOGFmYTVjNzQzZTlkZmE2ZmIzMDYzZDRkNDM3YjJhZDAyYjQwYWYzMzM3
15
+ NDUyMjIwYzE0MGM1MDc2YWVlNTZjYjc4ZTgyMzVlNTQ2YzkwMzY=
@@ -48,6 +48,12 @@ module EventStore
48
48
  events.limit(max).where{ version >= version_number.to_i }.all
49
49
  end
50
50
 
51
+ def event_stream_between(start_time, end_time, fully_qualified_names = [])
52
+ query = events.where(occurred_at: start_time..end_time)
53
+ query = query.where(fully_qualified_name: fully_qualified_names) if fully_qualified_names && fully_qualified_names.any?
54
+ query.all.map {|e| e[:serialized_event] = EventStore.unescape_bytea(e[:serialized_event]); e}
55
+ end
56
+
51
57
  def event_stream
52
58
  events.all.map {|e| e[:serialized_event] = EventStore.unescape_bytea(e[:serialized_event]); e}
53
59
  end
@@ -43,6 +43,10 @@ module EventStore
43
43
  translate_events @aggregate.events_from(version_number, max)
44
44
  end
45
45
 
46
+ def event_stream_between(start_time, end_time, fully_qualified_names = [])
47
+ translate_events @aggregate.event_stream_between(start_time, end_time, fully_qualified_names)
48
+ end
49
+
46
50
  def peek
47
51
  translate_event @aggregate.last_event
48
52
  end
@@ -54,6 +54,7 @@ module EventStore
54
54
  end
55
55
 
56
56
  def prepare_event raw_event
57
+ raise ArgumentError.new("Cannot Append a Nil Event") unless raw_event
57
58
  { :version => raw_event.version.to_i,
58
59
  :aggregate_id => raw_event.aggregate_id,
59
60
  :occurred_at => Time.parse(raw_event.occurred_at.to_s).utc, #to_s truncates microseconds, which brake Time equality
@@ -1,3 +1,3 @@
1
1
  module EventStore
2
- VERSION = "0.2.7"
2
+ VERSION = "0.2.8"
3
3
  end
@@ -127,6 +127,83 @@ describe EventStore::Client do
127
127
  end
128
128
  end
129
129
 
130
+ describe '#event_stream_between' do
131
+ subject {es_client.new(AGGREGATE_ID_ONE, :device)}
132
+
133
+ before do
134
+ version = subject.version
135
+ @oldest_event_time = @event_time + 1
136
+ @middle_event_time = @event_time + 2
137
+ @newest_event_time = @event_time + 3
138
+
139
+ @outside_event = EventStore::Event.new(AGGREGATE_ID_ONE, (@event_time).utc, "middle_event", "#{1002.to_s(2)}_foo", version += 1)
140
+ @event = EventStore::Event.new(AGGREGATE_ID_ONE, (@oldest_event_time).utc, "oldest_event", "#{1002.to_s(2)}_foo", version += 1)
141
+ @new_event = EventStore::Event.new(AGGREGATE_ID_ONE, (@middle_event_time).utc, "middle_event", "#{1002.to_s(2)}_foo", version += 1)
142
+ @newest_event = EventStore::Event.new(AGGREGATE_ID_ONE, (@newest_event_time).utc, "newest_event_type", "#{1002.to_s(2)}_foo", version += 1)
143
+ subject.append([@event, @new_event, @newest_event])
144
+ end
145
+
146
+ it "returns all events between a start and an end time" do
147
+ start_time = @oldest_event_time
148
+ end_time = @newest_event_time
149
+ subject.event_stream_between(start_time, end_time).length.should == 3
150
+ end
151
+
152
+ it "returns an empty array if start time is before end time" do
153
+ start_time = @newest_event_time
154
+ end_time = @oldest_event_time
155
+ subject.event_stream_between(start_time, end_time).length.should == 0
156
+ end
157
+
158
+ it "returns all the events at a given time if the start time is the same as the end time" do
159
+ start_time = @oldest_event_time
160
+ end_time = @oldest_event_time
161
+ subject.event_stream_between(start_time, end_time).length.should == 1
162
+ end
163
+
164
+ it "returns unencodes the serialized_event fields out of the database encoding" do
165
+ EventStore.should_receive(:unescape_bytea).once
166
+ start_time = @oldest_event_time
167
+ end_time = @oldest_event_time
168
+ subject.event_stream_between(start_time, end_time).length.should == 1
169
+ end
170
+
171
+ it "returns the raw events translated into SerializedEvents" do
172
+ subject.should_receive(:translate_events).once.and_call_original
173
+ start_time = @oldest_event_time
174
+ end_time = @oldest_event_time
175
+ subject.event_stream_between(start_time, end_time).length.should == 1
176
+ end
177
+
178
+ it "returns types requested within the time range" do
179
+ start_time = @oldest_event_time
180
+ end_time = @newest_event_time
181
+ fully_qualified_name = 'middle_event'
182
+ subject.event_stream_between(start_time, end_time, [fully_qualified_name]).length.should == 1
183
+ end
184
+
185
+ it "returns types requested within the time range for more than one type" do
186
+ start_time = @oldest_event_time
187
+ end_time = @newest_event_time
188
+ fully_qualified_names = ['middle_event', 'newest_event_type']
189
+ subject.event_stream_between(start_time, end_time, fully_qualified_names).length.should == 2
190
+ end
191
+
192
+ it "returns an empty array if there are no events of the requested types in the time range" do
193
+ start_time = @oldest_event_time
194
+ end_time = @newest_event_time
195
+ fully_qualified_names = ['random_strings']
196
+ subject.event_stream_between(start_time, end_time, fully_qualified_names).length.should == 0
197
+ end
198
+
199
+ it "returns only events of types that exist within the time range" do
200
+ start_time = @oldest_event_time
201
+ end_time = @newest_event_time
202
+ fully_qualified_names = ['middle_event', 'event_name']
203
+ subject.event_stream_between(start_time, end_time, fully_qualified_names).length.should == 1
204
+ end
205
+ end
206
+
130
207
  describe '#peek' do
131
208
  let(:client) {es_client.new(AGGREGATE_ID_ONE, :device)}
132
209
  subject { client.peek }
@@ -189,6 +266,10 @@ describe EventStore::Client do
189
266
  @client.append([@old_event, @new_event, @really_new_event])
190
267
  @client.snapshot.should == @client.event_stream
191
268
  end
269
+
270
+ it "should raise a meaningful exception when a nil event given to it to append" do
271
+ expect {@client.append([nil])}.to raise_exception(ArgumentError)
272
+ end
192
273
  end
193
274
 
194
275
  describe 'with prior events of same type' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: event_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Saieg, John Colvin
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-03 00:00:00.000000000 Z
12
+ date: 2014-05-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler