freddy 1.7.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Freddy
4
+ VERSION = '2.2.1'
5
+ end
data/lib/freddy.rb CHANGED
@@ -3,9 +3,11 @@
3
3
  require 'json'
4
4
  require 'thread/pool'
5
5
  require 'securerandom'
6
- require 'opentracing'
6
+ require 'opentelemetry'
7
+ require 'opentelemetry/semantic_conventions'
8
+ require_relative './freddy/version'
7
9
 
8
- Dir[File.dirname(__FILE__) + '/freddy/*.rb'].each(&method(:require))
10
+ Dir["#{File.dirname(__FILE__)}/freddy/*.rb"].sort.each(&method(:require))
9
11
 
10
12
  class Freddy
11
13
  FREDDY_TOPIC_EXCHANGE_NAME = 'freddy-topic'
@@ -26,22 +28,15 @@ class Freddy
26
28
  # @return [Freddy]
27
29
  #
28
30
  # @example
29
- # Freddy.build(Logger.new(STDOUT), user: 'thumper', pass: 'howdy')
30
- def self.build(logger = Logger.new(STDOUT), max_concurrency: DEFAULT_MAX_CONCURRENCY, **config)
31
- OpenTracing.global_tracer ||= OpenTracing::Tracer.new
32
-
31
+ # Freddy.build(Logger.new($stdout), user: 'thumper', pass: 'howdy')
32
+ def self.build(logger = Logger.new($stdout), max_concurrency: DEFAULT_MAX_CONCURRENCY, **config)
33
33
  connection = Adapters.determine.connect(config)
34
34
  new(connection, logger, max_concurrency)
35
35
  end
36
36
 
37
- # @deprecated Use {OpenTracing.active_span} instead
38
- def self.trace
39
- OpenTracing.active_span
40
- end
41
-
42
- # @deprecated Use OpenTracing ScopeManager instead
43
- def self.trace=(trace)
44
- OpenTracing.scope_manager.activate(trace) if OpenTracing.active_span != trace
37
+ # @private
38
+ def self.tracer
39
+ @tracer ||= OpenTelemetry.tracer_provider.tracer('freddy', Freddy::VERSION)
45
40
  end
46
41
 
47
42
  def initialize(connection, logger, max_concurrency)
@@ -70,7 +65,7 @@ class Freddy
70
65
  # Received message as a ruby hash with symbolized keys
71
66
  # @yieldparam [#success, #error] handler
72
67
  # Handler for responding to messages. Use handler#success for successful
73
- # respone and handler#error for error response.
68
+ # response and handler#error for error response.
74
69
  #
75
70
  # @return [#shutdown]
76
71
  #
@@ -104,7 +99,7 @@ class Freddy
104
99
  # consuming them. It is useful for general messages that two or more clients
105
100
  # are interested.
106
101
  #
107
- # @param [String] pattern
102
+ # @param [String] pattern_or_patterns
108
103
  # the destination pattern. Use `#` wildcard for matching 0 or more words.
109
104
  # Use `*` to match exactly one word.
110
105
  # @param [Hash] options
@@ -157,15 +152,18 @@ class Freddy
157
152
  # @option options [Integer] :timeout (0)
158
153
  # discards the message after given seconds if nobody consumes it. Message
159
154
  # won't be discarded if timeout it set to 0 (default).
160
- #
155
+ # @option options [String] :compress (nil)
156
+ # - 'zlib' - compresses the payload with zlib
161
157
  # @return [void]
162
158
  #
163
159
  # @example
164
160
  # freddy.deliver 'Metrics', user_id: 5, metric: 'signed_in'
165
161
  def deliver(destination, payload, options = {})
166
162
  timeout = options.fetch(:timeout, 0)
163
+ compression_algorithm = options.fetch(:compress, nil)
167
164
  opts = {}
168
165
  opts[:expiration] = (timeout * 1000).to_i if timeout.positive?
