flail 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3@flail
data/Gemfile.lock ADDED
@@ -0,0 +1,43 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ flail (0.0.3)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ actionpack (2.3.14)
10
+ activesupport (= 2.3.14)
11
+ rack (~> 1.1.0)
12
+ activerecord (2.3.14)
13
+ activesupport (= 2.3.14)
14
+ activesupport (2.3.14)
15
+ diff-lcs (1.1.3)
16
+ fakeweb (1.3.0)
17
+ rack (1.1.3)
18
+ rake (0.9.2.2)
19
+ rr (1.0.4)
20
+ rspec (2.11.0)
21
+ rspec-core (~> 2.11.0)
22
+ rspec-expectations (~> 2.11.0)
23
+ rspec-mocks (~> 2.11.0)
24
+ rspec-core (2.11.1)
25
+ rspec-expectations (2.11.2)
26
+ diff-lcs (~> 1.1.3)
27
+ rspec-mocks (2.11.1)
28
+ sham_rack (1.3.4)
29
+ rack
30
+
31
+ PLATFORMS
32
+ ruby
33
+
34
+ DEPENDENCIES
35
+ actionpack (~> 2.3.8)
36
+ activerecord (~> 2.3.8)
37
+ activesupport (~> 2.3.8)
38
+ fakeweb (~> 1.3.0)
39
+ flail!
40
+ rake
41
+ rr
42
+ rspec
43
+ sham_rack (~> 1.3.0)
data/flail.gemspec CHANGED
@@ -18,7 +18,12 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
+ s.add_development_dependency 'actionpack', '~> 2.3.8'
22
+ s.add_development_dependency 'activerecord', '~> 2.3.8'
23
+ s.add_development_dependency 'activesupport', '~> 2.3.8'
24
+ s.add_development_dependency 'fakeweb', '~> 1.3.0'
21
25
  s.add_development_dependency 'rake'
22
26
  s.add_development_dependency 'rspec'
23
27
  s.add_development_dependency 'rr'
28
+ s.add_development_dependency 'sham_rack', '~> 1.3.0'
24
29
  end
@@ -1,8 +1,9 @@
1
1
  require 'socket'
2
+ require 'json'
2
3
 
3
4
  class Flail
4
5
  class Exception
5
- def initialize(env, exception)
6
+ def initialize(env, exception, local = false)
6
7
  @exception = exception
7
8
  @env = env
8
9
  end
@@ -18,19 +19,15 @@ class Flail
18
19
  end
19
20
  end
20
21
 
21
- def controller
22
- @controller ||= @env['action_controller.instance']
23
- @controller ||= @request.controller if @request.respond_to?(:controller)
24
- end
25
-
26
- def user
27
- if controller.respond_to?(:current_user)
28
- current_user = controller.current_user
29
-
30
- {:id => current_user.id, :name => current_user.to_s}
31
- else
32
- {}
33
- end
22
+ def request_data
23
+ @request_data ||= if @env['flail.request.data']
24
+ @env['flail.request.data']
25
+ else
26
+ {
27
+ :parameters => {},
28
+ :user => {},
29
+ }
30
+ end
34
31
  end
35
32
 
36
33
 
@@ -45,14 +42,17 @@ class Flail
45
42
  @extract ||= begin
46
43
  info = {}
47
44
 
48
- info[:class_name] = @exception.class.to_s # @exception class
49
- info[:message] = @exception.to_s # error message
50
- info[:trace] = @exception.backtrace.to_json # backtrace of error
51
- info[:target_url] = request.url # url of request
52
- info[:referer_url] = request.referer # referer
53
- info[:parameters] = request.params.to_json # request parameters
54
- info[:user_agent] = request.user_agent # user agent
55
- info[:user] = self.user.to_json # current user
45
+ # rack env
46
+ info[:rack] = @env.to_json(:except => ['flail.request', 'flail.request.data'])
47
+ info[:class_name] = @exception.class.to_s # @exception class
48
+ info[:message] = @exception.to_s # error message
49
+ info[:trace] = @exception.backtrace # backtrace of error
50
+ info[:target_url] = request_data[:target_url] # url of request
51
+ info[:referer_url] = request_data[:referer_url] # referer
52
+ info[:parameters] = request_data[:parameters] # request parameters
53
+ info[:user_agent] = request_data[:user_agent] # user agent
54
+ info[:user] = request_data[:user] # current user
55
+ info[:session_data]= request_data[:session_data] # session
56
56
 
57
57
  # special variables
58
58
  info[:environment] = Flail.configuration.env
data/lib/flail/rails.rb CHANGED
@@ -3,6 +3,7 @@ require 'flail/rails/rescue_action'
3
3
 
4
4
  if defined?(::ActionController::Base)
