sandthorn_sequel_projection 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d35ee8abcc130d57be788903844a7b12726db058
4
- data.tar.gz: ba46a86b2d10fa2559e809374b8ade8e9c2738cf
3
+ metadata.gz: 4ed993e1161fdd690cbdc9d687b477bc817d9914
4
+ data.tar.gz: 761900e638aacf45e73657775e9b933b906b72e8
5
5
  SHA512:
6
- metadata.gz: 4aec9daf59f3525127f063cade17309474ec63791ef828569bdcb8a77dd8ad124338b6d23afb0e91183713dcc2d1496c768b92f07b75de26a4a64ac270b906c9
7
- data.tar.gz: 9b4e209d22b2d588d7ac5d7558f27b68fe08379e272d8e3b2ac16c3b8c7409093ae0547e5135993ce94f230aaa48d0e8f3ab0974caa6e0f034f500044bb3dd76
6
+ metadata.gz: b3aaf8e7a717c7ed0350af0255f899e208b544519c3f43c15bebdde8127e5ba06e96af036e06e4c6259ea06931de67ac975471c9cb0bd797305498dc92e8467a
7
+ data.tar.gz: ca046141de5a0893faab75c07661244c598bcc4a28d2faad01486e0e541323c6e217fe5f954d2a65474a2ba82a6a7a7eed1fbe453006719001af1adda13102bf
data/.travis.yml CHANGED
@@ -2,6 +2,7 @@ language: ruby
2
2
  rvm:
3
3
  - 2.2.1
4
4
  - 2.1.5
5
+ - 2.0.0
5
6
  addons:
6
7
  codeclimate:
7
8
  repo_token: d57433c34e6540ec1ede44f03df0843c49e8f9b83bdf6ce7a767e9be0c9c6fd7
data/README.md CHANGED
@@ -56,9 +56,9 @@ SandthornSequelProjection uses Sequel to connected to a database. Configure it l
56
56
  # The key is the name of the method to be executed. Filters are defined in the value.
57
57
  # Handlers with only a symbol will execute for all events.
58
58
  define_event_handlers do |handlers|
59
- handlers.add new_user: { aggregate_type: MyAggregates::User, event_name: :new }
60
- handlers.add foo_changed: { aggregate_types: [MyAggregates::User, MyAggregates::Foo] }
61
- handlers.add :wildcard
59
+ handlers.define new_user: { aggregate_type: MyAggregates::User, event_name: :new }
60
+ handlers.define foo_changed: { aggregate_types: [MyAggregates::User, MyAggregates::Foo] }
61
+ handlers.define :wildcard
62
62
  end
63
63
 
64
64
  def new_users(event)
@@ -6,6 +6,7 @@ require "sandthorn"
6
6
  require "sandthorn_sequel_projection/errors"
7
7
  require "sandthorn_sequel_projection/version"
8
8
  require "sandthorn_sequel_projection/utilities"
9
+ require "sandthorn_sequel_projection/event_store"
9
10
  require "sandthorn_sequel_projection/cursor"
10
11
  require "sandthorn_sequel_projection/event_handler"
11
12
  require "sandthorn_sequel_projection/event_handler_collection"
@@ -36,7 +37,7 @@ module SandthornSequelProjection
36
37
  end
37
38
 
38
39
  def find_event_store(name)
39
- Sandthorn.find_event_store(name)
40
+ EventStore.new(name)
40
41
  end
41
42
  end
42
43
 
@@ -0,0 +1,13 @@
1
+ module SandthornSequelProjection
2
+ class EventStore
3
+ def initialize(name = :default)
4
+ @name = name || :default
5
+ end
6
+
7
+ def get_events(*args)
8
+ keywords = args.pop || {}
9
+ keywords[:event_store] = @name
10
+ Sandthorn.get_events(keywords)
11
+ end
12
+ end
13
+ end
@@ -11,7 +11,7 @@ module SandthornSequelProjection
11
11
 
12
12
  DEFAULT_TABLE_NAME = :processed_events_trackers
13
13
 
