serf 0.12.0 → 0.12.1

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/.gitignore CHANGED
@@ -1,21 +1,10 @@
1
1
  # Gemfile.lock because this is a library, not a deployable application.
2
2
  Gemfile.lock
3
-
4
- # rcov generated
5
3
  coverage
6
-
7
- # rdoc generated
8
4
  rdoc
9
-
10
- # yard generated
11
5
  doc
12
6
  .yardoc
13
-
14
- # bundler config
15
7
  .bundle
16
-
17
- # bundler installs here if bundle path is set to "vendor"
18
8
  vendor
19
-
20
- # generated builds
21
9
  pkg
10
+ tmp
@@ -1,9 +1,8 @@
1
1
  require 'hashie'
2
2
  require 'optser'
3
3
 
4
- require 'serf/parcel_builder'
4
+ require 'serf/parcel_factory'
5
5
  require 'serf/util/error_handling'
6
- require 'serf/util/uuidable'
7
6
 
8
7
  module Serf
9
8
  module Middleware
@@ -16,8 +15,7 @@ module Middleware
16
15
  include Serf::Util::ErrorHandling
17
16
 
18
17
  attr_reader :app
19
- attr_reader :parcel_builder
20
- attr_reader :uuidable
18
+ attr_reader :parcel_factory
21
19
 
22
20
  ##
23
21
  # @param app the app
@@ -27,8 +25,7 @@ module Middleware
27
25
  @app = app
28
26
 
29
27
  # Tunable knobs
30
- @parcel_builder = opts.get(:parcel_builder) { Serf::ParcelBuilder.new }
31
- @uuidable = opts.get(:uuidable) { Serf::Util::Uuidable.new }
28
+ @parcel_factory = opts.get(:parcel_factory) { Serf::ParcelFactory.new }
32
29
  end
33
30
 
34
31
  def call(parcel)
@@ -42,9 +39,10 @@ module Middleware
42
39
 
43
40
  # We got an error message instead, so build out the headers
44
41
  # and return the parcel.
45
- error_headers = uuidable.create_uuids parcel[:headers]
46
- error_headers[:kind] = 'serf/events/caught_error'
47
- return parcel_builder.build error_headers, error_message
42
+ return parcel_factory.create(
43
+ kind: 'serf/events/caught_error',
44
+ parent: parcel,
45
+ message: error_message)
48
46
  end
49
47
 
50
48
  end
@@ -0,0 +1,45 @@
1
+ require 'hashie'
2
+ require 'optser'
3
+
4
+ require 'serf/util/uuidable'
5
+
6
+ module Serf
7
+
8
+ ##
9
+ # Creates Parcels as Hashie::Mash objects with headers and messages.
10
+ #
11
+ class ParcelFactory
12
+ attr_reader :mash_class
13
+ attr_reader :uuidable
14
+
15
+ def initialize(*args)
16
+ opts = Optser.extract_options! args
17
+
18
+ @mash_class = opts.get :mash_class, Hashie::Mash
19
+ @uuidable = opts.get(:uuidable) { Serf::Util::Uuidable.new }
20
+ end
21
+
22
+ def create(*args)
23
+ opts = Optser.extract_options! args
24
+
25
+ # Get parameters
26
+ kind = opts.get :kind
27
+ parent = opts.get :parent, {}
28
+ headers = opts.get :headers, {}
29
+ message = opts.get :message, {}
30
+
31
+ # Coerce to mashes.
32
+ parent = mash_class.new(parent) unless parent.kind_of? mash_class
33
+ headers = mash_class.new(headers) unless headers.kind_of? mash_class
34
+
35
+ # Create a new headers object w/ uuids set from the parent and kind.
36
+ headers = headers.merge uuidable.create_uuids(parent.headers)
37
+ headers.kind = kind
38
+
39
+ # Return a final parcel, coerced as a mash.
40
+ mash_class.new headers: headers, message: message
41
+ end
42
+
43
+ end
44
+
45
+ end
data/lib/serf/serfer.rb CHANGED
@@ -1,8 +1,6 @@
1
- require 'hashie'
2
1
  require 'optser'
3
2
 
4
- require 'serf/parcel_builder'
5
- require 'serf/util/uuidable'
3
+ require 'serf/parcel_factory'
6
4
 
7
5
  module Serf
8
6
 