5
5
  ::ActionController::Base.send(:include, Flail::Rails::RescueAction)
6
+ ::ActionController::Base.send(:include, Flail::Rails::ControllerMethods)
6
7
  end
7
8
 
8
9
  if defined?(::Rails.configuration) && ::Rails.configuration.respond_to?(:middleware)
@@ -0,0 +1,34 @@
1
+ class Flail
2
+ module Rails
3
+ module ControllerMethods
4
+ def flail_request_data
5
+ {
6
+ :parameters => params.to_hash,
7
+ :session_data => flail_session_data,
8
+ :target_url => request.url,
9
+ :referer_url => request.referer,
10
+ :user_agent => request.user_agent,
11
+ :user => flail_user_data
12
+ }
13
+ end
14
+
15
+ def flail_session_data
16
+ if session.respond_to?(:to_hash)
17
+ session.to_hash
18
+ else
19
+ session.data
20
+ end
21
+ end
22
+
23
+ def flail_user_data
24
+ user = current_user
25
+
26
+ user.attributes.select do |k, v|
27
+ /^(id|name|username|email|login)$/ === k unless v.blank?
28
+ end
29
+ rescue NoMethodError, NameError
30
+ {}
31
+ end
32
+ end # ControllerMethods
33
+ end
34
+ end
@@ -14,7 +14,8 @@ class Flail
14
14
  # Rails 2's exception helpers.
15
15
  def rescue_action_in_public_with_flail(exception)
16
16
  request.env['flail.request'] = request
17
- request.env['action_controller.instance'] = self
17
+ request.env['flail.request.data'] = flail_request_data
18
+
18
19
  Flail::Exception.new(request.env, exception).handle!
19
20
  rescue_action_in_public_without_flail(exception)
20
21
  end
data/lib/flail/railtie.rb CHANGED
@@ -10,6 +10,11 @@ class Flail
10
10
  host Socket.gethostname
11
11
  end
12
12
 
13
+ ActiveSupport.on_load(:action_controller) do
14
+ require 'flail/rails/controller_methods'
15
+ include Flail::Rails::ControllerMethods
16
+ end
17
+
13
18
  if defined?(::ActionDispatch::DebugExceptions)
14
19
  # Rails 3.2.x
15
20
  require 'flail/rails/action_dispatch'
data/lib/flail/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Flail
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ require 'flail/rails/rescue_action'
4
+
5
+ describe Flail::Rails::RescueAction do
6
+
7
+ context "catching requests" do
8
+ before do
9
+ FlailArmory.setup
10
+ end
11
+
12
+ before(:each) do
13
+ FlailArmory.raid
14
+ end
15
+
16
+ it "should deliver an exception raised in public requests" do
17
+ FlailArmory.process_action_with_error
18
+ FlailArmory.payload.should_not be_nil
19
+ end
20
+
21
+ it "should not deliver exceptions in local requests" do
22
+ FlailArmory.process_action_with_error(:local => true)
23
+ FlailArmory.payload.should be_nil
24
+ end
25
+
26
+ it "should not deliver exceptions when all requests are local" do
27
+ FlailArmory.process_action_with_error(:all_local => true)
28
+ FlailArmory.payload.should be_nil
29
+ end
30
+
31
+ it "should not deliver exceptions from actions that don't raise" do
32
+ controller = FlailArmory.process_action { render :text => 'Hello' }
33
+
34
+ FlailArmory.payload.should be_nil
35
+ controller.response.body.should == 'Hello'
36
+ end
37
+
38
+ it "should send session data" do
39
+ data = {'one' => 'two'}
40
+ FlailArmory.process_action_with_error(:session => data)
41
+
42
+ FlailArmory.payload['session_data'].should == data
43
+ end
44
+ end
45
+ end
data/spec/spec_helper.rb CHANGED
@@ -3,9 +3,110 @@ require 'bundler'
3
3
  Bundler.setup
4
4
 
5
5
  require 'rspec'
6
- require 'flail'
6
+ require 'rr'
7
7
 
8
8
  RSpec.configure do |config|
9
9
  config.mock_with :rr
10
10
  end
11
11
 
