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 +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
|