@@ -11,8 +9,7 @@ module Serf
11
9
  #
12
10
  class Serfer
13
11
  attr_reader :interactor
14
- attr_reader :parcel_builder
15
- attr_reader :uuidable
12
+ attr_reader :parcel_factory
16
13
 
17
14
  def initialize(interactor, *args)
18
15
  opts = Optser.extract_options! args
@@ -21,26 +18,24 @@ module Serf
21
18
  @interactor = interactor
22
19
 
23
20
  # Tunable knobs
24
- @parcel_builder = opts.get(:parcel_builder) { Serf::ParcelBuilder.new }
25
- @uuidable = opts.get(:uuidable) { Serf::Util::Uuidable.new }
21
+ @parcel_factory = opts.get(:parcel_factory) { Serf::ParcelFactory.new }
26
22
  end
27
23
 
28
24
  ##
29
25
  # Rack-like call to run the Interactor's use-case.
30
26
  #
31
27
  def call(parcel)
32
- headers = parcel[:headers]
33
- message = parcel[:message]
34
-
35
28
  # 1. Execute interactor
36
- response_kind, response_message = interactor.call message
37
-
38
- # 2. Create the response headers
39
- response_headers = uuidable.create_uuids headers
40
- response_headers[:kind] = response_kind
41
-
42
- # 3. Return the response headers and message as a parcel
43
- return parcel_builder.build response_headers, response_message
29
+ response_kind, response_message = interactor.call parcel[:message]
30
+
31
+ # 2. Return a new response parcel with:
32
+ # a. uuids set from parent parcel
33
+ # b. kind set to response kind
34
+ # c. the message set to response_message
35
+ return parcel_factory.create(
36
+ parent: parcel,
37
+ kind: response_kind,
38
+ message: response_message)
44
39
  end
45
40
 
46
41
  end
data/lib/serf/version.rb CHANGED
@@ -3,7 +3,7 @@ module Serf
3
3
  module Version
4
4
  MAJOR = 0
5
5
  MINOR = 12
6
- PATCH = 0
6
+ PATCH = 1
7
7
  BUILD = nil
8
8
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join '.'
9
9
  end
data/serf.gemspec CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |gem|
23
23
  ]
24
24
 
25
25
  gem.add_runtime_dependency('hashie', ['>= 1.2.0'])
26
- gem.add_runtime_dependency('ice_nine', ['>= 0.4.0'])
26
+ gem.add_runtime_dependency('ice_nine', ['>= 0.6.0'])
27
27
  gem.add_runtime_dependency('optser', ['>= 0.1.0'])
28
28
  gem.add_runtime_dependency('uuidtools', ['>= 2.1.3'])
29
29
  end
@@ -1,5 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
+ require 'factory_girl'
4
+
3
5
  require 'serf/middleware/error_handler'
4
6
 
5
7
  describe Serf::Middleware::ErrorHandler do
@@ -7,6 +9,13 @@ describe Serf::Middleware::ErrorHandler do
7
9
  describe '#call' do
8
10
 
9
11
  context 'has a raised error' do
