ndr_error 2.0.2 → 2.3.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
2
  SHA256:
3
- metadata.gz: 5dd7e6a0913bf10fcf2b1a3aac9f963f201f4f32d3fb59adf874a4a6eac51736
4
- data.tar.gz: a3492d3af1d28af880fbf560d6419e3c4ea8eca38e562d872174c53f7ccfb690
3
+ metadata.gz: 905684f0ea130a6c5613e2df87f46d0e098fe6d16ebcc5647594318bc55cf4a1
4
+ data.tar.gz: cc8defe0ac32639a4b3b86d7756e6bdbd9fac7a8f0c1923ec2f4982cdfe5f076
5
5
  SHA512:
6
- metadata.gz: 9285560f82cc42c548f3c36ce93763c64e5c9b354a42d39475c6d826fa03c65ca794a5ff5465ee89e411dc7e764079d26c32fc723d6ee90057e6a461b995c64b
7
- data.tar.gz: 6ff76ea64127ba4fb70828ccc0edb7993c80c5d5d793cf1a64d83bb6f74e54e53edaab15f9bffd58818f7c28cc65920762447cceebc3278fd8e2354239173f5f
6
+ metadata.gz: ee098ccf9dab59e79c533139b754a41306c2cf7d0425098ffeb338dd770d16b53ebb7b818f4976b5c92235831205a8a6e18aa4c39c8c2fc01aab6c05cb120c98
7
+ data.tar.gz: f8fed40535c7289b0375393518bcca2017dd6f7dea525d4fdc9e22d185cf86f9f23ac5b25a98c60106e8489d2eec1b10399406097ad65586962ff8c49f9504dc
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # NdrError [![Build Status](https://travis-ci.org/PublicHealthEngland/ndr_error.svg?branch=master)](https://travis-ci.org/PublicHealthEngland/ndr_error) [![Gem Version](https://badge.fury.io/rb/ndr_error.svg)](https://badge.fury.io/rb/ndr_error)
1
+ # NdrError [![Build Status](https://github.com/publichealthengland/ndr_error/workflows/Test/badge.svg)](https://github.com/publichealthengland/ndr_error/actions?query=workflow%3Atest) [![Gem Version](https://badge.fury.io/rb/ndr_error.svg)](https://rubygems.org/gems/ndr_error)
2
2
 
3
3
  This is the Public Health England (PHE) National Disease Registers (NDR) Error ruby gem. It is a
4
4
  Rails engine that provides error logging, viewing, and grouping capabilities.
@@ -38,6 +38,11 @@ a Rack application that can be used as part of the Rails exception-handling midd
38
38
 
39
39
  In the host application's `application.rb`, the following configuration can be added:
40
40
 
41
+ To log the error, but have the host application's routing respond:
42
+ ```ruby
43
+ config.exceptions_app = NdrError::Recorder.new(self.routes)
44
+ ```
45
+ or log the error, then serve error templates from `public/` (legacy):
41
46
  ```ruby
42
47
  require 'ndr_error/middleware/public_exceptions'
43
48
  # Configure the ActionDispatch::ShowExceptions middleware to use NdrError's exception logger:
@@ -1,5 +1,3 @@
1
- require 'ndr_ui'
2
-
3
1
  module NdrError
4
2
  # Global controller logic
5
3
  class ApplicationController < ActionController::Base
@@ -6,22 +6,23 @@ module NdrError
6
6
 
7
7
  self.primary_key = 'error_fingerprintid'
8
8
 
9
- belongs_to_options = {
10
- class_name: 'NdrError::Fingerprint',
11
- foreign_key: 'causal_error_fingerprintid'
12
- }
13
- belongs_to_options[:optional] = true if Rails::VERSION::MAJOR > 4
14
- belongs_to :causal_error_fingerprint, belongs_to_options
9
+ belongs_to :causal_error_fingerprint,
10
+ class_name: 'NdrError::Fingerprint',
11
+ foreign_key: 'causal_error_fingerprintid',
12
+ inverse_of: :caused_error_fingerprints,
13
+ optional: true
15
14
 
16
15
  has_many :caused_error_fingerprints,
17
16
  class_name: 'NdrError::Fingerprint',
18
- foreign_key: 'causal_error_fingerprintid'
17
+ foreign_key: 'causal_error_fingerprintid',
18
+ inverse_of: :causal_error_fingerprint
19
19
 
20
20
  has_many :error_logs,
21
21
  -> { latest_first },
22
22
  autosave: true,
23
23
  class_name: 'NdrError::Log',
24
- foreign_key: 'error_fingerprintid'
24
+ foreign_key: 'error_fingerprintid',
25
+ inverse_of: :error_fingerprint
25
26
 
26
27
  validate :ensure_ticket_url_matched_a_supplied_format
27
28
 
@@ -15,7 +15,8 @@ module NdrError
15
15
 
16
16
  belongs_to :error_fingerprint,
17
17
  class_name: 'NdrError::Fingerprint',
18
- foreign_key: 'error_fingerprintid'
18
+ foreign_key: 'error_fingerprintid',
19
+ inverse_of: :error_logs
19
20
 
20
21
  scope :deleted, -> { where("status like 'deleted%'") }
21
22
  scope :not_deleted, -> { where("(status is null) or (status not like 'deleted%')") }
@@ -0,0 +1,27 @@
1
+ module NdrError
2
+ # contains logic for registering callbacks
3
+ module Callbacks
4
+ def self.extended(base)
5
+ base.mattr_accessor :_after_log_callbacks
6
+ base._after_log_callbacks = []
7
+ end
8
+
9
+ # Register callbacks that will be called after an exception
10
+ # has been logged.
11
+ #
12
+ # NdrError.after_log do |exception, fingerprint, log|
13
+ # # ...
14
+ # end
15
+ #
16
+ # Multiple callbacks can be registered.
17
+ def after_log(&block)
18
+ _after_log_callbacks << block
19
+ end
20
+
21
+ def run_after_log_callbacks(*args)
22
+ _after_log_callbacks.each do |callback|
23
+ callback.call(*args)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,7 @@
1
1
  require 'active_support/all' # TODO: want duration
2
2
 
3
+ require 'ndr_ui/engine'
4
+
3
5
  require 'will_paginate'
4
6
  require 'will_paginate/array'
5
7
 
@@ -12,11 +14,13 @@ module NdrError
12
14
 
13
15
  # Hook into host app's asset pipeline
14
16
  initializer 'ndr_error.assets.precompile' do |app|
15
- app.config.assets.precompile += %w[
16
- ndr_error/ndr_error.css
17
- ndr_error/ndr_error.js
18
- ndr_error/bootstrap/glyphicons-halflings-regular*
19
- ]
17
+ if app.config.respond_to?(:assets)
18
+ app.config.assets.precompile += %w[
19
+ ndr_error/ndr_error.css
20
+ ndr_error/ndr_error.js
21
+ ndr_error/bootstrap/glyphicons-halflings-regular*
22
+ ]
23
+ end
20
24
  end
21
25
 
22
26
  # Extract context filtering from the host application
@@ -16,9 +16,11 @@ module NdrError
16
16
 
17
17
  print = Fingerprint.find_or_create_by_id(log.md5_digest)
18
18
  print.causal_error_fingerprint = parent_print
19
- error = print.store_log(log)
19
+ log = print.store_log(log)
20
20
 
21
- [print, error]
21
+ NdrError.run_after_log_callbacks(exception, print, log)
22
+
23
+ [print, log]
22
24
  end
23
25
 
24
26
  def monitor(ancillary_data: {}, request: nil, swallow: false)
@@ -1,40 +1,9 @@
1
1
  module NdrError
2
2
  module Middleware
3
3
  # Middleware for logging exceptions, can be used as exception_app for Rails.
4
- class PublicExceptions < ::ActionDispatch::PublicExceptions
5
- def call(env)
6
- rescuing_everything do
7
- request = ActionDispatch::Request.new(env)
8
- exception = env['action_dispatch.exception']
9
-
10
- # "falsey" callback return value allows logging to be skipped
11
- log_exception(request, exception) if run_exception_callback(request, exception)
12
- end
13
-
14
- super # Invoke the PublicExceptions behaviour
15
- end
16
-
17
- private
18
-
19
- def log_exception(request, exception)
20
- parameters = NdrError.log_parameters.call(request)
21
- _fingerprint, _log = NdrError.log(exception, parameters, request)
22
- end
23
-
24
- def run_exception_callback(request, exception)
25
- NdrError.exception_app_callback.call(request, exception)
26
- end
27
-
28
- # Unhandled exceptions with logging could terminate the web server!
29
- def rescuing_everything
30
- yield
31
- rescue Exception => exception # rubocop:disable Lint/RescueException
32
- # "Log the exception caused by logging an exception..."
33
- Rails.logger.warn <<-MSG.strip_heredoc
34
- NdrError failed to log an exception!
35
- logging error class: #{exception.class}
36
- logging error message: #{exception.message}
37
- MSG
4
+ class PublicExceptions < NdrError::Recorder
5
+ def initialize(public_path)
6
+ super ::ActionDispatch::PublicExceptions.new(public_path)
38
7
  end
39
8
  end
40
9
  end
@@ -0,0 +1,45 @@
1
+ module NdrError
2
+ # Middleware for logging exceptions, can be used as exception_app for Rails.
3
+ class Recorder
4
+ # the parent_handler could be the host app's routes, or an instance
5
+ # of ActionDispatch::PublicExceptions, or any other middleware.
6
+ def initialize(parent_handler)
7
+ @parent_handler = parent_handler
8
+ end
9
+
10
+ def call(env)
11
+ rescuing_everything do
12
+ request = ActionDispatch::Request.new(env)
13
+ exception = env['action_dispatch.exception']
14
+
15
+ # "falsey" callback return value allows logging to be skipped
16
+ log_exception(request, exception) if run_exception_callback(request, exception)
17
+ end
18
+
19
+ @parent_handler.call(env)
20
+ end
21
+
22
+ private
23
+
24
+ def log_exception(request, exception)
25
+ parameters = NdrError.log_parameters.call(request)
26
+ _fingerprint, _log = NdrError.log(exception, parameters, request)
27
+ end
28
+
29
+ def run_exception_callback(request, exception)
30
+ NdrError.exception_app_callback.call(request, exception)
31
+ end
32
+
33
+ # Unhandled exceptions with logging could terminate the web server!
34
+ def rescuing_everything
35
+ yield
36
+ rescue Exception => exception # rubocop:disable Lint/RescueException
37
+ # "Log the exception caused by logging an exception..."
38
+ Rails.logger.warn <<-MSG.strip_heredoc
39
+ NdrError failed to log an exception!
40
+ logging error class: #{exception.class}
41
+ logging error message: #{exception.message}
42
+ MSG
43
+ end
44
+ end
45
+ end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Contains the version of NdrError. Sourced by the gemspec.
4
4
  module NdrError
5
- VERSION = '2.0.2'.freeze
5
+ VERSION = '2.3.0'
6
6
  end
data/lib/ndr_error.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'ndr_error/engine'
2
+ require 'ndr_error/recorder'
2
3
 
3
4
  require 'ndr_error/backtrace_compression'
5
+ require 'ndr_error/callbacks'
4
6
  require 'ndr_error/finder'
5
7
  require 'ndr_error/fuzzing'
6
8
  require 'ndr_error/logging'
@@ -8,6 +10,7 @@ require 'ndr_error/uuid_builder'
8
10
 
9
11
  # Configuration for NdrError + convienence methods.
10
12
  module NdrError
13
+ extend Callbacks
11
14
  extend Finder
12
15
  extend Logging
13
16
 
@@ -95,6 +98,6 @@ module NdrError
95
98
  # 4.2 compatability layer is targetted since all the bundled migrations were written prior to
96
99
  # Rails 5.
97
100
  def self.migration_class
98
- Rails::VERSION::MAJOR < 5 ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
101
+ ActiveRecord::Migration[4.2]
99
102
  end
100
103
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ndr_error
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - NCRS Development Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-16 00:00:00.000000000 Z
11
+ date: 2022-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5.2'
19
+ version: '6.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '7'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '5.2'
29
+ version: '6.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '7'
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: puma
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: sqlite3
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -132,22 +146,16 @@ dependencies:
132
146
  name: ndr_dev_support
133
147
  requirement: !ruby/object:Gem::Requirement
134
148
  requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: '3.1'
138
149
  - - ">="
139
150
  - !ruby/object:Gem::Version
140
- version: 3.1.3
151
+ version: '5.10'
141
152
  type: :development
142
153
  prerelease: false
143
154
  version_requirements: !ruby/object:Gem::Requirement
144
155
  requirements:
145
- - - "~>"
146
- - !ruby/object:Gem::Version
147
- version: '3.1'
148
156
  - - ">="
149
157
  - !ruby/object:Gem::Version
150
- version: 3.1.3
158
+ version: '5.10'
151
159
  - !ruby/object:Gem::Dependency
152
160
  name: simplecov
153
161
  requirement: !ruby/object:Gem::Requirement
@@ -189,11 +197,13 @@ files:
189
197
  - db/migrate/20180203174345_add_cause_to_error_fingerprints.rb
190
198
  - lib/ndr_error.rb
191
199
  - lib/ndr_error/backtrace_compression.rb
200
+ - lib/ndr_error/callbacks.rb
192
201
  - lib/ndr_error/engine.rb
193
202
  - lib/ndr_error/finder.rb
194
203
  - lib/ndr_error/fuzzing.rb
195
204
  - lib/ndr_error/logging.rb
196
205
  - lib/ndr_error/middleware/public_exceptions.rb
206
+ - lib/ndr_error/recorder.rb
197
207
  - lib/ndr_error/uuid_builder.rb
198
208
  - lib/ndr_error/version.rb
199
209
  - lib/tasks/ndr_error_tasks.rake
@@ -209,14 +219,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
209
219
  requirements:
210
220
  - - ">="
211
221
  - !ruby/object:Gem::Version
212
- version: '2.5'
222
+ version: '2.6'
213
223
  required_rubygems_version: !ruby/object:Gem::Requirement
214
224
  requirements:
215
225
  - - ">="
216
226
  - !ruby/object:Gem::Version
217
227
  version: '0'
218
228
  requirements: []
219
- rubygems_version: 3.0.3
229
+ rubygems_version: 3.1.6
220
230
  signing_key:
221
231
  specification_version: 4
222
232
  summary: Rails exception logging