airbrake_user_attributes_rails5 0.2.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 +7 -0
- data/.gitignore +4 -0
- data/Gemfile +5 -0
- data/README.md +17 -0
- data/Rakefile +16 -0
- data/airbrake_user_attributes_rails5.gemspec +26 -0
- data/lib/airbrake/current_user.rb +30 -0
- data/lib/airbrake_overrides/airbrake.rb +14 -0
- data/lib/airbrake_overrides/notice.rb +86 -0
- data/lib/airbrake_overrides/rails/controller_methods.rb +17 -0
- data/lib/airbrake_user_attributes.rb +6 -0
- data/lib/airbrake_user_attributes/version.rb +3 -0
- data/test/airbrake_2_2.xsd +79 -0
- data/test/helper.rb +262 -0
- data/test/notice_test.rb +131 -0
- metadata +197 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2fa584b675b512dad537c345355b0d93a4beea11
|
4
|
+
data.tar.gz: 791341dd036d47edcd75e05278d849b78b07aa5c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 635ba79975867d15c859f3f7a4e8dccfdea11fe616b7a6c39f45c772cf7cceda6580a9f5f2d09c1394c482c876b3c153e7617a8419faf1baf3829463489e6296
|
7
|
+
data.tar.gz: 33b5fb8b8b4a32aad3ee2bb484d148602ca7adf419eb761a922078a42ad8edef287d95d1cab5f9680a525ef73cfbc9a75ea2bfded8833b2a90c6dada99cd9b05
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Airbrake - User Attributes
|
2
|
+
=======================
|
3
|
+
|
4
|
+
## Forked
|
5
|
+
|
6
|
+
This gem was forked in order to bump the Airbrake dependency version to v5.
|
7
|
+
|
8
|
+
## Original Readme
|
9
|
+
|
10
|
+
Adds information about the current user to error reports.
|
11
|
+
This information can only be processed and displayed by
|
12
|
+
[Errbit, the open source error catcher](https://github.com/errbit/errbit).
|
13
|
+
|
14
|
+
This gem can be used as a replacement for the `airbrake` gem,
|
15
|
+
since it loads `airbrake` as a dependency.
|
16
|
+
|
17
|
+
Copyright (c) 2012 Cloudfuji
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'bundler/gem_helper'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the airbrake_user_attributes gem.'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.pattern = 'test/**/*_test.rb'
|
12
|
+
t.verbose = true
|
13
|
+
end
|
14
|
+
|
15
|
+
Bundler::GemHelper.install_tasks
|
16
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'airbrake_user_attributes/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'airbrake_user_attributes_rails5'
|
7
|
+
s.authors = ['Nathan Broadbent', 'Diego Salazar']
|
8
|
+
s.email = 'salazar@kipusystems.com'
|
9
|
+
s.homepage = 'https://github.com/DiegoSalazar/airbrake_user_attributes_rails5'
|
10
|
+
s.summary = 'Update to use Airbrake v5. Send Airbrake notifications with user attributes'
|
11
|
+
s.description = 'Adds information about the current user to error reports'
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.version = AirbrakeUserAttributes::VERSION
|
14
|
+
|
15
|
+
s.add_development_dependency("actionpack", "~> 2.3.8")
|
16
|
+
s.add_development_dependency("activerecord", "~> 2.3.8")
|
17
|
+
s.add_development_dependency("activesupport", "~> 2.3.8")
|
18
|
+
s.add_development_dependency("bourne", ">= 1.0")
|
19
|
+
s.add_development_dependency("fakeweb", "~> 1.3.0")
|
20
|
+
s.add_development_dependency("nokogiri", "~> 1.4.3.1")
|
21
|
+
s.add_development_dependency("rspec", "~> 2.6.0")
|
22
|
+
s.add_development_dependency("sham_rack", "~> 1.3.0")
|
23
|
+
s.add_development_dependency("shoulda", "~> 2.11.3")
|
24
|
+
|
25
|
+
s.add_dependency 'airbrake', '~> 5.5'
|
26
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Airbrake
|
2
|
+
module CurrentUser
|
3
|
+
|
4
|
+
# Returns filtered attributes for current user
|
5
|
+
def self.filtered_attributes(controller)
|
6
|
+
return {} unless controller.respond_to?(:current_user, true)
|
7
|
+
begin
|
8
|
+
user = controller.send(:current_user)
|
9
|
+
rescue
|
10
|
+
# If something goes wrong (perhaps while running rake airbrake:test),
|
11
|
+
# use the first User.
|
12
|
+
user = User.first
|
13
|
+
end
|
14
|
+
# Return empty hash if there are no users.
|
15
|
+
return {} unless user && user.respond_to?(:attributes)
|
16
|
+
|
17
|
+
# Removes auth-related fields
|
18
|
+
attributes = user.attributes.reject do |k, v|
|
19
|
+
/password|token|login|sign_in|per_page|_at$/ =~ k
|
20
|
+
end
|
21
|
+
# Try to include a URL for the user, if possible.
|
22
|
+
if url_method = [:user_url, :admin_user_url].detect {|m| controller.respond_to?(m) }
|
23
|
+
attributes[:url] = controller.send(url_method, user)
|
24
|
+
end
|
25
|
+
# Return all keys with non-blank values
|
26
|
+
attributes.select {|k,v| v.present? }
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Airbrake
|
2
|
+
class << self
|
3
|
+
private
|
4
|
+
|
5
|
+
def build_notice_for_with_current_user(exception, opts = {})
|
6
|
+
if opts[:rack_env] && controller = opts[:rack_env]['action_controller.instance']
|
7
|
+
opts[:user_attributes] = Airbrake::CurrentUser.filtered_attributes(controller)
|
8
|
+
end
|
9
|
+
build_notice_for_without_current_user(exception, opts)
|
10
|
+
end
|
11
|
+
alias_method_chain :build_notice_for, :current_user
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'airbrake/notice'
|
2
|
+
|
3
|
+
module Airbrake
|
4
|
+
class Notice
|
5
|
+
# User information
|
6
|
+
# - Provides information about the currently logged in user
|
7
|
+
attr_reader :user_attributes
|
8
|
+
|
9
|
+
def initialize_with_user_attributes(args)
|
10
|
+
self.user_attributes = args[:user_attributes] || {}
|
11
|
+
initialize_without_user_attributes(args)
|
12
|
+
end
|
13
|
+
alias_method_chain :initialize, :user_attributes
|
14
|
+
|
15
|
+
# Converts the given notice to XML
|
16
|
+
# Need to override whole builder to add user-attributes at end.
|
17
|
+
def to_xml
|
18
|
+
builder = Builder::XmlMarkup.new
|
19
|
+
builder.instruct!
|
20
|
+
xml = builder.notice(:version => Airbrake::API_VERSION) do |notice|
|
21
|
+
notice.tag!("api-key", api_key)
|
22
|
+
notice.notifier do |notifier|
|
23
|
+
notifier.name(notifier_name)
|
24
|
+
notifier.version(notifier_version)
|
25
|
+
notifier.url(notifier_url)
|
26
|
+
end
|
27
|
+
notice.error do |error|
|
28
|
+
error.tag!('class', error_class)
|
29
|
+
error.message(error_message)
|
30
|
+
error.backtrace do |backtrace|
|
31
|
+
self.backtrace.lines.each do |line|
|
32
|
+
backtrace.line(:number => line.number,
|
33
|
+
:file => line.file,
|
34
|
+
:method => line.method)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
if url ||
|
39
|
+
controller ||
|
40
|
+
action ||
|
41
|
+
!parameters.blank? ||
|
42
|
+
!cgi_data.blank? ||
|
43
|
+
!session_data.blank?
|
44
|
+
notice.request do |request|
|
45
|
+
request.url(url)
|
46
|
+
request.component(controller)
|
47
|
+
request.action(action)
|
48
|
+
unless parameters.nil? || parameters.empty?
|
49
|
+
request.params do |params|
|
50
|
+
xml_vars_for(params, parameters)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
unless session_data.nil? || session_data.empty?
|
54
|
+
request.session do |session|
|
55
|
+
xml_vars_for(session, session_data)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
unless cgi_data.nil? || cgi_data.empty?
|
59
|
+
request.tag!("cgi-data") do |cgi_datum|
|
60
|
+
xml_vars_for(cgi_datum, cgi_data)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
notice.tag!("server-environment") do |env|
|
66
|
+
env.tag!("project-root", project_root)
|
67
|
+
env.tag!("environment-name", environment_name)
|
68
|
+
env.tag!("hostname", hostname)
|
69
|
+
end
|
70
|
+
|
71
|
+
if user_attributes.present?
|
72
|
+
notice.tag!("user-attributes") do |user|
|
73
|
+
xml_vars_for(user, user_attributes)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
xml.to_s
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
attr_writer :user_attributes
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'airbrake/rails/controller_methods'
|
2
|
+
|
3
|
+
module Airbrake
|
4
|
+
module Rails
|
5
|
+
module ControllerMethods
|
6
|
+
private
|
7
|
+
|
8
|
+
def airbrake_request_data_with_user_attributes
|
9
|
+
airbrake_request_data_without_user_attributes.merge(
|
10
|
+
:user_attributes => Airbrake::CurrentUser.filtered_attributes(self)
|
11
|
+
)
|
12
|
+
end
|
13
|
+
alias_method_chain :airbrake_request_data, :user_attributes
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
3
|
+
|
4
|
+
<xs:element name="notice">
|
5
|
+
<xs:complexType>
|
6
|
+
<xs:all>
|
7
|
+
<xs:element name="api-key" type="xs:string"/>
|
8
|
+
<xs:element name="notifier" type="notifier"/>
|
9
|
+
<xs:element name="error" type="error"/>
|
10
|
+
<xs:element name="request" type="request" minOccurs="0"/>
|
11
|
+
<xs:element name="server-environment" type="serverEnvironment"/>
|
12
|
+
<xs:element name="user-attributes" type="varList" minOccurs="0"/>
|
13
|
+
</xs:all>
|
14
|
+
<xs:attribute name="version" type="xs:string" use="required"/>
|
15
|
+
</xs:complexType>
|
16
|
+
</xs:element>
|
17
|
+
|
18
|
+
<xs:complexType name="notifier">
|
19
|
+
<xs:all>
|
20
|
+
<xs:element name="name" type="xs:string"/>
|
21
|
+
<xs:element name="version" type="xs:string"/>
|
22
|
+
<xs:element name="url" type="xs:string"/>
|
23
|
+
</xs:all>
|
24
|
+
</xs:complexType>
|
25
|
+
|
26
|
+
<xs:complexType name="error">
|
27
|
+
<xs:all>
|
28
|
+
<xs:element name="class" type="xs:string"/>
|
29
|
+
<xs:element name="message" type="xs:string" minOccurs="0"/>
|
30
|
+
<xs:element name="backtrace" type="backtrace"/>
|
31
|
+
</xs:all>
|
32
|
+
</xs:complexType>
|
33
|
+
|
34
|
+
<xs:complexType name="backtrace">
|
35
|
+
<xs:sequence>
|
36
|
+
<xs:element name="line" maxOccurs="unbounded">
|
37
|
+
<xs:complexType>
|
38
|
+
<xs:attribute name="file" type="xs:string" use="required"/>
|
39
|
+
<xs:attribute name="number" type="xs:string" use="required"/>
|
40
|
+
<xs:attribute name="method" type="xs:string" use="optional"/>
|
41
|
+
</xs:complexType>
|
42
|
+
</xs:element>
|
43
|
+
</xs:sequence>
|
44
|
+
</xs:complexType>
|
45
|
+
|
46
|
+
<xs:complexType name="request">
|
47
|
+
<xs:all>
|
48
|
+
<xs:element name="url" type="xs:string"/>
|
49
|
+
<xs:element name="component" type="xs:string"/>
|
50
|
+
<xs:element name="action" type="xs:string" minOccurs="0"/>
|
51
|
+
<xs:element name="params" type="varList" minOccurs="0"/>
|
52
|
+
<xs:element name="session" type="varList" minOccurs="0"/>
|
53
|
+
<xs:element name="cgi-data" type="varList" minOccurs="0"/>
|
54
|
+
</xs:all>
|
55
|
+
</xs:complexType>
|
56
|
+
|
57
|
+
<xs:complexType name="varList">
|
58
|
+
<xs:sequence>
|
59
|
+
<xs:element name="var" type="var" maxOccurs="unbounded"/>
|
60
|
+
</xs:sequence>
|
61
|
+
</xs:complexType>
|
62
|
+
|
63
|
+
<xs:complexType name="var" mixed="true">
|
64
|
+
<xs:sequence>
|
65
|
+
<xs:element name="var" type="var" minOccurs="0" maxOccurs="unbounded"/>
|
66
|
+
</xs:sequence>
|
67
|
+
<xs:attribute name="key" type="xs:string" use="required"/>
|
68
|
+
</xs:complexType>
|
69
|
+
|
70
|
+
<xs:complexType name="serverEnvironment">
|
71
|
+
<xs:sequence>
|
72
|
+
<xs:element name="project-root" type="xs:string" minOccurs="0"/>
|
73
|
+
<xs:element name="environment-name" type="xs:string"/>
|
74
|
+
<xs:element name="app-version" type="xs:string" minOccurs="0"/>
|
75
|
+
<xs:element name="hostname" type="xs:string" minOccurs="0"/>
|
76
|
+
</xs:sequence>
|
77
|
+
</xs:complexType>
|
78
|
+
|
79
|
+
</xs:schema>
|
data/test/helper.rb
ADDED
@@ -0,0 +1,262 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
5
|
+
|
6
|
+
require 'thread'
|
7
|
+
|
8
|
+
require "bundler/setup"
|
9
|
+
|
10
|
+
require 'shoulda'
|
11
|
+
require 'mocha'
|
12
|
+
|
13
|
+
require 'action_controller'
|
14
|
+
require 'action_controller/test_process'
|
15
|
+
require 'active_record'
|
16
|
+
require 'active_support'
|
17
|
+
require 'nokogiri'
|
18
|
+
require 'rack'
|
19
|
+
require 'bourne'
|
20
|
+
require 'sham_rack'
|
21
|
+
|
22
|
+
require "airbrake"
|
23
|
+
require "airbrake_user_attributes"
|
24
|
+
|
25
|
+
begin require 'redgreen'; rescue LoadError; end
|
26
|
+
|
27
|
+
module TestMethods
|
28
|
+
def rescue_action e
|
29
|
+
raise e
|
30
|
+
end
|
31
|
+
|
32
|
+
def do_raise
|
33
|
+
raise "Airbrake"
|
34
|
+
end
|
35
|
+
|
36
|
+
def do_not_raise
|
37
|
+
render :text => "Success"
|
38
|
+
end
|
39
|
+
|
40
|
+
def do_raise_ignored
|
41
|
+
raise ActiveRecord::RecordNotFound.new("404")
|
42
|
+
end
|
43
|
+
|
44
|
+
def do_raise_not_ignored
|
45
|
+
raise ActiveRecord::StatementInvalid.new("Statement invalid")
|
46
|
+
end
|
47
|
+
|
48
|
+
def manual_notify
|
49
|
+
notify_airbrake(Exception.new)
|
50
|
+
render :text => "Success"
|
51
|
+
end
|
52
|
+
|
53
|
+
def manual_notify_ignored
|
54
|
+
notify_airbrake(ActiveRecord::RecordNotFound.new("404"))
|
55
|
+
render :text => "Success"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class Test::Unit::TestCase
|
60
|
+
def request(action = nil, method = :get, user_agent = nil, params = {})
|
61
|
+
@request = ActionController::TestRequest.new
|
62
|
+
@request.action = action ? action.to_s : ""
|
63
|
+
|
64
|
+
if user_agent
|
65
|
+
if @request.respond_to?(:user_agent=)
|
66
|
+
@request.user_agent = user_agent
|
67
|
+
else
|
68
|
+
@request.env["HTTP_USER_AGENT"] = user_agent
|
69
|
+
end
|
70
|
+
end
|
71
|
+
@request.query_parameters = @request.query_parameters.merge(params)
|
72
|
+
@response = ActionController::TestResponse.new
|
73
|
+
@controller.process(@request, @response)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Borrowed from ActiveSupport 2.3.2
|
77
|
+
def assert_difference(expression, difference = 1, message = nil, &block)
|
78
|
+
b = block.send(:binding)
|
79
|
+
exps = Array.wrap(expression)
|
80
|
+
before = exps.map { |e| eval(e, b) }
|
81
|
+
|
82
|
+
yield
|
83
|
+
|
84
|
+
exps.each_with_index do |e, i|
|
85
|
+
error = "#{e.inspect} didn't change by #{difference}"
|
86
|
+
error = "#{message}.\n#{error}" if message
|
87
|
+
assert_equal(before[i] + difference, eval(e, b), error)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def assert_no_difference(expression, message = nil, &block)
|
92
|
+
assert_difference expression, 0, message, &block
|
93
|
+
end
|
94
|
+
|
95
|
+
def stub_sender
|
96
|
+
stub('sender', :send_to_airbrake => nil)
|
97
|
+
end
|
98
|
+
|
99
|
+
def stub_sender!
|
100
|
+
Airbrake.sender = stub_sender
|
101
|
+
end
|
102
|
+
|
103
|
+
def stub_notice
|
104
|
+
stub('notice', :to_xml => 'some yaml', :ignore? => false)
|
105
|
+
end
|
106
|
+
|
107
|
+
def stub_notice!
|
108
|
+
stub_notice.tap do |notice|
|
109
|
+
Airbrake::Notice.stubs(:new => notice)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def create_dummy
|
114
|
+
Airbrake::DummySender.new
|
115
|
+
end
|
116
|
+
|
117
|
+
def reset_config
|
118
|
+
Airbrake.configuration = nil
|
119
|
+
Airbrake.configure do |config|
|
120
|
+
config.api_key = 'abc123'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def clear_backtrace_filters
|
125
|
+
Airbrake.configuration.backtrace_filters.clear
|
126
|
+
end
|
127
|
+
|
128
|
+
def build_exception(opts = {})
|
129
|
+
backtrace = ["airbrake/test/helper.rb:132:in `build_exception'",
|
130
|
+
"airbrake/test/backtrace.rb:4:in `build_notice_data'",
|
131
|
+
"/var/lib/gems/1.8/gems/airbrake-2.4.5/rails/init.rb:2:in `send_exception'"]
|
132
|
+
opts = {:backtrace => backtrace}.merge(opts)
|
133
|
+
BacktracedException.new(opts)
|
134
|
+
end
|
135
|
+
|
136
|
+
class BacktracedException < Exception
|
137
|
+
attr_accessor :backtrace
|
138
|
+
def initialize(opts)
|
139
|
+
@backtrace = opts[:backtrace]
|
140
|
+
end
|
141
|
+
def set_backtrace(bt)
|
142
|
+
@backtrace = bt
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def build_notice_data(exception = nil)
|
147
|
+
exception ||= build_exception
|
148
|
+
{
|
149
|
+
:api_key => 'abc123',
|
150
|
+
:error_class => exception.class.name,
|
151
|
+
:error_message => "#{exception.class.name}: #{exception.message}",
|
152
|
+
:backtrace => exception.backtrace,
|
153
|
+
:environment => { 'PATH' => '/bin', 'REQUEST_URI' => '/users/1' },
|
154
|
+
:request => {
|
155
|
+
:params => { 'controller' => 'users', 'action' => 'show', 'id' => '1' },
|
156
|
+
:rails_root => '/path/to/application',
|
157
|
+
:url => "http://test.host/users/1"
|
158
|
+
},
|
159
|
+
:session => {
|
160
|
+
:key => '123abc',
|
161
|
+
:data => { 'user_id' => '5', 'flash' => { 'notice' => 'Logged in successfully' } }
|
162
|
+
}
|
163
|
+
}
|
164
|
+
end
|
165
|
+
|
166
|
+
def assert_caught_and_sent
|
167
|
+
assert !Airbrake.sender.collected.empty?
|
168
|
+
end
|
169
|
+
|
170
|
+
def assert_caught_and_not_sent
|
171
|
+
assert Airbrake.sender.collected.empty?
|
172
|
+
end
|
173
|
+
|
174
|
+
def assert_array_starts_with(expected, actual)
|
175
|
+
assert_respond_to actual, :to_ary
|
176
|
+
array = actual.to_ary.reverse
|
177
|
+
expected.reverse.each_with_index do |value, i|
|
178
|
+
assert_equal value, array[i]
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def assert_valid_node(document, xpath, content)
|
183
|
+
nodes = document.xpath(xpath)
|
184
|
+
assert nodes.any?{|node| node.content == content },
|
185
|
+
"Expected xpath #{xpath} to have content #{content}, " +
|
186
|
+
"but found #{nodes.map { |n| n.content }} in #{nodes.size} matching nodes." +
|
187
|
+
"Document:\n#{document.to_s}"
|
188
|
+
end
|
189
|
+
|
190
|
+
def assert_logged(expected)
|
191
|
+
assert_received(Airbrake, :write_verbose_log) do |expect|
|
192
|
+
expect.with {|actual| actual =~ expected }
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def assert_not_logged(expected)
|
197
|
+
assert_received(Airbrake, :write_verbose_log) do |expect|
|
198
|
+
expect.with {|actual| actual =~ expected }.never
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
|
203
|
+
end
|
204
|
+
|
205
|
+
module DefinesConstants
|
206
|
+
def setup
|
207
|
+
@defined_constants = []
|
208
|
+
end
|
209
|
+
|
210
|
+
def teardown
|
211
|
+
@defined_constants.each do |constant|
|
212
|
+
Object.__send__(:remove_const, constant)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def define_constant(name, value)
|
217
|
+
Object.const_set(name, value)
|
218
|
+
@defined_constants << name
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
# Also stolen from AS 2.3.2
|
223
|
+
class Array
|
224
|
+
# Wraps the object in an Array unless it's an Array. Converts the
|
225
|
+
# object to an Array using #to_ary if it implements that.
|
226
|
+
def self.wrap(object)
|
227
|
+
case object
|
228
|
+
when nil
|
229
|
+
[]
|
230
|
+
when self
|
231
|
+
object
|
232
|
+
else
|
233
|
+
if object.respond_to?(:to_ary)
|
234
|
+
object.to_ary
|
235
|
+
else
|
236
|
+
[object]
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|
242
|
+
|
243
|
+
class CollectingSender
|
244
|
+
attr_reader :collected
|
245
|
+
|
246
|
+
def initialize
|
247
|
+
@collected = []
|
248
|
+
end
|
249
|
+
|
250
|
+
def send_to_airbrake(data)
|
251
|
+
@collected << data
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
class FakeLogger
|
256
|
+
def info(*args); end
|
257
|
+
def debug(*args); end
|
258
|
+
def warn(*args); end
|
259
|
+
def error(*args); end
|
260
|
+
def fatal(*args); end
|
261
|
+
end
|
262
|
+
|
data/test/notice_test.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class NoticeTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
include DefinesConstants
|
6
|
+
|
7
|
+
def configure
|
8
|
+
Airbrake::Configuration.new.tap do |config|
|
9
|
+
config.api_key = 'abc123def456'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def build_notice(args = {})
|
14
|
+
configuration = args.delete(:configuration) || configure
|
15
|
+
Airbrake::Notice.new(configuration.merge(args))
|
16
|
+
end
|
17
|
+
|
18
|
+
def stub_request(attrs = {})
|
19
|
+
stub('request', { :parameters => { 'one' => 'two' },
|
20
|
+
:protocol => 'http',
|
21
|
+
:host => 'some.host',
|
22
|
+
:request_uri => '/some/uri',
|
23
|
+
:session => { :to_hash => { 'a' => 'b' } },
|
24
|
+
:env => { 'three' => 'four' } }.update(attrs))
|
25
|
+
end
|
26
|
+
|
27
|
+
def hostname
|
28
|
+
`hostname`.chomp
|
29
|
+
end
|
30
|
+
|
31
|
+
def assert_valid_notice_document(document)
|
32
|
+
xsd_path = File.join(File.dirname(__FILE__), "airbrake_2_2.xsd")
|
33
|
+
schema = Nokogiri::XML::Schema.new(IO.read(xsd_path))
|
34
|
+
errors = schema.validate(document)
|
35
|
+
assert errors.empty?, errors.collect{|e| e.message }.join
|
36
|
+
end
|
37
|
+
|
38
|
+
context "a Notice turned into XML" do
|
39
|
+
setup do
|
40
|
+
Airbrake.configure do |config|
|
41
|
+
config.api_key = "1234567890"
|
42
|
+
end
|
43
|
+
|
44
|
+
@exception = build_exception
|
45
|
+
|
46
|
+
@notice = build_notice({
|
47
|
+
:notifier_name => 'a name',
|
48
|
+
:notifier_version => '1.2.3',
|
49
|
+
:notifier_url => 'http://some.url/path',
|
50
|
+
:exception => @exception,
|
51
|
+
:controller => "controller",
|
52
|
+
:action => "action",
|
53
|
+
:url => "http://url.com",
|
54
|
+
:parameters => { "paramskey" => "paramsvalue",
|
55
|
+
"nestparentkey" => { "nestkey" => "nestvalue" } },
|
56
|
+
:session_data => { "sessionkey" => "sessionvalue" },
|
57
|
+
:cgi_data => { "cgikey" => "cgivalue" },
|
58
|
+
:user_attributes => { "id" => 1234, "username" => "jsmith", "url" => "http://www.example.com/users/1234" },
|
59
|
+
:project_root => "RAILS_ROOT",
|
60
|
+
:environment_name => "RAILS_ENV"
|
61
|
+
})
|
62
|
+
|
63
|
+
@xml = @notice.to_xml
|
64
|
+
|
65
|
+
@document = Nokogiri::XML::Document.parse(@xml)
|
66
|
+
end
|
67
|
+
|
68
|
+
should "validate against the XML schema" do
|
69
|
+
assert_valid_notice_document @document
|
70
|
+
end
|
71
|
+
|
72
|
+
should "serialize a Notice to XML when sent #to_xml" do
|
73
|
+
assert_valid_node(@document, "//api-key", @notice.api_key)
|
74
|
+
|
75
|
+
assert_valid_node(@document, "//notifier/name", @notice.notifier_name)
|
76
|
+
assert_valid_node(@document, "//notifier/version", @notice.notifier_version)
|
77
|
+
assert_valid_node(@document, "//notifier/url", @notice.notifier_url)
|
78
|
+
|
79
|
+
assert_valid_node(@document, "//error/class", @notice.error_class)
|
80
|
+
assert_valid_node(@document, "//error/message", @notice.error_message)
|
81
|
+
|
82
|
+
assert_valid_node(@document, "//error/backtrace/line/@number", @notice.backtrace.lines.first.number)
|
83
|
+
assert_valid_node(@document, "//error/backtrace/line/@file", @notice.backtrace.lines.first.file)
|
84
|
+
assert_valid_node(@document, "//error/backtrace/line/@method", @notice.backtrace.lines.first.method)
|
85
|
+
|
86
|
+
assert_valid_node(@document, "//request/url", @notice.url)
|
87
|
+
assert_valid_node(@document, "//request/component", @notice.controller)
|
88
|
+
assert_valid_node(@document, "//request/action", @notice.action)
|
89
|
+
|
90
|
+
assert_valid_node(@document, "//request/params/var/@key", "paramskey")
|
91
|
+
assert_valid_node(@document, "//request/params/var", "paramsvalue")
|
92
|
+
assert_valid_node(@document, "//request/params/var/@key", "nestparentkey")
|
93
|
+
assert_valid_node(@document, "//request/params/var/var/@key", "nestkey")
|
94
|
+
assert_valid_node(@document, "//request/params/var/var", "nestvalue")
|
95
|
+
assert_valid_node(@document, "//request/session/var/@key", "sessionkey")
|
96
|
+
assert_valid_node(@document, "//request/session/var", "sessionvalue")
|
97
|
+
assert_valid_node(@document, "//request/cgi-data/var/@key", "cgikey")
|
98
|
+
assert_valid_node(@document, "//request/cgi-data/var", "cgivalue")
|
99
|
+
|
100
|
+
assert_valid_node(@document, "//server-environment/project-root", "RAILS_ROOT")
|
101
|
+
assert_valid_node(@document, "//server-environment/environment-name", "RAILS_ENV")
|
102
|
+
assert_valid_node(@document, "//server-environment/hostname", hostname)
|
103
|
+
|
104
|
+
assert_valid_node(@document, "//user-attributes/var/@key", "id")
|
105
|
+
assert_valid_node(@document, "//user-attributes/var", "1234")
|
106
|
+
assert_valid_node(@document, "//user-attributes/var/@key", "username")
|
107
|
+
assert_valid_node(@document, "//user-attributes/var", "jsmith")
|
108
|
+
assert_valid_node(@document, "//user-attributes/var/@key", "url")
|
109
|
+
assert_valid_node(@document, "//user-attributes/var", "http://www.example.com/users/1234")
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
should "not send empty request data" do
|
114
|
+
notice = build_notice
|
115
|
+
assert_nil notice.url
|
116
|
+
assert_nil notice.controller
|
117
|
+
assert_nil notice.action
|
118
|
+
assert_empty notice.user_attributes
|
119
|
+
|
120
|
+
xml = notice.to_xml
|
121
|
+
document = Nokogiri::XML.parse(xml)
|
122
|
+
assert_nil document.at('//request/url')
|
123
|
+
assert_nil document.at('//request/component')
|
124
|
+
assert_nil document.at('//request/action')
|
125
|
+
assert_nil document.at('//user-attributes')
|
126
|
+
|
127
|
+
assert_valid_notice_document document
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
end
|
metadata
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: airbrake_user_attributes_rails5
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nathan Broadbent
|
8
|
+
- Diego Salazar
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2016-09-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: actionpack
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 2.3.8
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 2.3.8
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: activerecord
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 2.3.8
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 2.3.8
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: activesupport
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 2.3.8
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 2.3.8
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: bourne
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '1.0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: fakeweb
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 1.3.0
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 1.3.0
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: nokogiri
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.4.3.1
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 1.4.3.1
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rspec
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 2.6.0
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 2.6.0
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: sham_rack
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 1.3.0
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.3.0
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: shoulda
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 2.11.3
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 2.11.3
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: airbrake
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - "~>"
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '5.5'
|
147
|
+
type: :runtime
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - "~>"
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '5.5'
|
154
|
+
description: Adds information about the current user to error reports
|
155
|
+
email: salazar@kipusystems.com
|
156
|
+
executables: []
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- ".gitignore"
|
161
|
+
- Gemfile
|
162
|
+
- README.md
|
163
|
+
- Rakefile
|
164
|
+
- airbrake_user_attributes_rails5.gemspec
|
165
|
+
- lib/airbrake/current_user.rb
|
166
|
+
- lib/airbrake_overrides/airbrake.rb
|
167
|
+
- lib/airbrake_overrides/notice.rb
|
168
|
+
- lib/airbrake_overrides/rails/controller_methods.rb
|
169
|
+
- lib/airbrake_user_attributes.rb
|
170
|
+
- lib/airbrake_user_attributes/version.rb
|
171
|
+
- test/airbrake_2_2.xsd
|
172
|
+
- test/helper.rb
|
173
|
+
- test/notice_test.rb
|
174
|
+
homepage: https://github.com/DiegoSalazar/airbrake_user_attributes_rails5
|
175
|
+
licenses: []
|
176
|
+
metadata: {}
|
177
|
+
post_install_message:
|
178
|
+
rdoc_options: []
|
179
|
+
require_paths:
|
180
|
+
- lib
|
181
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - ">="
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
191
|
+
requirements: []
|
192
|
+
rubyforge_project:
|
193
|
+
rubygems_version: 2.4.6
|
194
|
+
signing_key:
|
195
|
+
specification_version: 4
|
196
|
+
summary: Update to use Airbrake v5. Send Airbrake notifications with user attributes
|
197
|
+
test_files: []
|