12
+ require 'action_controller'
13
+ require 'action_controller/test_process'
14
+ require 'active_record'
15
+ require 'active_support'
16
+ require 'rack'
17
+ require 'sham_rack'
18
+
19
+ require 'flail'
20
+ require 'flail/rails/controller_methods'
21
+ require 'flail/rails/rescue_action'
22
+
23
+ class FlailArmory
24
+
25
+ module ClassMethods
26
+ def define_constant(name, value)
27
+ @defined_constants ||= []
28
+ Object.const_set(name, value)
29
+ @defined_constants << name
30
+ end
31
+
32
+ def build_controller_class(&definition)
33
+ Class.new(ActionController::Base).tap do |klass|
34
+ klass.__send__(:include, Flail::Rails::ControllerMethods)
35
+ klass.__send__(:include, Flail::Rails::RescueAction)
36
+ klass.class_eval(&definition) if definition
37
+
38
+ klass.class_eval do
39
+ def rescue_action_in_public_without_flail(*args)
40
+ end
41
+ end
42
+ define_constant('FlailTestController', klass)
43
+ end
44
+ end
45
+
46
+ def process_action(options = {}, &action)
47
+ options[:request] ||= ActionController::TestRequest.new
48
+ options[:response] ||= ActionController::TestResponse.new
49
+
50
+ klass = build_controller_class do
51
+ cattr_accessor :local
52
+ define_method(:index, &action)
53
+
54
+ def local_request?
55
+ local
56
+ end
57
+ end
58
+
59
+ if options[:user_agent]
60
+ if options[:request].respond_to?(:user_agent=)
61
+ options[:request].user_agent = options[:user_agent]
62
+ else
63
+ options[:request].env["HTTP_USER_AGENT"] = options[:user_agent]
64
+ end
65
+ end
66
+
67
+ klass.consider_all_requests_local = options[:all_local]
68
+ klass.local = options[:local]
69
+
70
+ controller = klass.new
71
+ options[:request].query_parameters = options[:request].query_parameters.merge(options[:params] || {})
72
+ options[:request].session = ActionController::TestSession.new(options[:session] || {})
73
+
74
+ options[:request].env['REQUEST_URI'] = options[:request].request_uri
75
+ controller.process(options[:request], options[:response])
76
+ controller
77
+ end
78
+
79
+ def process_action_with_error(options = {})
80
+ process_action(options) do
81
+ raise "Hello"
82
+ end
83
+ end
84
+
85
+ def setup
86
+ Flail.configure do
87
+ handle do |payload|
88
+ FlailArmory.payload = ActiveSupport::JSON.decode(payload)
89
+ end
90
+ end
91
+ define_constant('RAILS_ROOT', '/path/to/rails/root')
92
+ end
93
+
94
+ def payload=(value)
95
+ @payload = value
96
+ end
97
+
98
+ def payload
99
+ @payload
100
+ end
101
+
102
+ def raid
103
+ @defined_constants.each do |constant|
104
+ Object.__send__(:remove_const, constant)
105
+ end
106
+
107
+ @payload = nil
108
+ @defined_constants = []
109
+ end
110
+ end
111
+ extend ClassMethods
112
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flail
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,72 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-08 00:00:00.000000000 Z
12
+ date: 2012-08-09 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: actionpack
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.3.8
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.3.8
30
+ - !ruby/object:Gem::Dependency
31
+ name: activerecord
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.3.8
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.3.8
46
+ - !ruby/object:Gem::Dependency
47
+ name: activesupport
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 2.3.8
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.3.8
62
+ - !ruby/object:Gem::Dependency
63
+ name: fakeweb
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.3.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.3.0
14
78
  - !ruby/object:Gem::Dependency
15
79
  name: rake
16
80
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +123,22 @@ dependencies:
59
123
  - - ! '>='
60
124
  - !ruby/object:Gem::Version
61
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: sham_rack
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 1.3.0
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 1.3.0
62
142
  description: Handle Rails exceptions with the fail flail.
63
143
  email:
64
144
  - machinist@asceth.com
@@ -69,7 +149,9 @@ files:
69
149
  - .gemtest
70
150
  - .gitignore
71
151
  - .rspec
152
+ - .rvmrc
72
153
  - Gemfile
154
+ - Gemfile.lock
73
155
  - LICENSE
74
156
  - README.md
75
157
  - Rakefile
@@ -81,11 +163,13 @@ files:
81
163
  - lib/flail/rack.rb
82
164
  - lib/flail/rails.rb
83
165
  - lib/flail/rails/action_dispatch.rb
166
+ - lib/flail/rails/controller_methods.rb
84
167
  - lib/flail/rails/rescue_action.rb
85
168
  - lib/flail/railtie.rb
86
169
  - lib/flail/version.rb
87
170
  - rails/init.rb
88
171
  - spec/base_spec.rb
172
+ - spec/rescue_action_spec.rb
89
173
  - spec/spec_helper.rb
90
174
  homepage: https://github.com/asceth/flail
91
175
  licenses: []
@@ -113,4 +197,5 @@ specification_version: 3
113
197
  summary: Rails exception handler
114
198
  test_files:
115
199
  - spec/base_spec.rb
200
+ - spec/rescue_action_spec.rb
116
201
  - spec/spec_helper.rb