hoodoo 1.19.0 → 2.0.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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hoodoo/active/active_model/uuid_validator.rb +0 -1
  3. data/lib/hoodoo/active/active_record/dated.rb +2 -2
  4. data/lib/hoodoo/active/active_record/support.rb +2 -1
  5. data/lib/hoodoo/active/active_record/uuid.rb +2 -2
  6. data/lib/hoodoo/active/active_record/writer.rb +1 -1
  7. data/lib/hoodoo/generator.rb +52 -12
  8. data/lib/hoodoo/monkey/patch/datadog_traced_amqp.rb +11 -6
  9. data/lib/hoodoo/monkey/patch/newrelic_middleware_analytics.rb +17 -10
  10. data/lib/hoodoo/monkey/patch/newrelic_traced_amqp.rb +71 -33
  11. data/lib/hoodoo/services/discovery/discoverers/by_drb/by_drb.rb +13 -8
  12. data/lib/hoodoo/services/middleware/exception_reporting/reporters/airbrake_reporter.rb +8 -3
  13. data/lib/hoodoo/services/middleware/interaction.rb +1 -1
  14. data/lib/hoodoo/services/middleware/middleware.rb +52 -41
  15. data/lib/hoodoo/version.rb +2 -2
  16. data/spec/active/active_record/creator_spec.rb +1 -1
  17. data/spec/active/active_record/dated_spec.rb +7 -7
  18. data/spec/active/active_record/finder_spec.rb +953 -839
  19. data/spec/active/active_record/manually_dated_spec.rb +1 -1
  20. data/spec/active/active_record/search_helper_spec.rb +1 -1
  21. data/spec/active/active_record/secure_spec.rb +2 -2
  22. data/spec/active/active_record/support_spec.rb +3 -3
  23. data/spec/monkey/patch/datadog_traced_amqp_spec.rb +10 -2
  24. data/spec/monkey/patch/newrelic_traced_amqp_spec.rb +54 -21
  25. data/spec/new_relic/agent/logger.rb +24 -0
  26. data/spec/new_relic/agent/transaction.rb +32 -0
  27. data/spec/services/discovery/discoverers/by_drb/by_drb_spec.rb +48 -2
  28. data/spec/services/middleware/exception_reporting/reporters/airbrake_reporter_spec.rb +4 -4
  29. data/spec/services/middleware/middleware_multi_local_spec.rb +41 -13
  30. data/spec/services/middleware/middleware_multi_remote_spec.rb +93 -67
  31. data/spec/services/middleware/middleware_spec.rb +80 -7
  32. data/spec/services/services/interface_spec.rb +2 -2
  33. data/spec/transient_store/transient_store/mocks/redis_spec.rb +8 -6
  34. metadata +30 -26
@@ -98,7 +98,7 @@ describe Hoodoo::Services::Middleware do
98
98
  end
99
99
  end
100
100
 
101
- Hoodoo::Services::Middleware.new( NewRelic::Agent::Instrumentation::MiddlewareProxy.new )
101
+ Hoodoo::Services::Middleware.new( ::NewRelic::Agent::Instrumentation::MiddlewareProxy.new )
102
102
  }.to raise_error(RuntimeError, "Hoodoo::Services::Middleware instance created with NewRelic-wrapped Service entity, but NewRelic API is not as expected by Hoodoo; incompatible NewRelic version.")
103
103
 
104
104
  Object.send( :remove_const, :NewRelic )
@@ -118,7 +118,7 @@ describe Hoodoo::Services::Middleware do
118
118
  end
119
119
  end
120
120
 
121
- Hoodoo::Services::Middleware.new( NewRelic::Agent::Instrumentation::MiddlewareProxy.new )
121
+ Hoodoo::Services::Middleware.new( ::NewRelic::Agent::Instrumentation::MiddlewareProxy.new )
122
122
  }.to raise_error(RuntimeError, "Hoodoo::Services::Middleware instance created with non-Service entity of class 'Hash' - is this the last middleware in the chain via 'use()' and is Rack 'run()'-ing the correct thing?")
123
123
 
124
124
  Object.send( :remove_const, :NewRelic )
@@ -148,7 +148,7 @@ describe Hoodoo::Services::Middleware do
148
148
  end
149
149
  end
150
150
 
151
- Hoodoo::Services::Middleware.new( NewRelic::Agent::Instrumentation::MiddlewareProxy.new )
151
+ Hoodoo::Services::Middleware.new( ::NewRelic::Agent::Instrumentation::MiddlewareProxy.new )
152
152
  }.to raise_error(RuntimeError, "Hoodoo::Services::Middleware encountered invalid interface class RSpecTestServiceStubBadInterface via service class RSpecTestServiceStubBad")
153
153
 
154
154
  Object.send( :remove_const, :NewRelic )
@@ -267,6 +267,37 @@ describe Hoodoo::Services::Middleware do
267
267
  end
268
268
  end
269
269
 
270
+ it 'rejects attempts to send body data for HTTP methods that should not have any' do
271
+
272
+ # I can't find a way to persuade Rack to send body data instead of query
273
+ # parameters for GET (it's trying to Do The Right Thing) so instead I'm
274
+ # forced to write expectations that assume the implementation in the
275
+ # middleware.
276
+ #
277
+ allow_any_instance_of( Rack::Request ).to receive( :body ).and_return( StringIO.new( "hello world" ) )
278
+ get '/v2/rspec_test_service_stub', nil, { 'CONTENT_TYPE' => 'application/json; charset=utf-8' }
279
+
280
+ expect(last_response.status).to eq(422)
281
+
282
+ result = JSON.parse(last_response.body)
283
+ expect(result['errors'][0]['code']).to eq('platform.malformed')
284
+ expect(result['errors'][0]['message']).to eq('Unexpected body data for this action')
285
+ end
286
+
287
+ it 'rejects oversized payloads' do
288
+ stub_const('Hoodoo::Services::Middleware::MAXIMUM_PAYLOAD_SIZE', 10)
289
+
290
+ post '/v2/rspec_test_service_stub',
291
+ JSON.fast_generate( { 'key' => 'this is definitely larger than 10 characters as JSON' } ),
292
+ { 'CONTENT_TYPE' => 'application/json; charset=utf-8' }
293
+
294
+ expect(last_response.status).to eq(422)
295
+
296
+ result = JSON.parse(last_response.body)
297
+ expect(result['errors'][0]['code']).to eq('platform.malformed')
298
+ expect(result['errors'][0]['message']).to eq('Body data exceeds configured maximum size for platform')
299
+ end
300
+
270
301
  it 'should generate interaction IDs and other standard headers even for error states' do
271
302
  get '/v2/rspec_test_service_stub'
272
303
 
@@ -853,7 +884,7 @@ describe Hoodoo::Services::Middleware do
853
884
  expect(result['errors'][0]['reference']).to eq('search: thing\\, thang')
854
885
  end
855
886
 
856
- it 'should respond to permitted framework search query parameter' do
887
+ it 'should respond to permitted framework search query parameter "created_after"' do
857
888
  dt = DateTime.parse( Time.now.round.iso8601 )
858
889
  str = dt.iso8601
859
890
  encstr = CGI.escape( CGI.escape( str ) ) # Remember, search values within the subquery string must be double escaped
@@ -866,7 +897,7 @@ describe Hoodoo::Services::Middleware do
866
897
  expect(last_response.status).to eq(200)
867
898
  end
868
899
 
869
- it 'should reject malformed value in permitted framework search query parameter' do
900
+ it 'should reject malformed value in permitted framework search query parameter "created_after"' do
870
901
  expect_any_instance_of(RSpecTestServiceStubImplementation).to_not receive(:list)
871
902
  get "/v2/rspec_test_service_stub?search=created_after%3Dthing", nil, { 'CONTENT_TYPE' => 'application/json; charset=utf-8' }
872
903
  expect(last_response.status).to eq(422)
@@ -876,6 +907,27 @@ describe Hoodoo::Services::Middleware do
876
907
  expect(result['errors'][0]['reference']).to eq('search: created_after')
877
908
  end
878
909
 