166
+ opts[:content_encoding] = compression_algorithm if compression_algorithm
169
167
 
170
168
  @send_and_forget_producer.produce(destination, payload, opts)
171
169
  end
data/spec/.rubocop.yml ADDED
@@ -0,0 +1,26 @@
1
+ require: rubocop-rspec
2
+ inherit_from: ../.rubocop.yml
3
+
4
+ RSpec/ExampleLength:
5
+ Enabled: no
6
+
7
+ RSpec/MultipleExpectations:
8
+ Enabled: no
9
+
10
+ RSpec/MessageSpies:
11
+ Enabled: no
12
+
13
+ RSpec/VerifiedDoubles:
14
+ Enabled: no
15
+
16
+ RSpec/InstanceVariable:
17
+ Enabled: no
18
+
19
+ RSpec/NestedGroups:
20
+ Enabled: no
21
+
22
+ RSpec/DescribeClass:
23
+ Enabled: no
24
+
25
+ RSpec/MultipleMemoizedHelpers:
26
+ Enabled: no
@@ -13,10 +13,10 @@ describe Freddy::ErrorResponse do
13
13
  end
14
14
 
15
15
  describe '#message' do
16
- subject { error.message }
16
+ subject(:message) { error.message }
17
17
 
18
18
  it 'uses error type as a message' do
19
- is_expected.to eq('SomeError')
19
+ expect(message).to eq('SomeError')
20
20
  end
21
21
  end
22
22
  end
@@ -31,10 +31,10 @@ describe Freddy::ErrorResponse do
31
31
  end
32
32
 
33
33
  describe '#message' do
34
- subject { error.message }
34
+ subject(:message) { error.message }
35
35
 
36
36
  it 'uses error type as a message' do
37
- is_expected.to eq('SomeError: extra info')
37
+ expect(message).to eq('SomeError: extra info')
38
38
  end
39
39
  end
40
40
  end
@@ -49,10 +49,10 @@ describe Freddy::ErrorResponse do
49
49
  end
50
50
 
51
51
  describe '#message' do
52
- subject { error.message }
52
+ subject(:message) { error.message }
53
53
 
54
54
  it 'uses default error message as a message' do
55
- is_expected.to eq('Use #response to get the error response')
55
+ expect(message).to eq('Use #response to get the error response')
56
56
  end
57
57
  end
58
58
  end
@@ -49,6 +49,29 @@ describe Freddy do
49
49
  expect(processed_after_timeout).to be(true)
50
50
  end
51
51
  end
52
+
53
+ context 'with compress' do
54
+ it 'compresses the payload' do
55
+ expect(Freddy::Encoding).to receive(:compress).with(anything, 'zlib').and_call_original
56
+
57
+ freddy.tap_into(destination) { |msg| @tapped_message = msg }
58
+ freddy.deliver(destination, payload, compress: 'zlib')
59
+ default_sleep
60
+
61
+ wait_for { @tapped_message }
62
+ expect(@tapped_message).to eq(payload)
63
+ end
64
+ end
65
+
66
+ context 'without compress' do
67
+ it 'does not compress the payload' do
68
+ freddy.tap_into(destination) { |msg| @tapped_message = msg }
69
+ deliver
70
+
71
+ wait_for { @tapped_message }
72
+ expect(@tapped_message).to eq(payload)
73
+ end
74
+ end
52
75
  end
53
76
 
54
77
  context 'when making a synchronized request' do
@@ -2,19 +2,28 @@ require 'spec_helper'
2
2
 
3
3
  describe Freddy::Payload do
4
4
  describe '#dump' do
5
- it 'serializes time objects as iso8601 format strings' do
6
- expect(dump(time: Time.utc(2016, 1, 4, 20, 18)))
7
- .to eq('{"time":"2016-01-04T20:18:00Z"}')
8
- end
9
-
10
- it 'serializes time objects in an array as iso8601 format strings' do
11
- expect(dump(time: [Time.utc(2016, 1, 4, 20, 18)]))
12
- .to eq('{"time":["2016-01-04T20:18:00Z"]}')
13
- end
14
-
15
- it 'serializes time objects in a nested hash as iso8601 format strings' do
16
- expect(dump(x: { time: Time.utc(2016, 1, 4, 20, 18) }))
17
- .to eq('{"x":{"time":"2016-01-04T20:18:00Z"}}')
5
+ context 'with a given Ruby engine' do
6
+ let(:ts) do
7
+ RUBY_ENGINE == 'jruby' ? '{"time":"2016-01-04T20:18:00Z"}' : '{"time":"2016-01-04T20:18:00.000000Z"}'
8
+ end
9
+ let(:ts_array) do
10
+ RUBY_ENGINE == 'jruby' ? '{"time":["2016-01-04T20:18:00Z"]}' : '{"time":["2016-01-04T20:18:00.000000Z"]}'
11
+ end
12
+
13
+ it 'serializes time objects as iso8601 format strings' do
14
+ expect(dump(time: Time.utc(2016, 1, 4, 20, 18)))
15
+ .to eq(ts)
16
+ end
17
+
18
+ it 'serializes time objects in an array as iso8601 format strings' do
19
+ expect(dump(time: [Time.utc(2016, 1, 4, 20, 18)]))
20
+ .to eq(ts_array)
21
+ end
22
+
23
+ it 'serializes time objects in a nested hash as iso8601 format strings' do
24
+ expect(dump(x: { time: Time.utc(2016, 1, 4, 20, 18) }))
25
+ .to eq("{\"x\":#{ts}}")
26
+ end
18
27
  end
19
28
 
20
29
  it 'serializes date objects as iso8601 format strings' do
@@ -33,17 +42,17 @@ describe Freddy::Payload do
33
42
  end
34
43
 
35
44
  it 'serializes datetime objects as iso8601 format strings' do
36
- expect(dump(datetime: DateTime.new(2016, 1, 4, 20, 18))) # rubocop:disable Style/DateTime
45
+ expect(dump(datetime: DateTime.new(2016, 1, 4, 20, 18)))
37
46
  .to eq('{"datetime":"2016-01-04T20:18:00+00:00"}')
38
47
  end
39
48
 
40
49
  it 'serializes datetime objects in an array as iso8601 format strings' do
41
- expect(dump(datetime: [DateTime.new(2016, 1, 4, 20, 18)])) # rubocop:disable Style/DateTime
50
+ expect(dump(datetime: [DateTime.new(2016, 1, 4, 20, 18)]))
42
51
  .to eq('{"datetime":["2016-01-04T20:18:00+00:00"]}')
43
52
  end
44
53
 
45
54
  it 'serializes datetime objects in a nested hash as iso8601 format strings' do
46
- expect(dump(x: { datetime: DateTime.new(2016, 1, 4, 20, 18) })) # rubocop:disable Style/DateTime
55
+ expect(dump(x: { datetime: DateTime.new(2016, 1, 4, 20, 18) }))
47
56
  .to eq('{"x":{"datetime":"2016-01-04T20:18:00+00:00"}}')
48
57
  end
49
58
 
@@ -10,21 +10,17 @@ describe 'Concurrency' do
10
10
 
11
11
  it 'supports multiple requests in #respond_to' do
12
12
  freddy1.respond_to 'Concurrency1' do |_payload, msg_handler|
13
- begin
14
- freddy1.deliver_with_response 'Concurrency2', msg: 'noop'
15
- result2 = freddy1.deliver_with_response 'Concurrency3', msg: 'noop'
16
- msg_handler.success(result2)
17
- rescue Freddy::InvalidRequestError => e
18
- msg_handler.error(e.response)
19
- end
13
+ freddy1.deliver_with_response 'Concurrency2', msg: 'noop'
14
+ result2 = freddy1.deliver_with_response 'Concurrency3', msg: 'noop'
15
+ msg_handler.success(result2)
16
+ rescue Freddy::InvalidRequestError => e
17
+ msg_handler.error(e.response)
20
18
  end
