airbrake 4.1.0 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -114,6 +114,7 @@ namespace :airbrake do
114
114
  protocol = (config.respond_to?(:force_ssl) && config.force_ssl) ? 'https' : 'http'
115
115
 
116
116
  env = Rack::MockRequest.env_for("#{protocol}://www.example.com/verify")
117
+ env['REMOTE_ADDR'] = '127.0.0.1'
117
118
 
118
119
  Rails.application.call(env)
119
120
 
@@ -1,9 +1,8 @@
1
+ gem 'sidekiq', '~> 3.0'
1
2
  require 'sidekiq'
2
3
 
3
- if ::Sidekiq::VERSION >= '3'
4
- ::Sidekiq.configure_server do |config|
5
- config.error_handlers << lambda do |exception, context|
6
- Airbrake.notify_or_ignore(exception, :parameters => context)
7
- end
4
+ Sidekiq.configure_server do |config|
5
+ config.error_handlers << lambda do |exception, context|
6
+ Airbrake.notify_or_ignore(exception, :parameters => context)
8
7
  end
9
- end
8
+ end
@@ -6,7 +6,7 @@ namespace :airbrake do
6
6
  task :deploy do
7
7
  # update scm state to get the repository information
8
8
  invoke "#{scm}:update"
9
- on roles(:app) do
9
+ on roles(:all) do
10
10
  within release_path do
11
11
  # XXX: Invoking deploy:set_rails_env would set :rails_env to proper
12
12
  # value, but that would make us depend on capistrano-rails
@@ -5,15 +5,16 @@ module Airbrake
5
5
  attr_reader :parameters, :cgi_data, :session_data
6
6
 
7
7
  # Public: Initialize a new Airbrake::Utils::ParamsCleaner
8
- #
8
+ #
9
9
  # opts - The Hash options that contain filters and params (default: {}):
10
10
  # :filters - The Array of param keys that should be filtered
11
11
  # :to_clean - The Hash of unfiltered params
12
12
  def initialize(opts = {})
13
- @filters = opts[:filters] || {}
13
+ @filters = opts[:filters] || []
14
+ @filters.map!{|f| f.is_a?(Symbol) ? f.to_s : f }
14
15
  @to_clean = opts[:to_clean]
15
16
  end
16
-
17
+
17
18
  # Public: Takes the params to_clean passed in an initializer
18
19
  # and filters them out by filters passed.
19
20
  #
@@ -23,7 +24,7 @@ module Airbrake
23
24
  # could be extracted
24
25
  def clean
25
26
  clean_parameters
26
- clean_session_data
27
+ clean_session_data
27
28
  clean_cgi_data
28
29
  clean_rack_request_data
29
30
 
@@ -33,50 +34,52 @@ module Airbrake
33
34
  private
34
35
 
35
36
  def clean_parameters
36
- if params = @to_clean[:parameters]
37
- @parameters = clean_unserializable_data(params)
38
- @parameters = filter @parameters
37
+ return unless @to_clean[:parameters]
38
+
39
+ @parameters = if @filters.any?
40
+ filter(clean_unserializable_data(@to_clean[:parameters]))
41
+ else
42
+ clean_unserializable_data(@to_clean[:parameters])
39
43
  end
40
44
  end
41
45
 
42
46
  def clean_cgi_data
43
- if params = @to_clean[:cgi_data]
44
- @cgi_data = clean_unserializable_data params
45
- @cgi_data = filter @cgi_data
47
+ return unless @to_clean[:cgi_data]
48
+
49
+ @cgi_data = if @filters.any?
50
+ filter(clean_unserializable_data(@to_clean[:cgi_data]))
51
+ else
52
+ clean_unserializable_data(@to_clean[:cgi_data])
46
53
  end
47
54
  end
48
55
 
49
56
  def clean_session_data
50
- if params = @to_clean[:session_data]
51
- @session_data = clean_unserializable_data params
52
- @session_data = filter @session_data
57
+ return unless @to_clean[:session_data]
58
+
59
+ @session_data = if @filters.any?
60
+ filter(clean_unserializable_data(@to_clean[:session_data]))
61
+ else
62
+ clean_unserializable_data(@to_clean[:session_data])
53
63
  end
54
64
  end
55
65
 
56
66
  def clean_rack_request_data
57
67
  if @cgi_data
58
- @cgi_data.keys.each do |key|
59
- if filter_key?(key, Airbrake::FILTERED_RACK_VARS)
60
- @cgi_data.delete key
61
- end
68
+ @cgi_data.reject! do |key, val|
69
+ Airbrake::FILTERED_RACK_VARS.include?(key) || Airbrake::SENSITIVE_ENV_VARS.any?{|re| re.match(key)}
62
70
  end