12
+ let(:request_parcel) {
13
+ FactoryGirl.create :random_parcel
14
+ }
15
+ let(:response_parcel) {
16
+ FactoryGirl.create :random_parcel
17
+ }
18
+
10
19
  subject {
11
20
  described_class.new(proc { |parcel|
12
21
  raise 'Some Runtime Error'
@@ -24,6 +33,25 @@ describe Serf::Middleware::ErrorHandler do
24
33
  parcel = subject.call({})
25
34
  expect(parcel[:headers][:kind]).to eq('serf/events/caught_error')
26
35
  end
36
+
37
+ it 'uses parcel factory w/ kind, parent, and error message' do
38
+ mock_parcel_factory = double 'parcel_factory'
39
+ mock_parcel_factory.
40
+ should_receive(:create).
41
+ with({
42
+ parent: request_parcel,
43
+ kind: 'serf/events/caught_error',
44
+ message: anything()
45
+ }).
46
+ and_return(response_parcel)
47
+
48
+ app = described_class.new(proc { |parcel|
49
+ raise 'Some Runtime Error'
50
+ },
51
+ parcel_factory: mock_parcel_factory)
52
+ response = app.call request_parcel
53
+ expect(response).to eq(response_parcel)
54
+ end
27
55
  end
28
56
 
29
57
  context 'has a succeeding app' do
@@ -0,0 +1,99 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hashie'
4
+ require 'securerandom'
5
+
6
+ require 'serf/parcel_factory'
7
+
8
+ describe Serf::ParcelFactory do
9
+
10
+ describe '#build' do
11
+ let(:response_kind) {
12
+ SecureRandom.hex
13
+ }
14
+ let(:response_headers) {
15
+ FactoryGirl.create :random_headers
16
+ }
17
+ let(:response_message) {
18
+ FactoryGirl.create :random_message
19
+ }
20
+ let(:parent_parcel) {
21
+ FactoryGirl.create :random_parcel
22
+ }
23
+
24
+ it 'returns a Hashie Mash' do
25
+ parcel = subject.create
26
+ expect(parcel).to be_a_kind_of(Hashie::Mash)
27
+ end
28
+
29
+ it 'returns the headers as a Hashie Mash' do
30
+ parcel = subject.create
31
+ expect(parcel.headers).to be_a_kind_of(Hashie::Mash)
32
+ end
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
40
+ parcel = subject.create headers: response_headers
41
+ expect(response_headers.kind).to_not be_nil
42
+ expect(parcel.headers.kind).to be_nil
43
+ end
44
+
45
+ it 'sets a kind in parcel headers to overwrite headers' do
46
+ parcel = subject.create kind: response_kind, headers: response_headers
47
+ expect(response_headers.kind).to_not eq(response_kind)
48
+ expect(parcel.headers.kind).to eq(response_kind)
49
+ end
50
+
51
+ it 'sets uuid, w/ nil origin and parent in parcel headers' do
52
+ parcel = subject.create
53
+ expect(parcel.headers.uuid).to_not be_nil
54
+ expect(parcel.headers.parent_uuid).to be_nil
55
+ expect(parcel.headers.origin_uuid).to be_nil
56
+ end
57
+
58
+ it 'sets uuid, origin and parent in response headers from parent' do
59
+ parcel = subject.create parent: parent_parcel
60
+ expect(parcel.headers.uuid).to_not be_nil
61
+ expect(parcel.headers.parent_uuid).to eq(parent_parcel.headers.uuid)
62
+ expect(parcel.headers.origin_uuid).
63
+ to eq(parent_parcel.headers.origin_uuid)
64
+ end
65
+
66
+ it 'returns the message as a Hashie Mash' do
67
+ parcel = subject.create
68
+ expect(parcel.message).to be_a_kind_of(Hashie::Mash)
69
+ end
70
+
71
+ it 'sets empty parcel message as default' do
72
+ parcel = subject.create
73
+ expect(parcel[:message]).to eq({})
74
+ end
75
+
76
+ it 'sets the message, given a message' do
77
+ parcel = subject.create message: response_message
78
+ expect(parcel.message).to eq(response_message)
79
+ end
80
+
81
+ it 'sets meets expectations given kind, headers, message and parent' do
82
+ parcel = subject.create(
83
+ parent: parent_parcel,
84
+ kind: response_kind,
85
+ headers: response_headers,
86
+ message: response_message)
87
+ expect(response_headers.kind).to_not eq(response_kind)
88
+ expect(parcel.headers.kind).to eq(response_kind)
89
+ expect(parcel.headers.uuid).to_not be_nil
90
+ expect(parcel.headers.parent_uuid).to eq(parent_parcel.headers.uuid)
91
+ expect(parcel.headers.origin_uuid).
92
+ to eq(parent_parcel.headers.origin_uuid)
93
+ expect(parcel.headers.option_a).to eq(response_headers.option_a)
94
+ expect(parcel.message).to eq(response_message)
95
+ end
96
+
97
+ end
98
+
99
+ end
@@ -1,59 +1,81 @@
1
1
  require 'spec_helper'
2
2
 
3
+ require 'hashie'
4
+ require 'securerandom'
5
+
3
6
  require 'serf/serfer'
4
7
 
5
8
  describe Serf::Serfer do
6
9
 
7
10
  describe '#call' do
11
+ let(:request_parcel) {
12
+ Hashie::Mash.new(
13
+ headers: request_headers,
14
+ message: request_message)
15
+ }
16
+ let(:request_headers) {
17
+ FactoryGirl.create :random_headers
18
+ }
8
19
  let(:request_message) {
9
20
  FactoryGirl.create :random_message
10
21
  }
22
+ let(:response_kind) {
23
+ SecureRandom.hex
24
+ }
11
25
  let(:response_message) {
12
26
  FactoryGirl.create :random_message
13
27
  }
28
+ let(:disconnected_response_parcel) {
29
+ FactoryGirl.create :random_parcel
30
+ }
14
31
 
15
32
  it 'calls app with message' do
16
33
  mock_app = double 'mock_app'
17
34
  mock_app.should_receive(:call).with(request_message)
18
35
  serfer = described_class.new mock_app
19
- serfer.call(
20
- headers: nil,
21
- message: request_message)
36
+ serfer.call request_parcel
22
37
  end
23
38
 
24
- it 'returns a parcel' do
39
+ it 'returns a parcel with a kind, message and uuids' do
25
40
  mock_app = double 'mock_app'
26
41
  mock_app.
27
42
  should_receive(:call).
28
43
  with(request_message).
29
- and_return([nil, response_message])
44
+ and_return([response_kind, response_message])
30
45
  serfer = described_class.new mock_app
31
- parcel = serfer.call(
32
- headers: nil,
33
- message: request_message)
46
+
47
+ parcel = serfer.call request_parcel
48
+
49
+ # We expect the kind and message to match.
50
+ # We also expect that the uuid is some value
51
+ # We also expect that the response parent uuid matches request uuid
52
+ # We also expect that the response origin uuid matches request origin's.
53
+ expect(parcel.headers.kind).to eq(response_kind)
54
+ expect(parcel.headers.uuid).to_not be_nil
55
+ expect(parcel.headers.origin_uuid).
56
+ to eq(request_parcel.headers.origin_uuid)
57
+ expect(parcel.headers.parent_uuid).
58
+ to eq(request_parcel.headers.uuid)
34
59
  expect(parcel.message).to eq(response_message)
35
60
  end
36
61
 
37
- it 'sets the kind header in response' do
38
- mock_app = double 'mock_app'
39
- mock_app.
40
- should_receive(:call).
41
- with(request_message).
42
- and_return(['KIND', response_message])
43
- serfer = described_class.new mock_app
44
- parcel = serfer.call(
45
- headers: nil,
46
- message: request_message)
47
- expect(parcel.headers.kind).to eq('KIND')
48
- end
62
+ it 'uses parcel factory w/ message and headers' do
63
+ mock_parcel_factory = double 'parcel_factory'
64
+ mock_parcel_factory.
65
+ should_receive(:create).
66
+ with({
67
+ parent: request_parcel,
68
+ kind: response_kind,
69
+ message: response_message
70
+ }).
71
+ and_return(disconnected_response_parcel)
49
72
 
50
- it 'generate uuids' do
51
- uuidable = double 'uuidable'
52
- uuidable.should_receive(:create_uuids).and_return({})
53
73
  serfer = described_class.new(
54
- lambda {|obj| return obj },
55
- uuidable: uuidable)
56
- serfer.call({})
74
+ lambda {|obj| return response_kind, response_message },
75
+ parcel_factory: mock_parcel_factory)
76
+ parcel = serfer.call request_parcel
77
+
78
+ expect(parcel).to eq(disconnected_response_parcel)
57
79
  end
58
80
 
59
81
  end
@@ -15,6 +15,8 @@ FactoryGirl.define do
15
15
  factory :random_parcel, class: Hashie::Mash do
16
16
  headers {{
17
17
  uuid: generate(:random_string),
18
+ origin_uuid: generate(:random_string),
19
+ parent_uuid: generate(:random_string),
18
20
  kind: generate(:random_string)
19
21
  }}
20
22
  message {{
@@ -24,7 +26,10 @@ FactoryGirl.define do
24
26
 
25
27
  factory :random_headers, class: Hashie::Mash do
26
28
  uuid { generate(:random_string) }
29
+ origin_uuid { generate(:random_string) }
30
+ parent_uuid { generate(:random_string) }
27
31
  kind { generate(:random_string) }
32
+ option_a { generate(:random_string) }
28
33
  end
29
34
 
30
35
  factory :random_message, class: Hashie::Mash do
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.12.0
4
+ version: 0.12.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-22 00:00:00.000000000 Z
12
+ date: 2012-12-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: hashie
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
- version: 0.4.0
37
+ version: 0.6.0
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
- version: 0.4.0
45
+ version: 0.6.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: optser
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -106,7 +106,7 @@ files:
106
106
  - lib/serf/middleware/policy_checker.rb
107
107
  - lib/serf/middleware/request_timer.rb
108
108
  - lib/serf/middleware/uuid_tagger.rb
109
- - lib/serf/parcel_builder.rb
109
+ - lib/serf/parcel_factory.rb
110
110
  - lib/serf/serfer.rb
111
111
  - lib/serf/util/error_handling.rb
112
112
  - lib/serf/util/null_object.rb
@@ -126,7 +126,7 @@ files:
126
126
  - spec/serf/middleware/policy_checker_spec.rb
127
127
  - spec/serf/middleware/request_timer_spec.rb
128
128
  - spec/serf/middleware/uuid_tagger_spec.rb
129
- - spec/serf/parcel_builder_spec.rb
129
+ - spec/serf/parcel_factory_spec.rb
130
130
  - spec/serf/serfer_spec.rb
131
131
  - spec/serf/util/error_handling_spec.rb
132
132
  - spec/serf/util/null_object_spec.rb
@@ -155,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
155
  version: '0'
156
156
  segments:
157
157
  - 0
158
- hash: 3194185596279459247
158
+ hash: 4471778564530978528
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: 3194185596279459247
167
+ hash: 4471778564530978528
168
168
  requirements: []
169
169
  rubyforge_project:
170
170
  rubygems_version: 1.8.23
@@ -183,7 +183,7 @@ test_files:
183
183
  - spec/serf/middleware/policy_checker_spec.rb
184
184
  - spec/serf/middleware/request_timer_spec.rb
185
185
  - spec/serf/middleware/uuid_tagger_spec.rb
186
- - spec/serf/parcel_builder_spec.rb
186
+ - spec/serf/parcel_factory_spec.rb
187
187
  - spec/serf/serfer_spec.rb
188
188
  - spec/serf/util/error_handling_spec.rb
189
189
  - spec/serf/util/null_object_spec.rb
@@ -1,27 +0,0 @@
1
- require 'hashie'
2
- require 'optser'
3
-
4
- module Serf
5
-
6
- ##
7
- # Builds Parcels as Hashie::Mash objects with headers and messages.
8
- #
9
- class ParcelBuilder
10
- attr_reader :mash_class
11
-
12
- def initialize(*args)
13
- opts = Optser.extract_options! args
14
-
15
- @mash_class = opts.get :mash_class, Hashie::Mash
16
- end
17
-
18
- def build(headers=nil, message=nil)
19
- # We want to make sure that our headers and message are Mashes.
20
- headers = mash_class.new(headers) unless headers.kind_of? mash_class
21
- message = mash_class.new(message) unless message.kind_of? mash_class
22
- mash_class.new headers: headers, message: message
23
- end
24
-
25
- end
26
-
27
- end
@@ -1,46 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'hashie'
4
-
5
- require 'serf/parcel_builder'
6
-
7
- describe Serf::ParcelBuilder do
8
-
9
- describe '#build' do
10
- let(:random_headers) {
11
- FactoryGirl.create :random_headers
12
- }
13
- let(:random_message) {
14
- FactoryGirl.create :random_message
15
- }
16
-
17
- it 'returns a Hashie' do
18
- parcel = subject.build
19
- expect(parcel).to be_a_kind_of(Hashie::Mash)
20
- end
21
-
22
- it 'sets default parcel headers' do
23
- parcel = subject.build
24
- expect(parcel[:headers]).to eq({})
25
- end
26
-
27
- it 'sets default parcel message' do
28
- parcel = subject.build
29
- expect(parcel[:headers]).to eq({})
30
- end
31
-
32
- it 'sets given headers and message' do
33
- parcel = subject.build random_headers, random_message
34
- expect(parcel[:headers]).to eq(random_headers)
35
- expect(parcel[:message]).to eq(random_message)
36
- end
37
-
38
- it 'will coerce headers and message into Hashie::Mash' do
39
- parcel = subject.build nil, nil
40
- expect(parcel[:headers]).to be_a_kind_of(Hashie::Mash)
41
- expect(parcel[:message]).to be_a_kind_of(Hashie::Mash)
42
- end
43
-
44
- end
45
-
46
- end