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 +0 -1
- data/Gemfile.lock +0 -6
- data/README.md +85 -24
- data/lib/serf/builder.rb +0 -13
- data/lib/serf/handler.rb +22 -3
- data/lib/serf/message.rb +9 -12
- data/lib/serf/messages/caught_exception_event.rb +2 -2
- data/lib/serf/messages/message_accepted_event.rb +2 -2
- data/lib/serf/serfer.rb +0 -13
- data/lib/serf/version.rb +1 -1
- data/serf.gemspec +2 -5
- metadata +23 -34
data/Gemfile
CHANGED
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.
|
42
|
-
2.
|
43
|
-
|
44
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
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
|
-
#
|
129
|
-
#
|
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(
|
62
|
-
|
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
|
-
|
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
|
-
|
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
|
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
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.
|
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 = "
|
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.
|
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:
|
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: &
|
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: *
|
24
|
+
version_requirements: *70321253946220
|
36
25
|
- !ruby/object:Gem::Dependency
|
37
26
|
name: i18n
|
38
|
-
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: *
|
35
|
+
version_requirements: *70321253945360
|
47
36
|
- !ruby/object:Gem::Dependency
|
48
37
|
name: uuidtools
|
49
|
-
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: *
|
46
|
+
version_requirements: *70321253944480
|
58
47
|
- !ruby/object:Gem::Dependency
|
59
48
|
name: rspec
|
60
|
-
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: *
|
57
|
+
version_requirements: *70321253943600
|
69
58
|
- !ruby/object:Gem::Dependency
|
70
59
|
name: yard
|
71
|
-
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: *
|
68
|
+
version_requirements: *70321253942720
|
80
69
|
- !ruby/object:Gem::Dependency
|
81
70
|
name: bundler
|
82
|
-
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: *
|
79
|
+
version_requirements: *70321253941800
|
91
80
|
- !ruby/object:Gem::Dependency
|
92
81
|
name: jeweler
|
93
|
-
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: *
|
90
|
+
version_requirements: *70321253941020
|
102
91
|
- !ruby/object:Gem::Dependency
|
103
92
|
name: rcov
|
104
|
-
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: *
|
101
|
+
version_requirements: *70321253940260
|
113
102
|
- !ruby/object:Gem::Dependency
|
114
103
|
name: msgpack
|
115
|
-
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: *
|
112
|
+
version_requirements: *70321253939160
|
124
113
|
- !ruby/object:Gem::Dependency
|
125
114
|
name: eventmachine
|
126
|
-
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: *
|
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: -
|
171
|
+
hash: -2016734549477828314
|
183
172
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
173
|
none: false
|
185
174
|
requirements:
|