redmine_airbrake_backend 1.3.0 → 1.4.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: a675ca6c57b6334a15a7f53bcfffc8e6ce4a75bedb9f562eda35cfec2741744b
4
- data.tar.gz: 825e1ed47ea45f1e2c186fd3c0f014bda2fd8ad1803048858dd2742b1989ce19
3
+ metadata.gz: e94a784058235695f5420da63caf59103aadd0e2f9479dc7ad6da0619b296035
4
+ data.tar.gz: 8dfb3a85f877301c7507c8066000d0e5677cb8df86d937243c55fce9963ba9d4
5
5
  SHA512:
6
- metadata.gz: f65356a879aa32b8e0d60244181e43a76e5ce34f6f2d5819e63f9522e3e346ff8535ae2add2919fa96c9ecd95af43d229e53b656f93611564e4be6ed92793b15
7
- data.tar.gz: b8ac9d2f823e7e484d4c5ff4b29cfd6fcf7aa34b616297f08957b518ba804a01a2fffcd2a6e3bde95cd108d1d66e5db6972583a5171383de5048b6d634895ebc
6
+ metadata.gz: 56af38387d929c822fe89205f77a05590ebc6e9bd4a7354791548821edff783b252bb0a7f5846b2116163a21c5afd35a98fe251b335d6c700cbaadf97f7b5f84
7
+ data.tar.gz: e53f9f81f788630b003c6fa2f1cd4c6cb135c22b2f9578f40a22f3091d97ec595439c003faaf6023aa14a0df1bd1503f5788ce4f23d50a7a1e96c1f76f87c645
@@ -6,7 +6,7 @@ stages:
6
6
 
7
7
  build:
8
8
  stage: build
9
- image: ruby:2.5
9
+ image: ruby:2.6
10
10
  script:
11
11
  - gem install bundler --no-document
12
12
  - bundle update
@@ -16,7 +16,7 @@ build:
16
16
 
17
17
  test:
18
18
  stage: test
19
- image: ruby:2.5
19
+ image: ruby:2.6
20
20
  script:
21
21
  - gem install bundler --no-document
22
22
  - bundle update
@@ -24,9 +24,9 @@ test:
24
24
 
25
25
  rubocop:
26
26
  stage: codequality
27
- image: ruby:2.5
27
+ image: ruby:2.6
28
28
  script:
29
- - gem install rubocop --no-document
29
+ - gem install rubocop rubocop-performance rubocop-rails --no-document
30
30
  - rubocop
31
31
 
32
32
  dependency_scanning:
@@ -1,3 +1,7 @@
1
+ require:
2
+ - rubocop-performance
3
+ - rubocop-rails
4
+
1
5
  AllCops:
2
6
  TargetRubyVersion: 2.4
3
7
  Exclude:
@@ -1,75 +1,87 @@
1
1
  # Changelog
2
+ All notable changes to this project will be documented in this file.
2
3
 