14
- def initialize(identifier:, event_store:, db_connection: nil)
14
+ def initialize(identifier: required(:identifier), event_store: required(:event_store), db_connection: nil)
15
15
  @identifier = identifier.to_s
16
16
  @event_store = event_store
17
17
  @db_connection = db_connection || SandthornSequelProjection.configuration.db_connection
@@ -29,12 +29,12 @@ module SandthornSequelProjection
29
29
  with_lock do
30
30
  cursor = Cursor.new(after_sequence_number: last_processed_sequence_number, event_store: event_store)
31
31
  events = cursor.get_batch
32
- transaction do
33
- until(events.empty?)
32
+ until(events.empty?)
33
+ transaction do
34
34
  block.call(events)
35
- events = cursor.get_batch
35
+ write_sequence_number(cursor.last_sequence_number)
36
36
  end
37
- write_sequence_number(cursor.last_sequence_number)
37
+ events = cursor.get_batch
38
38
  end
39
39
  end
40
40
  end
@@ -70,14 +70,18 @@ module SandthornSequelProjection
70
70
  String :identifier
71
71
  Integer :last_processed_sequence_number, default: 0
72
72
  DateTime :locked_at, null: true
73
+ index [:identifier], unique: true
73
74
  end
74
- db_connection.add_index(table_name, :identifier, unique: true)
75
75
  rescue Exception => e
76
- raise Errors::MigrationError, e
76
+ raise MigrationError, e
77
77
  end
78
78
 
79
79
  private
80
80
 
81
+ def required(key)
82
+ raise ArgumentError, "key missing: #{key}"
83
+ end
84
+
81
85
  def write_sequence_number(number)
82
86
  table.where(identifier: identifier).update(last_processed_sequence_number: number)
83
87
  end
@@ -1,3 +1,3 @@
1
1
  module SandthornSequelProjection
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -18,18 +18,18 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.required_ruby_version = ">= 2.1"
21
+ spec.required_ruby_version = ">= 2.0"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.6"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "rspec"
26
- spec.add_development_dependency "sandthorn_driver_sequel"
26
+ spec.add_development_dependency "sandthorn_driver_sequel", "~> 2.0.0"
27
27
  spec.add_development_dependency "awesome_print"
28
28
  spec.add_development_dependency "pry"
29
29
  spec.add_development_dependency "sqlite3"
30
30
  spec.add_development_dependency "codeclimate-test-reporter"
31
31
 
32
- spec.add_runtime_dependency "sandthorn", "~> 0.6"
32
+ spec.add_runtime_dependency "sandthorn", "~> 0.7"
33
33
  spec.add_runtime_dependency "sandthorn_event_filter", "~> 0.0.4"
34
34
  spec.add_runtime_dependency "sequel"
35
35
  spec.add_runtime_dependency "simple_migrator", "~> 0.0.2"
@@ -0,0 +1,30 @@
1
+ module SandthornSequelProjection
2
+ describe MockEventStore do
3
+ let(:store) { MockEventStore.new }
4
+ describe "get_events" do
5
+ context "when there are events" do
6
+ before do
7
+ store.add_event({sequence_number: 1, event_args: { foo: "bar" } })
8
+ end
9
+ it "returns events with serialized event data" do
10
+ events = store.get_events
11
+ event = events.first
12
+ expect(event[:event_data]).to eq(YAML.dump(event[:event_args]))
13
+ end
14
+
15
+ it "returns the correct amount of events" do
16
+ store.add_event({sequence_number: 2, event_args: { foo: "bar"} })
17
+ expect(store.get_events(take: 2).length).to eq(2)
18
+ expect(store.get_events(take: 1).length).to eq(1)
19
+ end
20
+ end
21
+
22
+ context "when there's no events" do
23
+ it "return the empty array" do
24
+ expect(store.get_events).to be_empty
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -46,8 +46,8 @@ module SandthornSequelProjection
46
46
  before do
47
47
  event_store = Sandthorn.default_event_store
48
48
  event_store.reset
49
- event_store.add_event({sequence_number: 1})
50
- event_store.add_event({sequence_number: 2})
49
+ event_store.add_event({sequence_number: 1, event_args: {}})
50
+ event_store.add_event({sequence_number: 2, event_args: {}})
51
51
  end
