airbrake_user_attributes_rails5 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,4 @@
1
+ Gemfile.lock
2
+ pkg/
3
+
4
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'rake'
4
+
5
+ gemspec
@@ -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
@@ -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,6 @@
1
+ require 'airbrake'
2
+
3
+ require 'airbrake/current_user'
4
+ require 'airbrake_overrides/airbrake'
5
+ require 'airbrake_overrides/notice'
6
+ require 'airbrake_overrides/rails/controller_methods'
@@ -0,0 +1,3 @@
1
+ module AirbrakeUserAttributes
2
+ VERSION = '0.2.0'
3
+ 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>
@@ -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
+
@@ -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: []