served 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a9d112dbf8e70d5ece558892faf608955e7c63bd
4
- data.tar.gz: 114c90343efa2eb1af73a09344483d588af63de2
3
+ metadata.gz: f16ed665b06a5042b1acf3658918c48c2dfebabd
4
+ data.tar.gz: 51638a8ecb500306975a9fb962abeb117c4aa7d5
5
5
  SHA512:
6
- metadata.gz: 8c7c9b61fcdf251d352dd430201501fc5d7e6dbe2344eff0f1d4b226100b7d3b0f5a8d5e5566a61ae4ed881369c0c0e6632eca167266350c229ebb369185d6a5
7
- data.tar.gz: 175df4779e4176ee9b15f4f9019a4cbde160ce34f0ad60af81eed8f70058056fedd3e813b2ef7a3a2a16e50abe791bf0279c186d023cc6cc11ecc949aa67bc67
6
+ metadata.gz: 8a582540ae2fe53989249f28cd5b0e6cadb81182837dbc6ab4321f9cce2fb939c22c57964158f0e1ab90dc911b0091092535ba07c94da6836948aff9b3a25753
7
+ data.tar.gz: f74a7473319e02a655a7b9b6a98066905f074eb383273e052d498e634900c288628d5d8d0c26054e6e1a695dca9b0ad3b7c0fca4326e4fb00e738c7a646ba404
data/.travis.yml CHANGED
@@ -1,9 +1,11 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1
4
- - 2.2.2
5
- - 2.3.3
6
- - 2.4.0
3
+ - 2.1.9
4
+ - 2.1.10
5
+ - 2.2.7
6
+ - 2.3.2
7
+ - 2.3.4
8
+ - 2.4.1
7
9
  before_install: gem install bundler -v 1.10.5
8
10
 
9
11
  gemfile:
@@ -13,5 +15,8 @@ gemfile:
13
15
 
14
16
  matrix:
15
17
  exclude:
16
- - gemfile: gemfiles/5.0.gemfile
17
- rvm: 2.1
18
+ - rvm: 2.1.9
19
+ gemfile: gemfiles/5.0.gemfile
20
+ - rvm: 2.1.10
21
+ gemfile: gemfiles/5.0.gemfile
22
+
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.1
4
+ * update CI to cover latest version so of ruby
5
+ * Fixes unhandled exception when error response isn't valid JSON
6
+ * Fix HTTP error handling to all codes are dealt with consistently.
7
+
3
8
  ## 0.4.0
4
9
  * Install rubocop and make everything compliant.
5
10
  * Improve error messaging for inclusion validations.
@@ -7,24 +7,20 @@ module Served
7
7
  attr_reader :response
8
8
  attr_reader :code
9
9
 
10
- # Defined in individual error classes
11
- def self.code
12
- raise NotImplementedError
13
- end
10
+ def initialize(code, resource, response)
11
+ @code = code
14
12
 
15
- def initialize(resource, response)
16
13
  if resource.serializer.respond_to? :exception
17
14
  serialized = resource.serializer.exception(response.body).symbolize_keys!
18
15
 
19
16
  @error = serialized[:error]
20
17
  @message = serialized[:exception]
21
18
  @server_backtrace = serialized[:backtrace]
22
- @code = serialized[:code] || serialized[:code] = self.class.code
23
19
  @response = OpenStruct.new(serialized) # TODO: remove in served 1.0, used for backwards compat
24
20
 
25
21
  super("An error '#{code} #{message}' occurred while making this request")
26
22
  end
27
- super "An error occurred '#{self.class.code}'"
23
+ super "An error occurred '#{code}'"
28
24
  end
29
25
 
30
26
  def status
@@ -32,81 +28,60 @@ module Served
32
28
  end
33
29
  end
34
30
 
35
- # 301 MovedPermanently
36
- class MovedPermanently < HttpError
37
- def self.code
38
- 301
39
- end
31
+ # 302, 303, 307
32
+ class Redirection < HttpError
40
33
  end
41
34
 
42
- # 400 BadRequest
43
- class BadRequest < HttpError
44
- def self.code
45
- 400
46
- end
35
+ # 301 Moved Permanently
36
+ class MovedPermanently < Redirection
37
+ end
38
+
39
+ # 401-499
40
+ class ClientError < HttpError
41
+ end
42
+
43
+ # 400 Bad Request
44
+ class BadRequest < ClientError
47
45
  end
48
46
 
49
47
  # 401 Unauthorized
50
- class Unauthorized < HttpError
51
- def self.code
52
- 401
53
- end
48
+ class Unauthorized < ClientError
54
49
  end
55
50
 
56
51
  # 403 Forbidden
57
- class Forbidden < HttpError
58
- def self.code
59
- 403
60
- end
52
+ class Forbidden < ClientError
61
53
  end
62
54
 
63
- # 404 NotFound
64
- class NotFound < HttpError
65
- def self.code
66
- 404
67
- end
55
+ # 404 Not Found
56
+ class NotFound < ClientError
68
57
  end
69
58
 
70
- # 405 MethodNotAllowed
71
- class MethodNotAllowed < HttpError
72
- def self.code
73
- 405
74
- end
59
+ # 405 Method Not Allowed
60
+ class MethodNotAllowed < ClientError
75
61
  end
76
62
 
77
- # 406 NotAcceptable
78
- class NotAcceptable < HttpError
79
- def self.code
80
- 406
81
- end
63
+ # 406 Not Acceptable
64
+ class NotAcceptable < ClientError
82
65
  end
83
66
 
84
- # 408 RequestTimeout
85
- class RequestTimeout < HttpError
86
- def self.code
87
- 408
88
- end
67
+ # 408 Request Timeout
68
+ class RequestTimeout < ClientError
89
69
  end
90
70
 
91
- # 422 UnprocessableEntity
92
- class UnprocessableEntity < HttpError
93
- def self.code
94
- 422
95
- end
71
+ # 422 Unprocessable Entity
72
+ class UnprocessableEntity < ClientError
96
73
  end
97
74
 
98
- # 500 InternalServerError
99
- class InternalServerError < HttpError
100
- def self.code
101
- 500
102
- end
75
+ # 5xx Server Error
76
+ class ServerError < HttpError
103
77
  end
104
78
 
105
- # 503 BadGateway
106
- class BadGateway < HttpError
107
- def self.code
108
- 503
109
- end
79
+ # 500 Internal Server Error
80
+ class InternalServerError < ServerError
81
+ end
82
+
83
+ # 503 Bad Gateway
84
+ class BadGateway < ServerError
110
85
  end
111
86
  end
112
87
  end
@@ -42,10 +42,12 @@ module Served
42
42
  end
43
43
 
44
44
  handle((200..201), :load)
45
- handle([204, 202]) { attributes }
45
+ handle([202, 204]) { attributes }
46
46
 
47
- # 400 level errors
48
47
  handle(301) { Resource::MovedPermanently }
48
+ handle([302, 303, 304, 305, 307, 308]) { Resource::Redirection }
49
+
50
+ # 400 level errors
49
51
  handle(400) { Resource::BadRequest }
50
52
  handle(401) { Resource::Unauthorized }
51
53
  handle(403) { Resource::Forbidden }
@@ -54,16 +56,18 @@ module Served
54
56
  handle(406) { Resource::NotAcceptable }
55
57
  handle(408) { Resource::RequestTimeout }
56
58
  handle(422) { Resource::UnprocessableEntity }
59
+ handle((400..499)) { Resource::ClientError }
57
60
 
58
61
  # 500 level errors
59
62
  handle(500) { Resource::InternalServerError }
60
63
  handle(503) { Resource::BadGateway }
64
+ handle((500..599)) { Resource::ServerError }
61
65
  end
62
66
 
63
67
  module ClassMethods
64
68
  def handle_response(response)
65
69
  if raise_on_exceptions
66
- handler = handlers[response.code]
70
+ handler = handlers.fetch(response.code) { proc { HttpError } }
67
71
  if handler.is_a? Proc
68
72
  result = handler.call(response)
69
73
  else
@@ -71,7 +75,7 @@ module Served
71
75
  end
72
76
 
73
77
  if result.respond_to?(:ancestors) && result.ancestors.include?(HttpError)
74
- raise result.new(self, response)
78
+ raise result.new(response.code, self, response)
75
79
  end
76
80
  result
77
81
  else
@@ -90,7 +94,7 @@ module Served
90
94
  raise HandlerRequired unless symbol_or_proc || block_given?
91
95
  if code_or_range.is_a?(Range) || code_or_range.is_a?(Array)
92
96
  code_or_range.each do |c|
93
- handlers[c] = symbol_or_proc || block
97
+ handlers[c] = symbol_or_proc || block unless handlers.key?(c)
94
98
  end
95
99
  else
96
100
  handlers[code_or_range] = symbol_or_proc || block
@@ -26,6 +26,8 @@ module Served
26
26
 
27
27
  def self.exception(data)
28
28
  JSON.parse(data)
29
+ rescue
30
+ {}
29
31
  end
30
32
  end
31
33
  end
@@ -1,3 +1,3 @@
1
1
  module Served
2
- VERSION = '0.4.0'.freeze
2
+ VERSION = '0.4.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: served
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jarod Reid
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-13 00:00:00.000000000 Z
11
+ date: 2017-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport