euston 1.2.8 → 1.2.9

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -65,7 +65,7 @@ end
65
65
  #
66
66
  #############################################################################
67
67
 
68
- default_rspec_opts = %w[--colour --format Fuubar]
68
+ default_rspec_opts = %w[--colour --tty -b --format Fuubar]
69
69
 
70
70
  desc "Run all examples"
71
71
  RSpec::Core::RakeTask.new(:spec) do |t|
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'euston'
3
- s.version = '1.2.8'
4
- s.date = '2012-02-02'
3
+ s.version = '1.2.9'
4
+ s.date = '2012-02-28'
5
5
  s.platform = RUBY_PLATFORM.to_s == 'java' ? 'java' : Gem::Platform::RUBY
6
6
  s.authors = ['Lee Henson', 'Guy Boertje']
7
7
  s.email = ['lee.m.henson@gmail.com', 'guyboertje@gmail.com']
@@ -46,8 +46,9 @@ Gem::Specification.new do |s|
46
46
  s.add_dependency 'activemodel', '~> 3.1.0'
47
47
  s.add_dependency 'activesupport', '~> 3.1.0'
48
48
 
49
- s.add_development_dependency 'fuubar', '~> 0.0.0'
50
- s.add_development_dependency 'rake', '~> 0.9.2'
51
- s.add_development_dependency 'rspec', '~> 2.6.0'
52
- s.add_development_dependency 'uuid', '~> 2.3.0'
49
+ s.add_development_dependency 'awesome_print', '~> 1.0.2'
50
+ s.add_development_dependency 'fuubar', '~> 1.0.0'
51
+ s.add_development_dependency 'rake', '~> 0.9.2'
52
+ s.add_development_dependency 'rspec', '~> 2.6.0'
53
+ s.add_development_dependency 'uuid', '~> 2.3.0'
53
54
  end
@@ -44,6 +44,10 @@ module Euston
44
44
  @uncommitted_events ||= []
45
45
  end
46
46
 
47
+ def uncommitted_headers
48
+ @uncommitted_headers ||= {}
49
+ end
50
+
47
51
  def consume_command headers, command
48
52
  consume_message headers, command, :command, Euston::CommandHeaders, :send_command_to_method
49
53
  end
@@ -52,16 +56,6 @@ module Euston
52
56
  consume_message headers, event, :event_subscription, Euston::EventHeaders, :send_event_subscription_to_method
53
57
  end
54
58
 
55
- def replay_event headers, event
56
- headers = Euston::EventHeaders.from_hash(headers) if headers.is_a?(Hash)
57
-
58
- source_message = headers.source_message
59
- committed_messages << source_message[:headers][:id] unless source_message.nil?
60
-
61
- send_event_to_method headers, event
62
- @initial_version = initial_version + 1
63
- end
64
-
65
59
  def take_snapshot
66
60
  methods = self.class.instance_methods
67
61
  regex = self.class.take_snapshot_regexp
@@ -88,11 +82,6 @@ module Euston
88
82
  :version => version,
89
83
  :timestamp => Time.now.to_f
90
84
 
91
- unless @current_message_headers.nil?
92
- event.headers[@current_message_type] = { :headers => @current_message_headers.to_hash,
93
- :body => @current_message_body }
94
- end
95
-
96
85
  send_event_to_method Euston::EventHeaders.from_hash(event.headers), event.body
97
86
  uncommitted_events << event
98
87
  end
@@ -118,6 +107,10 @@ module Euston
118
107
 
119
108
  raise "This aggregate cannot apply a historical event stream because it is not empty." unless uncommitted_events.empty? && initial_version == 0
120
109
 
110
+ unless stream.committed_headers[:source_message].nil?
111
+ committed_messages << stream.committed_headers[:source_message][:headers][:id]
112
+ end
113
+
121
114
  events.each_with_index do |event, i|
122
115
  replay_event event.headers, event.body
123
116
  end
@@ -130,6 +123,12 @@ module Euston
130
123
  uncommitted_commands << command
131
124
  end
132
125
 
126
+ def replay_event headers, event
127
+ headers = Euston::EventHeaders.from_hash(headers) if headers.is_a?(Hash)
128
+ send_event_to_method headers, event
129
+ @initial_version = initial_version + 1
130
+ end
131
+
133
132
  def send_command_to_method headers, command
134
133
  deliver_message headers, command, :consumes_method_name, 'a command', "a 'consumes' block"
135
134
  end
@@ -148,10 +147,9 @@ module Euston
148
147
  headers = headers_type.from_hash(headers) if headers.is_a?(Hash)
149
148
 
150
149
  unless committed_messages.include? headers.id
151
- @current_message_type = message_type
152
- @current_message_headers = headers
153
- @current_message_body = body
154
-
150
+ uncommitted_headers[:source_message_type] = message_type
151
+ uncommitted_headers[:source_message] = { headers: headers.to_hash, body: body }
152
+
155
153
  self.send send_method, headers, body
156
154
  end
157
155
 
@@ -164,9 +162,9 @@ module Euston
164
162
  @log.debug "Calling #{name} with: #{message.inspect}"
165
163
  m = method(name)
166
164
  case m.arity
167
- when 2, -2
165
+ when 2, -1, -2
168
166
  m.call OpenStruct.new(headers.to_hash).freeze, OpenStruct.new(message).freeze
169
- when 1, -1
167
+ when 1
170
168
  m.call OpenStruct.new(message).freeze
171
169
  else
172
170
  m.call
@@ -24,7 +24,7 @@ module Euston
24
24
  method_name = event_handler_method_name type, version
25
25
  define_method method_name, &consumer
26
26
  new_method = instance_method method_name
27
-
27
+
28
28
  define_method method_name do |*args|
29
29
  new_method.bind(self).call *args
30
30
  end
@@ -1,3 +1,3 @@
1
1
  module Euston
2
- VERSION = "1.2.8"
2
+ VERSION = "1.2.9"
3
3
  end
@@ -44,6 +44,7 @@ module Euston
44
44
  apply_event :product_access_logged, 1, :product_id => command.product_id,
45
45
  :access_count => @access_count + 1
46
46
  end
47
+
47
48
  applies :product_created, 1 do |event|
48
49
  @access_count = 0
49
50
  end
@@ -2,21 +2,47 @@ require File.expand_path("../spec_helper", __FILE__)
2
2
 
3
3
  module Euston
4
4
  describe 'aggregate root' do
5
- context 'duplicate command consumption' do
6
- let(:aggregate) { Sample::Widget.new }
7
- let(:aggregate2) { Sample::Widget.new }
8
- let(:command) { { :headers => CommandHeaders.new(id: Euston.uuid.generate, type: 'create_widget', version: 1),
9
- :body => { :id => Euston.uuid.generate } } }
5
+ let(:aggregate) { Sample::Widget.new }
6
+ let(:command_headers) { CommandHeaders.new id: Euston.uuid.generate, type: 'create_widget', version: 1 }
7
+ let(:command_body) { { :id => Euston.uuid.generate } }
8
+
9
+ before do
10
+ aggregate.consume_command command_headers, command_body
11
+ end
12
+
13
+ subject { aggregate }
14
+
15
+ context 'commmand consumption' do
16
+ its(:uncommitted_events) { should have(1).item }
17
+
18
+ describe 'the uncommitted headers' do
19
+ subject { aggregate.uncommitted_headers }
20
+
21
+ its([:source_message_type]) { should == :command }
10
22
 
11
- it 'does not handle the same command twice' do
12
- aggregate.consume_command command[:headers], command[:body]
13
- aggregate.uncommitted_events.should have(1).item
23
+ describe 'the source message' do
24
+ subject { aggregate.uncommitted_headers[:source_message] }
14
25
 
15
- aggregate.uncommitted_events.each { |e| aggregate2.replay_event e.headers, e.body }
26
+ its([:headers]) { should == command_headers }
27
+ its([:body]) { should == command_body }
28
+ end
29
+ end
30
+ end
16
31
 
17
- aggregate2.consume_command command[:headers], command[:body]
18
- aggregate2.uncommitted_events.should have(0).items
32
+ context 'duplicate command consumption' do
33
+ subject do
34
+ stream = OpenStruct.new.tap do |s|
35
+ s.committed_headers = { source_message_type: :command,
36
+ source_message: { headers: command_headers, body: command_body } }
37
+ s.committed_events = aggregate.uncommitted_events
38
+ end
39
+
40
+ aggregate2 = Sample::Widget.hydrate stream
41
+ aggregate2.consume_command command_headers, command_body
42
+ aggregate2
19
43
  end
44
+
45
+ its(:uncommitted_events) { should have(0).items }
20
46
  end
21
47
  end
22
48
  end
@@ -1,3 +1,5 @@
1
+ require 'ap'
2
+ require 'ostruct'
1
3
  require 'euston'
2
4
  require 'aggregate_root_samples'
3
5
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: euston
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.8
4
+ version: 1.2.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-02-02 00:00:00.000000000 Z
13
+ date: 2012-02-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
17
- requirement: &70141078237840 !ruby/object:Gem::Requirement
17
+ requirement: &70218912203040 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 3.1.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70141078237840
25
+ version_requirements: *70218912203040
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activesupport
28
- requirement: &70141078236560 !ruby/object:Gem::Requirement
28
+ requirement: &70218912202480 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,21 +33,32 @@ dependencies:
33
33
  version: 3.1.0
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70141078236560
36
+ version_requirements: *70218912202480
37
+ - !ruby/object:Gem::Dependency
38
+ name: awesome_print
39
+ requirement: &70218912202000 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 1.0.2
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *70218912202000
37
48
  - !ruby/object:Gem::Dependency
38
49
  name: fuubar
39
- requirement: &70141078235060 !ruby/object:Gem::Requirement
50
+ requirement: &70218912201500 !ruby/object:Gem::Requirement
40
51
  none: false
41
52
  requirements:
42
53
  - - ~>
43
54
  - !ruby/object:Gem::Version
44
- version: 0.0.0
55
+ version: 1.0.0
45
56
  type: :development
46
57
  prerelease: false
47
- version_requirements: *70141078235060
58
+ version_requirements: *70218912201500
48
59
  - !ruby/object:Gem::Dependency
49
60
  name: rake
50
- requirement: &70141078255960 !ruby/object:Gem::Requirement
61
+ requirement: &70218912200960 !ruby/object:Gem::Requirement
51
62
  none: false
52
63
  requirements:
53
64
  - - ~>
@@ -55,10 +66,10 @@ dependencies:
55
66
  version: 0.9.2
56
67
  type: :development
57
68
  prerelease: false
58
- version_requirements: *70141078255960
69
+ version_requirements: *70218912200960
59
70
  - !ruby/object:Gem::Dependency
60
71
  name: rspec
61
- requirement: &70141078254500 !ruby/object:Gem::Requirement
72
+ requirement: &70218912200420 !ruby/object:Gem::Requirement
62
73
  none: false
63
74
  requirements:
64
75
  - - ~>
@@ -66,10 +77,10 @@ dependencies:
66
77
  version: 2.6.0
67
78
  type: :development
68
79
  prerelease: false
69
- version_requirements: *70141078254500
80
+ version_requirements: *70218912200420
70
81
  - !ruby/object:Gem::Dependency
71
82
  name: uuid
72
- requirement: &70141078252660 !ruby/object:Gem::Requirement
83
+ requirement: &70218912199880 !ruby/object:Gem::Requirement
73
84
  none: false
74
85
  requirements:
75
86
  - - ~>
@@ -77,7 +88,7 @@ dependencies:
77
88
  version: 2.3.0
78
89
  type: :development
79
90
  prerelease: false
80
- version_requirements: *70141078252660
91
+ version_requirements: *70218912199880
81
92
  description: ''
82
93
  email:
83
94
  - lee.m.henson@gmail.com
@@ -124,15 +135,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
124
135
  - - ! '>='
125
136
  - !ruby/object:Gem::Version
126
137
  version: '0'
138
+ segments:
139
+ - 0
140
+ hash: -818260274026684501
127
141
  required_rubygems_version: !ruby/object:Gem::Requirement
128
142
  none: false
129
143
  requirements:
130
144
  - - ! '>='
131
145
  - !ruby/object:Gem::Version
132
146
  version: '0'
147
+ segments:
148
+ - 0
149
+ hash: -818260274026684501
133
150
  requirements: []
134
151
  rubyforge_project:
135
- rubygems_version: 1.8.10
152
+ rubygems_version: 1.8.17
136
153
  signing_key:
137
154
  specification_version: 3
138
155
  summary: Cqrs tooling.