3
- ## 1.3.0 (2019-02-11)
4
- ### Changes
5
- - Redmine 4.0 / Rails 5.0 compatibility
6
-
7
- ## 1.2.4 (2019-01-30)
8
- ### Fixes
9
- - Require Rake::TestTask to avoid error with Redmine >= 4.0.0
10
-
11
- ## 1.2.3 (2019-01-27)
12
- ### Fixes
13
- - Fix reopen of issues
14
-
15
- ## 1.2.2 (2018-11-03)
16
- ### Fixes
17
- - Fix finding repository if no filename is for backtrace element
18
- ### Changes
19
- - Internal restructuring for better code style
20
- - Requires Ruby >= 2.4.0
21
- - Requires Redmine >= 3.4.0
22
-
23
- ## 1.2.1 (2018-01-29)
24
- ### Features
25
- - All responses are formatted as JSON
26
-
27
- ## 1.2.0 (2018-01-17)
28
- ### Features
29
- - Support airbrake token based authentication
30
-
31
- ## 1.1.2 (2017-12-12)
32
- ### Fixes
33
- - Prevent rendering of empty sections
34
- - Handle notices without a backtrace
35
-
36
- ## 1.1.1 (2016-05-18)
37
- ### Fixes
38
- - Add missing foreign_key option on issue category has many relation. Caused error on removing issue category
39
-
40
- ## 1.1.0 (2016-01-29)
41
- ### Fixes
42
- - Handle new ruby lambda backtrace syntax
43
- - Don't treat nested errors separately
44
-
45
- ## 1.0.3 (2016-01-26)
46
- ### Fixes
47
- - Fix syntax error
48
-
49
- ## 1.0.2 (2016-01-26)
50
- ### Fixes
51
- - Wrong status code for response
52
-
53
- ## 1.0.1 (2016-01-25)
54
- ### Fixes
55
- - Add space to comma separated key-value list in description tables
56
- - Exclude notifier information from context table
57
-
58
- ## 1.0.0 (2016-01-23)
59
- ### Changes
60
- - Add support for new v3 JSON notices
61
- - Add support for new v3 JSON iOS reports
62
- - Dropped support for old notices and reports APIs
63
- - Add permission to use Airbrake API. No longer bound to issue create permission
64
- - Added new key *column* in backtrace to ID calculation
65
- - Require Redmine >= 3.2.0
66
- - Show hashes in table sections (no recursion)
67
-
68
- ## 0.6.1 (2015-04-28)
69
- ### Fixes
70
- - Usage as Redmine plugin additional to gem
71
-
72
- ## 0.6.0 (2015-04-22)
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [1.4.0] - 2019-08-26
10
+ ### Fixed
11
+ - Mapping of backtrace elements to repository entries
12
+ ### Changed
13
+ - Respect new rubocop suggestions
14
+
15
+ ## [1.3.0] - 2019-02-11
16
+ ### Changed
17
+ - Redmine 4.0 / Rails 5.0 compatibility
18
+
19
+ ## [1.2.4] - 2019-01-30
20
+ ### Fixed
21
+ - Require Rake::TestTask to avoid error with Redmine >= 4.0.0
22
+
23
+ ## [1.2.3] - 2019-01-27
24
+ ### Fixed
25
+ - Fix reopen of issues
26
+
27
+ ## [1.2.2] - 2018-11-03
28
+ ### Fixed
29
+ - Fix finding repository if no filename is for backtrace element
30
+ ### Changed
31
+ - Internal restructuring for better code style
32
+ - Requires Ruby >= 2.4.0
33
+ - Requires Redmine >= 3.4.0
34
+
35
+ ## [1.2.1] - 2018-01-29
36
+ ### Added
37
+ - All responses are formatted as JSON
38
+
39
+ ## [1.2.0] - 2018-01-17
40
+ ### Added
41
+ - Support airbrake token based authentication
42
+
43
+ ## [1.1.2] - 2017-12-12
44
+ ### Fixed
45
+ - Prevent rendering of empty sections
46
+ - Handle notices without a backtrace
47
+
48
+ ## [1.1.1] - 2016-05-18
49
+ ### Fixed
50
+ - Add missing foreign_key option on issue category has many relation. Caused error on removing issue category
51
+
52
+ ## [1.1.0] - 2016-01-29
53
+ ### Fixed
54
+ - Handle new ruby lambda backtrace syntax
55
+ - Don't treat nested errors separately
56
+
57
+ ## [1.0.3] - 2016-01-26
58
+ ### Fixed
59
+ - Fix syntax error
60
+
61
+ ## [1.0.2] - 2016-01-26
62
+ ### Fixed
63
+ - Wrong status code for response
64
+
65
+ ## [1.0.1] - 2016-01-25
66
+ ### Fixed
67
+ - Add space to comma separated key-value list in description tables
68
+ - Exclude notifier information from context table
69
+
70
+ ## [1.0.0] - 2016-01-23
71
+ ### Changed
72
+ - Add support for new v3 JSON notices
73
+ - Add support for new v3 JSON iOS reports
74
+ - Dropped support for old notices and reports APIs
75
+ - Add permission to use Airbrake API. No longer bound to issue create permission
76
+ - Added new key *column* in backtrace to ID calculation
77
+ - Require Redmine >= 3.2.0
78
+ - Show hashes in table sections (no recursion)
79
+
80
+ ## [0.6.1] - 2015-04-28
81
+ ### Fixed
82
+ - Usage as Redmine plugin additional to gem
83
+
84
+ ## [0.6.0] - 2015-04-22
73
85
  ### Changed
74
- - Redmine 3.0.x compatibility
75
- - Switched from hpricot to nokogiri for XML parsing
86
+ - Redmine 3.0.x compatibility
87
+ - Switched from hpricot to nokogiri for XML parsing
data/README.md CHANGED
@@ -41,17 +41,18 @@ gem 'airbrake'
41
41
  And configure it, e.g. with an initializer `config/initializers/airbrake.rb`:
42
42
  ```ruby
43
43
  Airbrake.configure do |c|
44
- c.project_id = 'redmine_project_identifier'
45
- c.project_key = {
44
+ c.project_id = 'redmine_project_identifier'
45
+ c.project_key = {
46
46
  key: 'redmine_api_key', # the api key for a user which has permission to create issues in the project specified in the previous step
47
47
  tracker: 'Bug', # the name or id of your desired tracker (optional if default is configured)
48
48
  category: 'Development', # the name or id of a ticket category, optional
49
49
  priority: 5, # the name or id of the priority for new tickets, optional.
50
50
  assignee: 'admin' # the login or id of a user the ticket should get assigned to by default, optional
51
51
  }.to_json
52
- c.host = 'https://redmine.example.com/'
52
+ c.host = 'https://redmine.example.com/'
53
53
  c.root_directory = Rails.root
54
- c.environment = 'production'
54
+ c.environment = 'production'
55
+ c.performance_stats = false # Performance stats are not supported
55
56
  end
56
57
  ```
57
58
 
@@ -4,6 +4,7 @@ require 'redmine_airbrake_backend/notice'
4
4
 
5
5
  # Controller with airbrake related stuff
6
6
  class AirbrakeController < ::ApplicationController
7
+ include AirbrakeSettings
7
8
  include AirbrakeIssueHandling
8
9
  include AirbrakeRendering
9
10
 
@@ -19,7 +20,7 @@ class AirbrakeController < ::ApplicationController
19
20
  before_action :find_category
20
21
  before_action :find_priority
21
22
  before_action :find_assignee
22
- before_action :find_repository
23
+ before_action :find_repositories
23
24
 
24
25
  private
25
26
 
@@ -44,7 +45,7 @@ class AirbrakeController < ::ApplicationController
44
45
  end
45
46
 
46
47
  def authorize
47
- User.current = User.find_by_api_key(@key[:key])
48
+ User.current = User.find_by_api_key(@key[:key]) # rubocop:disable Rails/DynamicFindBy
48
49
 
49
50
  if User.current.blank? || User.current.anonymous?
50
51
  render_error('Failed to authenticate', :unauthorized)
@@ -63,7 +64,7 @@ class AirbrakeController < ::ApplicationController
63
64
  render_error('No or invalid tracker', :failed_dependency) if @tracker.blank?
64
65
 
65
66
  # Check notice ID field
66
- return unless @tracker.custom_fields.find_by(id: notice_hash_field.id).blank?
67
+ return if @tracker.custom_fields.find_by(id: notice_hash_field.id).present?
67
68
 
68
69
  render_error('Custom field for notice hash not available on selected tracker', :failed_dependency)
69
70
  end
@@ -80,8 +81,12 @@ class AirbrakeController < ::ApplicationController
80
81
  @assignee = record_for(@project.users, :assignee, %i[id login])
81
82
  end
82
83
 
83
- def find_repository
84
- @repository = @project.repositories.find_by(identifier: (@key[:repository] || ''))
84
+ def find_repositories
85
+ @repositories = if @key[:repositories].present?
86
+ @project.repositories.where(identifier: @key[:repositories].split(',').map(&:strip)).to_a
87
+ else
88
+ @project.repositories.to_a
89
+ end
85
90
  end
86
91
 
87
92
  def render_error(error, status = :internal_server_error)
@@ -116,16 +121,6 @@ class AirbrakeController < ::ApplicationController
116
121
  project_setting(key)
117
122
  end
118
123
 
119
- def global_setting(key)
120
- Setting.plugin_redmine_airbrake_backend[key.to_s]
121
- end
122
-
123
- def project_setting(key)
124
- return nil if @project.airbrake_settings.blank?
125
-
126
- @project.airbrake_settings.send(key) if @project.airbrake_settings.respond_to?(key)
127
- end
128
-
129
124
  def custom_field(key)
130
125
  @project.issue_custom_fields.find_by(id: global_setting(key)) ||
131
126
  CustomField.find_by(id: global_setting(key), is_for_all: true)
@@ -28,7 +28,7 @@ module AirbrakeIssueFinding
28
28
  author: User.current,
29
29
  category: @category,
30
30
  priority: @priority,
31
- description: render_description(notice),
31
+ description: render_description(notice, repositories: @repositories),
32
32
  assigned_to: @assignee
33
33
  )
34
34
 
@@ -69,7 +69,7 @@ module AirbrakeIssueHandling
69
69
  return if notice.environment_name.blank?
70
70
 
71
71
  desc = "*Issue reopened after occurring again in _#{notice.environment_name}_ environment.*"
72
- desc += "\n\n#{render_description(notice)}" if issue_reopen_repeat_description?
72
+ desc += "\n\n#{render_description(notice, repositories: @repositories)}" if issue_reopen_repeat_description?
73
73
 
74
74
  issue.status = issue.tracker.default_status
75
75
 
@@ -4,8 +4,8 @@
4
4
  module AirbrakeRendering
5
5
  extend ActiveSupport::Concern
6
6
 
7
- def render_description(notice)
8
- locals = { notice: notice }
7
+ def render_description(notice, locals)
8
+ locals = { notice: notice, repositories: [] }.merge(locals)
9
9
 
10
10
  if template_exists?("airbrake/issue_description/#{notice.type}")
11
11
  render_to_string("airbrake/issue_description/#{notice.type}", layout: false, locals: locals)
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Get Airbrake global or project settings
4
+ module AirbrakeSettings
5
+ extend ActiveSupport::Concern
6
+
7
+ private
8
+
9
+ def global_setting(key)
10
+ Setting.plugin_redmine_airbrake_backend[key.to_s]
11
+ end
12
+
13
+ def project_setting(key)
14
+ return nil if @project.airbrake_settings.blank?
15
+
16
+ @project.airbrake_settings.send(key) if @project.airbrake_settings.respond_to?(key)
17
+ end
18
+ end
@@ -36,8 +36,8 @@ module AirbrakeHelper
36
36
  end
37
37
 
38
38
  # Wiki markup for backtrace element with link to repository if possible
39
- def airbrake_format_backtrace_element(element)
40
- repository = airbrake_repository_for_backtrace_element(element)
39
+ def airbrake_format_backtrace_element(repositories, element)
40
+ repository = airbrake_repository_for_backtrace_element(repositories, element)
41
41
 
42
42
  markup = if repository.blank?
43
43
  airbrake_backtrace_element_markup_without_repository(element)
@@ -56,48 +56,28 @@ module AirbrakeHelper
56
56
 
57
57
  private
58
58
 
59
- def airbrake_repository_for_backtrace_element(element)
60
- return nil unless element.file.present?
61
- return nil unless element.file.start_with?('[PROJECT_ROOT]')
62
-
63
- filename = airbrake_filename_for_backtrace_element(element)
64
-
65
- airbrake_repositories_for_backtrace.find { |r| r.entry(filename) }
66
- end
67
-
68
- def airbrake_repositories_for_backtrace
69
- return @bactrace_repositories unless @bactrace_repositories.nil?
70
-
71
- @bactrace_repositories = if @repository.present?
72
- [@repository]
73
- else
74
- @project.repositories.to_a
75
- end
76
-
77
- @bactrace_repositories
78
- end
79
-
80
- def airbrake_filename_for_backtrace_element(element)
59
+ def airbrake_repository_for_backtrace_element(repositories, element)
60
+ return nil unless element.root.project?
81
61
  return nil if element.file.blank?
