paul_bunyan 1.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0b7d9fd1c7ac8e2b72e82b72171ea627c9597196
4
- data.tar.gz: 270c98aa6aa254836aa244db96847b432204df92
2
+ SHA256:
3
+ metadata.gz: 99a1d7f5e1bca7051329fba1b48a4b948bec14fc627d67104628eb8518b030c9
4
+ data.tar.gz: 1baa56a528d8e90f60160241d1fc2201d3d9e9fe047ad089afbbee915ca16902
5
5
  SHA512:
6
- metadata.gz: 7cd3fb82d143d9b6fba0d2f4949ad5a15b52459a6b85fa2ff273a3d13f17754d3bf212a6c133a554a222691e2a6adc90a16a62dc5cfa325513a4e8099e869488
7
- data.tar.gz: 19f8c7c07ac6027f48302882a814b7426dcd3dad228bf4be858075aeccb32d94db72feaddfcdb2cd3019991f775d8969447c1ceb57a6cb0f7485422577bae276
6
+ metadata.gz: 9f42e5e066c935ee873ffd6ebdd1219987d62df649c99b6183492eb18bfaece06350260f33599ee3011b2c944b7186e0bc46bd357139224b0874ed83f8d9c2ac
7
+ data.tar.gz: 478483be7bd4535bc0e8a88e26e51cea389e60361b16d89db092109e8c97956684226a02f66e3889854c31561352f3585d739e13cbff90d0fc931ad5df32b584
data/.travis.yml CHANGED
@@ -1,17 +1,17 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2
4
- - 2.3
5
- - 2.4
3
+ - 2.5
4
+ - 2.6
5
+ - 2.7
6
6
  matrix:
7
7
  fast_finish: true
8
8
  # WWTD doesn't support allow_failures... yet
9
9
  # allow_failures:
10
10
  # - rvm: ruby-head
11
11
  gemfile:
12
- - spec/gemfiles/42.gemfile
13
- - spec/gemfiles/50.gemfile
14
- - spec/gemfiles/51.gemfile
12
+ - spec/gemfiles/52.gemfile
13
+ - spec/gemfiles/60.gemfile
14
+ - spec/gemfiles/61.gemfile
15
15
  script: bundle exec rspec
16
16
  notifications:
17
17
  email:
data/Dockerfile CHANGED
@@ -2,18 +2,14 @@ FROM instructure/rvm
2
2
  MAINTAINER Instructure
3
3
 
4
4
  WORKDIR /usr/src/app
5
- RUN /bin/bash -l -c "rvm use --default 2.4"
5
+ # Everyone use the same bundler version
6
+ RUN /bin/bash -l -c "rvm use 2.5 && gem install bundler"
7
+ RUN /bin/bash -l -c "rvm use 2.6 && gem install bundler"
8
+ RUN /bin/bash -l -c "rvm use --default 2.7 && gem install bundler"
6
9
 
7
- COPY paul_bunyan.gemspec Gemfile /usr/src/app/
8
- COPY lib/paul_bunyan/version.rb /usr/src/app/lib/paul_bunyan/
9
-
10
- USER root
11
- RUN chown -R docker:docker /usr/src/app
12
- USER docker
10
+ COPY --chown=docker:docker paul_bunyan.gemspec Gemfile /usr/src/app/
11
+ COPY --chown=docker:docker lib/paul_bunyan/version.rb /usr/src/app/lib/paul_bunyan/
13
12
  RUN /bin/bash -l -c "bundle install"
14
13
 
15
- COPY . /usr/src/app
16
- USER root
17
- RUN chown -R docker:docker /usr/src/app/*
18
- USER docker
14
+ COPY --chown=docker:docker . /usr/src/app
19
15
  CMD /bin/bash -l -c "wwtd --parallel"
data/Jenkinsfile ADDED
@@ -0,0 +1,14 @@
1
+ pipeline {
2
+ agent {
3
+ label "docker"
4
+ }
5
+ stages {
6
+ stage('Build') {
7
+ steps {
8
+ ansiColor('xterm') {
9
+ sh './build.sh'
10
+ }
11
+ }
12
+ }
13
+ }
14
+ }
data/README.md CHANGED
@@ -43,9 +43,7 @@ Or install it yourself as:
43
43
  ```
44
44
  require 'paul_bunyan'
45
45
 
46
- include PaulBunyan::Logger
47
-
48
- PaulBunyan.set_logger(STDOUT)
46
+ include PaulBunyan
49
47
 
50
48
  logger.warn "blah"
51
49
  ```
@@ -62,3 +60,7 @@ the request host to the metadata in the examples directory. There are a few
62
60
  keys that are used internally that will be overwritten when added to user
63
61
  supplied metadata, this list can be found in the `#call` method of
64
62
  `PaulBunyan::JSONFormatter`.
63
+
64
+ ### Seeing what your server logs will look like in the console
65
+ To do this set `PB_DISABLE_CONSOLE_OVERRIDE` in your environment:
66
+ `PB_DISABLE_CONSOLE_OVERRIDE=1 bundle exec rails c`
@@ -1,11 +1,31 @@
1
1
  module PaulBunyan
2
2
  module MetadataLogging
3
3
  def clear_metadata!
4
- formatter.clear_metadata!
4
+ formatter.clear_metadata! if formatter.respond_to?(:clear_metadata!)
5
5
  end
6
6
 
7
7
  def with_metadata(metadata)
8
- formatter.with_metadata(metadata) { yield self }
8
+ if formatter.respond_to?(:with_metadata)
9
+ formatter.with_metadata(metadata) { yield self }
10
+ else
11
+ yield self
12
+ end
13
+ end
14
+
15
+ def add_metadata(metadata)
16
+ formatter.add_metadata(metadata) if formatter.respond_to?(:add_metadata)
17
+ end
18
+
19
+ def remove_metadata(metadata)
20
+ formatter.remove_metadata(metadata) if formatter.respond_to?(:remove_metadata)
21
+ end
22
+
23
+ def current_metadata
24
+ if formatter.respond_to?(:current_metadata)
25
+ return formatter.current_metadata
26
+ else
27
+ return {}
28
+ end
9
29
  end
10
30
 
11
31
  def flush
@@ -17,6 +17,16 @@ module PaulBunyan
17
17
  Rails.env.development? || Rails.env.test?
18
18
  end
19
19
 
20
+ def self.rake_task?
21
+ File.basename($0) == 'rake'
22
+ end
23
+
24
+ def self.migrating?
25
+ rake_task? && ARGV.include?('db:migrate')
26
+ end
27
+
28
+ delegate :rake_task?, :migrating?, to: :class
29
+
20
30
  # Set up the config and some defaults
21
31
  config.logging = ActiveSupport::OrderedOptions.new
22
32
  config.logging.override_location = !Rails.env.test?
@@ -27,22 +37,24 @@ module PaulBunyan
27
37
  initializer 'initalize_logger.logging', group: :all, before: :initialize_logger do |app|
28
38
  logging_config = config.logging
29
39
 
30
- new_logger = PaulBunyan.add_logger(ActiveSupport::Logger.new(log_target(app.config)))
31
- new_logger.level = PaulBunyan::Level.coerce_level(ENV['LOG_LEVEL'] || ::Rails.application.config.log_level || 'INFO')
32
- new_logger.formatter = logging_config.formatter
33
- new_logger.extend(ActiveSupport::TaggedLogging) if logging_config.formatter.respond_to?(:tagged)
34
- new_logger.extend(PaulBunyan::MetadataLogging) if logging_config.formatter.respond_to?(:with_metadata)
40
+ unless migrating?
41
+ new_logger = PaulBunyan.add_logger(ActiveSupport::Logger.new(log_target(app.config)))
42
+ new_logger.level = PaulBunyan::Level.coerce_level(ENV['LOG_LEVEL'] || ::Rails.application.config.log_level || 'INFO')
43
+ new_logger.formatter = logging_config.formatter
44
+ new_logger.extend(ActiveSupport::TaggedLogging) if logging_config.formatter.respond_to?(:tagged)
45
+ new_logger.extend(PaulBunyan::MetadataLogging) if logging_config.formatter.respond_to?(:with_metadata)
35
46
 
36
- if logging_config.handle_request_logging
37
- unsubscribe_default_log_subscribers
38
- LogSubscriber.subscribe_to_events
39
- end
47
+ if logging_config.handle_request_logging
48
+ unsubscribe_default_log_subscribers
49
+ LogSubscriber.subscribe_to_events
50
+ end
40
51
 
41
- Rails.logger = PaulBunyan.logger
52
+ Rails.logger = PaulBunyan.logger
53
+ end
42
54
  end
43
55
 
44
56
  console do
45
- PaulBunyan.logger.formatter = TextFormatter.new(include_metadata: false)
57
+ PaulBunyan.logger.formatter = TextFormatter.new(include_metadata: false) unless ENV['PB_DISABLE_CONSOLE_OVERRIDE']
46
58
  end
47
59
 
48
60
  def conditionally_unsubscribe(listener)
@@ -66,8 +66,12 @@ module PaulBunyan
66
66
  subscribers << subscriber
67
67
 
68
68
  event_patterns.each do |pattern|
69
- subscriber.patterns << pattern
70
- notifier.subscribe(pattern, subscriber)
69
+ if Rails::VERSION::MAJOR >= 6
70
+ subscriber.patterns[pattern] = notifier.subscribe(pattern, subscriber)
71
+ else
72
+ subscriber.patterns << pattern
73
+ notifier.subscribe(pattern, subscriber)
74
+ end
71
75
  end
72
76
  end
73
77
 
@@ -5,7 +5,7 @@ end
5
5
 
6
6
  module PaulBunyan
7
7
  class TextFormatter < Logger::Formatter
8
- include ActiveSupport::TaggedLogging::Formatter if defined?(ActiveSupport::TaggedLogging)
8
+ include ActiveSupport::TaggedLogging::Formatter if defined?(ActiveSupport::TaggedLogging::Formatter)
9
9
 
10
10
  def initialize(include_metadata: true)
11
11
  @include_metadata = include_metadata
@@ -1,3 +1,3 @@
1
1
  module PaulBunyan
2
- VERSION = '1.5.0'
2
+ VERSION = '2.0.0'
3
3
  end
data/paul_bunyan.gemspec CHANGED
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency 'request_store'
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 1.5'
23
+ spec.add_development_dependency 'bundler'
24
24
  spec.add_development_dependency 'rake'
25
25
  spec.add_development_dependency 'rspec'
26
26
  spec.add_development_dependency 'wwtd'
27
- spec.add_development_dependency 'rails', '>= 4.2'
27
+ spec.add_development_dependency 'rails', '>= 5.2'
28
28
  spec.add_development_dependency 'sqlite3'
29
29
  spec.add_development_dependency 'byebug'
30
30
  end
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../javascripts .js
3
+ //= link_directory ../stylesheets .css
@@ -19,9 +19,8 @@ module Dummy
19
19
  # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
20
20
  # config.i18n.default_locale = :de
21
21
 
22
- # Do not swallow errors in after_commit/after_rollback callbacks.
23
- if Rails.version > '4.2' && Rails.version < '5.0'
24
- config.active_record.raise_in_transactional_callbacks = true
22
+ if Rails.version < '6.0'
23
+ config.active_record.sqlite3.represent_boolean_as_integer = true
25
24
  end
26
25
  end
27
26
  end
@@ -18,7 +18,6 @@ Dummy::Application.configure do
18
18
  config.static_cache_control = 'public, max-age=3600'
19
19
  end
20
20
 
21
-
22
21
  # Show full error reports and disable caching.
23
22
  config.consider_all_requests_local = true
24
23
  config.action_controller.perform_caching = false
@@ -42,4 +41,13 @@ Dummy::Application.configure do
42
41
 
43
42
  # Raises error for missing translations
44
43
  # config.action_view.raise_on_missing_translations = true
44
+
45
+ # Simulate default production logging configuration
46
+ if Rails.version < '5.1'
47
+ config.log_formatter = ::Logger::Formatter.new
48
+ else
49
+ logger = ActiveSupport::Logger.new(STDOUT)
50
+ logger.formatter = config.log_formatter
51
+ config.logger = ActiveSupport::TaggedLogging.new(logger)
52
+ end
45
53
  end
@@ -2,4 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '../../'
4
4
 
5
- gem 'rails', '~> 4.2.0'
5
+ gem 'rails', '~> 5.2.0'
@@ -2,4 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '../../'
4
4
 
5
- gem 'rails', '~> 5.0.0'
5
+ gem 'rails', '~> 6.0.0'
@@ -2,4 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '../../'
4
4
 
5
- gem 'rails', '~> 5.1.0'
5
+ gem 'rails', '~> 6.1.0'
@@ -1,47 +1,108 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PaulBunyan::MetadataLogging do
4
- subject { Object.new }
5
- let(:formatter) { double('formatter') }
4
+ context "with a formatter that supports metadata" do
5
+ subject { Object.new }
6
+ let(:formatter) { double('formatter') }
6
7
 
7
- before do
8
- subject.extend(PaulBunyan::MetadataLogging)
9
- allow(subject).to receive(:formatter).and_return(formatter)
10
- end
8
+ before do
9
+ subject.extend(PaulBunyan::MetadataLogging)
10
+ allow(subject).to receive(:formatter).and_return(formatter)
11
+ end
11
12
 
12
- it 'must delegate clear_metadata! to the formatter' do
13
- expect(formatter).to receive(:clear_metadata!)
14
- subject.clear_metadata!
15
- end
13
+ it 'must delegate clear_metadata! to the formatter' do
14
+ expect(formatter).to receive(:clear_metadata!)
15
+ subject.clear_metadata!
16
+ end
16
17
 
17
- it 'must delegate with_metadata to the formatter' do
18
- expect(formatter).to receive(:with_metadata).with(foo: 'bar').and_yield
19
- subject.with_metadata(foo: 'bar') do |logger|
20
- expect(subject).to eq logger
18
+ it 'must delegate with_metadata to the formatter' do
19
+ expect(formatter).to receive(:with_metadata).with(foo: 'bar').and_yield
20
+ subject.with_metadata(foo: 'bar') do |logger|
21
+ expect(subject).to eq logger
22
+ end
21
23
  end
22
- end
23
24
 
24
- context '#flush' do
25
- it 'clears metadata on the formatter' do
26
- expect(formatter).to receive(:clear_metadata!)
27
- subject.flush
25
+ it 'must delegate add_metadata to the formatter' do
26
+ expect(formatter).to receive(:add_metadata).with(foo: 'bar')
27
+ subject.add_metadata(foo: 'bar')
28
28
  end
29
29
 
30
- it 'sends flush to a parent' do
31
- klass = Class.new
32
- klass.class_eval do
33
- def flush
34
- flush_behavior()
30
+ it 'must delegate current_metadata to the formatter' do
31
+ expect(formatter).to receive(:current_metadata).and_return({})
32
+ subject.current_metadata
33
+ end
34
+
35
+ it 'must delegate remove_metadata to the formatter' do
36
+ expect(formatter).to receive(:remove_metadata).with(foo: 'bar')
37
+ subject.remove_metadata(foo: 'bar')
38
+ end
39
+
40
+ context '#flush' do
41
+ it 'clears metadata on the formatter' do
42
+ expect(formatter).to receive(:clear_metadata!)
43
+ subject.flush
44
+ end
45
+
46
+ it 'sends flush to a parent' do
47
+ klass = Class.new
48
+ klass.class_eval do
49
+ def flush
50
+ flush_behavior()
51
+ end
35
52
  end
53
+
54
+ metadata_logger = klass.new
55
+ metadata_logger.extend(PaulBunyan::MetadataLogging)
56
+ allow(metadata_logger).to receive(:formatter).and_return(formatter)
57
+ allow(formatter).to receive(:clear_metadata!)
58
+
59
+ expect(metadata_logger).to receive(:flush_behavior)
60
+ metadata_logger.flush
36
61
  end
62
+ end
63
+ end
64
+
65
+ context "with a formatter that does not support metadata" do
66
+ subject { Object.new }
67
+ let(:formatter) { PaulBunyan::TextFormatter.new }
68
+
69
+ before do
70
+ subject.extend(PaulBunyan::MetadataLogging)
71
+ allow(subject).to receive(:formatter).and_return(formatter)
72
+ end
73
+
74
+ it 'must not call clear_metadata! on the formatter' do
75
+ expect(formatter).to_not respond_to(:clear_metadata!)
76
+ subject.clear_metadata!
77
+ end
78
+
79
+ it 'must delegate with_metadata to the formatter' do
80
+ expect(formatter).to_not respond_to(:with_metadata)
81
+ subject.with_metadata(foo: 'bar') do |logger|
82
+ expect(subject).to eq logger
83
+ end
84
+ end
85
+
86
+ it 'must delegate add_metadata to the formatter' do
87
+ expect(formatter).to_not respond_to(:add_metadata)
88
+ subject.add_metadata(foo: 'bar')
89
+ end
37
90
 
38
- metadata_logger = klass.new
39
- metadata_logger.extend(PaulBunyan::MetadataLogging)
40
- allow(metadata_logger).to receive(:formatter).and_return(formatter)
41
- allow(formatter).to receive(:clear_metadata!)
91
+ it 'must delegate current_metadata to the formatter' do
92
+ expect(formatter).to_not respond_to(:current_metadata)
93
+ subject.current_metadata
94
+ end
95
+
96
+ it 'must delegate remove_metadata to the formatter' do
97
+ expect(formatter).to_not respond_to(:remove_metadata)
98
+ subject.remove_metadata(foo: 'bar')
99
+ end
42
100
 
43
- expect(metadata_logger).to receive(:flush_behavior)
44
- metadata_logger.flush
101
+ context '#flush' do
102
+ it 'clears metadata on the formatter' do
103
+ expect(formatter).to_not respond_to(:clear_metadata!)
104
+ subject.flush
105
+ end
45
106
  end
46
107
  end
47
108
  end
@@ -32,10 +32,10 @@ module PaulBunyan
32
32
  end
33
33
 
34
34
  it 'must leave the ActionController::LogSubscriber subscription to deep_munge.action_controller in place' do
35
- # I don't expect that we'll ever care to unsubcribe the logger
36
- # non-event so we'll use it as a check to ensure we don't
37
- # clobber all of the listeners, only the ones we care about
38
- expect(subscriber_classes_for('logger.action_controller')).
35
+ # We do not currently support fragment cache logging so we'll use it as
36
+ # a check to ensure we don't clobber all of the listeners, only the
37
+ # ones we care about
38
+ expect(subscriber_classes_for('write_fragment.action_controller')).
39
39
  to include ActionController::LogSubscriber
40
40
  end
41
41
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paul_bunyan
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Duane Johnson
8
8
  - Kenneth Romney
9
9
  - Mark Severson
10
10
  - Tyler Pickett
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2017-09-26 00:00:00.000000000 Z
14
+ date: 2021-03-16 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: request_store
@@ -31,16 +31,16 @@ dependencies:
31
31
  name: bundler
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
- - - "~>"
34
+ - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: '1.5'
36
+ version: '0'
37
37
  type: :development
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "~>"
41
+ - - ">="
42
42
  - !ruby/object:Gem::Version
43
- version: '1.5'
43
+ version: '0'
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: rake
46
46
  requirement: !ruby/object:Gem::Requirement
@@ -89,14 +89,14 @@ dependencies:
89
89
  requirements:
90
90
  - - ">="
91
91
  - !ruby/object:Gem::Version
92
- version: '4.2'
92
+ version: '5.2'
93
93
  type: :development
94
94
  prerelease: false
95
95
  version_requirements: !ruby/object:Gem::Requirement
96
96
  requirements:
97
97
  - - ">="
98
98
  - !ruby/object:Gem::Version
99
- version: '4.2'
99
+ version: '5.2'
100
100
  - !ruby/object:Gem::Dependency
101
101
  name: sqlite3
102
102
  requirement: !ruby/object:Gem::Requirement
@@ -144,6 +144,7 @@ files:
144
144
  - Dockerfile
145
145
  - Gemfile
146
146
  - Guardfile
147
+ - Jenkinsfile
147
148
  - LICENSE.txt
148
149
  - README.md
149
150
  - Rakefile
@@ -169,6 +170,7 @@ files:
169
170
  - lib/tasks/paul_bunyan_tasks.rake
170
171
  - paul_bunyan.gemspec
171
172
  - spec/dummy/Rakefile
173
+ - spec/dummy/app/assets/config/manifest.js
172
174
  - spec/dummy/app/assets/images/.keep
173
175
  - spec/dummy/app/assets/javascripts/application.js
174
176
  - spec/dummy/app/assets/stylesheets/application.css
@@ -209,9 +211,9 @@ files:
209
211
  - spec/dummy/public/422.html
210
212
  - spec/dummy/public/500.html
211
213
  - spec/dummy/public/favicon.ico
212
- - spec/gemfiles/42.gemfile
213
- - spec/gemfiles/50.gemfile
214
- - spec/gemfiles/51.gemfile
214
+ - spec/gemfiles/52.gemfile
215
+ - spec/gemfiles/60.gemfile
216
+ - spec/gemfiles/61.gemfile
215
217
  - spec/lib/paul_bunyan/json_formatter_spec.rb
216
218
  - spec/lib/paul_bunyan/level_spec.rb
217
219
  - spec/lib/paul_bunyan/log_relayer_spec.rb
@@ -227,7 +229,7 @@ homepage: https://github.com/instructure/paul_bunyan
227
229
  licenses:
228
230
  - MIT
229
231
  metadata: {}
230
- post_install_message:
232
+ post_install_message:
231
233
  rdoc_options: []
232
234
  require_paths:
233
235
  - lib
@@ -242,13 +244,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
242
244
  - !ruby/object:Gem::Version
243
245
  version: '0'
244
246
  requirements: []
245
- rubyforge_project:
246
- rubygems_version: 2.6.13
247
- signing_key:
247
+ rubygems_version: 3.0.3
248
+ signing_key:
248
249
  specification_version: 4
249
250
  summary: Logging for all the things
250
251
  test_files:
251
252
  - spec/dummy/Rakefile
253
+ - spec/dummy/app/assets/config/manifest.js
252
254
  - spec/dummy/app/assets/images/.keep
253
255
  - spec/dummy/app/assets/javascripts/application.js
254
256
  - spec/dummy/app/assets/stylesheets/application.css
@@ -289,9 +291,9 @@ test_files:
289
291
  - spec/dummy/public/422.html
290
292
  - spec/dummy/public/500.html
291
293
  - spec/dummy/public/favicon.ico
292
- - spec/gemfiles/42.gemfile
293
- - spec/gemfiles/50.gemfile
294
- - spec/gemfiles/51.gemfile
294
+ - spec/gemfiles/52.gemfile
295
+ - spec/gemfiles/60.gemfile
296
+ - spec/gemfiles/61.gemfile
295
297
  - spec/lib/paul_bunyan/json_formatter_spec.rb
296
298
  - spec/lib/paul_bunyan/level_spec.rb
297
299
  - spec/lib/paul_bunyan/log_relayer_spec.rb