ndr_error 2.0.2 → 2.3.0

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