52
52
 
53
53
  it "fetches events and passes them on to the handlers" do
@@ -1,29 +1,35 @@
1
1
  require 'json'
2
-
2
+ require 'pp'
3
3
  module SandthornSequelProjection
4
4
  class MockEventStore
5
5
 
6
6
  def initialize(events = nil)
7
- @events = Array.wrap(events)
7
+ Array.wrap(events).each do |event|
8
+ add_event(event)
9
+ end
8
10
  end
9
11
 
10
12
  def reset(events = [])
11
13
  @events = events
12
14
  end
13
15
 
16
+ def events
17
+ @events ||= []
18
+ end
19
+
14
20
  def add_event(event)
15
- @events << event
21
+ # We have to do these silly things b/c of Sandthorn design errors.
22
+ event[:event_data] = Sandthorn.serialize(event[:event_args])
23
+ events << event
16
24
  end
17
25
 
18
26
  alias_method :add, :add_event
19
27
 
20
- def get_events(after_sequence_number: 0, take: 1)
28
+ def get_events(after_sequence_number: 0, take: 1, **rest)
21
29
  unless numeric?(after_sequence_number, take)
22
30
  raise ArgumentError, "arguments have to be numbers, received: #{after_sequence_number.inspect} and #{take.inspect}"
23
31
  end
24
- start = after_sequence_number
25
- stop = after_sequence_number + take - 1
26
- Array.wrap(@events[start..stop])
32
+ events.select { |event| event[:sequence_number] > after_sequence_number }.take(take).map { |e| e.dup }
27
33
  end
28
34
 
29
35
  def numeric?(*args)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sandthorn_sequel_projection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Krantz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-04 00:00:00.000000000 Z
11
+ date: 2015-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: sandthorn_driver_sequel
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 2.0.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 2.0.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: awesome_print
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '0.6'
131
+ version: '0.7'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '0.6'
138
+ version: '0.7'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: sandthorn_event_filter
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -200,6 +200,7 @@ files:
200
200
  - lib/sandthorn_sequel_projection/errors.rb
201
201
  - lib/sandthorn_sequel_projection/event_handler.rb
202
202
  - lib/sandthorn_sequel_projection/event_handler_collection.rb
203
+ - lib/sandthorn_sequel_projection/event_store.rb
203
204
  - lib/sandthorn_sequel_projection/lock.rb
204
205
  - lib/sandthorn_sequel_projection/manifest.rb
205
206
  - lib/sandthorn_sequel_projection/processed_events_tracker.rb
@@ -216,6 +217,7 @@ files:
216
217
  - spec/event_handler_spec.rb
217
218
  - spec/integration/projection_spec.rb
218
219
  - spec/lock_spec.rb
220
+ - spec/mock_event_store_spec.rb
219
221
  - spec/processed_events_tracker_spec.rb
220
222
  - spec/projection_spec.rb
221
223
  - spec/runner_spec.rb
@@ -235,7 +237,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
235
237
  requirements:
236
238
  - - ">="
237
239
  - !ruby/object:Gem::Version
238
- version: '2.1'
240
+ version: '2.0'
239
241
  required_rubygems_version: !ruby/object:Gem::Requirement
240
242
  requirements:
241
243
  - - ">="
@@ -243,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
243
245
  version: '0'
244
246
  requirements: []
245
247
  rubyforge_project:
246
- rubygems_version: 2.4.6
248
+ rubygems_version: 2.4.3
247
249
  signing_key:
248
250
  specification_version: 4
249
251
  summary: Helps creating sql projections from sandthorn events
@@ -253,6 +255,7 @@ test_files:
253
255
  - spec/event_handler_spec.rb
254
256
  - spec/integration/projection_spec.rb
255
257
  - spec/lock_spec.rb
258
+ - spec/mock_event_store_spec.rb
256
259
  - spec/processed_events_tracker_spec.rb
257
260
  - spec/projection_spec.rb
258
261
  - spec/runner_spec.rb