serf 0.13.0 → 0.14.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/NOTICE.txt +1 -1
- data/README.md +80 -27
- data/lib/serf/loader/registry.rb +3 -2
- data/lib/serf/middleware/error_handler.rb +1 -2
- data/lib/serf/middleware/parcel_freezer.rb +1 -1
- data/lib/serf/middleware/parcel_masher.rb +2 -3
- data/lib/serf/middleware/request_timer.rb +4 -1
- data/lib/serf/middleware/uuid_tagger.rb +6 -6
- data/lib/serf/parcel_factory.rb +19 -9
- data/lib/serf/version.rb +1 -1
- data/spec/serf/builder_spec.rb +1 -1
- data/spec/serf/loader/loader_spec.rb +3 -3
- data/spec/serf/loader/registry_spec.rb +1 -1
- data/spec/serf/loader_spec.rb +3 -3
- data/spec/serf/middleware/error_handler_spec.rb +1 -1
- data/spec/serf/middleware/parcel_masher_spec.rb +1 -2
- data/spec/serf/middleware/request_timer_spec.rb +1 -1
- data/spec/serf/middleware/uuid_tagger_spec.rb +4 -6
- data/spec/serf/parcel_factory_spec.rb +22 -28
- data/spec/serf/serfer_spec.rb +7 -17
- data/spec/support/factories.rb +14 -23
- metadata +3 -3
data/NOTICE.txt
CHANGED
data/README.md
CHANGED
@@ -27,7 +27,7 @@ The piece of work to be done. This takes in a request, represented by the
|
|
27
27
|
"Message" within the given "Parcel", and returns an "Event" as its result.
|
28
28
|
The Interactor is the "Domain Controller" with respect to performing
|
29
29
|
Domain Layer business logic in coordinating and interacting with
|
30
|
-
the Domain Layer's Entities
|
30
|
+
the Domain Layer's Model (Entities, Value Objects and Entity Gateways).
|
31
31
|
|
32
32
|
1. Include the "Serf::Interactor" module in your class.
|
33
33
|
2. Implement the 'call(parcel)' method.
|
@@ -51,11 +51,14 @@ introspect the parcel's message.
|
|
51
51
|
Example:
|
52
52
|
|
53
53
|
require 'hashie'
|
54
|
+
require 'optser'
|
54
55
|
|
55
56
|
class MyInteractor
|
57
|
+
attr_reader :model
|
56
58
|
|
57
|
-
def initialize(*
|
59
|
+
def initialize(*args, &block)
|
58
60
|
# Do some validation here, or extra parameter setting with the args
|
61
|
+
opts = Optser.extract_options! args
|
59
62
|
@model = opts :model, MyModel
|
60
63
|
end
|
61
64
|
|
@@ -63,7 +66,7 @@ Example:
|
|
63
66
|
# Do something w/ the message and opts.
|
64
67
|
# Simple data structures for the Interactor's "Request".
|
65
68
|
|
66
|
-
item =
|
69
|
+
item = model.find parcel.message.model_id
|
67
70
|
|
68
71
|
# Make a simple data structure as the Interactor "Response".
|
69
72
|
response = Hashie::Mash.new
|
@@ -84,13 +87,30 @@ This simplifies marshalling over the network. It also gives us easier
|
|
84
87
|
semantics in defining Request and Responses without need of extra classes,
|
85
88
|
code, etc.
|
86
89
|
|
87
|
-
The Parcel in Ruby (Datastructure) is represented simply as
|
90
|
+
The Parcel in Ruby (Datastructure) is represented simply as a hash.
|
88
91
|
|
89
|
-
*
|
92
|
+
* The *message* is stored in the "message" property of the parcel.
|
93
|
+
* And *header* fields exist in the top level namespace of the parcel.
|
90
94
|
|
91
|
-
|
92
|
-
|
93
|
-
|
95
|
+
For example,
|
96
|
+
|
97
|
+
{
|
98
|
+
kind: 'serf/messages/my_kind',
|
99
|
+
uuid: 'gvGshlXTEeKj-AQMzuOZ7g',
|
100
|
+
another_header_field: '123456',
|
101
|
+
message: {
|
102
|
+
# Some message object
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
Serf *RESERVES* the following set of header names:
|
107
|
+
|
108
|
+
* kind
|
109
|
+
* message
|
110
|
+
* uuid
|
111
|
+
* parent_uuid
|
112
|
+
* origin_uuid
|
113
|
+
* serf_*
|
94
114
|
|
95
115
|
*Messages* are the representation of a Business Request or Business Event.
|
96
116
|
|
@@ -106,19 +126,54 @@ be in the message.
|
|
106
126
|
*Headers* are the processing meta data that is associated with a Message.
|
107
127
|
|
108
128
|
Headers provide information that would assist in processing, tracking
|
109
|
-
a Message. But
|
110
|
-
the Request or Event Message.
|
129
|
+
a Message. But SHOULD NOT provide business relevant information to
|
130
|
+
the Interactor for it to process a Request or Event Message.
|
111
131
|
|
112
|
-
|
113
|
-
|
114
|
-
The "kind" field identifies the ontological meaning of the message, which
|
132
|
+
*kind* field identifies the ontological meaning of the message, which
|
115
133
|
may be used to route messages over messaging channels to Interactors.
|
116
134
|
The convention is 'mymodule/requests/my_business_request' for Requests,
|
117
135
|
and 'mymodule/events/my_business_event' for Events.
|
118
136
|
|
119
|
-
|
120
|
-
|
121
|
-
|
137
|
+
*UUIDs* are used to track request and events, providing a sequential
|
138
|
+
order of execution of commands. Already Implemented by Serf middleware.
|
139
|
+
|
140
|
+
* uuid - The identification of the specific parcel.
|
141
|
+
* parent_uuid - The identification of the parcel that caused the current
|
142
|
+
parcel to be generated.
|
143
|
+
* origin_uuid - The original parcel (request or event) that started
|
144
|
+
the chain of requests and event parcels to be generated from Interactors
|
145
|
+
processing.
|
146
|
+
|
147
|
+
The format of the UUIDs is Serf's `coded_uuid`. It is a URI safe base64
|
148
|
+
string encoded from a UTC timestamped Type 1 UUID. This allows for both
|
149
|
+
good uniqueness and timestamp auditing (if servers are network time synced).
|
150
|
+
|
151
|
+
*serf headers* are prefixed with the "serf_" string. Example:
|
152
|
+
|
153
|
+
{
|
154
|
+
kind: 'my_lib/messages/my_kind',
|
155
|
+
serf_elapsed_time: 12034,
|
156
|
+
message: {
|
157
|
+
}
|
158
|
+
}
|
159
|
+
|
160
|
+
Applications can add their own headers to parcels for application
|
161
|
+
specific tracking. Namespacing SHOULD be used.
|
162
|
+
|
163
|
+
For example,
|
164
|
+
|
165
|
+
{
|
166
|
+
kind: 'my_lib/messages/my_kind',
|
167
|
+
my_middleware: {
|
168
|
+
data_point_a: 1234
|
169
|
+
},
|
170
|
+
my_middleware_data_poing_b: 5678,
|
171
|
+
message: {
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
Examples of other header uses:
|
176
|
+
|
122
177
|
* Current User that sent the request. For authentication and authorization.
|
123
178
|
* Host and Application Server that is processing this request.
|
124
179
|
|
@@ -134,6 +189,10 @@ chained requests to other Interactors. For example, the UUIDs in headers in
|
|
134
189
|
UUID headers for "Request B" that is sent to "Interactor B". This allows
|
135
190
|
us to track the origin point of any piece of processing request and event..
|
136
191
|
|
192
|
+
NOTE: Hashie::Mash is *Awesome*. (https://github.com/intridea/hashie)
|
193
|
+
NOTE: Serf passes the parcel as frozen Hashie::Mash instances
|
194
|
+
to Interactor' call method by default.
|
195
|
+
|
137
196
|
Policies
|
138
197
|
--------
|
139
198
|
|
@@ -249,7 +308,7 @@ Serf Builder Example
|
|
249
308
|
class MyPolicy
|
250
309
|
|
251
310
|
def check!(parcel)
|
252
|
-
raise 'Policy Error: User is nil' unless parcel.
|
311
|
+
raise 'Policy Error: User is nil' unless parcel.current_user
|
253
312
|
end
|
254
313
|
|
255
314
|
end
|
@@ -284,18 +343,14 @@ Serf Builder Example
|
|
284
343
|
|
285
344
|
# Here is good result
|
286
345
|
results = serf.call(
|
287
|
-
|
288
|
-
user: 'user_info_1'
|
289
|
-
},
|
346
|
+
current_user: 'user_info_1',
|
290
347
|
message: {
|
291
348
|
})
|
292
349
|
my_logger.info "Call 2: #{results.to_json}"
|
293
350
|
|
294
351
|
# Here get an error that was raised from the interactor
|
295
352
|
results = serf.call(
|
296
|
-
|
297
|
-
user: 'user_info_1'
|
298
|
-
},
|
353
|
+
current_user: 'user_info_1',
|
299
354
|
message: {
|
300
355
|
raise_an_error: true
|
301
356
|
})
|
@@ -369,9 +424,7 @@ Look inside the example subdirectory for the serf files in this example.
|
|
369
424
|
|
370
425
|
# Make an example request parcel
|
371
426
|
request_parcel = {
|
372
|
-
|
373
|
-
kind: 'subsystem/requests/create_widget'
|
374
|
-
},
|
427
|
+
kind: 'subsystem/requests/create_widget',
|
375
428
|
message: {
|
376
429
|
name: 'some widget name'
|
377
430
|
}
|
@@ -380,7 +433,7 @@ Look inside the example subdirectory for the serf files in this example.
|
|
380
433
|
#
|
381
434
|
# Look up the create widget serf by a request kind name,
|
382
435
|
# execute the serf, and log the results
|
383
|
-
serf = serf_map[request_parcel[:
|
436
|
+
serf = serf_map[request_parcel[:kind]]
|
384
437
|
results = serf.call request_parcel
|
385
438
|
logger.info results.to_json
|
386
439
|
|
data/lib/serf/loader/registry.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'hashie'
|
2
|
+
require 'optser'
|
2
3
|
|
3
4
|
module Serf
|
4
5
|
module Loader
|
@@ -37,10 +38,10 @@ module Loader
|
|
37
38
|
# # Now obtain the build serf, all wired up, by the parcel kind
|
38
39
|
# # and execute the found serf.
|
39
40
|
# parcel = {
|
40
|
-
#
|
41
|
+
# kind: 'subsystem/request/my_request',
|
41
42
|
# message: {}
|
42
43
|
# }
|
43
|
-
# serf = registry[parcel[:
|
44
|
+
# serf = registry[parcel[:kind]]
|
44
45
|
# puts serf.call(parcel)
|
45
46
|
#
|
46
47
|
class Registry
|
@@ -37,8 +37,7 @@ module Middleware
|
|
37
37
|
# Return on success
|
38
38
|
return response_parcel if response_parcel
|
39
39
|
|
40
|
-
# We got an error message
|
41
|
-
# and return the parcel.
|
40
|
+
# We got an error message, so build out and return the error parcel
|
42
41
|
return parcel_factory.create(
|
43
42
|
kind: 'serf/events/caught_error',
|
44
43
|
parent: parcel,
|
@@ -5,7 +5,7 @@ module Serf
|
|
5
5
|
module Middleware
|
6
6
|
|
7
7
|
##
|
8
|
-
# Middleware to
|
8
|
+
# Middleware to coerce the parcel to Hashie::Mash.
|
9
9
|
#
|
10
10
|
class ParcelMasher
|
11
11
|
attr_reader :app
|
@@ -22,10 +22,9 @@ module Middleware
|
|
22
22
|
|
23
23
|
##
|
24
24
|
# Coerces the parcel into a Hashie::Mash, makes sure that
|
25
|
-
# the
|
25
|
+
# the message field is set, and then passes it along the chain.
|
26
26
|
def call(parcel)
|
27
27
|
mashed_parcel = masher_class.new parcel
|
28
|
-
mashed_parcel[:headers] ||= {}
|
29
28
|
mashed_parcel[:message] ||= {}
|
30
29
|
app.call mashed_parcel
|
31
30
|
end
|
@@ -3,6 +3,9 @@ require 'optser'
|
|
3
3
|
module Serf
|
4
4
|
module Middleware
|
5
5
|
|
6
|
+
##
|
7
|
+
# Middleware to time the execution of the remaining stack, saving the
|
8
|
+
# timing into the 'serf_elapsed_time' field in the parcel.
|
6
9
|
class RequestTimer
|
7
10
|
attr_reader :app
|
8
11
|
attr_reader :timer
|
@@ -16,7 +19,7 @@ module Middleware
|
|
16
19
|
def call(parcel)
|
17
20
|
t = timer.start
|
18
21
|
response_parcel = app.call parcel
|
19
|
-
response_parcel
|
22
|
+
response_parcel[:serf_elapsed_time] = t.mark
|
20
23
|
return response_parcel
|
21
24
|
end
|
22
25
|
|
@@ -7,7 +7,7 @@ module Serf
|
|
7
7
|
module Middleware
|
8
8
|
|
9
9
|
##
|
10
|
-
# Middleware to add
|
10
|
+
# Middleware to add the uuid to the parcel hash if not already present.
|
11
11
|
#
|
12
12
|
class UuidTagger
|
13
13
|
attr_reader :app
|
@@ -23,13 +23,13 @@ module Middleware
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def call(parcel)
|
26
|
-
#
|
27
|
-
parcel
|
26
|
+
# Duplicate the parcel
|
27
|
+
parcel = parcel.dup
|
28
28
|
|
29
|
-
# Tag
|
30
|
-
parcel[:
|
29
|
+
# Tag with a UUID unless it already has one
|
30
|
+
parcel[:uuid] ||= uuidable.create_coded_uuid
|
31
31
|
|
32
|
-
# Pass on the given parcel with
|
32
|
+
# Pass on the given parcel with the uuid
|
33
33
|
app.call parcel
|
34
34
|
end
|
35
35
|
|
data/lib/serf/parcel_factory.rb
CHANGED
@@ -8,6 +8,18 @@ module Serf
|
|
8
8
|
##
|
9
9
|
# Creates Parcels as Hashie::Mash objects with headers and messages.
|
10
10
|
#
|
11
|
+
# The headers this factory sets are:
|
12
|
+
# * kind
|
13
|
+
# * uuid
|
14
|
+
# * parent_uuid
|
15
|
+
# * origin_uuid
|
16
|
+
#
|
17
|
+
# The message field:
|
18
|
+
# * message
|
19
|
+
#
|
20
|
+
# The UUID fields are created using the uuidable processed from the parent
|
21
|
+
# parcel.
|
22
|
+
#
|
11
23
|
class ParcelFactory
|
12
24
|
attr_reader :mash_class
|
13
25
|
attr_reader :uuidable
|
@@ -28,16 +40,14 @@ module Serf
|
|
28
40
|
headers = opts.get :headers, {}
|
29
41
|
message = opts.get :message, {}
|
30
42
|
|
31
|
-
#
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
headers.kind = kind
|
43
|
+
# Create a new parcel, with the header fields as base of object.
|
44
|
+
# Merge in the new UUIDs, overwriting anything set in headers.
|
45
|
+
# Merge in the kind and message, overwriting anything already set.
|
46
|
+
parcel = mash_class.new(headers)
|
47
|
+
parcel.merge! uuidable.create_uuids(parent)
|
48
|
+
parcel.merge! kind: kind, message: message
|
38
49
|
|
39
|
-
|
40
|
-
mash_class.new headers: headers, message: message
|
50
|
+
return parcel
|
41
51
|
end
|
42
52
|
|
43
53
|
end
|
data/lib/serf/version.rb
CHANGED
data/spec/serf/builder_spec.rb
CHANGED
@@ -33,7 +33,7 @@ describe Serf::Builder do
|
|
33
33
|
it 'runs the app' do
|
34
34
|
response = subject.to_app.call request_parcel
|
35
35
|
expect(response.message).to eq(request_parcel)
|
36
|
-
expect(response.
|
36
|
+
expect(response.kind).to eq(response_kind)
|
37
37
|
end
|
38
38
|
|
39
39
|
end
|
@@ -9,7 +9,7 @@ describe Serf::Loader::Loader do
|
|
9
9
|
|
10
10
|
context '#serfup Serf Map' do
|
11
11
|
let(:random_message) {
|
12
|
-
FactoryGirl.create :
|
12
|
+
FactoryGirl.create :random_hash
|
13
13
|
}
|
14
14
|
subject {
|
15
15
|
Serf::Loader::Loader.new.serfup(
|
@@ -39,7 +39,7 @@ describe Serf::Loader::Loader do
|
|
39
39
|
|
40
40
|
results = serf.call({})
|
41
41
|
expect(results).to_not be_nil
|
42
|
-
expect(results.
|
42
|
+
expect(results.kind).to_not eq('serf/events/caught_error')
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'returns nil on not found parcel kind' do
|
@@ -49,7 +49,7 @@ describe Serf::Loader::Loader do
|
|
49
49
|
it 'passes in a good environment' do
|
50
50
|
serf = subject['subsystem/requests/create_widget']
|
51
51
|
results = serf.call({})
|
52
|
-
expect(results.
|
52
|
+
expect(results.kind).to eq('subsystem/events/mywidget_created')
|
53
53
|
expect(results.message.success_message).to eq(random_message)
|
54
54
|
end
|
55
55
|
end
|
data/spec/serf/loader_spec.rb
CHANGED
@@ -9,7 +9,7 @@ describe Serf::Loader do
|
|
9
9
|
|
10
10
|
context '.serfup' do
|
11
11
|
let(:random_message) {
|
12
|
-
FactoryGirl.create :
|
12
|
+
FactoryGirl.create :random_hash
|
13
13
|
}
|
14
14
|
subject {
|
15
15
|
Serf::Loader.serfup(
|
@@ -39,7 +39,7 @@ describe Serf::Loader do
|
|
39
39
|
|
40
40
|
results = serf.call({})
|
41
41
|
expect(results).to_not be_nil
|
42
|
-
expect(results.
|
42
|
+
expect(results.kind).to_not eq('serf/events/caught_error')
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'returns nil on not found parcel kind' do
|
@@ -49,7 +49,7 @@ describe Serf::Loader do
|
|
49
49
|
it 'passes in a good environment' do
|
50
50
|
serf = subject['subsystem/requests/create_widget']
|
51
51
|
results = serf.call({})
|
52
|
-
expect(results.
|
52
|
+
expect(results.kind).to eq('subsystem/events/mywidget_created')
|
53
53
|
expect(results.message.success_message).to eq(random_message)
|
54
54
|
end
|
55
55
|
end
|
@@ -31,7 +31,7 @@ describe Serf::Middleware::ErrorHandler do
|
|
31
31
|
|
32
32
|
it 'has an error parcel kind' do
|
33
33
|
parcel = subject.call({})
|
34
|
-
expect(parcel[:
|
34
|
+
expect(parcel[:kind]).to eq('serf/events/caught_error')
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'uses parcel factory w/ kind, parent, and error message' do
|
@@ -16,10 +16,9 @@ describe Serf::Middleware::ParcelMasher do
|
|
16
16
|
app.call parcel
|
17
17
|
end
|
18
18
|
|
19
|
-
it 'autocreate
|
19
|
+
it 'autocreate message field' do
|
20
20
|
parcel = nil
|
21
21
|
app = described_class.new proc { |parcel|
|
22
|
-
expect(parcel.headers).to be_a_kind_of(Hashie::Mash)
|
23
22
|
expect(parcel.message).to be_a_kind_of(Hashie::Mash)
|
24
23
|
}
|
25
24
|
app.call parcel
|
@@ -35,7 +35,7 @@ describe Serf::Middleware::RequestTimer do
|
|
35
35
|
# Execute the Test
|
36
36
|
request_timer = described_class.new mock_app, :timer => mock_timer_class
|
37
37
|
response_parcel = request_timer.call({})
|
38
|
-
expect(response_parcel.
|
38
|
+
expect(response_parcel.serf_elapsed_time).to eq(elapsed_time)
|
39
39
|
end
|
40
40
|
|
41
41
|
end
|
@@ -6,10 +6,10 @@ describe Serf::Middleware::UuidTagger do
|
|
6
6
|
|
7
7
|
describe '#call' do
|
8
8
|
|
9
|
-
it 'adds uuid the parcel
|
9
|
+
it 'adds uuid to the parcel' do
|
10
10
|
parcel = {}
|
11
11
|
app = described_class.new proc { |parcel|
|
12
|
-
expect(parcel[:
|
12
|
+
expect(parcel[:uuid]).to_not be_nil
|
13
13
|
}
|
14
14
|
app.call parcel
|
15
15
|
end
|
@@ -17,12 +17,10 @@ describe Serf::Middleware::UuidTagger do
|
|
17
17
|
it 'does not change the existing uuid' do
|
18
18
|
uuid = '0d3eccaabcc46c3bcbe2a53c4505e352'
|
19
19
|
parcel = {
|
20
|
-
|
21
|
-
uuid: uuid
|
22
|
-
}
|
20
|
+
uuid: uuid
|
23
21
|
}
|
24
22
|
app = described_class.new proc { |parcel|
|
25
|
-
expect(parcel[:
|
23
|
+
expect(parcel[:uuid]).to eq(uuid)
|
26
24
|
}
|
27
25
|
app.call parcel
|
28
26
|
end
|
@@ -15,7 +15,7 @@ describe Serf::ParcelFactory do
|
|
15
15
|
FactoryGirl.create :random_headers
|
16
16
|
}
|
17
17
|
let(:response_message) {
|
18
|
-
FactoryGirl.create :
|
18
|
+
FactoryGirl.create :random_hash
|
19
19
|
}
|
20
20
|
let(:parent_parcel) {
|
21
21
|
FactoryGirl.create :random_parcel
|
@@ -26,41 +26,35 @@ describe Serf::ParcelFactory do
|
|
26
26
|
expect(parcel).to be_a_kind_of(Hashie::Mash)
|
27
27
|
end
|
28
28
|
|
29
|
-
it '
|
29
|
+
it 'sets nil kind in parcel' do
|
30
30
|
parcel = subject.create
|
31
|
-
expect(parcel.
|
31
|
+
expect(parcel.kind).to be_nil
|
32
32
|
end
|
33
33
|
|
34
|
-
it 'sets nil kind in parcel headers' do
|
35
|
-
parcel = subject.create
|
36
|
-
expect(parcel.headers.kind).to be_nil
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'sets nil kind in parcel headers to overwrite headers kind' do
|
34
|
+
it 'sets nil kind in parcel to overwrite headers kind' do
|
40
35
|
parcel = subject.create headers: response_headers
|
41
36
|
expect(response_headers.kind).to_not be_nil
|
42
|
-
expect(parcel.
|
37
|
+
expect(parcel.kind).to be_nil
|
43
38
|
end
|
44
39
|
|
45
|
-
it 'sets a kind in parcel
|
40
|
+
it 'sets a kind in parcel to overwrite headers' do
|
46
41
|
parcel = subject.create kind: response_kind, headers: response_headers
|
47
42
|
expect(response_headers.kind).to_not eq(response_kind)
|
48
|
-
expect(parcel.
|
43
|
+
expect(parcel.kind).to eq(response_kind)
|
49
44
|
end
|
50
45
|
|
51
|
-
it 'sets uuid, w/ nil origin and parent in parcel
|
46
|
+
it 'sets uuid, w/ nil origin and parent in parcel' do
|
52
47
|
parcel = subject.create
|
53
|
-
expect(parcel.
|
54
|
-
expect(parcel.
|
55
|
-
expect(parcel.
|
48
|
+
expect(parcel.uuid).to_not be_nil
|
49
|
+
expect(parcel.parent_uuid).to be_nil
|
50
|
+
expect(parcel.origin_uuid).to be_nil
|
56
51
|
end
|
57
52
|
|
58
|
-
it 'sets uuid, origin and parent in response
|
53
|
+
it 'sets uuid, origin and parent in response parent' do
|
59
54
|
parcel = subject.create parent: parent_parcel
|
60
|
-
expect(parcel.
|
61
|
-
expect(parcel.
|
62
|
-
expect(parcel.
|
63
|
-
to eq(parent_parcel.headers.origin_uuid)
|
55
|
+
expect(parcel.uuid).to_not be_nil
|
56
|
+
expect(parcel.parent_uuid).to eq(parent_parcel.uuid)
|
57
|
+
expect(parcel.origin_uuid).to eq(parent_parcel.origin_uuid)
|
64
58
|
end
|
65
59
|
|
66
60
|
it 'returns the message as a Hashie Mash' do
|
@@ -78,19 +72,19 @@ describe Serf::ParcelFactory do
|
|
78
72
|
expect(parcel.message).to eq(response_message)
|
79
73
|
end
|
80
74
|
|
81
|
-
it '
|
75
|
+
it 'uses correct fields given kind, extra headers, message and parent' do
|
82
76
|
parcel = subject.create(
|
83
77
|
parent: parent_parcel,
|
84
78
|
kind: response_kind,
|
85
79
|
headers: response_headers,
|
86
80
|
message: response_message)
|
87
81
|
expect(response_headers.kind).to_not eq(response_kind)
|
88
|
-
expect(parcel.
|
89
|
-
expect(parcel.
|
90
|
-
expect(parcel.
|
91
|
-
expect(parcel.
|
92
|
-
|
93
|
-
expect(parcel.
|
82
|
+
expect(parcel.kind).to eq(response_kind)
|
83
|
+
expect(parcel.uuid).to_not be_nil
|
84
|
+
expect(parcel.uuid).to_not eq(response_headers.uuid)
|
85
|
+
expect(parcel.parent_uuid).to eq(parent_parcel.uuid)
|
86
|
+
expect(parcel.origin_uuid).to eq(parent_parcel.origin_uuid)
|
87
|
+
expect(parcel.random_header_a).to eq(response_headers.random_header_a)
|
94
88
|
expect(parcel.message).to eq(response_message)
|
95
89
|
end
|
96
90
|
|
data/spec/serf/serfer_spec.rb
CHANGED
@@ -9,21 +9,13 @@ describe Serf::Serfer do
|
|
9
9
|
|
10
10
|
describe '#call' do
|
11
11
|
let(:request_parcel) {
|
12
|
-
|
13
|
-
headers: request_headers,
|
14
|
-
message: request_message)
|
15
|
-
}
|
16
|
-
let(:request_headers) {
|
17
|
-
FactoryGirl.create :random_headers
|
18
|
-
}
|
19
|
-
let(:request_message) {
|
20
|
-
FactoryGirl.create :random_message
|
12
|
+
FactoryGirl.create :random_parcel
|
21
13
|
}
|
22
14
|
let(:response_kind) {
|
23
15
|
SecureRandom.hex
|
24
16
|
}
|
25
17
|
let(:response_message) {
|
26
|
-
FactoryGirl.create :
|
18
|
+
FactoryGirl.create :random_hash
|
27
19
|
}
|
28
20
|
let(:disconnected_response_parcel) {
|
29
21
|
FactoryGirl.create :random_parcel
|
@@ -50,16 +42,14 @@ describe Serf::Serfer do
|
|
50
42
|
# We also expect that the uuid is some value
|
51
43
|
# We also expect that the response parent uuid matches request uuid
|
52
44
|
# We also expect that the response origin uuid matches request origin's.
|
53
|
-
expect(parcel.
|
54
|
-
expect(parcel.
|
55
|
-
expect(parcel.
|
56
|
-
|
57
|
-
expect(parcel.headers.parent_uuid).
|
58
|
-
to eq(request_parcel.headers.uuid)
|
45
|
+
expect(parcel.kind).to eq(response_kind)
|
46
|
+
expect(parcel.uuid).to_not be_nil
|
47
|
+
expect(parcel.origin_uuid).to eq(request_parcel.origin_uuid)
|
48
|
+
expect(parcel.parent_uuid).to eq(request_parcel.uuid)
|
59
49
|
expect(parcel.message).to eq(response_message)
|
60
50
|
end
|
61
51
|
|
62
|
-
it 'uses parcel factory w/
|
52
|
+
it 'uses parcel factory w/ kind, parent and message' do
|
63
53
|
mock_parcel_factory = double 'parcel_factory'
|
64
54
|
mock_parcel_factory.
|
65
55
|
should_receive(:create).
|
data/spec/support/factories.rb
CHANGED
@@ -6,39 +6,30 @@ FactoryGirl.define do
|
|
6
6
|
sequence(:random_string) { SecureRandom.hex }
|
7
7
|
|
8
8
|
factory :empty_parcel, class: Hashie::Mash do
|
9
|
-
headers {{
|
10
|
-
}}
|
11
9
|
message {{
|
12
10
|
}}
|
13
11
|
end
|
14
12
|
|
13
|
+
factory :random_hash, class: Hashie::Mash do
|
14
|
+
option_a { generate(:random_string) }
|
15
|
+
end
|
16
|
+
|
15
17
|
factory :random_parcel, class: Hashie::Mash do
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
}}
|
18
|
+
kind { generate(:random_string) }
|
19
|
+
uuid { generate(:random_string) }
|
20
|
+
origin_uuid { generate(:random_string) }
|
21
|
+
parent_uuid { generate(:random_string) }
|
22
|
+
random_header_a { generate(:random_string) }
|
22
23
|
message {{
|
23
24
|
some_data: generate(:random_string)
|
24
25
|
}}
|
25
26
|
end
|
26
27
|
|
27
28
|
factory :random_headers, class: Hashie::Mash do
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
factory :random_message, class: Hashie::Mash do
|
36
|
-
data { generate(:random_string) }
|
37
|
-
end
|
38
|
-
|
39
|
-
factory :random_options, class: Hashie::Mash do
|
40
|
-
option_a { generate(:random_string) }
|
41
|
-
option_b { generate(:random_string) }
|
42
|
-
option_c { generate(:random_string) }
|
29
|
+
kind { generate(:random_string) }
|
30
|
+
uuid { generate(:random_string) }
|
31
|
+
origin_uuid { generate(:random_string) }
|
32
|
+
parent_uuid { generate(:random_string) }
|
33
|
+
random_header_a { generate(:random_string) }
|
43
34
|
end
|
44
35
|
end
|
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.14.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -155,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
155
|
version: '0'
|
156
156
|
segments:
|
157
157
|
- 0
|
158
|
-
hash:
|
158
|
+
hash: -3964117889067138578
|
159
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
160
|
none: false
|
161
161
|
requirements:
|
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
164
|
version: '0'
|
165
165
|
segments:
|
166
166
|
- 0
|
167
|
-
hash:
|
167
|
+
hash: -3964117889067138578
|
168
168
|
requirements: []
|
169
169
|
rubyforge_project:
|
170
170
|
rubygems_version: 1.8.23
|