airbrake 3.1.13 → 3.1.14

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.
data/CHANGELOG CHANGED
@@ -1,3 +1,14 @@
1
+ Version 3.1.14 - 2013-08-22 09:03:14 +0200
2
+ ===============================================================================
3
+
4
+ Hrvoje Šimić (5):
5
+ use Coveralls for code coverage
6
+ use Gemnasium for dependency monitoring
7
+ use Code Climate for code analysis
8
+ extract ParamsCleaner class
9
+ being more careful with javascript_notifier and non-public requests
10
+
11
+
1
12
  Version 3.1.13 - 2013-08-20 09:39:41 +0200
2
13
  ===============================================================================
3
14
 
@@ -1225,4 +1236,5 @@ Nick Quaranto (3):
1225
1236
 
1226
1237
 
1227
1238
 
1239
+
1228
1240
 
data/README.md CHANGED
@@ -1,6 +1,10 @@
1
1
  Airbrake
2
2
  ========
3
3
 
4
+ [![Code Climate](https://codeclimate.com/github/airbrake/airbrake.png)](https://codeclimate.com/github/airbrake/airbrake)
5
+ [![Coverage Status](https://coveralls.io/repos/airbrake/airbrake/badge.png?branch=master)](https://coveralls.io/r/airbrake/airbrake?branch=master)
6
+ [![Dependency Status](https://gemnasium.com/airbrake/airbrake.png)](https://gemnasium.com/airbrake/airbrake)
7
+
4
8
  This is the notifier gem for integrating apps with [Airbrake](http://airbrake.io).
5
9
 
6
10
  When an uncaught exception occurs, Airbrake will POST the relevant data
data/Rakefile CHANGED
@@ -3,6 +3,7 @@ require "bundler/setup"
3
3
  require 'appraisal'
4
4
  require 'rake'
5
5
  require 'rake/testtask'
6
+ require 'coveralls/rake/task'
6
7
  require 'rubygems/package_task'
7
8
  begin
8
9
  require 'cucumber/rake/task'
@@ -12,13 +13,10 @@ rescue LoadError
12
13
  end
13
14
  require './lib/airbrake/version'
14
15
 
15
- task :default do
16
- exec 'rake test'\
17
- '&& rake appraisal:rails-3.2 integration_test'\
18
- '&& rake appraisal:rails-3.1 integration_test'\
19
- '&& rake appraisal:rails-3.0 integration_test'\
20
- '&& rake appraisal cucumber'
21
- end
16
+ Coveralls::RakeTask.new
17
+
18
+ task :default => [:test, "test:integration", "coveralls:push"]
19
+
22
20
 
23
21
  desc 'Test the airbrake gem.'
24
22
  Rake::TestTask.new(:test) do |t|
@@ -27,6 +25,16 @@ Rake::TestTask.new(:test) do |t|
27
25
  t.verbose = true
28
26
  end
29
27
 
28
+ namespace :test do
29
+ desc "Test the integration of airbrake gem with Rails."
30
+ task :integration do
31
+ system 'INTEGRATION=true rake appraisal:rails-3.2 integration_test'\
32
+ '&& INTEGRATION=true rake appraisal:rails-3.1 integration_test'\
33
+ '&& INTEGRATION=true rake appraisal:rails-3.0 integration_test'\
34
+ '&& INTEGRATION=true rake appraisal cucumber'
35
+ end
36
+ end
37
+
30
38
  desc "Test the integration of airbrake gem with Rails."
31
39
  Rake::TestTask.new(:integration_test) do |t|
32
40
  t.libs << 'lib'
data/airbrake.gemspec CHANGED
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
31
31
  s.add_development_dependency("shoulda-matchers")
32
32
  s.add_development_dependency("shoulda-context")
33
33
  s.add_development_dependency("pry")
34
+ s.add_development_dependency("coveralls")
34
35
 
35
36
  s.authors = ["Airbrake"]
36
37
  s.email = %q{support@airbrake.io}
data/lib/airbrake.rb CHANGED
@@ -9,6 +9,7 @@ require 'rubygems'
9
9
  require 'logger'
10
10
 
11
11
  require 'airbrake/version'
12
+ require 'airbrake/utils/params_cleaner'
12
13
  require 'airbrake/configuration'
13
14
  require 'airbrake/notice'
14
15
  require 'airbrake/sender'
@@ -87,6 +87,9 @@ module Airbrake
87
87
  # Details about the user who experienced the error
88
88
  attr_reader :user
89
89
 
90
+ # Instance that's used for cleaning out data that should be filtered out, should respond to #clean
91
+ attr_accessor :cleaner
92
+
90
93
  public
91
94
 
92
95
  def initialize(args)
@@ -120,12 +123,17 @@ module Airbrake
120
123
  end
121
124
 
122
125
  @hostname = local_hostname
123
- @user = args[:user] || {}
126
+ @user = args[:user] || {}
127
+
124
128
 
125
129
  also_use_rack_params_filters
126
130
  find_session_data
127
- clean_params
128
- clean_rack_request_data
131
+
132
+ @cleaner = args[:cleaner] ||
133
+ Airbrake::Utils::ParamsCleaner.new(:filters => params_filters,
134
+ :to_clean => data_to_clean)
135
+
136
+ clean_data!
129
137
  end
130
138
 
131
139
  # Converts the given notice to XML
@@ -293,69 +301,19 @@ module Airbrake
293
301
  end
294
302
  end
295
303
 
296
- # Removes non-serializable data from the given attribute.
297
- # See #clean_unserializable_data
298
- def clean_unserializable_data_from(attribute)
299
- self.instance_variable_set("@#{attribute}", clean_unserializable_data(send(attribute)))
300
- end
301
-
302
- # Removes non-serializable data. Allowed data types are strings, arrays,
303
- # and hashes. All other types are converted to strings.
304
- # TODO: move this onto Hash
305
- def clean_unserializable_data(data, stack = [])
306
- return "[possible infinite recursion halted]" if stack.any?{|item| item == data.object_id }
307
-
308
- if data.respond_to?(:to_hash)
309
- data.to_hash.inject({}) do |result, (key, value)|
310
- result.merge(key => clean_unserializable_data(value, stack + [data.object_id]))
311
- end
312
- elsif data.respond_to?(:to_ary)
313
- data.to_ary.collect do |value|
314
- clean_unserializable_data(value, stack + [data.object_id])
315
- end
316
- else
317
- data.to_s
318
- end
319
- end
320
-
321
304
  # Replaces the contents of params that match params_filters.
322
- # TODO: extract this to a different class
323
- def clean_params
324
- clean_unserializable_data_from(:parameters)
325
- filter(parameters)
326
- if cgi_data
327
- clean_unserializable_data_from(:cgi_data)
328
- filter(cgi_data)
329
- end
330
- if session_data
331
- clean_unserializable_data_from(:session_data)
332
- filter(session_data)
333
- end
334
- end
335
-
336
- def clean_rack_request_data
337
- if cgi_data
338
- cgi_data.delete("rack.request.form_vars")
339
- cgi_data.delete("action_dispatch.secret_token")
305
+ def clean_data!
306
+ cleaner.clean.tap do |c|
307
+ @parameters = c.parameters
308
+ @cgi_data = c.cgi_data
309
+ @session_data = c.session_data
340
310
  end
341
311
  end
342
312
 
343
- def filter(hash)
344
- if params_filters
345
- hash.each do |key, value|
346
- if filter_key?(key)
347
- hash[key] = "[FILTERED]"
348
- elsif value.respond_to?(:to_hash)
349
- filter(hash[key])
350
- end
351
- end
352
- end
353
- end
354
-
355
- def filter_key?(key)
356
- params_filters.any? do |filter|
357
- key.to_s.eql?(filter.to_s)
358
- end
313
+ def data_to_clean
314
+ {:parameters => parameters,
315
+ :cgi_data => cgi_data,
316
+ :session_data => session_data}
359
317
  end
360
318
 
361
319
  def find_session_data
@@ -10,31 +10,33 @@ module Airbrake
10
10
  private
11
11
 
12
12
  def airbrake_javascript_notifier
13
- airbrake_javascript_loader + airbrake_javascript_configuration
13
+ if Airbrake.configuration.public?
14
+ airbrake_javascript_loader + airbrake_javascript_configuration
15
+ end
14
16
  end
15
17
 
16
18
  def airbrake_javascript_loader
17
- return unless Airbrake.configuration.public?
18
-
19
- path = File.join File.dirname(__FILE__), '..', '..', 'templates', 'javascript_notifier_loader'
19
+ if Airbrake.configuration.public?
20
+ path = File.join File.dirname(__FILE__), '..', '..', 'templates', 'javascript_notifier_loader'
20
21
 
21
- _airbrake_render_part path
22
+ _airbrake_render_part path
23
+ end
22
24
  end
23
25
 
24
26
  def airbrake_javascript_configuration
25
- return unless Airbrake.configuration.public?
26
-
27
- path = File.join File.dirname(__FILE__), '..', '..', 'templates', 'javascript_notifier_configuration'
28
-
29
- options = {
30
- :api_key => Airbrake.configuration.js_api_key,
31
- :environment => Airbrake.configuration.environment_name,
32
- :action_name => action_name,
33
- :controller_name => controller_name,
34
- :url => request.url
35
- }
36
-
37
- _airbrake_render_part path, options
27
+ if Airbrake.configuration.public?
28
+ path = File.join File.dirname(__FILE__), '..', '..', 'templates', 'javascript_notifier_configuration'
29
+
30
+ options = {
31
+ :api_key => Airbrake.configuration.js_api_key,
32
+ :environment => Airbrake.configuration.environment_name,
33
+ :action_name => action_name,
34
+ :controller_name => controller_name,
35
+ :url => request.url
36
+ }
37
+
38
+ _airbrake_render_part path, options
39
+ end
38
40
  end
39
41
 
40
42
  protected
@@ -0,0 +1,98 @@
1
+ module Airbrake
2
+ module Utils
3
+ class ParamsCleaner
4
+ attr_writer :filters, :to_clean
5
+ attr_reader :parameters, :cgi_data, :session_data
6
+
7
+ # Public: Initialize a new Airbrake::Utils::ParamsCleaner
8
+ #
9
+ # opts - The Hash options that contain filters and params (default: {}):
10
+ # :filters - The Array of param keys that should be filtered
11
+ # :to_clean - The Hash of unfiltered params
12
+ def initialize(opts = {})
13
+ @filters = opts[:filters] || {}
14
+ @to_clean = opts[:to_clean]
15
+ end
16
+
17
+ # Public: Takes the params to_clean passed in an initializer
18
+ # and filters them out by filters passed.
19
+ #
20
+ # Also normalizes unserializable data.
21
+ #
22
+ # Returns self, so that :parameters, :cgi_data, :session_data
23
+ # could be extracted
24
+ def clean
25
+ clean_parameters
26
+ clean_session_data
27
+ clean_cgi_data
28
+ clean_rack_request_data
29
+
30
+ self
31
+ end
32
+
33
+ private
34
+
35
+ def clean_parameters
36
+ if params = @to_clean[:parameters]
37
+ @parameters = clean_unserializable_data(params)
38
+ @parameters = filter @parameters
39
+ end
40
+ end
41
+
42
+ def clean_cgi_data
43
+ if params = @to_clean[:cgi_data]
44
+ @cgi_data = clean_unserializable_data params
45
+ @cgi_data = filter @cgi_data
46
+ end
47
+ end
48
+
49
+ def clean_session_data
50
+ if params = @to_clean[:session_data]
51
+ @session_data = clean_unserializable_data params
52
+ @session_data = filter @session_data
53
+ end
54
+ end
55
+
56
+ def clean_rack_request_data
57
+ if @cgi_data
58
+ @cgi_data.delete("rack.request.form_vars")
59
+ @cgi_data.delete("action_dispatch.secret_token")
60
+ end
61
+ end
62
+
63
+ def filter_key?(key)
64
+ @filters.any? do |filter|
65
+ key.to_s.eql?(filter.to_s)
66
+ end
67
+ end
68
+
69
+ def filter(hash)
70
+ hash.each do |key, value|
71
+ if filter_key?(key)
72
+ hash[key] = "[FILTERED]"
73
+ elsif value.respond_to?(:to_hash)
74
+ filter(hash[key])
75
+ end
76
+ end
77
+ end
78
+
79
+ # Removes non-serializable data. Allowed data types are strings, arrays,
80
+ # and hashes. All other types are converted to strings.
81
+ def clean_unserializable_data(data, stack = [])
82
+ return "[possible infinite recursion halted]" if stack.any?{|item| item == data.object_id }
83
+
84
+ if data.respond_to?(:to_hash)
85
+ data.to_hash.inject({}) do |result, (key, value)|
86
+ result.merge(key => clean_unserializable_data(value, stack + [data.object_id]))
87
+ end
88
+ elsif data.respond_to?(:to_ary)
89
+ data.to_ary.collect do |value|
90
+ clean_unserializable_data(value, stack + [data.object_id])
91
+ end
92
+ else
93
+ data.to_s
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -1,3 +1,3 @@
1
1
  module Airbrake
2
- VERSION = "3.1.13"
2
+ VERSION = "3.1.14"
3
3
  end
data/resources/notice.xml CHANGED
@@ -1,2 +1,2 @@
1
- <?xml version="1.0" encoding="UTF-8"?><notice version="2.4"><api-key>myapikey</api-key><notifier><name>Airbrake Notifier</name><version>3.1.12</version><url>https://github.com/airbrake/airbrake</url></notifier><error><class>AirbrakeTestingException</class><message>AirbrakeTestingException:
2
- Testing airbrake via "rake airbrake:test". If you can see this, it works.</message><backtrace><line number="432" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run__3704021012138449705__process_action__3227464767449715736__callbacks"/><line number="410" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run_process_action_callbacks"/><line number="94" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="run_callbacks"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/callbacks.rb" method="process_action"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rescue.rb" method="process_action"/><line number="30" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/instrumentation.rb" method="block in process_action"/><line number="52" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications.rb" method="block in instrument"/><line number="21" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications/instrumenter.rb" method="instrument"/><line number="52" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications.rb" method="instrument"/><line number="29" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/instrumentation.rb" method="process_action"/><line number="119" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/base.rb" method="process"/><line number="41" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/rendering.rb" method="process"/><line number="138" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal.rb" method="dispatch"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rack_delegation.rb" method="dispatch"/><line number="178" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal.rb" method="block in action"/><line number="68" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="68" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="dispatch"/><line number="33" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="148" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/route_set.rb" method="block in call"/><line number="93" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="block in recognize"/><line number="68" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="optimized_each"/><line number="92" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="recognize"/><line number="139" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/route_set.rb" method="call"/><line number="499" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/best_standards_support.rb" method="call"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/head.rb" method="call"/><line number="24" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/methodoverride.rb" method="call"/><line number="21" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/params_parser.rb" method="call"/><line number="182" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/flash.rb" method="call"/><line number="149" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/session/abstract_store.rb" method="call"/><line number="302" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/cookies.rb" method="call"/><line number="46" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/callbacks.rb" method="block in call"/><line number="416" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run_call_callbacks"/><line number="44" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/callbacks.rb" method="call"/><line number="106" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/sendfile.rb" method="call"/><line number="48" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/remote_ip.rb" method="call"/><line number="13" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/rack/logger.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/runtime.rb" method="call"/><line number="72" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/cache/strategy/local_cache.rb" method="call"/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="block in call"/><line number="" file="" method=""/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="call"/><line number="30" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/static.rb" method="call"/><line number="168" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/application.rb" method="call"/><line number="236" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="call"/><line number="236" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="block in execute"/><line number="231" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="each"/><line number="231" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="execute"/><line number="175" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="block in invoke_with_call_chain"/><line number="211" file="/opt/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/monitor.rb" method="mon_synchronize"/><line number="168" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="invoke_with_call_chain"/><line number="161" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="invoke"/><line number="149" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="invoke_task"/><line number="106" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="block (2 levels) in top_level"/><line number="106" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="each"/><line number="106" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="block in top_level"/><line number="115" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="run_with_threads"/><line number="100" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="top_level"/><line number="78" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="block in run"/><line number="165" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="standard_exception_handling"/><line number="75" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="run"/><line number="33" file="[GEM_ROOT]/gems/rake-10.1.0/bin/rake" method="&lt;top (required)&gt;"/><line number="23" file="[GEM_ROOT]/bin/rake" method="load"/><line number="23" file="[GEM_ROOT]/bin/rake" method="&lt;main&gt;"/></backtrace></error><request><url>http://www.example.com/verify</url><component>application</component><action>verify</action><params><var key="action">verify</var><var key="controller">application</var></params><cgi-data><var key="rack.version">["1", "1"]</var><var key="rack.input">#&lt;StringIO:0x00000003073700&gt;</var><var key="rack.errors">#&lt;StringIO:0x000000030737c8&gt;</var><var key="rack.multithread">false</var><var key="rack.multiprocess">true</var><var key="rack.run_once">false</var><var key="REQUEST_METHOD">GET</var><var key="SERVER_NAME">www.example.com</var><var key="SERVER_PORT">80</var><var key="QUERY_STRING"></var><var key="PATH_INFO">/verify</var><var key="rack.url_scheme">http</var><var key="HTTPS">off</var><var key="SCRIPT_NAME"></var><var key="CONTENT_LENGTH">0</var><var key="action_dispatch.parameter_filter">["password"]</var><var key="action_dispatch.show_exceptions">false</var><var key="action_dispatch.remote_ip"></var><var key="rack.session"></var><var key="rack.session.options"><var key="path">/</var><var key="domain"></var><var key="expire_after"></var><var key="secure">false</var><var key="httponly">true</var><var key="id"></var></var><var key="action_dispatch.cookies"></var><var key="action_dispatch.request.unsigned_session_cookie"></var><var key="action_dispatch.request.path_parameters"><var key="action">verify</var><var key="controller">application</var></var><var key="action_controller.instance">#&lt;ApplicationController:0x00000003086738&gt;</var><var key="action_dispatch.request.content_type"></var><var key="action_dispatch.request.request_parameters"></var><var key="rack.request.query_string"></var><var key="rack.request.query_hash"></var><var key="action_dispatch.request.query_parameters"></var><var key="action_dispatch.request.parameters"><var key="action">verify</var><var key="controller">application</var></var><var key="action_dispatch.request.formats">["text/html"]</var></cgi-data></request><server-environment><project-root>/home/hrvoje/code/work/airbrake/tmp/rails_root</project-root><environment-name>test</environment-name><hostname>hrvoje-Aspire-5741G</hostname></server-environment><framework>Rails: 3.0.20</framework></notice>
1
+ <?xml version="1.0" encoding="UTF-8"?><notice version="2.4"><api-key>myapikey</api-key><notifier><name>Airbrake Notifier</name><version>3.1.13</version><url>https://github.com/airbrake/airbrake</url></notifier><error><class>AirbrakeTestingException</class><message>AirbrakeTestingException:
2
+ Testing airbrake via "rake airbrake:test". If you can see this, it works.</message><backtrace><line number="432" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run__1847088340968181607__process_action__2679515661620244747__callbacks"/><line number="410" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run_process_action_callbacks"/><line number="94" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="run_callbacks"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/callbacks.rb" method="process_action"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rescue.rb" method="process_action"/><line number="30" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/instrumentation.rb" method="block in process_action"/><line number="52" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications.rb" method="block in instrument"/><line number="21" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications/instrumenter.rb" method="instrument"/><line number="52" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications.rb" method="instrument"/><line number="29" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/instrumentation.rb" method="process_action"/><line number="119" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/base.rb" method="process"/><line number="41" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/rendering.rb" method="process"/><line number="138" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal.rb" method="dispatch"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rack_delegation.rb" method="dispatch"/><line number="178" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal.rb" method="block in action"/><line number="68" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="68" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="dispatch"/><line number="33" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="148" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/route_set.rb" method="block in call"/><line number="93" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="block in recognize"/><line number="68" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="optimized_each"/><line number="92" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="recognize"/><line number="139" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/route_set.rb" method="call"/><line number="499" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/best_standards_support.rb" method="call"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/head.rb" method="call"/><line number="24" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/methodoverride.rb" method="call"/><line number="21" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/params_parser.rb" method="call"/><line number="182" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/flash.rb" method="call"/><line number="149" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/session/abstract_store.rb" method="call"/><line number="302" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/cookies.rb" method="call"/><line number="46" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/callbacks.rb" method="block in call"/><line number="416" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run_call_callbacks"/><line number="44" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/callbacks.rb" method="call"/><line number="106" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/sendfile.rb" method="call"/><line number="48" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/remote_ip.rb" method="call"/><line number="13" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/rack/logger.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/runtime.rb" method="call"/><line number="72" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/cache/strategy/local_cache.rb" method="call"/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="block in call"/><line number="" file="" method=""/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="call"/><line number="30" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/static.rb" method="call"/><line number="168" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/application.rb" method="call"/><line number="236" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="call"/><line number="236" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="block in execute"/><line number="231" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="each"/><line number="231" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="execute"/><line number="175" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="block in invoke_with_call_chain"/><line number="211" file="/opt/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/monitor.rb" method="mon_synchronize"/><line number="168" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="invoke_with_call_chain"/><line number="161" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="invoke"/><line number="149" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="invoke_task"/><line number="106" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="block (2 levels) in top_level"/><line number="106" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="each"/><line number="106" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="block in top_level"/><line number="115" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="run_with_threads"/><line number="100" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="top_level"/><line number="78" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="block in run"/><line number="165" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="standard_exception_handling"/><line number="75" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="run"/><line number="33" file="[GEM_ROOT]/gems/rake-10.1.0/bin/rake" method="&lt;top (required)&gt;"/><line number="23" file="[GEM_ROOT]/bin/rake" method="load"/><line number="23" file="[GEM_ROOT]/bin/rake" method="&lt;main&gt;"/></backtrace></error><request><url>http://www.example.com/verify</url><component>application</component><action>verify</action><params><var key="action">verify</var><var key="controller">application</var></params><cgi-data><var key="rack.version">["1", "1"]</var><var key="rack.input">#&lt;StringIO:0x0000000357f410&gt;</var><var key="rack.errors">#&lt;StringIO:0x0000000357f4b0&gt;</var><var key="rack.multithread">false</var><var key="rack.multiprocess">true</var><var key="rack.run_once">false</var><var key="REQUEST_METHOD">GET</var><var key="SERVER_NAME">www.example.com</var><var key="SERVER_PORT">80</var><var key="QUERY_STRING"></var><var key="PATH_INFO">/verify</var><var key="rack.url_scheme">http</var><var key="HTTPS">off</var><var key="SCRIPT_NAME"></var><var key="CONTENT_LENGTH">0</var><var key="action_dispatch.parameter_filter">["password"]</var><var key="action_dispatch.show_exceptions">false</var><var key="action_dispatch.remote_ip"></var><var key="rack.session"></var><var key="rack.session.options"><var key="path">/</var><var key="domain"></var><var key="expire_after"></var><var key="secure">false</var><var key="httponly">true</var><var key="id"></var></var><var key="action_dispatch.cookies"></var><var key="action_dispatch.request.unsigned_session_cookie"></var><var key="action_dispatch.request.path_parameters"><var key="action">verify</var><var key="controller">application</var></var><var key="action_controller.instance">#&lt;ApplicationController:0x000000035906e8&gt;</var><var key="action_dispatch.request.content_type"></var><var key="action_dispatch.request.request_parameters"></var><var key="rack.request.query_string"></var><var key="rack.request.query_hash"></var><var key="action_dispatch.request.query_parameters"></var><var key="action_dispatch.request.parameters"><var key="action">verify</var><var key="controller">application</var></var><var key="action_dispatch.request.formats">["text/html"]</var></cgi-data></request><server-environment><project-root>/home/hrvoje/code/work/airbrake/tmp/rails_root</project-root><environment-name>test</environment-name><hostname>hrvoje-Aspire-5741G</hostname></server-environment><framework>Rails: 3.0.20</framework></notice>
@@ -2,9 +2,6 @@ require File.expand_path '../helper', __FILE__
2
2
  require 'rubygems'
3
3
 
4
4
  require File.dirname(__FILE__) + '/../lib/airbrake_tasks'
5
- require 'fakeweb'
6
-
7
- FakeWeb.allow_net_connect = false
8
5
 
9
6
  class AirbrakeTasksTest < Test::Unit::TestCase
10
7
  def successful_response(body = "")
@@ -54,6 +54,5 @@ class ControllerMethodsTest < Test::Unit::TestCase
54
54
  assert_equal no_session, {:session => 'no session found'}
55
55
  end
56
56
  end
57
-
58
57
  end
59
58
 
data/test/helper.rb CHANGED
@@ -1,3 +1,17 @@
1
+ require "simplecov"
2
+
3
+ if ENV["INTEGRATION"] then SimpleCov.command_name "test:integration"
4
+ else SimpleCov.command_name "test:units"
5
+ end
6
+
7
+ SimpleCov.merge_timeout 3600
8
+ SimpleCov.start
9
+
10
+ if ENV["CI"]
11
+ require "coveralls"
12
+ Coveralls.wear_merged!
13
+ end
14
+
1
15
  $VERBOSE = ENV["VERBOSE"]
2
16
 
3
17
  module Kernel
@@ -27,14 +41,20 @@ silence_warnings do
27
41
  require 'json-schema'
28
42
  require "shoulda-matchers"
29
43
  require "shoulda-context"
44
+ require "fakeweb"
45
+
30
46
  begin require 'redgreen'; rescue LoadError; end
31
47
  end
32
48
 
33
49
  $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
34
50
 
35
-
36
51
  require "airbrake"
37
52
 
53
+ XSD_SCHEMA_PATH = "http://airbrake.io/airbrake_#{Airbrake::API_VERSION.tr(".","_")}.xsd"
54
+ COVERALLS_API_URL = "https://coveralls.io/api/v1"
55
+
56
+ FakeWeb.allow_net_connect = %r{#{XSD_SCHEMA_PATH}|#{COVERALLS_API_URL}}
57
+
38
58
  module TestMethods
39
59
  def rescue_action e
40
60
  raise e
@@ -47,4 +47,10 @@ class JavascriptNotifierTest < Test::Unit::TestCase
47
47
  assert controller.send(:airbrake_javascript_notifier)['"ESCbad_javascriptESC"']
48
48
  assert ! controller.send(:airbrake_javascript_notifier)['"bad_javascript"']
49
49
  end
50
+
51
+ should "not raise exceptions for the non-public requests" do
52
+ Airbrake::Configuration.any_instance.stubs(:public? => false)
53
+ controller = FakeController.new
54
+ assert_nothing_raised { controller.send(:airbrake_javascript_notifier) }
55
+ end
50
56
  end
data/test/notice_test.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  require File.expand_path '../helper', __FILE__
2
2
 
3
- XSD_SCHEMA_PATH = "http://airbrake.io/airbrake_#{Airbrake::API_VERSION.tr(".","_")}.xsd"
4
- FakeWeb.allow_net_connect = %r{#{XSD_SCHEMA_PATH}}
5
3
 
6
4
  class NoticeTest < Test::Unit::TestCase
7
5
 
@@ -44,25 +42,6 @@ class NoticeTest < Test::Unit::TestCase
44
42
  "#{attribute} was not correctly set from a hash"
45
43
  end
46
44
 
47
- def assert_serializes_hash(attribute)
48
- [File.open(__FILE__), Proc.new { puts "boo!" }, Module.new].each do |object|
49
- hash = {
50
- :strange_object => object,
51
- :sub_hash => {
52
- :sub_object => object
53
- },
54
- :array => [object]
55
- }
56
- notice = build_notice(attribute => hash)
57
- hash = notice.send(attribute)
58
- assert_equal object.to_s, hash[:strange_object], "objects should be serialized"
59
- assert_kind_of Hash, hash[:sub_hash], "subhashes should be kept"
60
- assert_equal object.to_s, hash[:sub_hash][:sub_object], "subhash members should be serialized"
61
- assert_kind_of Array, hash[:array], "arrays should be kept"
62
- assert_equal object.to_s, hash[:array].first, "array members should be serialized"
63
- end
64
- end
65
-
66
45
  def assert_valid_notice_document(document)
67
46
  xsd_path = URI(XSD_SCHEMA_PATH)
68
47
  schema = Nokogiri::XML::Schema.new(Net::HTTP.get(xsd_path))
@@ -76,22 +55,6 @@ class NoticeTest < Test::Unit::TestCase
76
55
  assert errors.empty?, errors.join
77
56
  end
78
57
 
79
- def assert_filters_hash(attribute)
80
- filters = ["abc", :def]
81
- original = { 'abc' => "123", 'def' => "456", 'ghi' => "789", 'nested' => { 'abc' => '100' },
82
- 'something_with_abc' => 'match the entire string'}
83
- filtered = { 'abc' => "[FILTERED]",
84
- 'def' => "[FILTERED]",
85
- 'something_with_abc' => "match the entire string",
86
- 'ghi' => "789",
87
- 'nested' => { 'abc' => '[FILTERED]' } }
88
-
89
- notice = build_notice(:params_filters => filters, attribute => original)
90
-
91
- assert_equal(filtered,
92
- notice.send(attribute))
93
- end
94
-
95
58
  def build_backtrace_array
96
59
  ["app/models/user.rb:13:in `magic'",
97
60
  "app/controllers/users_controller.rb:8:in `index'"]
@@ -106,6 +69,12 @@ class NoticeTest < Test::Unit::TestCase
106
69
  new("darth@vader.com",1,"Anakin Skywalker")
107
70
  end
108
71
 
72
+ should "call the cleaner on initialization" do
73
+ cleaner = stub
74
+ cleaner.expects(:clean).returns(stub(:parameters => {}, :cgi_data => {}, :session_data => {}))
75
+ Airbrake::Notice.new(:cleaner => cleaner)
76
+ end
77
+
109
78
  should "set the api key" do
110
79
  api_key = 'key'
111
80
  notice = build_notice(:api_key => api_key)
@@ -249,43 +218,6 @@ class NoticeTest < Test::Unit::TestCase
249
218
  assert_array_starts_with backtrace.lines, notice.backtrace.lines
250
219
  end
251
220
 
252
- should "convert unserializable objects to strings" do
253
- assert_serializes_hash(:parameters)
254
- assert_serializes_hash(:cgi_data)
255
- assert_serializes_hash(:session_data)
256
- end
257
-
258
- should "filter parameters" do
259
- assert_filters_hash(:parameters)
260
- end
261
-
262
- should "filter cgi data" do
263
- assert_filters_hash(:cgi_data)
264
- end
265
-
266
- should "filter session" do
267
- assert_filters_hash(:session_data)
268
- end
269
-
270
- should "should always remove a Rails application's secret token" do
271
- original = {
272
- "action_dispatch.secret_token" => "abc123xyz456",
273
- "abc" => "123"
274
- }
275
- notice = build_notice(:cgi_data => original)
276
- assert_equal({"abc" => "123"}, notice.cgi_data)
277
- end
278
-
279
- should "remove rack.request.form_vars" do
280
- original = {
281
- "rack.request.form_vars" => "story%5Btitle%5D=The+TODO+label",
282
- "abc" => "123"
283
- }
284
-
285
- notice = build_notice(:cgi_data => original)
286
- assert_equal({"abc" => "123"}, notice.cgi_data)
287
- end
288
-
289
221
  context "a Notice turned into JSON" do
290
222
  setup do
291
223
  @exception = build_exception
@@ -0,0 +1,83 @@
1
+ require File.expand_path '../helper', __FILE__
2
+
3
+ class ParamsCleanerTest < Test::Unit::TestCase
4
+
5
+ def clean(opts = {})
6
+ cleaner = Airbrake::Utils::ParamsCleaner.new(:filters => opts.delete(:params_filters),
7
+ :to_clean => opts)
8
+ cleaner.clean
9
+ end
10
+
11
+ def assert_serializes_hash(attribute)
12
+ [File.open(__FILE__), Proc.new { puts "boo!" }, Module.new].each do |object|
13
+ hash = {
14
+ :strange_object => object,
15
+ :sub_hash => {
16
+ :sub_object => object
17
+ },
18
+ :array => [object]
19
+ }
20
+ clean_params = clean(attribute => hash)
21
+ hash = clean_params.send(attribute)
22
+ assert_equal object.to_s, hash[:strange_object], "objects should be serialized"
23
+ assert_kind_of Hash, hash[:sub_hash], "subhashes should be kept"
24
+ assert_equal object.to_s, hash[:sub_hash][:sub_object], "subhash members should be serialized"
25
+ assert_kind_of Array, hash[:array], "arrays should be kept"
26
+ assert_equal object.to_s, hash[:array].first, "array members should be serialized"
27
+ end
28
+ end
29
+
30
+ def assert_filters_hash(attribute)
31
+ filters = ["abc", :def]
32
+ original = { 'abc' => "123", 'def' => "456", 'ghi' => "789", 'nested' => { 'abc' => '100' },
33
+ 'something_with_abc' => 'match the entire string'}
34
+ filtered = { 'abc' => "[FILTERED]",
35
+ 'def' => "[FILTERED]",
36
+ 'something_with_abc' => "match the entire string",
37
+ 'ghi' => "789",
38
+ 'nested' => { 'abc' => '[FILTERED]' } }
39
+
40
+ clean_params = clean(:params_filters => filters,
41
+ attribute => original)
42
+
43
+ assert_equal(filtered,
44
+ clean_params.send(attribute))
45
+ end
46
+
47
+ should "should always remove a Rails application's secret token" do
48
+ original = {
49
+ "action_dispatch.secret_token" => "abc123xyz456",
50
+ "abc" => "123"
51
+ }
52
+ clean_params = clean(:cgi_data => original)
53
+ assert_equal({"abc" => "123"}, clean_params.cgi_data)
54
+ end
55
+
56
+ should "remove rack.request.form_vars" do
57
+ original = {
58
+ "rack.request.form_vars" => "story%5Btitle%5D=The+TODO+label",
59
+ "abc" => "123"
60
+ }
61
+
62
+ clean_params = clean(:cgi_data => original)
63
+ assert_equal({"abc" => "123"}, clean_params.cgi_data)
64
+ end
65
+
66
+ should "filter parameters" do
67
+ assert_filters_hash(:parameters)
68
+ end
69
+
70
+ should "filter cgi data" do
71
+ assert_filters_hash(:cgi_data)
72
+ end
73
+
74
+ should "filter session" do
75
+ assert_filters_hash(:session_data)
76
+ end
77
+
78
+ should "convert unserializable objects to strings" do
79
+ assert_serializes_hash(:parameters)
80
+ assert_serializes_hash(:cgi_data)
81
+ assert_serializes_hash(:session_data)
82
+ end
83
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airbrake
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.13
4
+ version: 3.1.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-20 00:00:00.000000000 Z
12
+ date: 2013-08-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: builder
@@ -283,6 +283,22 @@ dependencies:
283
283
  - - ! '>='
284
284
  - !ruby/object:Gem::Version
285
285
  version: '0'
286
+ - !ruby/object:Gem::Dependency
287
+ name: coveralls
288
+ requirement: !ruby/object:Gem::Requirement
289
+ none: false
290
+ requirements:
291
+ - - ! '>='
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ type: :development
295
+ prerelease: false
296
+ version_requirements: !ruby/object:Gem::Requirement
297
+ none: false
298
+ requirements:
299
+ - - ! '>='
300
+ - !ruby/object:Gem::Version
301
+ version: '0'
286
302
  description:
287
303
  email: support@airbrake.io
288
304
  executables:
@@ -303,6 +319,7 @@ files:
303
319
  - lib/airbrake/rails.rb
304
320
  - lib/airbrake/version.rb
305
321
  - lib/airbrake/rails3_tasks.rb
322
+ - lib/airbrake/utils/params_cleaner.rb
306
323
  - lib/airbrake/user_informer.rb
307
324
  - lib/airbrake/cli/project_factory.rb
308
325
  - lib/airbrake/cli/printer.rb
@@ -352,6 +369,7 @@ files:
352
369
  - test/integration/javascript_notifier_test.rb
353
370
  - test/integration/catcher_test.rb
354
371
  - test/notifier_test.rb
372
+ - test/params_cleaner_test.rb
355
373
  - test/configuration_test.rb
356
374
  - test/integration.rb
357
375
  - test/airbrake_tasks_test.rb
@@ -414,6 +432,7 @@ test_files:
414
432
  - test/integration/javascript_notifier_test.rb
415
433
  - test/integration/catcher_test.rb
416
434
  - test/notifier_test.rb
435
+ - test/params_cleaner_test.rb
417
436
  - test/configuration_test.rb
418
437
  - test/integration.rb
419
438
  - test/airbrake_tasks_test.rb
@@ -445,4 +464,3 @@ test_files:
445
464
  - features/rake.feature
446
465
  - features/rails_with_js_notifier.feature
447
466
  - features/sinatra.feature
448
- has_rdoc: