paul_bunyan 1.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.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/.travis.yml +9 -0
- data/Dockerfile +13 -0
- data/Gemfile +6 -0
- data/Guardfile +16 -0
- data/LICENSE.txt +22 -0
- data/README.md +51 -0
- data/README.rdoc +3 -0
- data/Rakefile +19 -0
- data/bin/logging_demo +17 -0
- data/build.sh +7 -0
- data/docker-compose.yml +4 -0
- data/lib/paul_bunyan.rb +70 -0
- data/lib/paul_bunyan/json_formatter.rb +122 -0
- data/lib/paul_bunyan/level.rb +28 -0
- data/lib/paul_bunyan/log_relayer.rb +148 -0
- data/lib/paul_bunyan/rails_ext.rb +7 -0
- data/lib/paul_bunyan/rails_ext/instrumentation.rb +41 -0
- data/lib/paul_bunyan/rails_ext/rack_logger.rb +24 -0
- data/lib/paul_bunyan/railtie.rb +75 -0
- data/lib/paul_bunyan/railtie/log_subscriber.rb +182 -0
- data/lib/paul_bunyan/text_formatter.rb +11 -0
- data/lib/paul_bunyan/version.rb +3 -0
- data/lib/tasks/paul_bunyan_tasks.rake +4 -0
- data/paul_bunyan.gemspec +30 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +28 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/secret_token.rb +1 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/gemfiles/40.gemfile +5 -0
- data/spec/gemfiles/40.gemfile.lock +137 -0
- data/spec/gemfiles/41.gemfile +5 -0
- data/spec/gemfiles/41.gemfile.lock +142 -0
- data/spec/gemfiles/42.gemfile +5 -0
- data/spec/gemfiles/42.gemfile.lock +167 -0
- data/spec/lib/paul_bunyan/json_formatter_spec.rb +237 -0
- data/spec/lib/paul_bunyan/level_spec.rb +78 -0
- data/spec/lib/paul_bunyan/log_relayer_spec.rb +333 -0
- data/spec/lib/paul_bunyan/rails_ext/instrumentation_spec.rb +81 -0
- data/spec/lib/paul_bunyan/railtie/log_subscriber_spec.rb +304 -0
- data/spec/lib/paul_bunyan/railtie_spec.rb +37 -0
- data/spec/lib/paul_bunyan_spec.rb +137 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/support/notification_helpers.rb +22 -0
- metadata +303 -0
@@ -0,0 +1,304 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module PaulBunyan
|
4
|
+
RSpec.describe LogSubscriber do
|
5
|
+
let(:aggregator) { subject.send(:aggregator) }
|
6
|
+
|
7
|
+
def preserving_event_lists
|
8
|
+
original_events = LogSubscriber.action_controller_events.dup
|
9
|
+
LogSubscriber.action_controller_events.clear
|
10
|
+
yield
|
11
|
+
ensure
|
12
|
+
LogSubscriber.instance_variable_set(:@action_controller_events, original_events)
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
RequestStore.clear!
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.action_controller_event(event_name)' do
|
20
|
+
around(:each) do |example|
|
21
|
+
preserving_event_lists do
|
22
|
+
example.run
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'must store the event name' do
|
27
|
+
LogSubscriber.action_controller_event :foo
|
28
|
+
expect(LogSubscriber.action_controller_events).to include :foo
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'must only add one copy of each event name' do
|
32
|
+
LogSubscriber.action_controller_event :foo
|
33
|
+
LogSubscriber.action_controller_event :foo
|
34
|
+
LogSubscriber.action_controller_event :bar
|
35
|
+
LogSubscriber.action_controller_event :bar
|
36
|
+
expect(LogSubscriber.action_controller_events).to contain_exactly :foo, :bar
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '.event_patterns' do
|
41
|
+
it 'must return a set including all action_controller events in that namespace', aggregate_failures: true do
|
42
|
+
LogSubscriber.action_controller_events.each do |event|
|
43
|
+
expect(LogSubscriber.event_patterns).to include "#{event}.action_controller"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '.subscribe_to_events' do
|
49
|
+
around(:each) do |example|
|
50
|
+
preserving_event_lists do
|
51
|
+
example.run
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'must add a subscripton for all action_controller events' do
|
56
|
+
LogSubscriber.action_controller_event :nx_event
|
57
|
+
LogSubscriber.subscribe_to_events
|
58
|
+
expect(subscriber_classes_for('nx_event.action_controller')).
|
59
|
+
to include LogSubscriber
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#process_action(event)' do
|
64
|
+
let(:event) {
|
65
|
+
ActiveSupport::Notifications::Event.new(
|
66
|
+
'process_action.action_controller',
|
67
|
+
Time.now,
|
68
|
+
Time.at(Time.now.to_f - 0.240),
|
69
|
+
SecureRandom.hex(5),
|
70
|
+
{
|
71
|
+
:controller=>"FoosController",
|
72
|
+
:action => "show",
|
73
|
+
:params => {"controller"=>"foos", "action"=>"show", "id" => "42", "foo" => "bar"},
|
74
|
+
:format => :html,
|
75
|
+
:method => "GET",
|
76
|
+
:path => "/foos/42",
|
77
|
+
:request_id => "dfa6f7b5-8400-4572-a2f7-80504ed9d09a",
|
78
|
+
:ip => '127.0.0.1',
|
79
|
+
:status => 200,
|
80
|
+
:view_runtime => 220.038,
|
81
|
+
:db_runtime => 10.177,
|
82
|
+
}.with_indifferent_access
|
83
|
+
)
|
84
|
+
}
|
85
|
+
|
86
|
+
before do
|
87
|
+
allow(::PaulBunyan.logger).to receive(:info)
|
88
|
+
subject.process_action(event)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'it must log the contents of the aggregator to the specified logger at the info level' do
|
92
|
+
expect(::PaulBunyan.logger).to have_received(:info)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'must set the method on the aggregator' do
|
96
|
+
expect(aggregator.method).to eq 'GET'
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'must set the controller on the aggregator' do
|
100
|
+
expect(aggregator.controller).to eq 'FoosController'
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'must set the action on the aggregator' do
|
104
|
+
expect(aggregator.action).to eq 'show'
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'must set the format on the aggregator' do
|
108
|
+
expect(aggregator.format).to eq :html
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'must set the path on the aggregator' do
|
112
|
+
expect(aggregator.path).to eq '/foos/42'
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'must set the request_id on the aggregator' do
|
116
|
+
expect(aggregator.request_id).to eq "dfa6f7b5-8400-4572-a2f7-80504ed9d09a"
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'must set the ip address on the aggregator' do
|
120
|
+
expect(aggregator.ip).to eq '127.0.0.1'
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'must set the status on the aggregator' do
|
124
|
+
expect(aggregator.status).to eq 200
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'must set the view_runtime value on the aggregator' do
|
128
|
+
expect(aggregator.view_runtime).to eq 220.038
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'must set the db_runtime value on the aggregator' do
|
132
|
+
expect(aggregator.db_runtime).to eq 10.177
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'extracting the params' do
|
136
|
+
it 'must not include the ActionController internal params from the hash' do
|
137
|
+
expect(aggregator.params).to_not include ActionController::LogSubscriber::INTERNAL_PARAMS
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'must include params passed to the controller action' do
|
141
|
+
expect(aggregator.params).to include "id" => "42", "foo" => "bar"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe '#halted_callback(event)' do
|
147
|
+
let(:event) {
|
148
|
+
ActiveSupport::Notifications::Event.new(
|
149
|
+
'halted_callback.action_controller',
|
150
|
+
Time.now,
|
151
|
+
Time.at(Time.now.to_f - 0.240),
|
152
|
+
SecureRandom.hex(5),
|
153
|
+
{filter: described_class}.with_indifferent_access
|
154
|
+
)
|
155
|
+
}
|
156
|
+
|
157
|
+
before do
|
158
|
+
subject.halted_callback(event)
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'must set the halting_filter field on the request aggregator' do
|
162
|
+
expect(aggregator.halting_filter).to eq 'PaulBunyan::LogSubscriber'
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe '#send_file(event)' do
|
167
|
+
let(:event) {
|
168
|
+
ActiveSupport::Notifications::Event.new(
|
169
|
+
'send_file.action_controller',
|
170
|
+
Time.at(Time.now.to_f - 0.240),
|
171
|
+
Time.now,
|
172
|
+
SecureRandom.hex(5),
|
173
|
+
{path: '/path/to/a/file'}.with_indifferent_access
|
174
|
+
)
|
175
|
+
}
|
176
|
+
let(:file_data) { aggregator.sent_file }
|
177
|
+
|
178
|
+
before do
|
179
|
+
subject.send_file(event)
|
180
|
+
end
|
181
|
+
|
182
|
+
it "must set the path field on the request aggregator's sent_file object" do
|
183
|
+
expect(file_data.path).to eq '/path/to/a/file'
|
184
|
+
end
|
185
|
+
|
186
|
+
it "must set the transfer_time on the request aggregator's sent_file object" do
|
187
|
+
expect(file_data.transfer_time).to be_within(1).of(240)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#redirect_to(event)' do
|
192
|
+
let(:event) {
|
193
|
+
ActiveSupport::Notifications::Event.new(
|
194
|
+
'redirect_to.action_controller',
|
195
|
+
Time.now,
|
196
|
+
Time.at(Time.now.to_f - 0.240),
|
197
|
+
SecureRandom.hex(5),
|
198
|
+
{location: 'https://example.com/another/resource'}.with_indifferent_access
|
199
|
+
)
|
200
|
+
}
|
201
|
+
|
202
|
+
before do
|
203
|
+
subject.redirect_to(event)
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'must set the redirect_location field on the request aggregator' do
|
207
|
+
expect(aggregator.redirect_location).to eq 'https://example.com/another/resource'
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe '#send_data(event)' do
|
212
|
+
let(:event) {
|
213
|
+
ActiveSupport::Notifications::Event.new(
|
214
|
+
'send_data.action_controller',
|
215
|
+
Time.at(Time.now.to_f - 0.240),
|
216
|
+
Time.now,
|
217
|
+
SecureRandom.hex(5),
|
218
|
+
{filename: '/path/to/a/file'}.with_indifferent_access
|
219
|
+
)
|
220
|
+
}
|
221
|
+
let(:file_data) { aggregator.sent_data }
|
222
|
+
|
223
|
+
before do
|
224
|
+
subject.send_data(event)
|
225
|
+
end
|
226
|
+
|
227
|
+
it "must set the path field on the request aggregator's sent_file object" do
|
228
|
+
expect(file_data.path).to eq '/path/to/a/file'
|
229
|
+
end
|
230
|
+
|
231
|
+
it "must set the transfer_time on the request aggregator's sent_file object" do
|
232
|
+
expect(file_data.transfer_time).to be_within(1).of(240)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
describe '#render_template(event)' do
|
237
|
+
let(:event) {
|
238
|
+
ActiveSupport::Notifications::Event.new(
|
239
|
+
'render_template.action_view',
|
240
|
+
Time.at(Time.now.to_f - 0.240),
|
241
|
+
Time.now,
|
242
|
+
SecureRandom.hex(5),
|
243
|
+
{
|
244
|
+
identifier: Rails.root.join('app', 'views', 'controller', 'index.html.erb'),
|
245
|
+
layout: Rails.root.join('app', 'views', 'application', 'application.html.erb'),
|
246
|
+
}.with_indifferent_access
|
247
|
+
)
|
248
|
+
}
|
249
|
+
let(:view_data) { aggregator.view }
|
250
|
+
|
251
|
+
before do
|
252
|
+
subject.render_template(event)
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'must set the view attribute on the aggregator' do
|
256
|
+
expect(aggregator.view).to_not be_nil
|
257
|
+
end
|
258
|
+
|
259
|
+
it 'must capture the rendered template path' do
|
260
|
+
expect(view_data.path.to_s).to end_with('controller/index.html.erb')
|
261
|
+
end
|
262
|
+
|
263
|
+
it 'must capture the render run time' do
|
264
|
+
expect(view_data.runtime).to be_within(1).of(240)
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'must capture the layout used' do
|
268
|
+
expect(view_data.layout.to_s).to end_with('application/application.html.erb')
|
269
|
+
end
|
270
|
+
|
271
|
+
it 'must remove the Rails root path from the rendered template path' do
|
272
|
+
expect(view_data.path.to_s).to_not start_with Rails.root.to_s
|
273
|
+
end
|
274
|
+
|
275
|
+
it 'must remove the default rails view path from the rendered template path' do
|
276
|
+
expect(view_data.path.to_s).to_not match /\A\/?app\/views\//
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
describe '#render_partial(event)' do
|
281
|
+
let(:event) {
|
282
|
+
ActiveSupport::Notifications::Event.new(
|
283
|
+
'render_partial.action_view',
|
284
|
+
Time.at(Time.now.to_f - 0.240),
|
285
|
+
Time.now,
|
286
|
+
SecureRandom.hex(5),
|
287
|
+
{
|
288
|
+
identifier: Rails.root.join('app', 'views', 'controller', '_form.html.erb'),
|
289
|
+
}.with_indifferent_access
|
290
|
+
)
|
291
|
+
}
|
292
|
+
let(:view_data) { aggregator.view }
|
293
|
+
|
294
|
+
before do
|
295
|
+
subject.render_partial(event)
|
296
|
+
end
|
297
|
+
|
298
|
+
it 'must add an object to the partials array on every call' do
|
299
|
+
subject.render_partial(event)
|
300
|
+
expect(aggregator.partials.size).to eq 2
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module PaulBunyan
|
4
|
+
RSpec.describe Railtie do
|
5
|
+
describe '#unsubscribe_default_log_subscribers' do
|
6
|
+
before do
|
7
|
+
@action_controller_subscriber = ActiveSupport::LogSubscriber.subscribers.find{|s|
|
8
|
+
s.class == ActionController::LogSubscriber
|
9
|
+
}
|
10
|
+
|
11
|
+
Railtie.instance.unsubscribe_default_log_subscribers
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
# replace any subscriptions we may have blown away so the next test
|
16
|
+
# can be assured of a clean slate
|
17
|
+
ActionController::LogSubscriber.attach_to(
|
18
|
+
:action_controller,
|
19
|
+
@action_controller_subscriber
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'must remove the ActionController::LogSubscriber subscription to process_action' do
|
24
|
+
expect(subscriber_classes_for('process_action.action_controller')).
|
25
|
+
to_not include ActionController::LogSubscriber
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'must leave the ActionController::LogSubscriber subscription to deep_munge.action_controller in place' do
|
29
|
+
# I don't expect that we'll ever care to unsubcribe the logger
|
30
|
+
# non-event so we'll use it as a check to ensure we don't
|
31
|
+
# clobber all of the listeners, only the ones we care about
|
32
|
+
expect(subscriber_classes_for('logger.action_controller')).
|
33
|
+
to include ActionController::LogSubscriber
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
initial_default_formatter_type = PaulBunyan.default_formatter_type
|
4
|
+
|
5
|
+
describe PaulBunyan do
|
6
|
+
shared_examples 'respecting the ::default_formatter_type' do
|
7
|
+
let(:logger) { double('logger') }
|
8
|
+
|
9
|
+
before do
|
10
|
+
allow(Logger).to receive(:new).and_return(logger)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'sets the default formatter to json, if set to :json' do
|
14
|
+
PaulBunyan.default_formatter_type = :json
|
15
|
+
expect(logger).to receive(:formatter=).with(instance_of(PaulBunyan::JSONFormatter))
|
16
|
+
default_formatter_type_call
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'sets the default formatter to text, if set to :text' do
|
20
|
+
PaulBunyan.default_formatter_type = :text
|
21
|
+
expect(logger).to receive(:formatter=).with(instance_of(PaulBunyan::TextFormatter))
|
22
|
+
default_formatter_type_call
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'does not modify the default formatter, if set to nil' do
|
26
|
+
PaulBunyan.default_formatter_type = nil
|
27
|
+
expect(logger).not_to receive(:formatter=)
|
28
|
+
default_formatter_type_call
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
before do
|
33
|
+
# reset the PaulBunyan module before each test
|
34
|
+
PaulBunyan.remove_instance_variable(:@logger) if PaulBunyan.instance_variable_defined?(:@logger)
|
35
|
+
PaulBunyan.default_formatter_type = initial_default_formatter_type
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'include' do
|
39
|
+
subject(:klass) { Class.new }
|
40
|
+
subject(:logging_klass) { Class.new { include PaulBunyan } }
|
41
|
+
|
42
|
+
it 'adds #logger to the host class' do
|
43
|
+
expect(klass.new).not_to respond_to(:logger)
|
44
|
+
expect(logging_klass.new).to respond_to(:logger)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '::logger' do
|
49
|
+
it 'instantiates a log relayer' do
|
50
|
+
expect(PaulBunyan.logger).to be_a(PaulBunyan::LogRelayer)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'maintains a single instance' do
|
54
|
+
logger = PaulBunyan.logger
|
55
|
+
expect(PaulBunyan.logger).to be(logger)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'adds a default STDOUT logger' do
|
59
|
+
expect(STDOUT).to receive(:write)
|
60
|
+
PaulBunyan.logger << 'msg'
|
61
|
+
end
|
62
|
+
|
63
|
+
def default_formatter_type_call
|
64
|
+
PaulBunyan.logger
|
65
|
+
end
|
66
|
+
|
67
|
+
it_behaves_like 'respecting the ::default_formatter_type'
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '::create_logger' do
|
71
|
+
let(:device) { double('device') }
|
72
|
+
let(:logger) { double('logger') }
|
73
|
+
|
74
|
+
before do
|
75
|
+
allow(logger).to receive(:formatter=)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'creates a new logger and adds it to the log relayer' do
|
79
|
+
expect(Logger).to receive(:new).with(device, 12, 42).and_return(logger)
|
80
|
+
PaulBunyan.create_logger(device, 12, 42)
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'returns the newly created logger' do
|
84
|
+
expect(Logger).to receive(:new).and_return(logger)
|
85
|
+
expect(PaulBunyan.create_logger(device)).to be(logger)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'allows the default formatter type to be overridden' do
|
89
|
+
PaulBunyan.default_formatter_type = :json
|
90
|
+
expect(Logger).to receive(:new).and_return(logger)
|
91
|
+
expect(logger).to receive(:formatter=).with(instance_of(PaulBunyan::TextFormatter))
|
92
|
+
PaulBunyan.create_logger(device, formatter_type: :text)
|
93
|
+
end
|
94
|
+
|
95
|
+
def default_formatter_type_call
|
96
|
+
PaulBunyan.create_logger(device)
|
97
|
+
end
|
98
|
+
|
99
|
+
it_behaves_like 'respecting the ::default_formatter_type'
|
100
|
+
end
|
101
|
+
|
102
|
+
describe '::add_logger' do
|
103
|
+
it 'adds the logger to the log relayer' do
|
104
|
+
logger = double('logger')
|
105
|
+
expect(PaulBunyan.logger).not_to be(nil)
|
106
|
+
PaulBunyan.add_logger(logger)
|
107
|
+
expect(PaulBunyan.logger.secondary_loggers).to include(logger)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'creates an empty log relayer, if not present' do
|
111
|
+
logger = double('logger')
|
112
|
+
PaulBunyan.add_logger(logger)
|
113
|
+
expect(PaulBunyan.logger.loggers).to eq([logger])
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'does not recreate the log relayer, if already present' do
|
117
|
+
logger1 = double('logger1')
|
118
|
+
logger2 = double('logger2')
|
119
|
+
PaulBunyan.add_logger(logger1)
|
120
|
+
PaulBunyan.add_logger(logger2)
|
121
|
+
expect(PaulBunyan.logger.loggers).to include(logger1)
|
122
|
+
expect(PaulBunyan.logger.loggers).to include(logger2)
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'returns the logger added' do
|
126
|
+
logger = double('logger')
|
127
|
+
expect(PaulBunyan.add_logger(logger)).to be(logger)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '::remove_logger' do
|
132
|
+
it 'removes the logger from the log relayer' do
|
133
|
+
expect(PaulBunyan.logger).to receive(:remove_logger).with(PaulBunyan.logger.primary_logger)
|
134
|
+
PaulBunyan.remove_logger(PaulBunyan.logger.primary_logger)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|