21
19
 
22
20
  freddy2.respond_to 'Concurrency2' do |_payload, msg_handler|
23
- begin
24
- msg_handler.success(from: 'Concurrency2')
25
- rescue Freddy::InvalidRequestError => e
26
- msg_handler.error(e.response)
27
- end
21
+ msg_handler.success(from: 'Concurrency2')
22
+ rescue Freddy::InvalidRequestError => e
23
+ msg_handler.error(e.response)
28
24
  end
29
25
 
30
26
  freddy3.respond_to 'Concurrency3' do |_payload, msg_handler|
@@ -1,13 +1,8 @@
1
1
  require 'spec_helper'
2
- require 'opentracing_test_tracer'
3
2
 
4
3
  describe 'Tracing' do
5
- let(:tracer) { OpenTracingTestTracer.build(logger: logger) }
6
4
  let(:logger) { spy }
7
5
 
8
- before { OpenTracing.global_tracer = tracer }
9
- after { OpenTracing.global_tracer = nil }
10
-
11
6
  context 'when receiving a traced request' do
12
7
  let(:freddy) { Freddy.build(logger, config) }
13
8
  let(:freddy2) { Freddy.build(logger, config) }
@@ -18,21 +13,13 @@ describe 'Tracing' do
18
13
  before do
19
14
  freddy.respond_to(destination) do |_payload, msg_handler|
20
15
  msg_handler.success(
21
- trace_initiator: {
22
- trace_id: active_span.context.trace_id,
23
- parent_id: active_span.context.parent_id,
24
- span_id: active_span.context.span_id
25
- },
16
+ trace_initiator: current_span_attributes,
26
17
  current_receiver: freddy.deliver_with_response(destination2, {})
27
18
  )
28
19
  end
29
20
 
30
21
  freddy2.respond_to(destination2) do |_payload, msg_handler|
31
- msg_handler.success(
32
- trace_id: active_span.context.trace_id,
33
- parent_id: active_span.context.parent_id,
34
- span_id: active_span.context.span_id
35
- )
22
+ msg_handler.success(current_span_attributes)
36
23
  end
37
24
  end
38
25
 
@@ -75,31 +62,19 @@ describe 'Tracing' do
75
62
  before do
76
63
  freddy.respond_to(destination) do |_payload, msg_handler|
77
64
  msg_handler.success({
78
- trace_initiator: {
79
- trace_id: active_span.context.trace_id,
80
- parent_id: active_span.context.parent_id,
81
- span_id: active_span.context.span_id
82
- }
65
+ trace_initiator: current_span_attributes
83
66
  }.merge(freddy.deliver_with_response(destination2, {})))
84
67
  end
85
68
 
86
69
  freddy2.respond_to(destination2) do |_payload, msg_handler|
87
70
  msg_handler.success(
88
- previous_receiver: {
89
- trace_id: active_span.context.trace_id,
90
- parent_id: active_span.context.parent_id,
91
- span_id: active_span.context.span_id
92
- },
71
+ previous_receiver: current_span_attributes,
93
72
  current_receiver: freddy2.deliver_with_response(destination3, {})
94
73
  )
95
74
  end
96
75
 
97
76
  freddy3.respond_to(destination3) do |_payload, msg_handler|
98
- msg_handler.success(
99
- trace_id: active_span.context.trace_id,
100
- parent_id: active_span.context.parent_id,
101
- span_id: active_span.context.span_id
102
- )
77
+ msg_handler.success(current_span_attributes)
103
78
  end
104
79
  end
105
80
 
@@ -131,7 +106,45 @@ describe 'Tracing' do
131
106
  end
132
107
  end
133
108
 
