airbrake 3.1.13 → 3.1.14

Sign up to get free protection for your applications and to get access to all the features.
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: