serf 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,7 +4,6 @@ source 'http://rubygems.org'
4
4
  # gem 'activesupport', '>= 2.3.5'
5
5
 
6
6
  # Requirements for both clients and servers.
7
- gem 'activemodel', '~> 3.1.3'
8
7
  gem 'activesupport', '~> 3.1.3'
9
8
  gem 'i18n', '~> 0.6.0' # For ActiveSupport
10
9
  # Used by Serf::Messages::*
data/Gemfile.lock CHANGED
@@ -1,13 +1,8 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activemodel (3.1.3)
5
- activesupport (= 3.1.3)
6
- builder (~> 3.0.0)
7
- i18n (~> 0.6)
8
4
  activesupport (3.1.3)
9
5
  multi_json (~> 1.0)
10
- builder (3.0.0)
11
6
  diff-lcs (1.1.3)
12
7
  eventmachine (0.12.10)
13
8
  git (1.2.5)
@@ -35,7 +30,6 @@ PLATFORMS
35
30
  ruby
36
31
 
37
32
  DEPENDENCIES
38
- activemodel (~> 3.1.3)
39
33
  activesupport (~> 3.1.3)
40
34
  bundler (~> 1.0.0)
41
35
  eventmachine (~> 0.12.10)
data/README.md CHANGED
@@ -38,14 +38,15 @@ Serf App and Channels
38
38
  A Serf App is a Rack-like application that accepts an ENV hash as input.
39
39
  This ENV hash is simply the hash representation of a message to be processed.
40
40
  The Serf App, as configured by registered manifests, will:
41
- 1. validate the message
42
- 2. route the message to the proper handler
43
- 3. run the handler in blocking or non-blocking mode.
44
- 4. publish the handler's results to results or error channels.
41
+ 1. route the ENV to the proper handler
42
+ 2. run the handler in blocking or non-blocking mode.
43
+ a. The handler's serf call method will parse the ENV into a message object
44
+ if the handler registered a Message class.
45
+ 3. publish the handler's results to results or error channels.
45
46
  a. These channels are normally message queuing channels.
46
47
  b. We only require the channel instance to respond to the 'publish'
47
48
  method and accept a message (or message hash) as the argument.
48
- 5. return the handler's results to the caller if it is blocking mode.
49
+ 4. return the handler's results to the caller if it is blocking mode.
49
50
  a. In non-blocking mode, an MessageAcceptedEvent is returned instead
50
51
  because the message will be run by the EventMachine deferred threadpool
51
52
  by default.
@@ -63,19 +64,56 @@ Service Libraries
63
64
  a. Barring that, they should conform to the idea that messages may be
64
65
  hashes that define at least one attribute: 'kind'.
65
66
  2. Serialization of the messages SHOULD BE Json or MessagePack (I hate XML).
67
+ a. `to_hash` is also included.
66
68
  3. Service Libraries SHOULD implement handler classes that include the
67
69
  ::Serf::Handler helper module.
68
- 4. Handler methods MUST receive a message as an options hash, symbolized keys.
70
+ 4. Handler methods MUST receive a message as either as an options hash
71
+ (with symbolized keys) or an instance of a declared Message.
69
72
  5. Handler methods MUST return zero or more messages.
70
73
  6. Handler methods SHOULD handle catch their business logic exceptions and
71
74
  return them as specialized messages that can be forwarded down error channels.
72
75
  Uncaught exceptions that are then caught by Serf are published as
73
76
  generic Serf::CaughtExceptionEvents, and are harder to deal with.
74
77
 
78
+
79
+ Serf::Message
80
+ -------------
81
+
82
+ Users of the Serf::Message module need to be aware of that:
83
+
84
+ 1. Messages MUST implement the `#attributes` method to use the
85
+ default implementations of `to_msgpack`, `to_json`, and `to_hash`.
86
+ 2. Messages MAY implement validation helpers (e.g. ActiveModel or
87
+ Virtus + Aequitas (DataMapper)). This is purely to be helpful for
88
+ receivers (Serf::Handlers) to validate the Messages before running
89
+ code against its data. The Serf infrastructure code does not
90
+ validate the Messages; it is the job of the handler code.
91
+ 3. Messages MAY override `Message.parse` class method if they want
92
+ different parsing (Message object instantiation) than
93
+ `message_class.new *args`. This parse method is called in
94
+ Serf::Handler when the handler class has defined a Message class
95
+ to be used to deserialize the ENV for a handler action method.
96
+ 3. Messages MAY override `Message#kind` instance method or `Message.kind`
97
+ class method to specify a message `kind` that is different than
98
+ the tableized name of the implementing ruby class.
99
+ 4. Messages MAY override `Message#to_msgpack`, `Message#to_json`, or
100
+ `Message#to_hash` to get alternate serialization.
101
+
102
+ User that opt to roll their own Message class only need to be
103
+ aware that:
104
+
105
+ 1. Message classes MUST implement `Message.parse(env={})` class method
106
+ if said message class is to be used as the target object representation
107
+ of a received message (from ENV hash).
108
+ a. Serf::Handler code makes this assumption when it finds an ENV
109
+ hash that is to be parsed into a message object.
110
+
111
+
75
112
  Example
76
113
  =======
77
114
 
78
115
  # Require our libraries
116
+ require 'active_model'
79
117
  require 'log4r'
80
118
  require 'serf/handler'
81
119
  require 'serf/message'
@@ -87,37 +125,57 @@ Example
87
125
  'fileOutputter',
88
126
  filename: 'log.txt')
89
127
 
128
+ # my_lib/my_message.rb
129
+ class MyMessage
130
+ include Serf::Message
131
+ include ActiveModel::Validations
132
+
133
+ attr_accessor :data
134
+
135
+ validates_presence_of :data
136
+
137
+ def initialize(options={})
138
+ @hi = options[:data] || 'some data here'
139
+ end
140
+
141
+ end
142
+
90
143
  # my_lib/my_handler.rb
91
144
  class MyHandler
92
145
  include Serf::Handler
93
146
 
147
+ # Declare handlers for a 'my_message' message kind with a Message class.
94
148
  receives(
95
149
  'my_message',
150
+ as: MyMessage,
96
151
  with: :submit_my_message)
97
152
 
153
+ # This handler of 'other_message' doesn't need a Message class,
154
+ # and will just work off the ENV hash.
155
+ receives(
156
+ 'other_message',
157
+ with: :submit_other_message)
158
+
98
159
  def initialize(options={})
99
160
  @logger = options[:logger]
100
161
  end
101
162
 
102
- def submit_my_message(message={})
103
- @logger.info "In Submit Match Result: #{message.inspect.to_s}"
163
+ def submit_my_message(message)
164
+ @logger.info "In Submit My Message: #{message.inspect.to_s}"
165
+ # Validate message because we have implement my_message with it.
166
+ unless message.valid?
167
+ raise ArgumentError, message.errors.full_messages.join(',')
168
+ end
104
169
  # Do work Here...
105
170
  # And return other messages as results of work, or nil for nothing.
106
171
  return nil
107
172
  end
108
173
 
109
- end
110
-
111
- # my_lib/my_message.rb
112
- class MyMessage
113
- include Serf::Message
114
-
115
- attr_accessor :data
116
-
117
- validates_presence_of :data
118
-
119
- def initialize(options={})
120
- @hi = options[:data] || 'some data here'
174
+ def submit_other_message(message={})
175
+ # The message here is the ENV hash because we didn't declare
176
+ # an :as option with `receives`.
177
+ @logger.info "In Submit Other Result: #{message.inspect.to_s}"
178
+ return nil
121
179
  end
122
180
 
123
181
  end
@@ -125,12 +183,15 @@ Example
125
183
  # my_lib/manifest.rb
126
184
  MANIFEST = {
127
185
  'my_message' => {
128
- # Optional Definition of an implementation class.
129
- #message_class => 'other_name_space/my_other_message_implementation',
130
- # Declares which handler
186
+ # Declares which handler to use. This is the tableized
187
+ # name of the class. It will be constantized by the serf code.
131
188
  handler: 'my_handler',
132
189
  # Default is true to process in background.
133
190
  async: true
191
+ },
192
+ 'other_message' => {
193
+ handler: 'my_handler',
194
+ async: false
134
195
  }
135
196
  }
136
197
 
@@ -206,5 +267,5 @@ Contributing to serf
206
267
  Copyright
207
268
  =========
208
269
 
209
- Copyright (c) 2011 Benjamin Yu. See LICENSE.txt for further details.
270
+ Copyright (c) 2011-2012 Benjamin Yu. See LICENSE.txt for further details.
210
271
 
data/lib/serf/builder.rb CHANGED
@@ -98,9 +98,7 @@ module Serf
98
98
 
99
99
  def to_app
100
100
  # Our async and sync messages & handlers.
101
- kinds = {}
102
101
  handlers = {}
103
- async_kinds = {}
104
102
  async_handlers = {}
105
103
 
106
104
  # Iterate our manifests to build out handlers and message classes
@@ -111,21 +109,12 @@ module Serf
111
109
  args, block = @config.fetch(handler_str) { [[], nil] }
112
110
  handler = handler_class.new *args, &block
113
111
 
114
- # Get the implementing message serialization class.
115
- # For a given message kind, we may have a different (or nil)
116
- # implementing class. If nil, then we're not going to try to
117
- # create a message class to validate before passing to handler.
118
- message_class = options.fetch(:message_class) { kind }
119
- message_class = message_class && message_class.camelize.constantize
120
-
121
112
  # Put handlers and kinds into the proper map of handlers for either
122
113
  # synchronous or asynchronous processing.
123
114
  async = options.fetch(:async) { true }
124
115
  if async
125
- async_kinds[kind] = message_class if message_class
126
116
  async_handlers[kind] = handler
127
117
  else
128
- kinds[kind] = message_class if message_class
129
118
  handlers[kind] = handler
130
119
  end
131
120
  end
@@ -144,7 +133,6 @@ module Serf
144
133
  # create the serfer class to run synchronous handlers
145
134
  app = @serfer_class.new(
146
135
  @serfer_options.merge(
147
- kinds: kinds,
148
136
  handlers: handlers,
149
137
  runner: runner,
150
138
  not_found: app))
@@ -159,7 +147,6 @@ module Serf
159
147
  # create the serfer class to run async handlers
160
148
  app = @serfer_class.new(
161
149
  @serfer_options.merge(
162
- kinds: async_kinds,
163
150
  handlers: async_handlers,
164
151
  runner: async_runner,
165
152
  not_found: app))
data/lib/serf/handler.rb CHANGED
@@ -16,9 +16,13 @@ module Serf
16
16
  # create an inheritable class attribute that will store
17
17
  # our mappings between messages and the methods to call.
18
18
  class_attribute :serf_actions
19
+ class_attribute :serf_message_classes
19
20
  send(
20
21
  'serf_actions=',
21
22
  ActiveSupport::InheritableOptions.new)
23
+ send(
24
+ 'serf_message_classes=',
25
+ ActiveSupport::InheritableOptions.new)
22
26
 
23
27
  def self.inherited(kls) #:nodoc:
24
28
  super
@@ -27,6 +31,9 @@ module Serf
27
31
  kls.send(
28
32
  'serf_actions=',
29
33
  self.serf_actions.inheritable_copy)
34
+ kls.send(
35
+ 'serf_message_classes=',
36
+ self.serf_message_classes.inheritable_copy)
30
37
  end
31
38
 
32
39
  end
@@ -45,6 +52,10 @@ module Serf
45
52
  raise ArgumentError, 'No "kind" in call env' if message_kind.blank?
46
53
  method = self.class.serf_actions[message_kind]
47
54
  raise ArgumentError, "#{message_kind} not found" if method.blank?
55
+ # Optionally convert the env into a Message class.
56
+ # Let the actual handler method validate if they want.
57
+ message_class = self.class.serf_message_classes[message_kind]
58
+ env = message_class.parse env if message_class
48
59
  # Now execute the method with the environment parameters
49
60
  self.send method, env
50
61
  rescue => e
@@ -57,12 +68,20 @@ module Serf
57
68
 
58
69
  ##
59
70
  # registers a method to handle the receipt of a message type.
