govuk_app_config 2.0.3 → 2.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 832d6ea72e7f391510a2fab49870ffd35a1178fba7f2647fee90532e8b157001
4
- data.tar.gz: 85f60eda57af5b21ba06961defd6b563041cd932fe319a55d8d915862e1aa2ae
3
+ metadata.gz: 11f06b82c25ddd23f985b025b26abdcce2a1c4ab772cdbf129907962d8297da8
4
+ data.tar.gz: aa6e55ea958fd54cf9eb833762cbf3dfc24d310af1e3bf6dd8a010f3ad4d9bc9
5
5
  SHA512:
6
- metadata.gz: e409aeb8a6a21b56c0945d25f40678d5115f13b049296e32f876a1073242f17a2d2db3a484140eeeb2c71a6ae3f25350fef3badbea28daabc58ea93cbf7d215e
7
- data.tar.gz: 3745c70fe767196d1f90cfec77af282927ffbc6c7b38001e433ed60a485637b27d1175be217cdd16286b1dfd86fe3d68ad9b5ca6a6120aef359873e56d4cc18e
6
+ metadata.gz: c5f01c3eb3f450616bc04577f788a36a4907d690d5694f9e813c89c985b370ad2b94abc53653a3a98885fed96799d7f34085e2e478d545ee15ac9421e846800d
7
+ data.tar.gz: cbe282314f027a01ed6fd1aae0e490b67b0fcb8425dc802dc7311bab8d97dea60f531b30302879fbe4a11d01f95bd61edda203dda1539c01831ec089d71db278
@@ -0,0 +1,3 @@
1
+ inherit_gem:
2
+ rubocop-govuk:
3
+ - config/default.yml
@@ -1,3 +1,23 @@
1
+ # 2.2.1
2
+
3
+ * Fix linting issues (https://github.com/alphagov/govuk_app_config/pull/149)
4
+
5
+ # 2.2.0
6
+
7
+ * Monkey patch `ActionDispatch::DebugExceptions#log_error` so it logs errors on a single line (https://github.com/alphagov/govuk_app_config/pull/147)
8
+
9
+ # 2.1.2
10
+
11
+ * Add missing ActiveRecord rescue_responses (https://github.com/alphagov/govuk_app_config/pull/142)
12
+
13
+ # 2.1.1
14
+
15
+ * Revert using sentry option of rails_report_rescued_exceptions (https://github.com/alphagov/govuk_app_config/pull/140)
16
+
17
+ # 2.1.0
18
+
19
+ * Stop exceptions rescued by rails from appearing in Sentry (https://github.com/alphagov/govuk_app_config/pull/138)
20
+
1
21
  # 2.0.3
2
22
 
3
23
  * Add hmrc-uk.digital.nuance.com (Nuance/HMRC Webchat provider) and gov.klick2contact.com (HMPO web chat provider) to connect-src CSP list (https://github.com/alphagov/govuk_app_config/pull/133)
data/Rakefile CHANGED
@@ -3,4 +3,9 @@ require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ desc "Lint Ruby"
7
+ task :lint do
8
+ sh "bundle exec rubocop --format clang"
9
+ end
10
+
11
+ task default: %i[spec lint]
@@ -22,7 +22,7 @@ class CustomCheck
22
22
 
23
23
  # Optional
24
24
  def message
25
- "This is an optional custom message"
25
+ "This is an optional custom message that will show up in the alert in Icinga"
26
26
  end
27
27
 
28
28
  # Optional
@@ -1,5 +1,3 @@
1
- # coding: utf-8
2
-
3
1
  lib = File.expand_path("lib", __dir__)
4
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
3
  require "govuk_app_config/version"
@@ -23,15 +21,17 @@ Gem::Specification.new do |spec|
23
21
  spec.require_paths = %w[lib]
24
22
 
25
23
  spec.add_dependency "logstasher", ">= 1.2.2", "< 1.4.0"
26
- spec.add_dependency "sentry-raven", ">= 2.7.1", "< 2.14.0"
24
+ spec.add_dependency "sentry-raven", ">= 2.7.1", "< 3.1.0"
27
25
  spec.add_dependency "statsd-ruby", "~> 1.4.0"
28
26
  spec.add_dependency "unicorn", ">= 5.4", "< 5.6"
29
27
 
30
28
  spec.add_development_dependency "bundler", "~> 1.15"
31
29
  spec.add_development_dependency "climate_control"
30
+ spec.add_development_dependency "rack-test", "~> 1.1.0"
32
31
  spec.add_development_dependency "rails", "~> 6"
33
32
  spec.add_development_dependency "rake", "~> 13.0"
34
33
  spec.add_development_dependency "rspec", "~> 3.9.0"
35
34
  spec.add_development_dependency "rspec-its", "~> 1.3.0"
35
+ spec.add_development_dependency "rubocop-govuk"
36
36
  spec.add_development_dependency "webmock"
37
37
  end
@@ -1,5 +1,5 @@
1
1
  GovukError.configure do |config|
2
- config.before_send = Proc.new { |e|
2
+ config.before_send = proc { |e|
3
3
  GovukStatsd.increment("errors_occurred")
4
4
  GovukStatsd.increment("error_types.#{e.class.name.demodulize.underscore}")
5
5
  e
@@ -8,21 +8,34 @@ GovukError.configure do |config|
8
8
  config.silence_ready = !Rails.env.production? if defined?(Rails)
9
9
 
10
10
  config.excluded_exceptions = [
11
- 'AbstractController::ActionNotFound',
12
- 'ActionController::BadRequest',
13
- 'ActionController::InvalidAuthenticityToken',
14
- 'ActionController::ParameterMissing',
15
- 'ActionController::RoutingError',
16
- 'ActionController::UnknownAction',
17
- 'ActionController::UnknownHttpMethod',
18
- 'ActionDispatch::RemoteIp::IpSpoofAttackError',
19
- 'ActiveJob::DeserializationError',
20
- 'ActiveRecord::RecordNotFound',
21
- 'CGI::Session::CookieStore::TamperedWithCookie',
22
- 'GdsApi::HTTPIntermittentServerError',
23
- 'GdsApi::TimedOutException',
24
- 'Mongoid::Errors::DocumentNotFound',
25
- 'Sinatra::NotFound',
11
+ # Default ActionDispatch rescue responses
12
+ "ActionController::RoutingError",
13
+ "AbstractController::ActionNotFound",
14
+ "ActionController::MethodNotAllowed",
15
+ "ActionController::UnknownHttpMethod",
16
+ "ActionController::NotImplemented",
17
+ "ActionController::UnknownFormat",
18
+ "Mime::Type::InvalidMimeType",
19
+ "ActionController::MissingExactTemplate",
20
+ "ActionController::InvalidAuthenticityToken",
21
+ "ActionController::InvalidCrossOriginRequest",
22
+ "ActionDispatch::Http::Parameters::ParseError",
23
+ "ActionController::BadRequest",
24
+ "ActionController::ParameterMissing",
25
+ "Rack::QueryParser::ParameterTypeError",
26
+ "Rack::QueryParser::InvalidParameterError",
27
+ # Default ActiveRecord rescue responses
28
+ "ActiveRecord::RecordNotFound",
29
+ "ActiveRecord::StaleObjectError",
30
+ "ActiveRecord::RecordInvalid",
31
+ "ActiveRecord::RecordNotSaved",
32
+ # Additional items
33
+ "ActiveJob::DeserializationError",
34
+ "CGI::Session::CookieStore::TamperedWithCookie",
35
+ "GdsApi::HTTPIntermittentServerError",
36
+ "GdsApi::TimedOutException",
37
+ "Mongoid::Errors::DocumentNotFound",
38
+ "Sinatra::NotFound",
26
39
  ]
27
40
 
28
41
  # This will exclude exceptions that are triggered by one of the ignored
@@ -30,7 +43,7 @@ GovukError.configure do |config|
30
43
  # Rails will raise a ActionView::Template::Error, instead of the original error.
31
44
  config.inspect_exception_causes_for_exclusion = true
32
45
 
33
- config.transport_failure_callback = Proc.new {
46
+ config.transport_failure_callback = proc {
34
47
  GovukStatsd.increment("error_reports_failed")
35
48
  }
36
49
  end
@@ -9,15 +9,15 @@ module GovukContentSecurityPolicy
9
9
  # - https://cspvalidator.org
10
10
 
11
11
  GOVUK_DOMAINS = [
12
- '*.publishing.service.gov.uk',
12
+ "*.publishing.service.gov.uk",
13
13
  "*.#{ENV['GOVUK_APP_DOMAIN_EXTERNAL'] || ENV['GOVUK_APP_DOMAIN'] || 'dev.gov.uk'}",
14
14
  "www.gov.uk",
15
- "*.dev.gov.uk"
15
+ "*.dev.gov.uk",
16
16
  ].uniq.freeze
17
17
 
18
- GOOGLE_ANALYTICS_DOMAINS = %w(www.google-analytics.com
18
+ GOOGLE_ANALYTICS_DOMAINS = %w[www.google-analytics.com
19
19
  ssl.google-analytics.com
20
- stats.g.doubleclick.net).freeze
20
+ stats.g.doubleclick.net].freeze
21
21
 
22
22
  def self.build_policy(policy)
23
23
  # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/default-src
@@ -13,8 +13,8 @@ module GovukHealthcheck
13
13
  proc do
14
14
  [
15
15
  200,
16
- {"Content-Type" => "application/json"},
17
- [JSON.dump(healthcheck(checks))]
16
+ { "Content-Type" => "application/json" },
17
+ [JSON.dump(healthcheck(checks))],
18
18
  ]
19
19
  end
20
20
  end
@@ -7,7 +7,7 @@ module GovukHealthcheck
7
7
  def status
8
8
  ::ActiveRecord::Base.connection
9
9
  OK
10
- rescue StandardError => e
10
+ rescue StandardError
11
11
  CRITICAL
12
12
  end
13
13
  end
@@ -43,7 +43,7 @@ module GovukHealthcheck
43
43
  end
44
44
 
45
45
  def status?(status)
46
- component_statuses.values.any? {|s| s[:status] == status }
46
+ component_statuses.values.any? { |s| s[:status] == status }
47
47
  end
48
48
 
49
49
  def build_component_status(check)
@@ -41,7 +41,7 @@ module GovukHealthcheck
41
41
  thresholds: {
42
42
  critical: critical_threshold(queue: name),
43
43
  warning: warning_threshold(queue: name),
44
- }.select { |_, val| !(val.to_f.infinite? || val.to_f.nan?) },
44
+ }.reject { |_, val| val.to_f.infinite? || val.to_f.nan? },
45
45
  }
46
46
  end,
47
47
  }
@@ -51,11 +51,11 @@ module GovukHealthcheck
51
51
  raise "This method must be overriden to be a hash of queue names and data."
52
52
  end
53
53
 
54
- def critical_threshold(queue:)
54
+ def critical_threshold(queue:) # rubocop:disable Lint/UnusedMethodArgument
55
55
  raise "This method must be overriden to be the critical threshold."
56
56
  end
57
57
 
58
- def warning_threshold(queue:)
58
+ def warning_threshold(queue:) # rubocop:disable Lint/UnusedMethodArgument
59
59
  raise "This method must be overriden to be the warning threshold."
60
60
  end
61
61
  end
@@ -6,7 +6,6 @@ module GovukHealthcheck
6
6
 
7
7
  def status
8
8
  Sidekiq.redis_info ? OK : CRITICAL
9
-
10
9
  rescue StandardError
11
10
  # One would expect a Redis::BaseConnectionError, but this should be
12
11
  # critical if any exception is raised when making a call to redis.
@@ -1,5 +1,6 @@
1
- require 'logstasher'
2
- require 'action_controller'
1
+ require "logstasher"
2
+ require "action_controller"
3
+ require_relative "rails_ext/action_dispatch/debug_exceptions"
3
4
 
4
5
  module GovukLogging
5
6
  def self.configure
@@ -13,8 +14,11 @@ module GovukLogging
13
14
  #
14
15
  # To resolve this we've directed stdout to stderr, to cover any Rails
15
16
  # writing. This frees up the normal stdout for the logstasher logs.
17
+
18
+ # rubocop:disable Style/GlobalVars
16
19
  $real_stdout = $stdout.clone
17
20
  $stdout.reopen($stderr)
21
+ # rubocop:enable Style/GlobalVars
18
22
 
19
23
  # Send Rails' logs to STDERR because they're not JSON formatted.
20
24
  Rails.logger = ActiveSupport::TaggedLogging.new(Logger.new($stderr, level: Rails.logger.level))
@@ -22,7 +26,7 @@ module GovukLogging
22
26
  # Custom that will be added to the Rails request logs
23
27
  LogStasher.add_custom_fields do |fields|
24
28
  # Mirrors Nginx request logging, e.g GET /path/here HTTP/1.1
25
- fields[:request] = "#{request.request_method} #{request.fullpath} #{request.headers["SERVER_PROTOCOL"]}"
29
+ fields[:request] = "#{request.request_method} #{request.fullpath} #{request.headers['SERVER_PROTOCOL']}"
26
30
 
27
31
  # Pass request Id to logging
28
32
  fields[:govuk_request_id] = request.headers["GOVUK-Request-Id"]
@@ -44,13 +48,13 @@ module GovukLogging
44
48
  Rails.application.config.logstasher.job_enabled = false
45
49
 
46
50
  Rails.application.config.logstasher.logger = Logger.new(
47
- $real_stdout,
51
+ $real_stdout, # rubocop:disable Style/GlobalVars
48
52
  level: Rails.logger.level,
49
53
  formatter: proc { |_severity, _datetime, _progname, msg|
50
- "#{String === msg ? msg : msg.inspect}\n"
51
- }
54
+ "#{msg.is_a?(String) ? msg : msg.inspect}\n"
55
+ },
52
56
  )
53
- Rails.application.config.logstasher.supress_app_log = true
57
+ Rails.application.config.logstasher.suppress_app_log = true
54
58
 
55
59
  if defined?(GdsApi::Base)
56
60
  GdsApi::Base.default_options ||= {}
@@ -61,5 +65,7 @@ module GovukLogging
61
65
  GdsApi::Base.default_options[:logger] =
62
66
  Rails.application.config.logstasher.logger
63
67
  end
68
+
69
+ RailsExt::ActionDispatch.monkey_patch_log_error if RailsExt::ActionDispatch.should_monkey_patch_log_error?
64
70
  end
65
71
  end
@@ -4,10 +4,10 @@ require "forwardable"
4
4
  module GovukStatsd
5
5
  extend SingleForwardable
6
6
  def_delegators :client, :increment, :decrement, :count, :time, :timing,
7
- :gauge, :set, :batch
7
+ :gauge, :set, :batch
8
8
 
9
9
  def self.client
10
- @statsd_client ||= begin
10
+ @client ||= begin
11
11
  statsd_client = ::Statsd.new("localhost")
12
12
  statsd_client.namespace = ENV["GOVUK_STATSD_PREFIX"].to_s
13
13
  statsd_client
@@ -9,8 +9,9 @@ module GovukUnicorn
9
9
  config.stderr_path "#{ENV['GOVUK_APP_LOGROOT']}/app.err.log"
10
10
  end
11
11
 
12
- config.before_exec do |server|
12
+ config.before_exec do |_server|
13
13
  next unless ENV["GOVUK_APP_ROOT"]
14
+
14
15
  ENV["BUNDLE_GEMFILE"] = "#{ENV['GOVUK_APP_ROOT']}/Gemfile"
15
16
  end
16
17
 
@@ -0,0 +1,52 @@
1
+ require "action_dispatch/middleware/debug_exceptions"
2
+
3
+ module GovukLogging
4
+ module RailsExt
5
+ module ActionDispatch
6
+ def self.should_monkey_patch_log_error?(clazz = ::ActionDispatch::DebugExceptions)
7
+ empty_instance = clazz.new nil
8
+ target_method = empty_instance.method :log_error
9
+
10
+ expected_parameters = [%i[req request], %i[req wrapper]]
11
+ actual_parameters = target_method.parameters
12
+
13
+ should_monkey_patch = actual_parameters == expected_parameters
14
+
15
+ unless should_monkey_patch
16
+ Rails.logger.warn "Refused to monkey patch ::ActionDispatch::DebugExceptions#log_error - " \
17
+ "signatures do not match. " \
18
+ "Expected #{expected_parameters}, but got #{actual_parameters}"
19
+ end
20
+
21
+ should_monkey_patch
22
+ rescue StandardError => e
23
+ Rails.logger.warn "Failed to detect whether to monkey patch " \
24
+ "::ActionDispatch::DebugExceptions#log_error - #{e.inspect}"
25
+ false
26
+ end
27
+
28
+ def self.monkey_patch_log_error(clazz = ::ActionDispatch::DebugExceptions)
29
+ clazz.class_eval do
30
+ private
31
+
32
+ def log_error(request, wrapper)
33
+ logger = logger(request)
34
+
35
+ return unless logger
36
+
37
+ exception = wrapper.exception
38
+
39
+ trace = wrapper.application_trace
40
+ trace = wrapper.framework_trace if trace.empty?
41
+
42
+ logger.fatal({
43
+ exception_class: exception.class.to_s,
44
+ exception_message: exception.message,
45
+ stacktrace: trace,
46
+ }.to_json)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,3 +1,3 @@
1
1
  module GovukAppConfig
2
- VERSION = "2.0.3"
2
+ VERSION = "2.2.1".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_app_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-06 00:00:00.000000000 Z
11
+ date: 2020-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstasher
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: 2.7.1
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: 2.14.0
42
+ version: 3.1.0
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,7 +49,7 @@ dependencies:
49
49
  version: 2.7.1
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: 2.14.0
52
+ version: 3.1.0
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: statsd-ruby
55
55
  requirement: !ruby/object:Gem::Requirement
@@ -112,6 +112,20 @@ dependencies:
112
112
  - - ">="
113
113
  - !ruby/object:Gem::Version
114
114
  version: '0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: rack-test
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: 1.1.0
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: 1.1.0
115
129
  - !ruby/object:Gem::Dependency
116
130
  name: rails
117
131
  requirement: !ruby/object:Gem::Requirement
@@ -168,6 +182,20 @@ dependencies:
168
182
  - - "~>"
169
183
  - !ruby/object:Gem::Version
170
184
  version: 1.3.0
185
+ - !ruby/object:Gem::Dependency
186
+ name: rubocop-govuk
187
+ requirement: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ type: :development
193
+ prerelease: false
194
+ version_requirements: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
171
199
  - !ruby/object:Gem::Dependency
172
200
  name: webmock
173
201
  requirement: !ruby/object:Gem::Requirement
@@ -191,6 +219,7 @@ extra_rdoc_files: []
191
219
  files:
192
220
  - ".gitignore"
193
221
  - ".rspec"
222
+ - ".rubocop.yml"
194
223
  - ".ruby-version"
195
224
  - CHANGELOG.md
196
225
  - Gemfile
@@ -218,6 +247,7 @@ files:
218
247
  - lib/govuk_app_config/govuk_logging.rb
219
248
  - lib/govuk_app_config/govuk_statsd.rb
220
249
  - lib/govuk_app_config/govuk_unicorn.rb
250
+ - lib/govuk_app_config/rails_ext/action_dispatch/debug_exceptions.rb
221
251
  - lib/govuk_app_config/railtie.rb
222
252
  - lib/govuk_app_config/version.rb
223
253
  homepage: https://github.com/alphagov/govuk_app_config