berkeley_library-logging 0.2.4 → 0.2.6.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.
@@ -20,12 +20,14 @@ Gem::Specification.new do |spec|
20
20
  spec.homepage = BerkeleyLibrary::Logging::ModuleInfo::HOMEPAGE
21
21
 
22
22
  spec.files = `git ls-files -z`.split("\x0")
23
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
+ spec.test_files = spec.files.grep(%r{^(test|spec|features|artifacts)/})
24
24
  spec.require_paths = ['lib']
25
25
 
26
26
  spec.required_ruby_version = ">= #{ruby_version}"
27
27
 
28
- spec.add_dependency 'activesupport', '~> 6.0'
28
+ rails_version = '>= 6'
29
+
30
+ spec.add_dependency 'activesupport', rails_version
29
31
  spec.add_dependency 'amazing_print', '~> 1.1'
30
32
  spec.add_dependency 'colorize', '~> 0.8.1'
31
33
  spec.add_dependency 'lograge', '~> 0.11'
@@ -37,11 +39,14 @@ Gem::Specification.new do |spec|
37
39
  spec.add_development_dependency 'dotenv', '~> 2.7'
38
40
  spec.add_development_dependency 'irb', '~> 1.2' # workaroundfor https://github.com/bundler/bundler/issues/6929
39
41
  spec.add_development_dependency 'listen', '>= 3.0.5', '< 3.2'
40
- spec.add_development_dependency 'rails', '~> 6.0'
42
+ spec.add_development_dependency 'rails', rails_version
41
43
  spec.add_development_dependency 'rake', '~> 13.0'
42
44
  spec.add_development_dependency 'rspec-support', '~> 3.9'
43
- spec.add_development_dependency 'rubocop', '~> 0.91.0'
45
+ spec.add_development_dependency 'rubocop', '~> 1.26.0'
46
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.4.0'
44
47
  spec.add_development_dependency 'simplecov', '~> 0.21.1'
45
48
  spec.add_development_dependency 'simplecov-console', '~> 0.9.1'
46
49
  spec.add_development_dependency 'simplecov-rcov', '~> 0.2'
50
+
51
+ spec.metadata['rubygems_mfa_required'] = 'true'
47
52
  end
@@ -22,9 +22,13 @@ module BerkeleyLibrary
22
22
  def configure_lograge(config)
23
23
  return unless config.respond_to?(:lograge)
24
24
 
25
- config.lograge.tap do |lograge|
25
+ lograge_config = config.lograge
26
+
27
+ custom_options = Events.extract_data_for_lograge(lograge_config)
28
+
29
+ lograge_config.tap do |lograge|
26
30
  lograge.enabled = true
27
- lograge.custom_options = Events.extract_data_for_lograge
31
+ lograge.custom_options = custom_options
28
32
  lograge.formatter = Formatters.lograge_formatter
29
33
  end
30
34
  end
@@ -11,7 +11,7 @@ module BerkeleyLibrary
11
11
  return Rails.env if defined?(Rails)
12
12
 
13
13
  @env ||= begin
14
- # Note: can't just self.env= b/c it returns the wrong value -- see
14
+ # NOTE: can't just self.env= b/c it returns the wrong value -- see
15
15
  # https://stackoverflow.com/q/65226532/27358
16
16
  env = (ENV['RAILS_ENV'] || ENV['RACK_ENV'] || FALLBACK_ENV)
17
17
  ensure_rails_env_like(env)
@@ -1,41 +1,46 @@
1
+ require 'berkeley_library/logging/safe_serializer'
2
+
1
3
  module BerkeleyLibrary
2
4
  module Logging
3
5
  module Events
6
+ LOGGED_REQUEST_ATTRIBUTES = %i[origin base_url x_csrf_token].freeze
7
+ LOGGED_SESSION_ATTRIBUTES = %i[session_id _csrf_token].freeze
8
+ LOGGED_PARAMETERS = [:authenticity_token].freeze
9
+ LOGGED_HEADERS = {
10
+ # yes, RFC 2616 uses a variant spelling for 'referrer', it's a known issue
11
+ # https://tools.ietf.org/html/rfc2616#section-14.36
12
+ referer: 'HTTP_REFERER',
13
+ request_id: 'action_dispatch.request_id',
14
+ remote_ip: 'action_dispatch.remote_ip',
15
+ remote_addr: 'REMOTE_ADDR',
16
+ x_forwarded_for: 'HTTP_X_FORWARDED_FOR',
17
+ forwarded: 'HTTP_FORWARDED' # RFC 7239
18
+ }.freeze
19
+
4
20
  class << self
5
- LOGGED_REQUEST_ATTRIBUTES = %i[origin base_url x_csrf_token].freeze
6
- LOGGED_PARAMETERS = [:authenticity_token].freeze
7
- LOGGED_HEADERS = {
8
- # yes, RFC 2616 uses a variant spelling for 'referrer', it's a known issue
9
- # https://tools.ietf.org/html/rfc2616#section-14.36
10
- referer: 'HTTP_REFERER',
11
- request_id: 'action_dispatch.request_id',
12
- remote_ip: 'action_dispatch.remote_ip',
13
- remote_addr: 'REMOTE_ADDR',
14
- x_forwarded_for: 'HTTP_X_FORWARDED_FOR',
15
- forwarded: 'HTTP_FORWARDED' # RFC 7239
16
- }.freeze
17
-
18
- def extract_data_for_lograge
19
- ->(event) { extract_event_data(event) }
20
- end
21
21
 
22
- private
22
+ def extract_data_for_lograge(lograge_config)
23
+ verbose_session_logging = lograge_config.verbose_session_logging
23
24
 
24
- def extract_event_data(event)
25
- { time: Time.now }.tap do |event_data|
26
- headers = extract_headers(event)
27
- event_data.merge!(headers)
25
+ ->(event) { extract_event_data(event.payload, verbose_session_logging) }
26
+ end
28
27
 
29
- request_attributes = extract_request_attributes(event)
30
- event_data.merge!(request_attributes)
28
+ private
31
29
 
32
- param_values = extract_param_values(event)
33
- event_data.merge!(param_values)
30
+ def extract_event_data(payload, verbose_session_logging)
31
+ [
32
+ extract_headers(payload),
33
+ extract_request_attributes(payload),
34
+ extract_param_values(payload),
35
+ extract_session(payload, verbose_session_logging)
36
+ ].inject({ time: Time.now }) do |data, values|
37
+ clean_values = SafeSerializer.serialize(values)
38
+ data.merge(clean_values)
34
39
  end
35
40
  end
36
41
 
37
- def extract_param_values(event)
38
- return {} unless (params = event.payload[:params])
42
+ def extract_param_values(payload)
43
+ return {} unless (params = payload[:params])
39
44
 
40
45
  LOGGED_PARAMETERS.each_with_object({}) do |param, values|
41
46
  next unless (param_val = params[param])
@@ -44,29 +49,46 @@ module BerkeleyLibrary
44
49
  end
45
50
  end
46
51
 
47
- def extract_request_attributes(event)
48
- return {} unless (request = event.payload[:request])
52
+ def extract_request_attributes(payload)
53
+ return {} unless (request = payload[:request])
49
54
 
50
55
  LOGGED_REQUEST_ATTRIBUTES.each_with_object({}) do |attr, values|
51
56
  next unless request.respond_to?(attr)
52
- next unless (attr_val = request.send(attr))
57
+ next if (attr_val = request.send(attr)).nil?
53
58
 
54
59
  values[attr] = attr_val
55
60
  end
56
61
  end
57
62
 
58
- def extract_headers(event)
59
- return {} unless (headers = event.payload[:headers])
63
+ def extract_headers(payload)
64
+ return {} unless (headers = payload[:headers])
60
65
 
61
66
  LOGGED_HEADERS.each_with_object({}) do |(key, header), values|
62
67
  next unless (header_val = headers[header])
63
68
 
64
- # Some of these 'headers' include recursive structures
65
- # that cause SystemStackErrors in JSON serialization,
66
- # so we convert them all to strings
67
- values[key] = header_val.to_s
69
+ values[key] = header_val
68
70
  end
69
71
  end
72
+
73
+ def extract_session(payload, verbose_session_logging)
74
+ return {} unless (request = payload[:request])
75
+ return {} unless (session = request.session)
76
+ return {} unless session.respond_to?(:to_hash)
77
+
78
+ session_hash = session_hash(session, verbose_session_logging)
79
+
80
+ { session: session_hash }
81
+ end
82
+
83
+ def session_hash(session, verbose)
84
+ raw_session_hash = session.to_hash
85
+ return raw_session_hash if verbose
86
+
87
+ LOGGED_SESSION_ATTRIBUTES.filter_map do |attr|
88
+ attr_str = attr.to_s
89
+ [attr, raw_session_hash[attr_str]] if raw_session_hash.key?(attr_str)
90
+ end.to_h
91
+ end
70
92
  end
71
93
  end
72
94
  end
@@ -0,0 +1,15 @@
1
+ module BerkeleyLibrary
2
+ module Logging
3
+ module ExceptionSerializer
4
+ def serialize_exc(ex, serialized = Set.new)
5
+ raw_result = { name: ex.class.name, message: ex.message, stack: ex.backtrace }
6
+ raw_result.tap do |result|
7
+ next unless (cause = ex.cause)
8
+ next if (serialized << ex).include?(cause) # prevent circular references
9
+
10
+ result[:cause] = serialize_exc(cause, serialized)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,4 +1,5 @@
1
1
  require 'ougai'
2
+ require 'berkeley_library/logging/exception_serializer'
2
3
 
3
4
  module BerkeleyLibrary
4
5
  module Logging
@@ -41,21 +42,8 @@ module BerkeleyLibrary
41
42
  # ------------------------------------------------------------
42
43
  # Private helper classes
43
44
 
44
- module ErrorCauseSerializer
45
- def serialize_exc(ex, serialized = Set.new)
46
- super(ex).tap do |result|
47
- next unless (cause = ex.cause)
48
- next if (serialized << ex).include?(cause) # prevent circular references
49
-
50
- result[:cause] = serialize_exc(cause, serialized)
51
- end
52
- end
53
- end
54
-
55
- private_constant :ErrorCauseSerializer
56
-
57
45
  class Readable < Ougai::Formatters::Readable
58
- include ErrorCauseSerializer
46
+ include ExceptionSerializer
59
47
 
60
48
  protected
61
49
 
@@ -71,9 +59,11 @@ module BerkeleyLibrary
71
59
  " #{err_hash[:name]} (#{err_hash[:message]}):".tap do |msg|
72
60
  next unless (stack = err_hash[:stack])
73
61
 
74
- msg << "\n"
75
- msg << (' ' * @trace_indent)
76
- msg << stack
62
+ trace_indent = (' ' * @trace_indent)
63
+ trace_separator = "\n#{trace_indent}"
64
+
65
+ msg << trace_separator
66
+ msg << stack.join(trace_separator)
77
67
 
78
68
  next unless (cause_hash = err_hash[:cause])
79
69
 
@@ -87,7 +77,7 @@ module BerkeleyLibrary
87
77
 
88
78
  class Bunyan < Ougai::Formatters::Bunyan
89
79
  include Ougai::Logging::Severity
90
- include ErrorCauseSerializer
80
+ include ExceptionSerializer
91
81
 
92
82
  def _call(severity, time, progname, data)
93
83
  original_data = Formatters.ensure_hash(data)
@@ -1,3 +1,11 @@
1
+ begin
2
+ # Rails 7.x LoggerThreadSafeLevel needs IsolatedExecutionState,
3
+ # but doesn't explicitly require it
4
+ require 'active_support/isolated_execution_state'
5
+ rescue LoadError
6
+ # Rails 6.x doesn't
7
+ end
8
+
1
9
  require 'active_support/logger'
2
10
  require 'ougai'
3
11
  require 'berkeley_library/logging/tagged_logging_extensions'
@@ -7,7 +7,7 @@ module BerkeleyLibrary
7
7
  SUMMARY = 'Opinionated Ruby/Rails logging for UC Berkeley Library'.freeze
8
8
  DESCRIPTION = 'A gem providing shared logging code for UC Berkeley Library gems and Rails applications'.freeze
9
9
  LICENSE = 'MIT'.freeze
10
- VERSION = '0.2.4'.freeze
10
+ VERSION = '0.2.6.1'.freeze
11
11
  HOMEPAGE = 'https://github.com/BerkeleyLibrary/logging'.freeze
12
12
 
13
13
  private_class_method :new
@@ -0,0 +1,77 @@
1
+ require 'time'
2
+ require 'berkeley_library/logging/exception_serializer'
3
+
4
+ module BerkeleyLibrary
5
+ module Logging
6
+ # Some of values include recursive structures
7
+ # that cause SystemStackErrors in JSON serialization,
8
+ # so we convert them all to strings
9
+ class SafeSerializer
10
+ include ExceptionSerializer
11
+
12
+ RAW_TYPES = [NilClass, FalseClass, TrueClass, Numeric, String, Symbol, Date, Time].freeze
13
+
14
+ def initialize(value)
15
+ @value = value
16
+ end
17
+
18
+ class << self
19
+ def serialize(value)
20
+ SafeSerializer.new(value).serialized_value
21
+ end
22
+
23
+ def placeholder_for(value)
24
+ "#<#{value.class}:#{value.object_id}> (recursive reference)"
25
+ end
26
+ end
27
+
28
+ def serialized_value
29
+ @serialized_value ||= serialize(@value)
30
+ end
31
+
32
+ private
33
+
34
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
35
+ def serialize(value)
36
+ return value if safe_raw_value?(value)
37
+ return SafeSerializer.placeholder_for(value) if serialized_values.include?(value)
38
+
39
+ serialized_values << value
40
+
41
+ return serialize_hash(value) if value.is_a?(Hash)
42
+ return serialize_hash(value.to_hash) if value.respond_to?(:to_hash)
43
+ return serialize_array(value) if value.is_a?(Array)
44
+ return serialize_array(value.to_ary) if value.respond_to?(:to_ary)
45
+ return serialize_exc(value, serialized_values) if value.is_a?(Exception)
46
+
47
+ value.to_s
48
+ end
49
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
50
+
51
+ def safe_raw_value?(value)
52
+ return true if rails_time_with_zone?(value)
53
+
54
+ RAW_TYPES.any? { |t| value.is_a?(t) }
55
+ end
56
+
57
+ def rails_time_with_zone?(value)
58
+ defined?(ActiveSupport::TimeWithZone) && value.is_a?(ActiveSupport::TimeWithZone)
59
+ end
60
+
61
+ def serialize_array(value)
62
+ value.map { |v| serialize(v) }
63
+ end
64
+
65
+ def serialize_hash(value)
66
+ value.each_with_object({}) do |(k, v), h|
67
+ k1, v1 = [k, v].map { |x| serialize(x) }
68
+ h[k1] = v1
69
+ end
70
+ end
71
+
72
+ def serialized_values
73
+ @serialized_values ||= Set.new
74
+ end
75
+ end
76
+ end
77
+ end
data/spec/.rubocop.yml CHANGED
@@ -1,15 +1,18 @@
1
1
  inherit_from: ../.rubocop.yml
2
2
 
3
+ require:
4
+ - rubocop-rspec
5
+
3
6
  Style/ClassAndModuleChildren:
4
7
  Enabled: false
5
8
 
6
- Layout/LineLength:
9
+ Style/OpenStructUse:
7
10
  Enabled: false
8
11
 
9
- Metrics/BlockLength:
12
+ Metrics/AbcSize:
10
13
  Enabled: false
11
14
 
12
- Metrics/ClassLength:
15
+ Metrics/BlockLength:
13
16
  Enabled: false
14
17
 
15
18
  Metrics/ModuleLength:
@@ -19,9 +22,87 @@ Metrics/MethodLength:
19
22
  Enabled: false
20
23
 
21
24
  ############################################################
22
- # Added in Rubocop 0.89
25
+ # rubocop-rspec
26
+
27
+ # believe me, it wasn't by choice
28
+ RSpec/AnyInstance:
29
+ Enabled: false
30
+
31
+ # we meant to do that
32
+ RSpec/BeforeAfterAll:
33
+ Enabled: false
34
+
35
+ # more words != more readable
36
+ RSpec/ContextWording:
37
+ Enabled: false
38
+
39
+ # explicit >>> implicit
40
+ RSpec/DescribedClass:
41
+ Enabled: false
42
+
43
+ # more punctuation != more readable
44
+ RSpec/DescribeSymbol:
45
+ Enabled: false
46
+
47
+ # too late now
48
+ RSpec/ExampleLength:
49
+ Enabled: false
50
+
51
+ # we meant to do that
52
+ RSpec/ExpectInHook:
53
+ Enabled: false
54
+
55
+ # if only it were that simple
56
+ RSpec/ExpectOutput:
57
+ Enabled: false
58
+
59
+ # your naming scheme is not in possession of all the facts
60
+ RSpec/FilePath:
61
+ Enabled: false
23
62
 
24
- # Sometimes we're testing the operator
25
- Lint/BinaryOperatorWithIdenticalOperands:
63
+ # explicit >>> implicit
64
+ RSpec/InstanceVariable:
26
65
  Enabled: false
27
-
66
+
67
+ # maybe when 'all' has a corresponding 'none' matcher
68
+ RSpec/IteratedExpectation:
69
+ Enabled: false
70
+
71
+ # TODO: clean these up & de-disable this
72
+ RSpec/LeakyConstantDeclaration:
73
+ Enabled: false
74
+
75
+ # too late now
76
+ RSpec/MultipleMemoizedHelpers:
77
+ Enabled: false
78
+
79
+ # setup cost / time >>> failure granularity
80
+ RSpec/MultipleExpectations:
81
+ Enabled: false
82
+
83
+ # cure is worse than the disease
84
+ RSpec/NestedGroups:
85
+ Enabled: false
86
+
87
+ # more quotation marks != more readable
88
+ RSpec/SharedExamples:
89
+ Enabled: false
90
+
91
+ # we meant to do that
92
+ RSpec/StubbedMock:
93
+ Enabled: false
94
+
95
+ # we meant to do that
96
+ RSpec/VerifiedDoubles:
97
+ Enabled: false
98
+
99
+ ############################################################
100
+ # rubocop-rspec
101
+
102
+ # enable newer rubocop-rspec cops
103
+
104
+ RSpec/IdenticalEqualityAssertion: # new in 2.4
105
+ Enabled: true
106
+
107
+ RSpec/Rails/AvoidSetupHook: # new in 2.4
108
+ Enabled: true
@@ -10,7 +10,7 @@ module BerkeleyLibrary
10
10
 
11
11
  attr_reader :config
12
12
 
13
- before(:each) do
13
+ before do
14
14
  app = Class.new(Rails::Application).new
15
15
  allow(Rails).to receive(:application).and_return(app)
16
16
  @config = app.config
@@ -30,53 +30,105 @@ module BerkeleyLibrary
30
30
  expect(lograge.enabled).to eq(true)
31
31
  end
32
32
 
33
- it 'extracts request info from log events' do
34
- Configurator.configure(config)
35
- lograge = config.lograge
33
+ context 'events' do
34
+ let(:params) { { authenticity_token: '8675309' } }
35
+
36
+ let(:session_hash) do
37
+ {
38
+ 'session_id' => '17cd06b1b7cb9744e8fa626ef5f37c67',
39
+ 'user' => {
40
+ 'id' => 71,
41
+ 'user_name' => 'Ms. Magoo',
42
+ 'created_at' => '2021-10-14T09:24:42.730-07:00',
43
+ 'updated_at' => '2021-10-14T09:24:42.729-07:00',
44
+ 'user_role' => 'Administrator',
45
+ 'user_active' => true,
46
+ 'uid' => 1_684_944,
47
+ 'updated_by' => 'Dr. Pibb'
48
+ },
49
+ 'expires_at' => '2021-11-03T12:30:01.281-07:00',
50
+ '_csrf_token' => 'HiN1xUxFcOvWvoe2nwoBSGlmGSN6x0jprpSqDrzquxA='
51
+ }
52
+ end
53
+
54
+ let(:request_headers) do
55
+ {
56
+ 'HTTP_REFERER' => 'value from HTTP_REFERER',
57
+ 'action_dispatch.request_id' => 'value from action_dispatch.request_id',
58
+ 'action_dispatch.remote_ip' => 'value from action_dispatch.remote_ip',
59
+ 'REMOTE_ADDR' => 'value from REMOTE_ADDR',
60
+ 'HTTP_X_FORWARDED_FOR' => 'value from HTTP_X_FORWARDED_FOR',
61
+ 'HTTP_FORWARDED' => 'value from HTTP_FORWARDED'
62
+ }
63
+ end
64
+
65
+ let(:expected_header_map) do
66
+ {
67
+ referer: 'HTTP_REFERER',
68
+ request_id: 'action_dispatch.request_id',
69
+ remote_ip: 'action_dispatch.remote_ip',
70
+ remote_addr: 'REMOTE_ADDR',
71
+ x_forwarded_for: 'HTTP_X_FORWARDED_FOR',
72
+ forwarded: 'HTTP_FORWARDED'
73
+ }
74
+ end
75
+
76
+ attr_reader :session, :request, :payload, :event
77
+
78
+ before do
79
+ @session = instance_double(ActionDispatch::Request::Session)
80
+ allow(session).to receive(:to_hash).and_return(session_hash)
81
+
82
+ @request = instance_double(ActionDispatch::Request)
83
+ allow(request).to receive(:origin).and_return('http://example.org:3000')
84
+ allow(request).to receive(:base_url).and_return('https://example.org:3443')
85
+ allow(request).to receive(:x_csrf_token).and_return('5551212')
86
+ allow(request).to receive(:session).and_return(session)
87
+
88
+ @payload = {
89
+ params: params,
90
+ request: request,
91
+ headers: request_headers
92
+ }
93
+
94
+ @event = instance_double(ActiveSupport::Notifications::Event)
95
+ allow(event).to receive(:payload).and_return(payload)
96
+ end
97
+
98
+ it 'extracts request info from log events' do
99
+ Configurator.configure(config)
100
+ data = config.lograge.custom_options.call(event)
101
+
102
+ expect(data).to be_a(Hash)
103
+ expect(data[:time]).to be_a(Time)
104
+ expect(data[:time].to_i).to be_within(60).of(Time.now.to_i)
105
+
106
+ expected_header_map.each { |xh, rh| expect(data[xh]).to eq(request_headers[rh]) }
107
+
108
+ expect(data[:authenticity_token]).to eq(params[:authenticity_token])
109
+
110
+ Events::LOGGED_REQUEST_ATTRIBUTES.each do |attr|
111
+ expect(data[attr]).to eq(request.send(attr))
112
+ end
113
+ end
114
+
115
+ it 'includes the entire session if `verbose_session_logging` is true' do
116
+ config.lograge.verbose_session_logging = true
117
+ Configurator.configure(config)
118
+ data = config.lograge.custom_options.call(event)
119
+
120
+ expect(data[:session]).to eq(session_hash)
121
+ end
122
+
123
+ it 'includes only the session ID by default' do
124
+ Configurator.configure(config)
125
+ data = config.lograge.custom_options.call(event)
126
+
127
+ expected_hash = Events::LOGGED_SESSION_ATTRIBUTES.each_with_object({}) do |attr, h|
128
+ h[attr] = session_hash[attr.to_s]
129
+ end
36
130
 
37
- params = { authenticity_token: '8675309' }
38
- request = OpenStruct.new(
39
- origin: 'http://example.org:3000',
40
- base_url: 'https://example.org:3443',
41
- x_csrf_token: '5551212'
42
- )
43
-
44
- request_headers = {
45
- 'HTTP_REFERER' => 'value from HTTP_REFERER',
46
- 'action_dispatch.request_id' => 'value from action_dispatch.request_id',
47
- 'action_dispatch.remote_ip' => 'value from action_dispatch.remote_ip',
48
- 'REMOTE_ADDR' => 'value from REMOTE_ADDR',
49
- 'HTTP_X_FORWARDED_FOR' => 'value from HTTP_X_FORWARDED_FOR',
50
- 'HTTP_FORWARDED' => 'value from HTTP_FORWARDED'
51
- }
52
-
53
- expected_header_map = {
54
- referer: 'HTTP_REFERER',
55
- request_id: 'action_dispatch.request_id',
56
- remote_ip: 'action_dispatch.remote_ip',
57
- remote_addr: 'REMOTE_ADDR',
58
- x_forwarded_for: 'HTTP_X_FORWARDED_FOR',
59
- forwarded: 'HTTP_FORWARDED'
60
- }
61
-
62
- payload = {
63
- params: params,
64
- request: request,
65
- headers: request_headers
66
- }
67
-
68
- event = instance_double(ActiveSupport::Notifications::Event)
69
- allow(event).to receive(:payload).and_return(payload)
70
-
71
- custom_options = lograge.custom_options
72
- data = custom_options.call(event)
73
- expect(data).to be_a(Hash)
74
- expect(data[:time]).to be_a(Time)
75
- expect(data[:time].to_i).to be_within(60).of(Time.now.to_i)
76
- expected_header_map.each { |xh, rh| expect(data[xh]).to eq(request_headers[rh]) }
77
- expect(data[:authenticity_token]).to eq(params[:authenticity_token])
78
- %i[origin base_url x_csrf_token].each do |attr|
79
- expect(data[attr]).to eq(request.send(attr))
131
+ expect(data[:session]).to eq(expected_hash)
80
132
  end
81
133
  end
82
134
 
@@ -5,11 +5,11 @@ module BerkeleyLibrary
5
5
 
6
6
  attr_reader :orig_rails_env
7
7
 
8
- before(:each) do
8
+ before do
9
9
  @orig_rails_env = Rails.env
10
10
  end
11
11
 
12
- after(:each) do
12
+ after do
13
13
  Rails.env = orig_rails_env
14
14
  end
15
15
 
@@ -9,7 +9,7 @@ module BerkeleyLibrary
9
9
  describe :new_json_formatter do
10
10
  attr_reader :out, :logger
11
11
 
12
- before(:each) do
12
+ before do
13
13
  @out = StringIO.new
14
14
  @logger = Logger.new(out)
15
15
  logger.formatter = Formatters.new_json_formatter
@@ -68,6 +68,7 @@ module BerkeleyLibrary
68
68
  expect(additional_data['more_strings']).to eq([expected_string, expected_string])
69
69
  end
70
70
 
71
+ # rubocop:disable Layout/LineLength
71
72
  it 'removes ANSI formatting from ActiveRecord logs' do
72
73
  original = " \e[1m\e[36mLendingItem Load (2.0ms)\e[0m \e[1m\e[34mSELECT \"lending_items\".* FROM \"lending_items\" WHERE \"lending_items\".\"directory\" = $1 LIMIT $2\e[0m [[\"directory\", \"b135297126_C068087930\"], [\"LIMIT\", 1]]"
73
74
  expected = ' LendingItem Load (2.0ms) SELECT "lending_items".* FROM "lending_items" WHERE "lending_items"."directory" = $1 LIMIT $2 [["directory", "b135297126_C068087930"], ["LIMIT", 1]]'
@@ -76,6 +77,7 @@ module BerkeleyLibrary
76
77
  msg = logged_json['msg']
77
78
  expect(msg).to eq(expected)
78
79
  end
80
+ # rubocop:enable Layout/LineLength
79
81
  end
80
82
 
81
83
  describe :ensure_hash do