egregious 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/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