82
62
 
83
- element.file[14..-1]
63
+ (repositories || []).find { |r| r.entry(element.file) }
84
64
  end
85
65
 
86
66
  def airbrake_backtrace_element_markup_without_repository(element)
67
+ file = element.root.undefined? ? element.file : "[#{element.root.upcase}_ROOT]#{element.file}"
68
+
87
69
  if element.line.blank?
88
- "@#{element.file}@"
70
+ "@#{ile}@"
89
71
  else
90
- "@#{element.file}:#{element.line}@"
72
+ "@#{file}:#{element.line}@"
91
73
  end
92
74
  end
93
75
 
94
76
  def airbrake_backtrace_element_markup_with_repository(repository, element)
95
- filename = airbrake_filename_for_backtrace_element(element)
96
-
97
77
  if repository.identifier.blank?
98
- "source:\"#{filename}#L#{element.line}\""
78
+ "source:\"#{element.file}#L#{element.line}\""
99
79
  else
100
- "source:\"#{repository.identifier}|#{filename}#L#{element.line}\""
80
+ "source:\"#{repository.identifier}|#{element.file}#L#{element.line}\""
101
81
  end
102
82
  end
103
83
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Project-specific settings for airbrake
4
- class AirbrakeProjectSetting < ActiveRecord::Base
4
+ class AirbrakeProjectSetting < ActiveRecord::Base # rubocop:disable Rails/ApplicationRecord
5
5
  belongs_to :project
6
6
  belongs_to :tracker
7
- belongs_to :category, class_name: IssueCategory.name
8
- belongs_to :priority, class_name: IssuePriority.name
7
+ belongs_to :category, class_name: 'IssueCategory'
8
+ belongs_to :priority, class_name: 'IssuePriority'
9
9
 
10
10
  validates :project_id, presence: true
11
11
  end
@@ -4,7 +4,7 @@ h1. <%= airbrake_error_title(error) %>
4
4
  <% if error.backtrace.present? %>
5
5
  h2. Stacktrace:
6
6
 
7
- p((. <%= raw error.backtrace.map { |e| airbrake_format_backtrace_element(e) }.join("\n") %>
7
+ p((. <%= raw error.backtrace.map { |e| airbrake_format_backtrace_element(repositories, e) }.join("\n") %>
8
8
  <% end %>
9
9
 
10
10
  <% end %>
@@ -5,28 +5,41 @@ require 'digest/md5'
5
5
  module RedmineAirbrakeBackend
6
6
  # Backtrace element received by airbrake
7
7
  class BacktraceElement
8
- attr_reader :file, :line, :function, :column
8
+ DEFAULT_ROOT = ActiveSupport::StringInquirer.new('undefined')
9
9
 
10
- def initialize(data)
11
- # File
12
- @file = data[:file].presence
10
+ attr_reader :root, :file, :line, :function, :column
13
11
 
14
- # Line
12
+ def initialize(data)
13
+ @root, @file = parse_root_and_file(data[:file].presence)
15
14
  @line = data[:line].presence
16
-
17
- # Function
18
15
  @function = data[:function].presence
19
-
20
- # Column
21
16
  @column = data[:column].presence
22
17
  end
23
18
 
24
19
  def checksum
25
- @checksum ||= Digest::MD5.hexdigest("#{@file}|#{normalized_function_name}|#{@line}|#{@column}")
20
+ @checksum ||= Digest::MD5.hexdigest("#{root}|#{file}|#{normalized_function_name}|#{line}|#{column}")
21
+ end
22
+
23
+ def formatted_file
24
+ if root.undefined?
25
+ file
26
+ else
27
+ "[#{root.upcase}_ROOT]#{file}"
28
+ end
26
29
  end
27
30
 
28
31
  private
29
32
 
33
+ def parse_root_and_file(file)
34
+ return DEFAULT_ROOT, file if file.blank?
35
+
36
+ match = %r{\A/([A-Z]+)_ROOT(/.+)}.match(file.strip)
37
+
38
+ return ActiveSupport::StringInquirer.new(match[1].downcase), match[2].strip if match.present?
39
+
40
+ [DEFAULT_ROOT, file]
41
+ end
42
+
30
43
  def normalized_function_name
31
44
  name = @function
32
45
  .downcase
@@ -43,7 +43,7 @@ module RedmineAirbrakeBackend
43
43
  parse_message(line, error)
44
44
  end
45
45
 
46
- crashed_thread = false if line =~ /^Thread \d+:$/
46
+ crashed_thread = false if line.match?(/^Thread \d+:$/)
47
47
 
48
48
  if crashed_thread
49
49
  backtrace = parse_backtrace_element(line)
@@ -54,7 +54,7 @@ module RedmineAirbrakeBackend
54
54
  crashed_thread = true
55
55
  end
56
56
 
57
- next_line_is_message = true if line =~ /^Application Specific Information:$/
57
+ next_line_is_message = true if line.match?(/^Application Specific Information:$/)
58
58
  end
59
59
 
60
60
  return nil if error.blank?
@@ -9,7 +9,7 @@ module RedmineAirbrakeBackend
9
9
  extend ActiveSupport::Concern
10
10
 
11
11
  included do
12
- has_one :airbrake_settings, class_name: AirbrakeProjectSetting.name, dependent: :destroy
12
+ has_one :airbrake_settings, class_name: 'AirbrakeProjectSetting', dependent: :destroy
13
13
  end
14
14
  end
15
15
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module RedmineAirbrakeBackend
4
4
  # Version of this gem
5
- VERSION = '1.3.0'
5
+ VERSION = '1.4.0'
6
6
  end
@@ -25,4 +25,6 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'bundler'
26
26
  spec.add_development_dependency 'rake'
27
27
  spec.add_development_dependency 'rubocop'
28
+ spec.add_development_dependency 'rubocop-performance'
29
+ spec.add_development_dependency 'rubocop-rails'
28
30
  end
@@ -67,6 +67,6 @@ class NoticeTest < ActiveSupport::TestCase
67
67
  assert_equal(1, notice.errors.length)
68
68
  assert_equal('OpenURI::HTTPError', notice.errors.first.type)
69
69
  assert_equal('404 Not Found', notice.errors.first.message)
70
- assert_equal('a16abb78bf4b40460258c72cdc971ca0', notice.id)
70
+ assert_equal('cfc605db663aab8c1cc7864567dab734', notice.id)
71
71
  end
72
72
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmine_airbrake_backend
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Schwab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-11 00:00:00.000000000 Z
11
+ date: 2019-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-performance
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  description: Plugin which adds Airbrake support to Redmine
70
98
  email:
71
99
  - me@ydkn.de
@@ -89,6 +117,7 @@ files:
89
117
  - app/controllers/concerns/airbrake_issue_finding.rb
90
118
  - app/controllers/concerns/airbrake_issue_handling.rb
91
119
  - app/controllers/concerns/airbrake_rendering.rb
120
+ - app/controllers/concerns/airbrake_settings.rb
92
121
  - app/helpers/airbrake_helper.rb
93
122
  - app/models/airbrake_project_setting.rb
94
123
  - app/views/airbrake/issue_description/_section.erb
@@ -136,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
165
  - !ruby/object:Gem::Version
137
166
  version: '0'
138
167
  requirements: []
139
- rubygems_version: 3.0.2
168
+ rubygems_version: 3.0.3
140
169
  signing_key:
141
170
  specification_version: 4
142
171
  summary: This plugin provides the necessary API to use Redmine as a Airbrake backend