134
- def active_span
135
- OpenTracing.active_span
109
+ context 'when receiving a broadcast' do
110
+ let(:freddy) { Freddy.build(logger, config) }
111
+ let(:destination) { random_destination }
112
+
113
+ before do
114
+ freddy.tap_into(destination) do
115
+ @deliver_span = current_span_attributes
116
+ end
117
+ end
118
+
119
+ after do
120
+ freddy.close
121
+ end
122
+
123
+ it 'creates a new trace and links it with the sender' do
124
+ initiator_span = nil
125
+ Freddy.tracer.in_span('test') do
126
+ initiator_span = current_span_attributes
127
+ freddy.deliver(destination, {})
128
+ end
129
+ wait_for { @deliver_span }
130
+
131
+ expect(@deliver_span.fetch(:trace_id)).not_to eq(initiator_span.fetch(:trace_id))
132
+
133
+ link = @deliver_span.fetch(:links)[0]
134
+ expect(link.span_context.trace_id).to eq(initiator_span.fetch(:trace_id))
135
+ end
136
+ end
137
+
138
+ def current_span_attributes
139
+ {
140
+ trace_id: current_span.context.trace_id,
141
+ parent_id: current_span.parent_span_id,
142
+ span_id: current_span.context.span_id,
143
+ links: current_span.links || []
144
+ }
145
+ end
146
+
147
+ def current_span
148
+ OpenTelemetry::Trace.current_span
136
149
  end
137
150
  end
data/spec/spec_helper.rb CHANGED
@@ -2,14 +2,9 @@ require 'rubygems'
2
2
  require 'bundler'
3
3
  Bundler.setup
4
4
 
5
- require 'codeclimate-test-reporter'
6
- SimpleCov.start do
7
- formatter SimpleCov::Formatter::MultiFormatter.new([
8
- SimpleCov::Formatter::HTMLFormatter,
9
- CodeClimate::TestReporter::Formatter
10
- ])
11
- add_filter '/spec/'
12
- end
5
+ ENV['OTEL_TRACES_EXPORTER'] = 'none'
6
+ require 'opentelemetry/sdk'
7
+ OpenTelemetry::SDK.configure
13
8
 
14
9
  require 'pry'
15
10
  require 'freddy'
@@ -22,10 +17,6 @@ RSpec.configure do |config|
22
17
  config.run_all_when_everything_filtered = true
23
18
  config.filter_run :focus
24
19
  config.order = 'random'
25
-
26
- config.before do
27
- OpenTracing.global_tracer ||= OpenTracing::Tracer.new
28
- end
29
20
  end
30
21
 
31
22
  def random_destination
@@ -43,6 +34,7 @@ end
43
34
  def wait_for
44
35
  100.times do
45
36
  return if yield
37
+
46
38
  sleep 0.005
47
39
  end
48
40
  end
@@ -53,7 +45,7 @@ def deliver(custom_destination = destination)
53
45
  end
54
46
 
55
47
  def logger
56
- Logger.new(STDOUT).tap { |l| l.level = Logger::ERROR }
48
+ Logger.new($stdout).tap { |l| l.level = Logger::ERROR }
57
49
  end
58
50
 
59
51
  def config
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: freddy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Glia TechMovers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-20 00:00:00.000000000 Z
11
+ date: 2021-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -67,19 +67,33 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.6'
69
69
  - !ruby/object:Gem::Dependency
70
- name: opentracing
70
+ name: opentelemetry-api
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.4'
75
+ version: 1.0.0.rc3
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.4'
82
+ version: 1.0.0.rc3
83
+ - !ruby/object:Gem::Dependency
84
+ name: opentelemetry-semantic_conventions
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: thread
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: zlib
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.1'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.1'
97
125
  description: Messaging API
98
126
  email:
99
127
  - techmovers@salemove.com
@@ -101,13 +129,12 @@ executables: []
101
129
  extensions: []
102
130
  extra_rdoc_files: []
103
131
  files:
132
+ - ".github/workflows/ci.yml"
104
133
  - ".gitignore"
105
- - ".npmignore"
106
134
  - ".rspec"
107
135
  - ".rubocop.yml"
108
136
  - ".ruby-gemset"
109
137
  - ".ruby-version"
110
- - ".travis.yml"
111
138
  - Gemfile
112
139
  - LICENCE.txt
113
140
  - README.md
@@ -116,12 +143,12 @@ files:
116
143
  - lib/freddy.rb
117
144
  - lib/freddy/adapters.rb
118
145
  - lib/freddy/adapters/bunny_adapter.rb
119
- - lib/freddy/adapters/march_hare_adapter.rb
120
146
  - lib/freddy/consumers.rb
121
147
  - lib/freddy/consumers/respond_to_consumer.rb
122
148
  - lib/freddy/consumers/response_consumer.rb
123
149
  - lib/freddy/consumers/tap_into_consumer.rb
124
150
  - lib/freddy/delivery.rb
151
+ - lib/freddy/encoding.rb
125
152
  - lib/freddy/error_response.rb
126
153
  - lib/freddy/invalid_request_error.rb
127
154
  - lib/freddy/message_handler.rb
@@ -135,7 +162,9 @@ files:
135
162
  - lib/freddy/responder_handler.rb
136
163
  - lib/freddy/sync_response_container.rb
137
164
  - lib/freddy/timeout_error.rb
138
- - lib/freddy/trace_carrier.rb
165
+ - lib/freddy/tracing.rb
166
+ - lib/freddy/version.rb
167
+ - spec/.rubocop.yml
139
168
  - spec/freddy/consumers/respond_to_consumer_spec.rb
140
169
  - spec/freddy/error_response_spec.rb
141
170
  - spec/freddy/freddy_spec.rb
@@ -143,15 +172,14 @@ files:
143
172
  - spec/freddy/payload_spec.rb
144
173
  - spec/freddy/responder_handler_spec.rb
145
174
  - spec/freddy/sync_response_container_spec.rb
146
- - spec/freddy/trace_carrier_spec.rb
147
175
  - spec/integration/concurrency_spec.rb
148
176
  - spec/integration/reply_spec.rb
149
177
  - spec/integration/tap_into_with_group_spec.rb
150
178
  - spec/integration/tracing_spec.rb
151
179
  - spec/spec_helper.rb
152
- homepage:
180
+ homepage: https://github.com/salemove/freddy
153
181
  licenses:
154
- - Private
182
+ - MIT
155
183
  metadata: {}
156
184
  post_install_message:
157
185
  rdoc_options: []
@@ -161,18 +189,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
189
  requirements:
162
190
  - - ">="
163
191
  - !ruby/object:Gem::Version
164
- version: '0'
192
+ version: '2.6'
165
193
  required_rubygems_version: !ruby/object:Gem::Requirement
166
194
  requirements:
167
195
  - - ">="
168
196
  - !ruby/object:Gem::Version
169
197
  version: '0'
170
198
  requirements: []
171
- rubygems_version: 3.0.6
199
+ rubygems_version: 3.0.9
172
200
  signing_key:
173
201
  specification_version: 4
174
202
  summary: API for inter-application messaging supporting acknowledgements and request-response
175
203
  test_files:
204
+ - spec/.rubocop.yml
176
205
  - spec/freddy/consumers/respond_to_consumer_spec.rb
177
206
  - spec/freddy/error_response_spec.rb
178
207
  - spec/freddy/freddy_spec.rb
@@ -180,7 +209,6 @@ test_files:
180
209
  - spec/freddy/payload_spec.rb
181
210
  - spec/freddy/responder_handler_spec.rb
182
211
  - spec/freddy/sync_response_container_spec.rb
183
- - spec/freddy/trace_carrier_spec.rb
184
212
  - spec/integration/concurrency_spec.rb
185
213
  - spec/integration/reply_spec.rb
186
214
  - spec/integration/tap_into_with_group_spec.rb