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 +4 -4
- data/.gitlab-ci.yml +4 -4
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +84 -72
- data/README.md +5 -4
- data/app/controllers/airbrake_controller.rb +10 -15
- data/app/controllers/concerns/airbrake_issue_finding.rb +1 -1
- data/app/controllers/concerns/airbrake_issue_handling.rb +1 -1
- data/app/controllers/concerns/airbrake_rendering.rb +2 -2
- data/app/controllers/concerns/airbrake_settings.rb +18 -0
- data/app/helpers/airbrake_helper.rb +11 -31
- data/app/models/airbrake_project_setting.rb +3 -3
- data/app/views/airbrake/issue_description/default.erb +1 -1
- data/lib/redmine_airbrake_backend/backtrace_element.rb +23 -10
- data/lib/redmine_airbrake_backend/ios_report.rb +2 -2
- data/lib/redmine_airbrake_backend/patches/project.rb +1 -1
- data/lib/redmine_airbrake_backend/version.rb +1 -1
- data/redmine_airbrake_backend.gemspec +2 -0
- data/test/unit/notice_test.rb +1 -1
- metadata +32 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e94a784058235695f5420da63caf59103aadd0e2f9479dc7ad6da0619b296035
|
4
|
+
data.tar.gz: 8dfb3a85f877301c7507c8066000d0e5677cb8df86d937243c55fce9963ba9d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56af38387d929c822fe89205f77a05590ebc6e9bd4a7354791548821edff783b252bb0a7f5846b2116163a21c5afd35a98fe251b335d6c700cbaadf97f7b5f84
|
7
|
+
data.tar.gz: e53f9f81f788630b003c6fa2f1cd4c6cb135c22b2f9578f40a22f3091d97ec595439c003faaf6023aa14a0df1bd1503f5788ce4f23d50a7a1e96c1f76f87c645
|
data/.gitlab-ci.yml
CHANGED
@@ -6,7 +6,7 @@ stages:
|
|
6
6
|
|
7
7
|
build:
|
8
8
|
stage: build
|
9
|
-
image: ruby:2.
|
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.
|
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.
|
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:
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,75 +1,87 @@
|
|
1
1
|
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
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
|
-
|
75
|
-
|
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
|
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
|
52
|
+
c.host = 'https://redmine.example.com/'
|
53
53
|
c.root_directory = Rails.root
|
54
|
-
c.environment
|
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 :
|
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
|
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
|
84
|
-
@
|
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)
|
@@ -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.
|
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
|
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
|
-
"@#{
|
70
|
+
"@#{ile}@"
|
89
71
|
else
|
90
|
-
"@#{
|
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:\"#{
|
78
|
+
"source:\"#{element.file}#L#{element.line}\""
|
99
79
|
else
|
100
|
-
"source:\"#{repository.identifier}|#{
|
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
|
8
|
-
belongs_to :priority, class_name: IssuePriority
|
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
|
-
|
8
|
+
DEFAULT_ROOT = ActiveSupport::StringInquirer.new('undefined')
|
9
9
|
|
10
|
-
|
11
|
-
# File
|
12
|
-
@file = data[:file].presence
|
10
|
+
attr_reader :root, :file, :line, :function, :column
|
13
11
|
|
14
|
-
|
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("#{
|
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
|
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
|
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
|
12
|
+
has_one :airbrake_settings, class_name: 'AirbrakeProjectSetting', dependent: :destroy
|
13
13
|
end
|
14
14
|
end
|
15
15
|
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
|
data/test/unit/notice_test.rb
CHANGED
@@ -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('
|
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.
|
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-
|
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.
|
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
|