63
71
  end
64
72
  end
65
73
 
66
- def filter_key?(key, filters)
67
- filters.any? do |filter|
68
- case filter
69
- when Regexp
70
- filter.match(key)
71
- else
72
- key.to_s.eql?(filter.to_s)
73
- end
74
+ def filter_key?(key)
75
+ @filters.any? do |filter|
76
+ key == filter || filter.is_a?(Regexp) && filter.match(key)
74
77
  end
75
78
  end
76
79
 
77
80
  def filter(hash)
78
81
  hash.each do |key, value|
79
- if filter_key?(key, @filters)
82
+ if filter_key?(key)
80
83
  hash[key] = "[FILTERED]"
81
84
  elsif value.respond_to?(:to_hash)
82
85
  filter(hash[key])
@@ -93,16 +96,25 @@ module Airbrake
93
96
  # and hashes. All other types are converted to strings.
94
97
  def clean_unserializable_data(data, stack = [])
95
98
  return "[possible infinite recursion halted]" if stack.any?{|item| item == data.object_id }
96
-
97
- if data.respond_to?(:to_hash)
99
+ if data.is_a?(String)
100
+ data
101
+ elsif data.is_a?(Hash)
102
+ data.inject({}) do |result, (key, value)|
103
+ result.merge!(key => clean_unserializable_data(value, stack + [data.object_id]))
104
+ end
105
+ elsif data.respond_to?(:to_hash)
98
106
  data.to_hash.inject({}) do |result, (key, value)|
99
- result.merge(key => clean_unserializable_data(value, stack + [data.object_id]))
107
+ result.merge!(key => clean_unserializable_data(value, stack + [data.object_id]))
108
+ end
109
+ elsif data.respond_to?(:collect) and !data.is_a?(IO)
110
+ data = data.collect do |value|
111
+ clean_unserializable_data(value, stack + [data.object_id])
100
112
  end
101
113
  elsif data.respond_to?(:to_ary)
102
- data.to_ary.collect do |value|
114
+ data = data.to_ary.collect do |value|
103
115
  clean_unserializable_data(value, stack + [data.object_id])
104
116
  end
105
- else
117
+ elsif data.respond_to?(:to_s)
106
118
  data.nil? ? nil : data.to_s
107
119
  end
108
120
  end
@@ -1,3 +1,3 @@
1
1
  module Airbrake
2
- VERSION = "4.1.0".freeze
2
+ VERSION = "4.2.0".freeze
3
3
  end
@@ -25,7 +25,7 @@ class AirbrakeGenerator < Rails::Generators::Base
25
25
  def install
26
26
  ensure_api_key_was_configured
27
27
  ensure_plugin_is_not_present
28
- append_capistrano_hook
28
+ append_capistrano_hook if capistrano_present?
29
29
  generate_initializer unless api_key_configured?
30
30
  determine_api_key if heroku?
31
31
  test_airbrake
@@ -47,18 +47,42 @@ class AirbrakeGenerator < Rails::Generators::Base
47
47
  end
48
48
  end
49
49
 
50
- def append_capistrano_hook
51
- if File.exists?('config/deploy.rb') && File.exists?('Capfile')
52
- append_file('config/deploy.rb', <<-HOOK)
50
+ def capistrano_present?
51
+ !Gem.loaded_specs['capistrano'].nil? &&
52
+ File.exists?('config/deploy.rb') &&
53
+ File.exists?('Capfile')
54
+ end
53
55
 
54
- require './config/boot'
55
- require 'airbrake/capistrano'
56
- HOOK
56
+ def append_capistrano_hook
57
+ if capistrano_version < Gem::Version.new('3')
58
+ append_file('config/deploy.rb', capistrano2_hook)
59
+ else
60
+ append_file('config/deploy.rb', capistrano3_hook)
57
61
  end
58
62
  end
59
63
 
64
+ def capistrano_version
65
+ Gem.loaded_specs['capistrano'].version
66
+ end
67
+
68
+ def capistrano2_hook
69
+ <<-HOOK
70
+
71
+ require './config/boot'
72
+ require 'airbrake/capistrano'
73
+ HOOK
74
+ end
75
+
76
+ def capistrano3_hook
77
+ <<-HOOK
78
+
79
+ require 'airbrake/capistrano3'
80
+ after "deploy:finished", "airbrake:deploy"
81
+ HOOK
82
+ end
83
+
60
84
  def api_key_expression
61
- s = if options[:api_key]
85
+ if options[:api_key]
62
86
  "'#{options[:api_key]}'"
