hoodoo 1.19.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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