71
+ # @param *args splat list of message kinds
72
+ # @options opts [Symbol] :with The method to call.
73
+ # @options opts [Object] :as The Message class to call `parse`.
60
74
  #
61
- def receives(message_kind, options={})
62
- raise ArgumentError, 'Blank message_kind' if message_kind.blank?
75
+ def receives(*args)
76
+ options = args.last.kind_of?(Hash) ? args.pop : {}
63
77
  exposed_method = options[:with]
64
78
  raise ArgumentError, 'Missing "with" option' if exposed_method.blank?
65
- self.serf_actions[message_kind] = exposed_method
79
+ message_class = options[:as]
80
+ args.each do |kind|
81
+ raise ArgumentError, 'Blank kind' if kind.blank?
82
+ self.serf_actions[kind] = exposed_method
83
+ self.serf_message_classes[kind] = message_class if message_class
84
+ end
66
85
  end
67
86
 
68
87
  end
data/lib/serf/message.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'active_model'
2
1
  require 'active_support/concern'
3
2
  require 'active_support/core_ext/class/attribute'
4
3
  require 'active_support/core_ext/string/inflections'
@@ -12,30 +11,28 @@ module Serf
12
11
  #
13
12
  module Message
14
13
  extend ActiveSupport::Concern
15
- include ActiveModel::Serialization
16
- include ActiveModel::Serializers::JSON
17
- include ActiveModel::Validations
18
14
 
19
15
  included do
20
16
  class_attribute :kind
21
17
  send 'kind=', self.to_s.tableize.singularize
22
- self.include_root_in_json = false
23
18
  end
24
19
 
25
20
  module InstanceMethods
26
21
 
27
- def attributes
28
- {
29
- :kind => kind
30
- }
31
- end
32
-
33
22
  def kind
34
23
  self.class.kind
35
24
  end
36
25
 
26
+ def to_hash
27
+ attributes.merge kind: kind
28
+ end
29
+
37
30
  def to_msgpack
38
- attributes.to_msgpack
31
+ to_hash.to_msgpack
32
+ end
33
+
34
+ def to_json(*args)
35
+ to_hash.to_json *args
39
36
  end
40
37
 
41
38
  end
@@ -33,11 +33,11 @@ module Messages
33
33
  'error_message' => @error_message,
34
34
  'error_backtrace' => @error_backtrace,
35
35
  'uuid' => uuid
36
- }.merge!(super)
36
+ }
37
37
  end
38
38
 
39
39
  def to_s
40
- attributes.to_s
40
+ to_hash.to_s
41
41
  end
42
42
 
43
43
  end
@@ -25,11 +25,11 @@ module Messages
25
25
  {
26
26
  'message' => @message,
27
27
  'uuid' => uuid
28
- }.merge!(super)
28
+ }
29
29
  end
30
30
 
31
31
  def to_s
32
- attributes.to_s
32
+ to_hash.to_s
33
33
  end
34
34
 
35
35
  end
data/lib/serf/serfer.rb CHANGED
@@ -9,7 +9,6 @@ module Serf
9
9
  @runner = options.fetch(:runner)
10
10
 
11
11
  # Options for handling the requests
12
- @kinds = options[:kinds] || {}
13
12
  @handlers = options[:handlers] || {}
14
13
  @not_found = options[:not_found] || proc do
15
14
  raise ArgumentError, 'Handler Not Found'
@@ -27,18 +26,6 @@ module Serf
27
26
  kind = params[:kind]
28
27
  handler = @handlers[kind]
29
28
  if handler
30
- # Do a message_class validation if we have it listed.
31
- # And use the message attributes instead of raw env when passing
32
- # to message handler.
33
- message_class = @kinds[kind]
34
- if message_class
35
- message = message_class.parse params
36
- unless message.valid?
37
- raise ArgumentError, message.errors.full_messages.join('. ')
38
- end
39
- params = message.attributes.symbolize_keys
40
- end
41
-
42
29
  # Let's run the handler
43
30
  return @runner.run(handler, params) if handler
44
31
  else
data/lib/serf/version.rb CHANGED
@@ -2,7 +2,7 @@ module Serf
2
2
 
