redmine_airbrake_backend 1.2.1 → 1.2.2
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 +42 -0
- data/.rubocop.yml +13 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +3 -1
- data/README.md +0 -4
- data/Rakefile +2 -1
- data/app/controllers/airbrake_controller.rb +32 -137
- data/app/controllers/airbrake_notice_controller.rb +8 -6
- data/app/controllers/airbrake_project_settings_controller.rb +6 -4
- data/app/controllers/airbrake_report_controller.rb +2 -0
- data/app/controllers/concerns/airbrake_attachments.rb +56 -0
- data/app/controllers/concerns/airbrake_issue_handling.rb +109 -0
- data/app/controllers/concerns/airbrake_rendering.rb +16 -0
- data/app/helpers/airbrake_helper.rb +35 -23
- data/app/models/airbrake_project_setting.rb +2 -0
- data/bin/rails +3 -3
- data/config/routes.rb +2 -0
- data/db/migrate/20130708102357_create_airbrake_project_settings.rb +3 -0
- data/db/migrate/20131003151228_add_reopen_repeat_description.rb +3 -0
- data/lib/redmine_airbrake_backend.rb +3 -0
- data/lib/redmine_airbrake_backend/backtrace_element.rb +6 -4
- data/lib/redmine_airbrake_backend/engine.rb +27 -25
- data/lib/redmine_airbrake_backend/error.rb +2 -0
- data/lib/redmine_airbrake_backend/ios_report.rb +33 -28
- data/lib/redmine_airbrake_backend/notice.rb +43 -27
- data/lib/redmine_airbrake_backend/patches/issue_category.rb +10 -5
- data/lib/redmine_airbrake_backend/patches/issue_priority.rb +10 -5
- data/lib/redmine_airbrake_backend/patches/project.rb +10 -5
- data/lib/redmine_airbrake_backend/patches/projects_helper.rb +16 -11
- data/lib/redmine_airbrake_backend/patches/tracker.rb +10 -5
- data/lib/redmine_airbrake_backend/version.rb +3 -1
- data/lib/tasks/test.rake +11 -9
- data/redmine_airbrake_backend.gemspec +10 -6
- data/test/unit/notice_test.rb +1 -1
- metadata +24 -5
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'redmine_airbrake_backend/error'
|
2
4
|
|
3
5
|
module RedmineAirbrakeBackend
|
@@ -7,32 +9,18 @@ module RedmineAirbrakeBackend
|
|
7
9
|
attr_reader :errors, :params, :session, :context, :environment, :application, :attachments
|
8
10
|
|
9
11
|
def initialize(options)
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
# Params
|
14
|
-
@params = options[:params]
|
15
|
-
|
16
|
-
# Session
|
17
|
-
@session = options[:session]
|
12
|
+
# Set instance variables from options
|
13
|
+
instance_variables_from_options(options, %i[errors params session environment application])
|
14
|
+
instance_variables_from_options(options, %i[attachments], ensure_array: true)
|
18
15
|
|
19
16
|
# Context
|
20
|
-
@context = options
|
21
|
-
|
22
|
-
# Environment
|
23
|
-
@environment = options[:environment]
|
24
|
-
|
25
|
-
# Application
|
26
|
-
@application = options[:application]
|
27
|
-
|
28
|
-
# Attachments
|
29
|
-
@attachments = (options[:attachments].presence || []).compact
|
17
|
+
@context = context_from_options(options)
|
30
18
|
|
31
19
|
# Environment name
|
32
|
-
@environment_name = options
|
20
|
+
@environment_name = environment_name_from_options(options)
|
33
21
|
|
34
22
|
# Type
|
35
|
-
@type =
|
23
|
+
@type = type_from_options(options)
|
36
24
|
|
37
25
|
# Error ID
|
38
26
|
@id = generate_id
|
@@ -43,21 +31,49 @@ module RedmineAirbrakeBackend
|
|
43
31
|
|
44
32
|
private
|
45
33
|
|
34
|
+
def instance_variables_from_options(options, keys, opts = {})
|
35
|
+
keys.each do |key|
|
36
|
+
value = options[key]
|
37
|
+
|
38
|
+
value = value.compact if value.is_a?(Array) || value.is_a?(Hash)
|
39
|
+
value = Array(value) if opts[:ensure_array]
|
40
|
+
|
41
|
+
instance_variable_set("@#{key}", value)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def context_from_options(options)
|
46
|
+
options[:context].reject { |k, _| ['notifier'].include?(k) }
|
47
|
+
end
|
48
|
+
|
49
|
+
def environment_name_from_options(options)
|
50
|
+
return nil if options[:context].blank?
|
51
|
+
|
52
|
+
options[:context][:environment].presence
|
53
|
+
end
|
54
|
+
|
55
|
+
def type_from_options(options)
|
56
|
+
return options[:type] if options[:type].present?
|
57
|
+
|
58
|
+
return nil if options[:context].blank? || options[:context][:language].blank?
|
59
|
+
|
60
|
+
options[:context][:language].strip.split('/', 2).first.downcase
|
61
|
+
end
|
62
|
+
|
46
63
|
def generate_id
|
47
64
|
Digest::MD5.hexdigest(@errors.map(&:id).join("\n"))
|
48
65
|
end
|
49
66
|
|
50
67
|
def generate_subject
|
51
68
|
error = @errors.first
|
52
|
-
s = ''
|
53
69
|
|
54
|
-
if error.type.blank? || error.message.starts_with?("#{error.type}:")
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
70
|
+
subject = if error.type.blank? || error.message.starts_with?("#{error.type}:")
|
71
|
+
"[#{@id[0..7]}] #{error.message}"
|
72
|
+
else
|
73
|
+
"[#{@id[0..7]}] #{error.type}: #{error.message}"
|
74
|
+
end
|
59
75
|
|
60
|
-
|
76
|
+
subject[0..254].strip
|
61
77
|
end
|
62
78
|
end
|
63
79
|
end
|
@@ -1,11 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
|
-
module RedmineAirbrakeBackend
|
4
|
-
module
|
5
|
-
|
5
|
+
module RedmineAirbrakeBackend
|
6
|
+
module Patches
|
7
|
+
# Patches for IssueCategory
|
8
|
+
module IssueCategory
|
9
|
+
extend ActiveSupport::Concern
|
6
10
|
|
7
|
-
|
8
|
-
|
11
|
+
included do
|
12
|
+
has_many :airbrake_project_settings, foreign_key: :category_id, dependent: :nullify
|
13
|
+
end
|
9
14
|
end
|
10
15
|
end
|
11
16
|
end
|
@@ -1,11 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
|
-
module RedmineAirbrakeBackend
|
4
|
-
module
|
5
|
-
|
5
|
+
module RedmineAirbrakeBackend
|
6
|
+
module Patches
|
7
|
+
# Patches for IssuePriority
|
8
|
+
module IssuePriority
|
9
|
+
extend ActiveSupport::Concern
|
6
10
|
|
7
|
-
|
8
|
-
|
11
|
+
included do
|
12
|
+
has_many :airbrake_project_settings, dependent: :nullify
|
13
|
+
end
|
9
14
|
end
|
10
15
|
end
|
11
16
|
end
|
@@ -1,11 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
|
-
module RedmineAirbrakeBackend
|
4
|
-
module
|
5
|
-
|
5
|
+
module RedmineAirbrakeBackend
|
6
|
+
module Patches
|
7
|
+
# Patches for Project
|
8
|
+
module Project
|
9
|
+
extend ActiveSupport::Concern
|
6
10
|
|
7
|
-
|
8
|
-
|
11
|
+
included do
|
12
|
+
has_one :airbrake_settings, class_name: AirbrakeProjectSetting.name, dependent: :destroy
|
13
|
+
end
|
9
14
|
end
|
10
15
|
end
|
11
16
|
end
|
@@ -1,25 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
|
-
module RedmineAirbrakeBackend
|
4
|
-
module
|
5
|
-
|
5
|
+
module RedmineAirbrakeBackend
|
6
|
+
module Patches
|
7
|
+
# Patches for ProjectsHelper
|
8
|
+
module ProjectsHelper
|
9
|
+
extend ActiveSupport::Concern
|
6
10
|
|
7
|
-
|
8
|
-
|
9
|
-
|
11
|
+
included do
|
12
|
+
alias_method_chain :project_settings_tabs, :airbrake_backend_tab
|
13
|
+
end
|
10
14
|
|
11
|
-
|
12
|
-
|
13
|
-
|
15
|
+
# add airbrake tab to project settings
|
16
|
+
def project_settings_tabs_with_airbrake_backend_tab
|
17
|
+
tabs = project_settings_tabs_without_airbrake_backend_tab
|
14
18
|
|
15
|
-
|
19
|
+
tabs.push(
|
16
20
|
name: 'airbrake',
|
17
21
|
action: :manage_airbrake,
|
18
22
|
partial: 'projects/settings/airbrake',
|
19
23
|
label: :project_module_airbrake
|
20
24
|
)
|
21
25
|
|
22
|
-
|
26
|
+
tabs.select { |tab| User.current.allowed_to?(tab[:action], @project) }
|
27
|
+
end
|
23
28
|
end
|
24
29
|
end
|
25
30
|
end
|
@@ -1,11 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
|
-
module RedmineAirbrakeBackend
|
4
|
-
module
|
5
|
-
|
5
|
+
module RedmineAirbrakeBackend
|
6
|
+
module Patches
|
7
|
+
# Patches for Tracker
|
8
|
+
module Tracker
|
9
|
+
extend ActiveSupport::Concern
|
6
10
|
|
7
|
-
|
8
|
-
|
11
|
+
included do
|
12
|
+
has_many :airbrake_project_settings, dependent: :nullify
|
13
|
+
end
|
9
14
|
end
|
10
15
|
end
|
11
16
|
end
|
data/lib/tasks/test.rake
CHANGED
@@ -1,30 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
namespace :redmine do
|
2
4
|
namespace :airbrake_backend do
|
3
5
|
desc 'Runs the plugin tests.'
|
4
6
|
task :test do
|
5
|
-
Rake::Task[
|
6
|
-
Rake::Task[
|
7
|
-
Rake::Task[
|
7
|
+
Rake::Task['redmine:airbrake_backend:test:units'].invoke
|
8
|
+
Rake::Task['redmine:airbrake_backend:test:functionals'].invoke
|
9
|
+
Rake::Task['redmine:airbrake_backend:test:integration'].invoke
|
8
10
|
end
|
9
11
|
|
10
12
|
namespace :test do
|
11
13
|
desc 'Runs the plugin unit tests.'
|
12
|
-
Rake::TestTask.new :
|
13
|
-
t.libs <<
|
14
|
+
Rake::TestTask.new units: 'db:test:prepare' do |t|
|
15
|
+
t.libs << 'test'
|
14
16
|
t.verbose = true
|
15
17
|
t.pattern = "#{RedmineAirbrakeBackend.directory}/test/unit/**/*_test.rb"
|
16
18
|
end
|
17
19
|
|
18
20
|
desc 'Runs the plugin functional tests.'
|
19
|
-
Rake::TestTask.new :
|
20
|
-
t.libs <<
|
21
|
+
Rake::TestTask.new functionals: 'db:test:prepare' do |t|
|
22
|
+
t.libs << 'test'
|
21
23
|
t.verbose = true
|
22
24
|
t.pattern = "#{RedmineAirbrakeBackend.directory}/test/functional/**/*_test.rb"
|
23
25
|
end
|
24
26
|
|
25
27
|
desc 'Runs the plugin integration tests.'
|
26
|
-
Rake::TestTask.new :
|
27
|
-
t.libs <<
|
28
|
+
Rake::TestTask.new integration: 'db:test:prepare' do |t|
|
29
|
+
t.libs << 'test'
|
28
30
|
t.verbose = true
|
29
31
|
t.pattern = "#{RedmineAirbrakeBackend.directory}/test/integration/**/*_test.rb"
|
30
32
|
end
|
@@ -1,19 +1,22 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
3
4
|
|
4
5
|
require 'redmine_airbrake_backend/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
8
|
+
spec.required_ruby_version = '>= 2.4.0'
|
9
|
+
|
7
10
|
spec.name = 'redmine_airbrake_backend'
|
8
11
|
spec.version = RedmineAirbrakeBackend::VERSION
|
9
12
|
spec.authors = ['Florian Schwab']
|
10
13
|
spec.email = ['me@ydkn.de']
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage = 'https://
|
14
|
+
spec.description = 'Plugin which adds Airbrake support to Redmine'
|
15
|
+
spec.summary = 'This plugin provides the necessary API to use Redmine as a Airbrake backend'
|
16
|
+
spec.homepage = 'https://gitlab.com/ydkn/redmine_airbrake_backend'
|
14
17
|
spec.license = 'MIT'
|
15
18
|
|
16
|
-
spec.files = `git ls-files`.split(
|
19
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
21
|
spec.require_paths = ['lib']
|
19
22
|
|
@@ -21,4 +24,5 @@ Gem::Specification.new do |spec|
|
|
21
24
|
|
22
25
|
spec.add_development_dependency 'bundler'
|
23
26
|
spec.add_development_dependency 'rake'
|
27
|
+
spec.add_development_dependency 'rubocop'
|
24
28
|
end
|
data/test/unit/notice_test.rb
CHANGED
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.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Schwab
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
description: Plugin which adds Airbrake support to Redmine
|
56
70
|
email:
|
57
71
|
- me@ydkn.de
|
@@ -60,6 +74,8 @@ extensions: []
|
|
60
74
|
extra_rdoc_files: []
|
61
75
|
files:
|
62
76
|
- ".gitignore"
|
77
|
+
- ".gitlab-ci.yml"
|
78
|
+
- ".rubocop.yml"
|
63
79
|
- CHANGELOG.md
|
64
80
|
- Gemfile
|
65
81
|
- LICENSE.txt
|
@@ -69,6 +85,9 @@ files:
|
|
69
85
|
- app/controllers/airbrake_notice_controller.rb
|
70
86
|
- app/controllers/airbrake_project_settings_controller.rb
|
71
87
|
- app/controllers/airbrake_report_controller.rb
|
88
|
+
- app/controllers/concerns/airbrake_attachments.rb
|
89
|
+
- app/controllers/concerns/airbrake_issue_handling.rb
|
90
|
+
- app/controllers/concerns/airbrake_rendering.rb
|
72
91
|
- app/helpers/airbrake_helper.rb
|
73
92
|
- app/models/airbrake_project_setting.rb
|
74
93
|
- app/views/airbrake/issue_description/_section.erb
|
@@ -97,7 +116,7 @@ files:
|
|
97
116
|
- redmine_airbrake_backend.gemspec
|
98
117
|
- test/test_helper.rb
|
99
118
|
- test/unit/notice_test.rb
|
100
|
-
homepage: https://
|
119
|
+
homepage: https://gitlab.com/ydkn/redmine_airbrake_backend
|
101
120
|
licenses:
|
102
121
|
- MIT
|
103
122
|
metadata: {}
|
@@ -109,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
109
128
|
requirements:
|
110
129
|
- - ">="
|
111
130
|
- !ruby/object:Gem::Version
|
112
|
-
version:
|
131
|
+
version: 2.4.0
|
113
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
133
|
requirements:
|
115
134
|
- - ">="
|
@@ -117,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
136
|
version: '0'
|
118
137
|
requirements: []
|
119
138
|
rubyforge_project:
|
120
|
-
rubygems_version: 2.7.
|
139
|
+
rubygems_version: 2.7.7
|
121
140
|
signing_key:
|
122
141
|
specification_version: 4
|
123
142
|
summary: This plugin provides the necessary API to use Redmine as a Airbrake backend
|