910
+ it 'should respond to permitted framework search query parameter "created_by"' do
911
+ encstr = Hoodoo::UUID.generate()
912
+
913
+ expect_any_instance_of(RSpecTestServiceStubImplementation).to receive(:list).once do | ignored_rspec_mock_instance, context |
914
+ expect(context.request.list.search_data).to eq({'created_by' => encstr})
915
+ end
916
+
917
+ get "/v2/rspec_test_service_stub?search=created_by%3D#{ encstr }", nil, { 'CONTENT_TYPE' => 'application/json; charset=utf-8' }
918
+ expect(last_response.status).to eq(200)
919
+ end
920
+
921
+ it 'should reject malformed value in permitted framework search query parameter "created_by"' do
922
+ expect_any_instance_of(RSpecTestServiceStubImplementation).to_not receive(:list)
923
+ get "/v2/rspec_test_service_stub?search=created_by%3Dnotauuid", nil, { 'CONTENT_TYPE' => 'application/json; charset=utf-8' }
924
+ expect(last_response.status).to eq(422)
925
+ result = JSON.parse(last_response.body)
926
+ expect(result['errors'][0]['code']).to eq('platform.malformed')
927
+ expect(result['errors'][0]['message']).to eq('One or more malformed or invalid query string parameters')
928
+ expect(result['errors'][0]['reference']).to eq('search: created_by')
929
+ end
930
+
879
931
  it 'should reject prohibited framework search query parameter' do
880
932
  str = Time.now.iso8601
881
933
  encstr = CGI.escape( CGI.escape( str ) ) # Remember, search values within the subquery string must be double escaped
@@ -946,7 +998,7 @@ describe Hoodoo::Services::Middleware do
946
998
  expect(result['errors'][0]['reference']).to eq('filter: thung\\, theng')
947
999
  end
948
1000
 
949
- it 'should respond to permitted framework filter query parameter' do
1001
+ it 'should respond to permitted framework filter query parameter "created_before"' do
950
1002
  dt = DateTime.parse( Time.now.round.iso8601 )
951
1003
  str = dt.iso8601
952
1004
  encstr = CGI.escape( CGI.escape( str ) ) # Remember, search values within the subquery string must be double escaped
@@ -959,7 +1011,7 @@ describe Hoodoo::Services::Middleware do
959
1011
  expect(last_response.status).to eq(200)
960
1012
  end
961
1013
 
962
- it 'should reject malformed value in permitted framework filter query parameter' do
1014
+ it 'should reject malformed value in permitted framework filter query parameter "created_before' do
963
1015
  expect_any_instance_of(RSpecTestServiceStubImplementation).to_not receive(:list)
964
1016
  get "/v2/rspec_test_service_stub?filter=created_before%3Dthing", nil, { 'CONTENT_TYPE' => 'application/json; charset=utf-8' }
965
1017
  expect(last_response.status).to eq(422)
@@ -969,6 +1021,27 @@ describe Hoodoo::Services::Middleware do
969
1021
  expect(result['errors'][0]['reference']).to eq('filter: created_before')
970
1022
  end
971
1023
 
1024
+ it 'should respond to permitted framework filter query parameter "created_by"' do
1025
+ encstr = Hoodoo::UUID.generate()
1026
+
1027
+ expect_any_instance_of(RSpecTestServiceStubImplementation).to receive(:list).once do | ignored_rspec_mock_instance, context |
1028
+ expect(context.request.list.filter_data).to eq({'created_by' => encstr})
1029
+ end
1030
+
1031
+ get "/v2/rspec_test_service_stub?filter=created_by%3D#{ encstr }", nil, { 'CONTENT_TYPE' => 'application/json; charset=utf-8' }
1032
+ expect(last_response.status).to eq(200)
1033
+ end
1034
+
1035
+ it 'should reject malformed value in permitted framework filter query parameter "created_by' do
1036
+ expect_any_instance_of(RSpecTestServiceStubImplementation).to_not receive(:list)
1037
+ get "/v2/rspec_test_service_stub?filter=created_by%3Dnotauuid", nil, { 'CONTENT_TYPE' => 'application/json; charset=utf-8' }
1038
+ expect(last_response.status).to eq(422)
1039
+ result = JSON.parse(last_response.body)
1040
+ expect(result['errors'][0]['code']).to eq('platform.malformed')
1041
+ expect(result['errors'][0]['message']).to eq('One or more malformed or invalid query string parameters')
1042
+ expect(result['errors'][0]['reference']).to eq('filter: created_by')
1043
+ end
1044
+
972
1045
  it 'should reject prohibited framework filter query parameter' do
973
1046
  str = Time.now.iso8601
974
1047
  encstr = CGI.escape( CGI.escape( str ) ) # Remember, search values within the subquery string must be double escaped
@@ -19,7 +19,7 @@ class RSpecTestInterfaceInterfaceA < Hoodoo::Services::Interface
19
19
  search :search_one, :search_two, :search_three
20
20
  filter :filter_one, :filter_two, :filter_three
21
21
  do_not_search :created_after, :created_before
22
- do_not_filter :created_after
22
+ do_not_filter :created_after, :created_by
23
23
  end
24
24
 
25
25
  to_create do
@@ -99,7 +99,7 @@ describe Hoodoo::Services::Interface do
99
99
  expect(RSpecTestInterfaceInterfaceA.to_list.search).to eq(['search_one', 'search_two', 'search_three'])
100
100
  expect(RSpecTestInterfaceInterfaceA.to_list.filter).to eq(['filter_one', 'filter_two', 'filter_three'])
101
101
  expect(RSpecTestInterfaceInterfaceA.to_list.do_not_search).to eq(['created_after', 'created_before'])
102
- expect(RSpecTestInterfaceInterfaceA.to_list.do_not_filter).to eq(['created_after'])
102
+ expect(RSpecTestInterfaceInterfaceA.to_list.do_not_filter).to eq(['created_after', 'created_by'])
103
103
  expect(RSpecTestInterfaceInterfaceA.to_create).to_not be_nil
104
104
  expect(RSpecTestInterfaceInterfaceA.to_create.get_schema().properties['foo']).to be_a(Hoodoo::Presenters::Text)
105
105
  expect(RSpecTestInterfaceInterfaceA.to_create.get_schema().properties['bar']).to be_a(Hoodoo::Presenters::Enum)
@@ -25,7 +25,7 @@ describe Hoodoo::TransientStore::Mocks::Redis do
25
25
  end
26
26
  end
27
27
 
28
- context 'mimic approcimated old behaviour of its Memcached counterpart by' do
28
+ context 'approximate old behaviour by' do
29
29
  it 'using the mock client in test mode if there is an empty host' do
30
30
  expect_any_instance_of( Hoodoo::TransientStore::Mocks::Redis ).to receive( :initialize ).once.and_call_original()
31
31
 
@@ -47,17 +47,19 @@ describe Hoodoo::TransientStore::Mocks::Redis do
47
47
  it 'using a real client in test mode if there is a defined host' do
48
48
  expect_any_instance_of( ::Redis ).to receive( :initialize ).once.and_call_original()
49
49
 
50
- # Silence 'Errno::ECONNREFUSED' warnings if Memcached is not actually
51
- # running at the given URI. That's fine; it's the initializer test
52
- # above which is important.
50
+ # If Redis is missing, Hoodoo raises an exception. Allow that in case no
51
+ # real Redis server is present, but don't allow other exceptions.
53
52
  #
54
- spec_helper_silence_stream( $stdout ) do
55
- spec_helper_silence_stream( $stderr ) do
53
+ begin
54
+ spec_helper_silence_stream( $stdout ) do
56
55
  Hoodoo::TransientStore::Redis.new(
57
56
  storage_host_uri: 'redis://localhost:6379',
58
57
  namespace: 'test_namespace_'
59
58
  )
60
59
  end
60
+ rescue => e
61
+ expect( e ).to be_a( RuntimeError )
62
+ expect( e.message ).to include( "Hoodoo::TransientStore::Redis: Cannot connect to Redis at 'redis://localhost:6379': " )
61
63
  end
62
64
  end
63
65
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hoodoo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.19.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Loyalty New Zealand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-17 00:00:00.000000000 Z
11
+ date: 2017-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dalli
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.2'
33
+ version: '3.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.2'
40
+ version: '3.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '10.4'
47
+ version: '12.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '10.4'
54
+ version: '12.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: simplecov-rcov
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '4.2'
75
+ version: '4.3'
76
76
  type: :development
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: '4.2'
82
+ version: '4.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rack-test
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -100,56 +100,56 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3.3'
103
+ version: '3.5'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3.3'
110
+ version: '3.5'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rspec-mocks
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '3.3'
117
+ version: '3.5'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '3.3'
124
+ version: '3.5'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: activerecord
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '4.2'
131
+ version: '5.1'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '4.2'
138
+ version: '5.1'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: activesupport
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '4.2'
145
+ version: '5.1'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '4.2'
152
+ version: '5.1'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: database_cleaner
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -170,28 +170,28 @@ dependencies:
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: '0.18'
173
+ version: '0.21'
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: '0.18'
180
+ version: '0.21'
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: byebug
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: '3.5'
187
+ version: '9.0'
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: '3.5'
194
+ version: '9.0'
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: timecop
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -226,28 +226,28 @@ dependencies:
226
226
  requirements:
227
227
  - - "~>"
228
228
  - !ruby/object:Gem::Version
229
- version: '4.3'
229
+ version: '6.2'
230
230
  type: :development
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - "~>"
235
235
  - !ruby/object:Gem::Version
236
- version: '4.3'
236
+ version: '6.2'
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: le
239
239
  requirement: !ruby/object:Gem::Requirement
240
240
  requirements:
241
241
  - - "~>"
242
242
  - !ruby/object:Gem::Version
243
- version: '2.6'
243
+ version: '2.7'
244
244
  type: :development
245
245
  prerelease: false
246
246
  version_requirements: !ruby/object:Gem::Requirement
247
247
  requirements:
248
248
  - - "~>"
249
249
  - !ruby/object:Gem::Version
250
- version: '2.6'
250
+ version: '2.7'
251
251
  description: Simplify the implementation of consistent services within an API-based
252
252
  software platform.
253
253
  email:
@@ -433,7 +433,9 @@ files:
433
433
  - spec/monkey/patch/datadog_traced_amqp_spec.rb
434
434
  - spec/monkey/patch/newrelic_middleware_analytics_spec.rb
435
435
  - spec/monkey/patch/newrelic_traced_amqp_spec.rb
436
+ - spec/new_relic/agent/logger.rb
436
437
  - spec/new_relic/agent/method_tracer.rb
438
+ - spec/new_relic/agent/transaction.rb
437
439
  - spec/newrelic_rpm.rb
438
440
  - spec/presenters/base_dsl_spec.rb
439
441
  - spec/presenters/base_spec.rb
@@ -514,7 +516,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
514
516
  requirements:
515
517
  - - ">="
516
518
  - !ruby/object:Gem::Version
517
- version: '2.1'
519
+ version: 2.2.7
518
520
  required_rubygems_version: !ruby/object:Gem::Requirement
519
521
  requirements:
520
522
  - - ">="
@@ -522,7 +524,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
522
524
  version: '0'
523
525
  requirements: []
524
526
  rubyforge_project:
525
- rubygems_version: 2.4.5
527
+ rubygems_version: 2.6.14
526
528
  signing_key:
527
529
  specification_version: 4
528
530
  summary: Opinionated APIs
@@ -578,7 +580,9 @@ test_files:
578
580
  - spec/monkey/patch/datadog_traced_amqp_spec.rb
579
581
  - spec/monkey/patch/newrelic_middleware_analytics_spec.rb
580
582
  - spec/monkey/patch/newrelic_traced_amqp_spec.rb
583
+ - spec/new_relic/agent/logger.rb
581
584
  - spec/new_relic/agent/method_tracer.rb
585
+ - spec/new_relic/agent/transaction.rb
582
586
  - spec/newrelic_rpm.rb
583
587
  - spec/presenters/base_dsl_spec.rb
584
588
  - spec/presenters/base_spec.rb