3
3
  module Version
4
4
  MAJOR = 0
5
- MINOR = 3
5
+ MINOR = 4
6
6
  PATCH = 0
7
7
  BUILD = nil
8
8
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join '.'
data/serf.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "serf"
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Benjamin Yu"]
12
- s.date = "2011-12-23"
12
+ s.date = "2012-01-19"
13
13
  s.description = "Event-Driven SOA with CQRS"
14
14
  s.email = "benjaminlyu@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -52,7 +52,6 @@ Gem::Specification.new do |s|
52
52
  s.specification_version = 3
53
53
 
54
54
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
55
- s.add_runtime_dependency(%q<activemodel>, ["~> 3.1.3"])
56
55
  s.add_runtime_dependency(%q<activesupport>, ["~> 3.1.3"])
57
56
  s.add_runtime_dependency(%q<i18n>, ["~> 0.6.0"])
58
57
  s.add_runtime_dependency(%q<uuidtools>, ["~> 2.1.2"])
@@ -64,7 +63,6 @@ Gem::Specification.new do |s|
64
63
  s.add_development_dependency(%q<msgpack>, ["~> 0.4.6"])
65
64
  s.add_development_dependency(%q<eventmachine>, ["~> 0.12.10"])
66
65
  else
67
- s.add_dependency(%q<activemodel>, ["~> 3.1.3"])
68
66
  s.add_dependency(%q<activesupport>, ["~> 3.1.3"])
69
67
  s.add_dependency(%q<i18n>, ["~> 0.6.0"])
70
68
  s.add_dependency(%q<uuidtools>, ["~> 2.1.2"])
@@ -77,7 +75,6 @@ Gem::Specification.new do |s|
77
75
  s.add_dependency(%q<eventmachine>, ["~> 0.12.10"])
78
76
  end
79
77
  else
80
- s.add_dependency(%q<activemodel>, ["~> 3.1.3"])
81
78
  s.add_dependency(%q<activesupport>, ["~> 3.1.3"])
82
79
  s.add_dependency(%q<i18n>, ["~> 0.6.0"])
83
80
  s.add_dependency(%q<uuidtools>, ["~> 2.1.2"])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-23 00:00:00.000000000Z
12
+ date: 2012-01-19 00:00:00.000000000Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: activemodel
16
- requirement: &70304875304400 !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 3.1.3
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: *70304875304400
25
14
  - !ruby/object:Gem::Dependency
26
15
  name: activesupport
27
- requirement: &70304875303800 !ruby/object:Gem::Requirement
16
+ requirement: &70321253946220 !ruby/object:Gem::Requirement
28
17
  none: false
29
18
  requirements:
30
19
  - - ~>
@@ -32,10 +21,10 @@ dependencies:
32
21
  version: 3.1.3
33
22
  type: :runtime
34
23
  prerelease: false
35
- version_requirements: *70304875303800
24
+ version_requirements: *70321253946220
36
25
  - !ruby/object:Gem::Dependency
37
26
  name: i18n
38
- requirement: &70304875303260 !ruby/object:Gem::Requirement
27
+ requirement: &70321253945360 !ruby/object:Gem::Requirement
39
28
  none: false
40
29
  requirements:
41
30
  - - ~>
@@ -43,10 +32,10 @@ dependencies:
43
32
  version: 0.6.0
44
33
  type: :runtime
45
34
  prerelease: false
46
- version_requirements: *70304875303260
35
+ version_requirements: *70321253945360
47
36
  - !ruby/object:Gem::Dependency
48
37
  name: uuidtools
49
- requirement: &70304875302780 !ruby/object:Gem::Requirement
38
+ requirement: &70321253944480 !ruby/object:Gem::Requirement
50
39
  none: false
51
40
  requirements:
52
41
  - - ~>
@@ -54,10 +43,10 @@ dependencies:
54
43
  version: 2.1.2
55
44
  type: :runtime
56
45
  prerelease: false
57
- version_requirements: *70304875302780
46
+ version_requirements: *70321253944480
58
47
  - !ruby/object:Gem::Dependency
59
48
  name: rspec
60
- requirement: &70304875302300 !ruby/object:Gem::Requirement
49
+ requirement: &70321253943600 !ruby/object:Gem::Requirement
61
50
  none: false
62
51
  requirements:
63
52
  - - ~>
@@ -65,10 +54,10 @@ dependencies:
65
54
  version: 2.3.0
66
55
  type: :development
67
56
  prerelease: false
68
- version_requirements: *70304875302300
57
+ version_requirements: *70321253943600
69
58
  - !ruby/object:Gem::Dependency
70
59
  name: yard
71
- requirement: &70304875301820 !ruby/object:Gem::Requirement
60
+ requirement: &70321253942720 !ruby/object:Gem::Requirement
72
61
  none: false
73
62
  requirements:
74
63
  - - ~>
@@ -76,10 +65,10 @@ dependencies:
76
65
  version: 0.6.0
77
66
  type: :development
78
67
  prerelease: false
79
- version_requirements: *70304875301820
68
+ version_requirements: *70321253942720
80
69
  - !ruby/object:Gem::Dependency
81
70
  name: bundler
82
- requirement: &70304875301340 !ruby/object:Gem::Requirement
71
+ requirement: &70321253941800 !ruby/object:Gem::Requirement
83
72
  none: false
84
73
  requirements:
85
74
  - - ~>
@@ -87,10 +76,10 @@ dependencies:
87
76
  version: 1.0.0
88
77
  type: :development
89
78
  prerelease: false
90
- version_requirements: *70304875301340
79
+ version_requirements: *70321253941800
91
80
  - !ruby/object:Gem::Dependency
92
81
  name: jeweler
93
- requirement: &70304875206820 !ruby/object:Gem::Requirement
82
+ requirement: &70321253941020 !ruby/object:Gem::Requirement
94
83
  none: false
95
84
  requirements:
96
85
  - - ~>
@@ -98,10 +87,10 @@ dependencies:
98
87
  version: 1.6.4
99
88
  type: :development
100
89
  prerelease: false
101
- version_requirements: *70304875206820
90
+ version_requirements: *70321253941020
102
91
  - !ruby/object:Gem::Dependency
103
92
  name: rcov
104
- requirement: &70304875206340 !ruby/object:Gem::Requirement
93
+ requirement: &70321253940260 !ruby/object:Gem::Requirement
105
94
  none: false
106
95
  requirements:
107
96
  - - ! '>='
@@ -109,10 +98,10 @@ dependencies:
109
98
  version: '0'
110
99
  type: :development
111
100
  prerelease: false
112
- version_requirements: *70304875206340
101
+ version_requirements: *70321253940260
113
102
  - !ruby/object:Gem::Dependency
114
103
  name: msgpack
115
- requirement: &70304875205860 !ruby/object:Gem::Requirement
104
+ requirement: &70321253939160 !ruby/object:Gem::Requirement
116
105
  none: false
117
106
  requirements:
118
107
  - - ~>
@@ -120,10 +109,10 @@ dependencies:
120
109
  version: 0.4.6
121
110
  type: :development
122
111
  prerelease: false
123
- version_requirements: *70304875205860
112
+ version_requirements: *70321253939160
124
113
  - !ruby/object:Gem::Dependency
125
114
  name: eventmachine
126
- requirement: &70304875205280 !ruby/object:Gem::Requirement
115
+ requirement: &70321253938520 !ruby/object:Gem::Requirement
127
116
  none: false
128
117
  requirements:
129
118
  - - ~>
@@ -131,7 +120,7 @@ dependencies:
131
120
  version: 0.12.10
132
121
  type: :development
133
122
  prerelease: false
134
- version_requirements: *70304875205280
123
+ version_requirements: *70321253938520
135
124
  description: Event-Driven SOA with CQRS
136
125
  email: benjaminlyu@gmail.com
137
126
  executables: []
@@ -179,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
179
168
  version: '0'
180
169
  segments:
181
170
  - 0
182
- hash: -3406748221232182748
171
+ hash: -2016734549477828314
183
172
  required_rubygems_version: !ruby/object:Gem::Requirement
184
173
  none: false
185
174
  requirements: