egregious 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -3,3 +3,9 @@ source "http://rubygems.org"
3
3
  # Specify your gem's dependencies in egregious.gemspec
4
4
  gemspec
5
5
 
6
+ if RUBY_VERSION < '1.9'
7
+ gem 'mongoid', '< 3'
8
+ gem 'bson_ext'
9
+ else
10
+ gem 'mongoid', '>= 3'
11
+ end
data/README CHANGED
@@ -1,15 +1,18 @@
1
1
  Update Log:
2
+ Version 0.2.3 released to https://rubygems.org/gems/egregious on 7.23.2013
3
+ Merged pull requests:
4
+ Mongoid integration (#6)
5
+ Bug Fix: Bad Rails test
6
+ Updated rails and rack dependencies
2
7
  Version 0.2.2 released to https://rubygems.org/gems/egregious on 2.15.2013
3
8
  Merged pull requests:
4
9
  Compatibility with Rails::API (#5)
5
- Thank you dwbutler! Keep those pull requests coming.
6
10
 
7
11
  Version 0.2.1 released to https://rubygems.org/gems/egregious on 9.21.2012
8
12
  Merged pull requests:
9
13
  Bug Fix: should translate status code Symbol to right HTTP STATUS CODE - avinasha
10
14
  Fixes teapot bug with rails 3.2.8. - kbrown
11
15
  Note: version 0.2.0 does not work with rails 3.2.8 you should update to 0.2.1
12
- Thank you avinasha and kbrown along with all the other forks! Keep those pull requests coming.
13
16
 
14
17
  If you would like to contribute take a look at the issues feature list, fork and issue a pull request!
15
18
 
@@ -29,8 +32,8 @@ provide the caller context information.
29
32
 
30
33
  What egregious can do:
31
34
 
32
- * Defines default exception handling for most common ruby, rails, warden and cancan exceptions.
33
- (warden and cancan are optional)
35
+ * Defines default exception handling for most common ruby, rails, warden, cancan and mongoid exceptions.
36
+ (warden, cancan and mongoid are optional)
34
37
  * Catches defined exceptions using a rescue_with returning the status code defined for each exception
35
38
  and well structured json, xml
36
39
  * For html production requests attempts to load the html error pages for the mapped status code,
@@ -42,7 +45,8 @@ provide the caller context information.
42
45
 
43
46
 
44
47
  REQUIRES:
45
- Rails 3.x
48
+ rails ~> 3.1.12
49
+ rack >= 1.3.6
46
50
 
47
51
  USAGE:
48
52
  1) Add to your Gemfile:
@@ -99,4 +103,4 @@ def build_html_file_path(status)
99
103
  end
100
104
 
101
105
  KNOWN ISSUES:
102
- * If you use CanCan or Devise you must have Egregious after CanCan/Devise in your Gemfile, if not it will not handle those errors correctly.
106
+ * If you use Mongoid, CanCan or Devise you must have Egregious after CanCan/Devise in your Gemfile, if not it will not handle those errors correctly.
data/egregious.gemspec CHANGED
@@ -18,15 +18,19 @@ 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
+
22
+ s.add_runtime_dependency "rails", '~> 3.1.12'
23
+ s.add_runtime_dependency "rack", '>= 1.3.6'
24
+ s.add_runtime_dependency "htmlentities"
25
+
21
26
  # specify any dependencies here; for example:
22
27
  s.add_development_dependency "rspec"
23
28
  s.add_development_dependency "json"
24
29
  s.add_development_dependency "hpricot"
25
30
  s.add_development_dependency "warden"
26
31
  s.add_development_dependency "cancan"
32
+ s.add_development_dependency "mongoid"
33
+ s.add_development_dependency "bson_ext"
27
34
 
28
- s.add_runtime_dependency "rails", '>= 3.0.1'
29
- s.add_runtime_dependency "rack"
30
- s.add_runtime_dependency "htmlentities"
31
35
 
32
36
  end
data/lib/egregious.rb CHANGED
@@ -75,6 +75,23 @@ module Egregious
75
75
  ActiveRecord::UnknownAttributeError=>status_code(:bad_request)
76
76
  })
77
77
  end
78
+
79
+ if defined?(Mongoid)
80
+ require 'egregious/extensions/mongoid'
81
+
82
+ exception_codes.merge!({
83
+ Mongoid::Errors::InvalidFind=>status_code(:bad_request),
84
+ Mongoid::Errors::DocumentNotFound=>status_code(:not_found),
85
+ Mongoid::Errors::Validations=>status_code(:unprocessable_entity)
86
+ })
87
+
88
+ if Mongoid::VERSION > '3'
89
+ exception_codes.merge!({
90
+ Mongoid::Errors::ReadonlyAttribute=>status_code(:forbidden),
91
+ Mongoid::Errors::UnknownAttribute=>status_code(:bad_request)
92
+ })
93
+ end
94
+ end
78
95
 
79
96
  if defined?(Warden)
80
97
  exception_codes.merge!({
@@ -92,7 +109,7 @@ module Egregious
92
109
  end
93
110
 
94
111
  @@exception_codes = self._load_exception_codes
95
- @@root = defined?(Rail) ? Rails.root : nil
112
+ @@root = defined?(Rails) ? Rails.root : nil
96
113
 
97
114
  # exposes the root of the app
98
115
  def self.root
@@ -0,0 +1,26 @@
1
+ if defined?(Mongoid)
2
+ # Customize the error information Egregious returns for MongoidErrors
3
+ module Mongoid
4
+ module Errors
5
+ class MongoidError
6
+ def to_xml
7
+ "<errors><error>#{HTMLEntities.new.encode(@problem || to_s)}</error><type>#{self.exception_type}</type></errors>"
8
+ end
9
+
10
+ def to_json
11
+ "{\"error\":#{ActiveSupport::JSON.encode(@problem || to_s)}, \"type\":\"#{self.exception_type}\"}"
12
+ end
13
+ end
14
+
15
+ class Validations
16
+ def to_xml
17
+ "<errors><error>#{HTMLEntities.new.encode(self.document.errors.full_messages.join(', ').gsub(/\r/, ' ').gsub(/\n/, ' ').squeeze(' '))}</error><type>#{self.exception_type}</type></errors>"
18
+ end
19
+
20
+ def to_json
21
+ "{\"error\":#{ActiveSupport::JSON.encode(self.document.errors.full_messages.join(', ').gsub(/\r/, ' ').gsub(/\n/, ' ').squeeze(' '))}, \"type\":\"#{self.exception_type}\"}"
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module Egregious
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -10,6 +10,8 @@ describe Egregious do
10
10
  describe 'status_code' do
11
11
  it "should translate Symbol to right HTTP STATUS CODE" do
12
12
  status_code(:bad_request).should == 400
13
+ status_code(:unauthorized).should == 401
14
+ status_code(:unprocessable_entity).should == 422
13
15
  end
14
16
  end
15
17
 
@@ -96,6 +98,21 @@ describe Egregious do
96
98
  exception_codes[CanCan::AuthorizationNotPerformed].should == Egregious.status_code(:unauthorized)
97
99
  end
98
100
  end
101
+
102
+ if defined?(Mongoid)
103
+ it "should return expected errors for Mongoid" do
104
+ exception_codes[Mongoid::Errors::InvalidFind].should == Egregious.status_code(:bad_request)
105
+ exception_codes[Mongoid::Errors::DocumentNotFound].should == Egregious.status_code(:not_found)
106
+ exception_codes[Mongoid::Errors::Validations].should == Egregious.status_code(:unprocessable_entity)
107
+ end
108
+
109
+ if Mongoid::VERSION > '3'
110
+ it "should return expected errors for Mongoid 3+" do
111
+ exception_codes[Mongoid::Errors::ReadonlyAttribute].should == Egregious.status_code(:forbidden)
112
+ exception_codes[Mongoid::Errors::UnknownAttribute].should == Egregious.status_code(:bad_request)
113
+ end
114
+ end
115
+ end
99
116
  end
100
117
 
101
118
  describe "status_code_for_exception" do
@@ -40,4 +40,49 @@ describe Exception do
40
40
  end
41
41
  X::Y::Z.new.exception_type.should == 'Z'
42
42
  end
43
+ end
44
+
45
+ if defined?(Mongoid)
46
+ class TestModel
47
+ include Mongoid::Document
48
+
49
+ field :foo
50
+ validates_presence_of :foo
51
+ end
52
+
53
+
54
+ describe Mongoid::Errors::MongoidError do
55
+ let(:exception) { Mongoid::Errors::InvalidFind.new }
56
+ let(:error_message) { "Calling Document.find with nil is invalid." }
57
+
58
+ it "should output json with a short problem description" do
59
+ result = JSON.parse(exception.to_json)
60
+ result['error'].should =~ /#{error_message}/
61
+ end
62
+
63
+ it "should output xml with a short problem description" do
64
+ doc = Hpricot.XML(exception.to_xml)
65
+ (doc/:errors).each do |error|
66
+ HTMLEntities.new.decode((error/:error).inner_html).should =~ /#{error_message}/
67
+ end
68
+ end
69
+ end
70
+
71
+ describe Mongoid::Errors::Validations do
72
+ let(:model) { TestModel.create }
73
+ let(:exception) { Mongoid::Errors::Validations.new(model) }
74
+ let(:error_message) { model.errors.full_messages.first }
75
+
76
+ it "should output json with a short summary" do
77
+ result = JSON.parse(exception.to_json)
78
+ result['error'].should == error_message
79
+ end
80
+
81
+ it "should output xml with a short problem description" do
82
+ doc = Hpricot.XML(exception.to_xml)
83
+ (doc/:errors).each do |error|
84
+ HTMLEntities.new.decode((error/:error).inner_html).should == error_message
85
+ end
86
+ end
87
+ end
43
88
  end
data/spec/spec_helper.rb CHANGED
@@ -9,6 +9,7 @@ require 'active_support/test_case'
9
9
  require 'action_controller'
10
10
  require 'warden'
11
11
  require 'cancan'
12
+ require 'mongoid'
12
13
 
13
14
  require 'egregious' # and any other gems you need
14
15
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: egregious
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,17 +9,49 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-15 00:00:00.000000000 Z
12
+ date: 2013-07-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rspec
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.1.12
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 3.1.12
30
+ - !ruby/object:Gem::Dependency
31
+ name: rack
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.3.6
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.3.6
46
+ - !ruby/object:Gem::Dependency
47
+ name: htmlentities
16
48
  requirement: !ruby/object:Gem::Requirement
17
49
  none: false
18
50
  requirements:
19
51
  - - ! '>='
20
52
  - !ruby/object:Gem::Version
21
53
  version: '0'
22
- type: :development
54
+ type: :runtime
23
55
  prerelease: false
24
56
  version_requirements: !ruby/object:Gem::Requirement
25
57
  none: false
@@ -28,7 +60,7 @@ dependencies:
28
60
  - !ruby/object:Gem::Version
29
61
  version: '0'
30
62
  - !ruby/object:Gem::Dependency
31
- name: json
63
+ name: rspec
32
64
  requirement: !ruby/object:Gem::Requirement
33
65
  none: false
34
66
  requirements:
@@ -44,7 +76,7 @@ dependencies:
44
76
  - !ruby/object:Gem::Version
45
77
  version: '0'
46
78
  - !ruby/object:Gem::Dependency
47
- name: hpricot
79
+ name: json
48
80
  requirement: !ruby/object:Gem::Requirement
49
81
  none: false
50
82
  requirements:
@@ -60,7 +92,7 @@ dependencies:
60
92
  - !ruby/object:Gem::Version
61
93
  version: '0'
62
94
  - !ruby/object:Gem::Dependency
63
- name: warden
95
+ name: hpricot
64
96
  requirement: !ruby/object:Gem::Requirement
65
97
  none: false
66
98
  requirements:
@@ -76,7 +108,7 @@ dependencies:
76
108
  - !ruby/object:Gem::Version
77
109
  version: '0'
78
110
  - !ruby/object:Gem::Dependency
79
- name: cancan
111
+ name: warden
80
112
  requirement: !ruby/object:Gem::Requirement
81
113
  none: false
82
114
  requirements:
@@ -92,30 +124,30 @@ dependencies:
92
124
  - !ruby/object:Gem::Version
93
125
  version: '0'
94
126
  - !ruby/object:Gem::Dependency
95
- name: rails
127
+ name: cancan
96
128
  requirement: !ruby/object:Gem::Requirement
97
129
  none: false
98
130
  requirements:
99
131
  - - ! '>='
100
132
  - !ruby/object:Gem::Version
101
- version: 3.0.1
102
- type: :runtime
133
+ version: '0'
134
+ type: :development
103
135
  prerelease: false
104
136
  version_requirements: !ruby/object:Gem::Requirement
105
137
  none: false
106
138
  requirements:
107
139
  - - ! '>='
108
140
  - !ruby/object:Gem::Version
109
- version: 3.0.1
141
+ version: '0'
110
142
  - !ruby/object:Gem::Dependency
111
- name: rack
143
+ name: mongoid
112
144
  requirement: !ruby/object:Gem::Requirement
113
145
  none: false
114
146
  requirements:
115
147
  - - ! '>='
116
148
  - !ruby/object:Gem::Version
117
149
  version: '0'
118
- type: :runtime
150
+ type: :development
119
151
  prerelease: false
120
152
  version_requirements: !ruby/object:Gem::Requirement
121
153
  none: false
@@ -124,14 +156,14 @@ dependencies:
124
156
  - !ruby/object:Gem::Version
125
157
  version: '0'
126
158
  - !ruby/object:Gem::Dependency
127
- name: htmlentities
159
+ name: bson_ext
128
160
  requirement: !ruby/object:Gem::Requirement
129
161
  none: false
130
162
  requirements:
131
163
  - - ! '>='
132
164
  - !ruby/object:Gem::Version
133
165
  version: '0'
134
- type: :runtime
166
+ type: :development
135
167
  prerelease: false
136
168
  version_requirements: !ruby/object:Gem::Requirement
137
169
  none: false
@@ -154,6 +186,7 @@ files:
154
186
  - egregious.gemspec
155
187
  - lib/egregious.rb
156
188
  - lib/egregious/extensions/exception.rb
189
+ - lib/egregious/extensions/mongoid.rb
157
190
  - lib/egregious/version.rb
158
191
  - spec/egregious_spec.rb
159
192
  - spec/exceptions_spec.rb