serf 0.3.0 → 0.4.0
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.
- 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:
|