redmine_airbrake_backend 1.3.0 → 1.4.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: 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