63
87
  elsif options[:heroku]
64
88
  "ENV['AIRBRAKE_API_KEY']"
@@ -1 +1 @@
1
- <?xml version="1.0" encoding="UTF-8"?><notice version="2.4"><api-key>myapikey</api-key><notifier><name>Airbrake Notifier</name><version>4.0.0</version><url>https://github.com/airbrake/airbrake</url></notifier><error><class>RuntimeError</class><message>RuntimeError: some message</message><backtrace><line number="5" file="[PROJECT_ROOT]/app/controllers/test_controller.rb" method="index"/><line number="4" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/implicit_render.rb" method="send_action"/><line number="150" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/base.rb" method="process_action"/><line number="11" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rendering.rb" method="process_action"/><line number="18" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/callbacks.rb" method="block in process_action"/><line number="436" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run__3844756527684457203__process_action__1951419777138106973__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="47" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/show_exceptions.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="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="synchronize"/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="call"/><line number="168" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/application.rb" method="call"/><line number="77" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/application.rb" method="method_missing"/><line number="4" file="request.rb" method="&lt;top (required)&gt;"/><line number="48" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands/runner.rb" method="eval"/><line number="48" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands/runner.rb" method="&lt;top (required)&gt;"/><line number="39" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands.rb" method="require"/><line number="39" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands.rb" method="&lt;top (required)&gt;"/><line number="6" file="script/rails" method="require"/><line number="6" file="script/rails" method="&lt;main&gt;"/></backtrace></error><request><url>http://example.com:123/test/index?param=value</url><component>test</component><action>index</action><params><var key="param">value</var><var key="controller">test</var><var key="action">index</var></params><cgi-data><var key="rack.version">["1", "1"]</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">example.com</var><var key="SERVER_PORT">123</var><var key="QUERY_STRING">param=value</var><var key="PATH_INFO">/test/index</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">true</var><var key="action_dispatch.remote_ip"></var><var key="action_dispatch.request.path_parameters"><var key="controller">test</var><var key="action">index</var></var><var key="action_dispatch.request.content_type"></var><var key="action_dispatch.request.request_parameters"></var><var key="rack.request.query_string">param=value</var><var key="rack.request.query_hash"><var key="param">value</var></var><var key="action_dispatch.request.query_parameters"><var key="param">value</var></var><var key="action_dispatch.request.parameters"><var key="param">value</var><var key="controller">test</var><var key="action">index</var></var><var key="action_dispatch.request.formats">["text/html"]</var></cgi-data></request><server-environment><project-root>/Users/shifi/work/rackspace/code/airbrake/tmp/rails_root</project-root><environment-name>production</environment-name><hostname>shifi-mac.lan</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>4.1.0</version><url>https://github.com/airbrake/airbrake</url></notifier><error><class>RuntimeError</class><message>RuntimeError: some message</message><backtrace><line number="5" file="[PROJECT_ROOT]/app/controllers/test_controller.rb" method="index"/><line number="4" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/implicit_render.rb" method="send_action"/><line number="150" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/base.rb" method="process_action"/><line number="11" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rendering.rb" method="process_action"/><line number="18" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/callbacks.rb" method="block in process_action"/><line number="436" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run__2068053752208704527__process_action__3383495195678923616__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="47" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/show_exceptions.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="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="synchronize"/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="call"/><line number="168" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/application.rb" method="call"/><line number="77" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/application.rb" method="method_missing"/><line number="4" file="request.rb" method="&lt;top (required)&gt;"/><line number="48" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands/runner.rb" method="eval"/><line number="48" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands/runner.rb" method="&lt;top (required)&gt;"/><line number="39" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands.rb" method="require"/><line number="39" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/commands.rb" method="&lt;top (required)&gt;"/><line number="6" file="script/rails" method="require"/><line number="6" file="script/rails" method="&lt;main&gt;"/></backtrace></error><request><url>http://example.com:123/test/index?param=value</url><component>test</component><action>index</action><params><var key="param">value</var><var key="controller">test</var><var key="action">index</var></params><cgi-data><var key="rack.version">["1", "1"]</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">example.com</var><var key="SERVER_PORT">123</var><var key="QUERY_STRING">param=value</var><var key="PATH_INFO">/test/index</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">true</var><var key="action_dispatch.remote_ip"></var><var key="action_dispatch.request.path_parameters"><var key="controller">test</var><var key="action">index</var></var><var key="action_dispatch.request.content_type"></var><var key="action_dispatch.request.request_parameters"></var><var key="rack.request.query_string">param=value</var><var key="rack.request.query_hash"><var key="param">value</var></var><var key="action_dispatch.request.query_parameters"><var key="param">value</var></var><var key="action_dispatch.request.parameters"><var key="param">value</var><var key="controller">test</var><var key="action">index</var></var><var key="action_dispatch.request.formats">["text/html"]</var></cgi-data></request><server-environment><project-root>/Users/shifi/work/rackspace/code/airbrake/tmp/rails_root</project-root><environment-name>production</environment-name><hostname>shifi-mac.mshome.net</hostname></server-environment><framework>Rails: 3.0.20</framework></notice>
@@ -75,6 +75,40 @@ class BacktraceTest < Test::Unit::TestCase
75
75
  assert_equal expected_backtrace, original_backtrace
76
76
  end
77
77
 
78
+ context "with a gem root" do
79
+ setup do
80
+ @gem_root = '/root/to/gem'
81
+ Gem.path << @gem_root
82
+ end
83
+
84
+ should "filter out the gem root" do
85
+ backtrace_with_gem_root = Airbrake::Backtrace.parse(
86
+ ["#{@gem_root}/some/gem.rb:9:in `test'",
87
+ "#{@gem_root}/path/to/awesome_gem.rb:13:in `awesome'",
88
+ "/test/something.rb:55:in `hack'"],
89
+ :filters => default_filters)
90
+ backtrace_without_gem_root = Airbrake::Backtrace.parse(
91
+ ["[GEM_ROOT]/some/gem.rb:9:in `test'",
92
+ "[GEM_ROOT]/path/to/awesome_gem.rb:13:in `awesome'",
93
+ "/test/something.rb:55:in `hack'"])
94
+
95
+ assert_equal backtrace_without_gem_root, backtrace_with_gem_root
96
+ end
97
+
98
+ should "ignore empty gem paths" do
99
+ Gem.path << ""
100
+ backtrace_with_gem_root = Airbrake::Backtrace.parse(
101
+ ["#{@gem_root}/some/gem.rb:9:in `test'",
102
+ "/test/something.rb:55:in `hack'"],
103
+ :filters => default_filters)
104
+ backtrace_without_gem_root = Airbrake::Backtrace.parse(
105
+ ["[GEM_ROOT]/some/gem.rb:9:in `test'",
106
+ "/test/something.rb:55:in `hack'"])
107
+
108
+ assert_equal backtrace_without_gem_root, backtrace_with_gem_root
109
+ end
110
+ end
111
+
78
112
  context "with a project root" do
79
113
  setup do
80
114
  @project_root = '/some/path'
@@ -33,7 +33,7 @@ class CapistranoTest < Test::Unit::TestCase
33
33
  @configuration.find_and_execute_task('airbrake:deploy')
34
34
 
35
35
  assert io.string.include?('** Notifying Airbrake of Deploy')
36
- assert io.string.include?('RAILS_ENV=production')
36
+ assert io.string.include?('TO=production')
37
37
  assert io.string.include?('** Airbrake Notification Complete')
38
38
  assert io.string.include?(%q[D\'Angelo\ \"D\"\ Barksdale])
39
39
  end
@@ -1,47 +1,106 @@
1
1
  require File.expand_path '../helper', __FILE__
2
2
 
3
3
  require 'airbrake/rails/controller_methods'
4
-
5
4
  class TestController
6
5
  include Airbrake::Rails::ControllerMethods
7
6
 
7
+ def params; {}; end
8
+ def session; nil; end
9
+ def request
10
+ OpenStruct.new(:port=> 80, :protocol => 'http://', host: 'example.com', :fullpath => 'path', :env => [])
11
+ end
12
+ end
13
+
14
+ class NilUserTestController < TestController
8
15
  def current_user
9
16
  nil
10
17
  end
11
18
  end
12
19
 
13
- class NoSessionTestController
14
- include Airbrake::Rails::ControllerMethods
20
+ class CurrentUserTestController < TestController
21
+ def current_user
22
+ OpenStruct.new(:id => 123, :name => 'tape')
23
+ end
24
+ end
15
25
 
16
- def session
17
- nil
26
+ class CurrentMemberTestController < TestController
27
+ def current_member
28
+ OpenStruct.new(:id => 321, :name => 'mamba')
18
29
  end
19
30
  end
20
31
 
21
32
 
33
+ class NoSessionTestController < TestController
34
+ def session
35
+ nil
36
+ end
37
+ end
22
38
 
23
39
  class ControllerMethodsTest < Test::Unit::TestCase
40
+ include DefinesConstants
41
+
24
42
  context "#airbrake_current_user" do
25
- setup do
43
+ context "without a logged in user" do
44
+ setup do
26
45
 
27
- NilClass.class_eval do
28
- @@called = false
46
+ NilClass.class_eval do
47
+ @@called = false
29
48
 
30
- def self.called
31
- !! @@called
32
- end
49
+ def self.called
50
+ !! @@called
51
+ end
33
52
 
34
- def id
35
- @@called = true
53
+ def id
54
+ @@called = true
55
+ end
36
56
  end
57
+
58
+ @controller = NilUserTestController.new
37
59
  end
38
60
 
39
- @controller = TestController.new
61
+ should "not call #id on NilClass" do
62
+ @controller.send(:airbrake_current_user)
63
+ assert_equal false, NilClass.called
64
+ end
40
65
  end
41
66
 
42
- should "not call #id on NilClass" do
43
- @controller.send(:airbrake_current_user)
44
- assert_equal false, NilClass.called
67
+ context "with a logged in User" do
68
+ teardown do
69
+ Object.__send__(:remove_const, :ActiveRecord) if defined?(ActiveRecord)
70
+ Object.__send__(:remove_const, :POOL) if defined?(POOL)
71
+ end
72
+ should 'include user info in the data sent to Ab' do
73
+ Airbrake.configuration.user_attributes = %w(id)
74
+ controller = CurrentUserTestController.new
75
+ ab_data = controller.airbrake_request_data
76
+
77
+ assert_equal( {:id => 123}, ab_data[:user])
78
+ end
79
+
80
+ should 'include more info if asked to, discarding unknown attributes' do
81
+ Airbrake.configuration.user_attributes = %w(id name collar-size)
82
+
83
+ controller = CurrentUserTestController.new
84
+ ab_data = controller.airbrake_request_data
85
+
86
+ assert_equal( {:id => 123, :name => 'tape'}, ab_data[:user])
87
+ end
88
+
89
+ should 'work with a "current_member" method too' do
90
+ Airbrake.configuration.user_attributes = %w(id)
91
+ controller = CurrentMemberTestController.new
92
+ ab_data = controller.airbrake_request_data
93
+
94
+ assert_equal( {:id => 321}, ab_data[:user])
95
+ end
96
+
97
+ should "release DB connections" do
98
+ ::POOL = Object.new
99
+ module ::ActiveRecord; class Base; def self.connection_pool; ::POOL; end; end; end
100
+ ::POOL.expects(:release_connection)
101
+
102
+ CurrentUserTestController.new.airbrake_request_data
103
+ end
45
104
  end
46
105
  end
47
106
 
@@ -55,15 +114,49 @@ class ControllerMethodsTest < Test::Unit::TestCase
55
114
  end
56
115
  end
57
116
 
117
+ context "#airbrake_request_url" do
118
+ setup do
119
+ @controller = NoSessionTestController.new
120
+ end
121
+ should "return correct request url" do
122
+ request_url = @controller.send(:airbrake_request_url)
123
+ assert_equal request_url, "http://example.com/path"
124
+ end
125
+ end
126
+
58
127
  context "Rails 3" do
59
128
  setup do
60
- @controller = TestController.new
129
+ @controller = NilUserTestController.new
61
130
  ::Rails = Object.new
62
131
  ::Rails.stubs(:version).returns("3.2.17")
63
132
  end
64
- should "respond to rails3? with true" do
65
- assert @controller.send(:rails3?)
133
+
134
+ should "respond to rails_3_or_4? with true" do
135
+ assert @controller.send(:rails_3_or_4?)
136
+ end
137
+
138
+ should "call filter_rails3_parameters" do
139
+ hash = {:a => "b"}
140
+ filtered_hash = {:c => "d"}
141
+
142
+ @controller.expects(:filter_rails3_parameters).with(hash).
143
+ returns(filtered_hash)
144
+ assert_equal filtered_hash,
145
+ @controller.send(:airbrake_filter_if_filtering, hash)
146
+ end
147
+ end
148
+
149
+ context "Rails 4.x" do
150
+ setup do
151
+ @controller = TestController.new
152
+ ::Rails = Object.new
153
+ ::Rails.stubs(:version).returns("4.5.6.7")
66
154
  end
155
+
156
+ should 'be true when running Rails 4.x' do
157
+ assert @controller.send(:rails_3_or_4?)
158
+ end
159
+
67
160
  should "call filter_rails3_parameters" do
68
161
  hash = {:a => "b"}
69
162
  filtered_hash = {:c => "d"}
@@ -74,4 +167,5 @@ class ControllerMethodsTest < Test::Unit::TestCase
74
167
  @controller.send(:airbrake_filter_if_filtering, hash)
75
168
  end
76
169
  end
170
+
77
171
  end