freddy 1.7.0 → 2.2.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.
@@ -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