odata4 0.9.0 → 0.9.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d39ce48da9f2bd4c5e58b4be1e0d5ac4a60c4f3e
4
- data.tar.gz: 0428d049a8e814d727fc7796c795fc4fddbe8265
3
+ metadata.gz: 681b21fbcc189d8fd525c14967ee0536e5175831
4
+ data.tar.gz: 0c1c00d948fbbf6da13d9474e89c68f87a32e60b
5
5
  SHA512:
6
- metadata.gz: 6d7a7d71b67e188600e7c7ccce3dd55721a27e3cc3371d790eb2d430f4b045e365d37871cd6dd9629586553e22029b52020c622cb0840ab94a52ef05475eb66d
7
- data.tar.gz: 70712da5e1e2e2dfc6b9d244b97cdd95c1fa4f727dac590aea3786e8494efa1f8244f82a65b778a2a824fd7bf16ac43a177e1842017789e7cd681ed28819f9f4
6
+ metadata.gz: caa27586434ea04697571112c0151e5487e0212dd630e96ad6e57689ccc608a07883ba723926bbac06d6b0d0dc5efba22129389216148cb0ba31f644f8e4c15b
7
+ data.tar.gz: d7c03530c1bb69d48ef53f2fcbfd3a9085025c67c0f30200acb208734b755cc565e6f05ce8f86bc6403fde13ab028c5689d546f02562d5c2be9e34677c51bbbf
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.9.1
4
+
5
+ * [New] Raising specific error classes instead of `RuntimeError` when request fails
6
+
3
7
  ## 0.9.0
4
8
 
5
9
  * [Breaking] Use Faraday instead of Typhoeus as HTTP connection adapter.
@@ -13,6 +13,7 @@ require 'json'
13
13
  # require 'active_support/concern'
14
14
 
15
15
  require 'odata4/version'
16
+ require 'odata4/errors'
16
17
  require 'odata4/property_registry'
17
18
  require 'odata4/property'
18
19
  require 'odata4/properties'
@@ -0,0 +1,68 @@
1
+ module OData4
2
+ # Base class for OData4 errors
3
+ class Error < StandardError
4
+ end
5
+
6
+ # Base class for network errors
7
+ class RequestError < Error
8
+ attr_reader :response
9
+
10
+ def initialize(response, message = nil)
11
+ @message = message
12
+ @response = response
13
+ end
14
+
15
+ def http_status
16
+ response.status
17
+ end
18
+
19
+ def message
20
+ [default_message, @message].compact.join(': ')
21
+ end
22
+
23
+ def default_message
24
+ nil
25
+ end
26
+ end
27
+
28
+ class ClientError < RequestError
29
+ end
30
+
31
+ class ServerError < RequestError
32
+ end
33
+
34
+ module Errors
35
+ ERROR_MAP = []
36
+
37
+ CLIENT_ERRORS = {
38
+ 400 => "Bad Request",
39
+ 401 => "Access Denied",
40
+ 403 => "Forbidden",
41
+ 404 => "Not Found",
42
+ 405 => "Method Not Allowed",
43
+ 406 => "Not Acceptable",
44
+ 413 => "Request Entity Too Large"
45
+ }
46
+
47
+ CLIENT_ERRORS.each do |code, message|
48
+ klass = Class.new(ClientError) do
49
+ send(:define_method, :default_message) { "#{code} #{message}" }
50
+ end
51
+ const_set(message.delete(' \-\''), klass)
52
+ ERROR_MAP[code] = klass
53
+ end
54
+
55
+ SERVER_ERRORS = {
56
+ 500 => "Internal Server Error",
57
+ 503 => "Service Unavailable"
58
+ }
59
+
60
+ SERVER_ERRORS.each do |code, message|
61
+ klass = Class.new(ServerError) do
62
+ send(:define_method, :default_message) { "#{code} #{message}" }
63
+ end
64
+ const_set(message.delete(' \-\''), klass)
65
+ ERROR_MAP[code] = klass
66
+ end
67
+ end
68
+ end
@@ -94,17 +94,10 @@ module OData4
94
94
  # occured.
95
95
  #
96
96
  # @return [self]
97
- def validate!
98
- raise "Bad Request. #{error_message(response)}" if status == 400
99
- raise "Access Denied" if status == 401
100
- raise "Forbidden" if status == 403
101
- raise "Not Found" if [0,404].include?(status)
102
- raise "Method Not Allowed" if status == 405
103
- raise "Not Acceptable" if status == 406
104
- raise "Request Entity Too Large" if status == 413
105
- raise "Internal Server Error" if status == 500
106
- raise "Service Unavailable" if status == 503
107
- self
97
+ def validate_response!
98
+ if error = OData4::Errors::ERROR_MAP[status]
99
+ raise error, response, error_message
100
+ end
108
101
  end
109
102
 
110
103
  private
@@ -117,7 +110,7 @@ module OData4
117
110
  Body: #{response.body}
118
111
  EOS
119
112
  check_content_type
120
- validate!
113
+ validate_response!
121
114
  rescue Faraday::TimeoutError
122
115
  logger.info "Request timed out."
123
116
  @timed_out = true
@@ -144,7 +137,7 @@ module OData4
144
137
  # We catch that here and bypass content type detection.
145
138
  @empty = true
146
139
  else
147
- raise ArgumentError, "Invalid response type '#{content_type}'"
140
+ raise RequestError, response, "Invalid response type '#{content_type}'"
148
141
  end
149
142
  end
150
143
 
@@ -1,3 +1,3 @@
1
1
  module OData4
2
- VERSION = '0.9.0'
2
+ VERSION = '0.9.1'
3
3
  end
@@ -101,7 +101,7 @@ describe OData4::EntitySet, vcr: {cassette_name: 'entity_set_specs'} do
101
101
  end
102
102
 
103
103
  it 'raises an error when no entity was found' do
104
- expect { nonexistant_entity }.to raise_error(RuntimeError, /Not Found/)
104
+ expect { nonexistant_entity }.to raise_error(OData4::Errors::NotFound)
105
105
  end
106
106
 
107
107
  describe 'eager loading' do
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe OData4::RequestError do
4
+ subject { OData4::RequestError.new(response, 'The server made a boo-boo.') }
5
+ let(:response) { instance_double('Faraday::Response', status: 400) }
6
+
7
+ describe '#http_status' do
8
+ it 'returns the status code' do
9
+ expect(subject.http_status).to eq(response.status)
10
+ end
11
+ end
12
+
13
+ describe '#response' do
14
+ it 'returns the response' do
15
+ expect(subject.response).to eq(response)
16
+ end
17
+ end
18
+
19
+ describe '#message' do
20
+ it 'returns the error message' do
21
+ expect(subject.message).to eq('The server made a boo-boo.')
22
+ end
23
+ end
24
+ end
25
+
26
+ describe OData4::Errors::InternalServerError do
27
+ let(:response) { instance_double('Faraday::Response', status: 500) }
28
+
29
+ context 'with custom error message' do
30
+ subject { OData4::Errors::InternalServerError.new(response, 'The server made a boo-boo.')}
31
+
32
+ describe '#message' do
33
+ it 'combines default message with custom message' do
34
+ expect(subject.message).to eq('500 Internal Server Error: The server made a boo-boo.')
35
+ end
36
+ end
37
+ end
38
+
39
+ context 'without custom error message' do
40
+ subject { OData4::Errors::InternalServerError.new(response) }
41
+
42
+ describe '#message' do
43
+ it 'returns the default message' do
44
+ expect(subject.message).to eq('500 Internal Server Error')
45
+ end
46
+ end
47
+ end
48
+ end
@@ -74,4 +74,12 @@ describe OData4::Service::Response, vcr: {cassette_name: 'service/response_specs
74
74
  it { expect(subject).to be_success }
75
75
  it { expect(subject.body).to match(/123/) }
76
76
  end
77
+
78
+ context 'with unregistered content type' do
79
+ let(:content_type) { 'text/unknown' }
80
+ let(:response_status) { 200 }
81
+ let(:response_body) { '123' }
82
+
83
+ it { expect { subject }.to raise_error(OData4::RequestError) }
84
+ end
77
85
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: odata4
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christoph Wagner
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-05-03 00:00:00.000000000 Z
12
+ date: 2018-05-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -203,6 +203,7 @@ files:
203
203
  - lib/odata4/entity.rb
204
204
  - lib/odata4/entity_container.rb
205
205
  - lib/odata4/entity_set.rb
206
+ - lib/odata4/errors.rb
206
207
  - lib/odata4/navigation_property.rb
207
208
  - lib/odata4/navigation_property/proxy.rb
208
209
  - lib/odata4/properties.rb
@@ -277,6 +278,7 @@ files:
277
278
  - spec/odata4/entity_container_spec.rb
278
279
  - spec/odata4/entity_set_spec.rb
279
280
  - spec/odata4/entity_spec.rb
281
+ - spec/odata4/errors_spec.rb
280
282
  - spec/odata4/navigation_property/proxy_spec.rb
281
283
  - spec/odata4/navigation_property_spec.rb
282
284
  - spec/odata4/properties/binary_spec.rb
@@ -362,6 +364,7 @@ test_files:
362
364
  - spec/odata4/entity_container_spec.rb
363
365
  - spec/odata4/entity_set_spec.rb
364
366
  - spec/odata4/entity_spec.rb
367
+ - spec/odata4/errors_spec.rb
365
368
  - spec/odata4/navigation_property/proxy_spec.rb
366
369
  - spec/odata4/navigation_property_spec.rb
367
370
  - spec/odata4/properties/binary_spec.rb