glia-errors 0.0.0 → 0.6.0

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
  SHA256:
3
- metadata.gz: 23c0be62fe5b91fe4914d5b6812cfd678a11497e9591291a0664823e6ef1938b
4
- data.tar.gz: 51680c69eaf02641ecc47857d67679fb3e64208f2e008471dffbe64d422d41d1
3
+ metadata.gz: 65d627db5f7496b55539268de587762316d8d138ea0548ecd7abb5c7968fb4b1
4
+ data.tar.gz: f0894efd36f5e3013d9f3892e922ea5b7007e3a271595a262e9e97534d90923f
5
5
  SHA512:
6
- metadata.gz: 3600850fc2f82f50c3608cbba041ef6af9bc9f15a387a64250e465b284ae26316532386443848a8718e4008b37a651c0c876bfb7ddac3e279990b2e11d9e49a7
7
- data.tar.gz: 46a878503202ae5bdb3ba9f8df49c76fd1d122ca76aa9456f0d477753f6f312cd6f01514d59d1babd5a0259b72e2b9f383dc5e0442e7c446a0c9a869350ffc3d
6
+ metadata.gz: 03af1bfefb0087f78f4ddfabe4575980167f03df92fc0aba83052a1aaed18a936b60b53b3d442deb1676f85007b47a9c86772f0581fc63e425417ec3c22235d7
7
+ data.tar.gz: dac6e22cc50535689a445ae0616c73b362bfdf75af9daf81c4d11f54034f7233da72e3bf00f1c4a203e649227b223e2d37025db91aa83d8e3dd22ca8474b1be3
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.7.2
data/Gemfile CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- gem 'prettier', '~> 0.21'
5
+ gem 'prettier', '~> 0.22'
6
6
  gem 'rake', '~> 13.0'
7
7
  gem 'rspec', '~> 3.10'
8
8
  gem 'rubocop', '~> 1.5'
data/Gemfile.lock CHANGED
@@ -13,7 +13,7 @@ GEM
13
13
  ast (~> 2.4.1)
14
14
  patience_diff (1.1.0)
15
15
  trollop (~> 1.16)
16
- prettier (0.21.0)
16
+ prettier (0.22.0)
17
17
  rainbow (3.0.0)
18
18
  rake (13.0.1)
19
19
  regexp_parser (2.0.0)
@@ -58,10 +58,11 @@ GEM
58
58
 
59
59
  PLATFORMS
60
60
  ruby
61
+ x86_64-darwin-19
61
62
 
62
63
  DEPENDENCIES
63
64
  appraisal
64
- prettier (~> 0.21)
65
+ prettier (~> 0.22)
65
66
  rake (~> 13.0)
66
67
  rspec (~> 3.10)
67
68
  rubocop (~> 1.5)
data/README.md CHANGED
@@ -1,25 +1,24 @@
1
- # glia-errors-ruby
2
- Glia REST API errors (WIP)
1
+ # glia-errors
3
2
 
4
- [![Build Status](https://travis-ci.org/salemove/glia-errors-ruby.svg?branch=master)](https://travis-ci.org/salemove/glia-errors-ruby)
3
+ Implements Glia errors in Ruby and provides utilities to easily construct them.
5
4
 
6
- The library provides a list of errors that are used in Glia REST API and utilities to easily construct them.
5
+ # Installation
7
6
 
8
- It is used by Glia developers to map application specific errors to one of standardized Glia errors.
9
- Glia REST API integrators can use the library as a collection of constants to match Glia error response with the error
10
- type, see the example below.
7
+ ```
8
+ $ gem install glia-errors
9
+ ```
11
10
 
12
- # Usage
11
+ ## Usage
13
12
 
14
- ## Require library
13
+ ### Require library
15
14
 
16
15
  ```ruby
17
16
  require 'glia/errors'
18
17
  ```
19
18
 
20
- ## For Glia developers
19
+ ### For Glia developers
21
20
 
22
- ### Map from `dry-validation` result
21
+ #### Map from `dry-validation` result
23
22
 
24
23
  Currently 2 `dry-validation` versions are supported:
25
24
  * `v0` up to `0.13`
@@ -51,7 +50,7 @@ error = Glia::Errors.from_dry_validation_result(result, ERROR_MAP)
51
50
  response = error.to_h
52
51
  ```
53
52
 
54
- ## For REST API integrators
53
+ ### For REST API integrators
55
54
 
56
55
  ```ruby
57
56
  require 'uri'
@@ -63,7 +62,6 @@ url = URI('https://api.glia.com/engagement_requests')
63
62
 
64
63
  http = Net::HTTP.new(url.host, url.port)
65
64
  http.use_ssl = true
66
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
67
65
  request = Net::HTTP::Post.new(url)
68
66
  request["Accept"] = 'application/json'
69
67
  request["Content-Type"] = 'application/json'
@@ -91,9 +89,9 @@ else
91
89
  end
92
90
  ```
93
91
 
94
- # Contributing
92
+ ## Contributing
95
93
 
96
- ## Testing
94
+ ### Testing
97
95
 
98
96
  Glia errors support multiple versions of `dry-validation` and tests are run against each supported major version.
99
97
  Under the hood we use `Appraisal` gem which generals additional gemfiles for each of the versions.
@@ -116,7 +114,7 @@ To run tests only for `dry-validation` v0:
116
114
  bundle exec rake test_dry_validation_v0
117
115
  ```
118
116
 
119
- ## Formatting
117
+ ### Formatting
120
118
 
121
119
  ```
122
120
  bundle exec rake format
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "prettier", "~> 0.21"
5
+ gem "prettier", "~> 0.22"
6
6
  gem "rake", "~> 13.0"
7
7
  gem "rspec", "~> 3.10"
8
8
  gem "rubocop", "~> 1.5"
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "prettier", "~> 0.21"
5
+ gem "prettier", "~> 0.22"
6
6
  gem "rake", "~> 13.0"
7
7
  gem "rspec", "~> 3.10"
8
8
  gem "rubocop", "~> 1.5"
data/glia-errors.gemspec CHANGED
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'glia-errors'
8
- spec.version = '0.0.0'
8
+ spec.version = '0.6.0'
9
9
  spec.authors = ['Glia TechMovers']
10
10
  spec.email = ['techmovers@glia.com']
11
11
 
data/lib/glia/errors.rb CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  require_relative './errors/error'
4
4
  require_relative './errors/error_types'
5
- require_relative './errors/validation_errors'
5
+ require_relative './errors/client_errors'
6
+ require_relative './errors/server_errors'
6
7
  require_relative './errors/mapper'
7
8
 
8
9
  module Glia
@@ -0,0 +1,212 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Glia
4
+ module Errors
5
+ # rubocop:disable Style/Documentation
6
+ class InputValidationError < Error
7
+ def initialize(error_details:, message: nil)
8
+ super(
9
+ type: INPUT_VALIDATION_ERROR,
10
+ ref: "https://example.com/errors/#{INPUT_VALIDATION_ERROR}.html",
11
+ message: message,
12
+ error_details: error_details
13
+ )
14
+ end
15
+ end
16
+
17
+ class InvalidNumberError < Error
18
+ def initialize(field:, message: nil)
19
+ super(
20
+ type: INVALID_NUMBER_ERROR,
21
+ ref: "https://example.com/errors/#{INVALID_NUMBER_ERROR}.html",
22
+ message: message || "#{humanize(field)} value is invalid"
23
+ )
24
+ end
25
+ end
26
+
27
+ class InvalidValueError < Error
28
+ def initialize(field:, message: nil)
29
+ super(
30
+ type: INVALID_VALUE_ERROR,
31
+ ref: "https://example.com/errors/#{INVALID_VALUE_ERROR}.html",
32
+ message: message || "#{humanize(field)} value is invalid"
33
+ )
34
+ end
35
+ end
36
+
37
+ class InvalidLengthError < Error
38
+ def initialize(field:, message: nil)
39
+ super(
40
+ type: INVALID_LENGTH_ERROR,
41
+ ref: "https://example.com/errors/#{INVALID_LENGTH_ERROR}.html",
42
+ message: message || "#{humanize(field)} length is invalid"
43
+ )
44
+ end
45
+ end
46
+
47
+ class InvalidFormatError < Error
48
+ class Formats
49
+ DATE_TIME = 'date_time'
50
+ DATE = 'date'
51
+ TIME = 'time'
52
+ UUID = 'uuid'
53
+ end
54
+
55
+ def initialize(field:, format: nil, message: nil)
56
+ default_message =
57
+ format ? "has invalid format, required format is #{format}" : 'has invalid format'
58
+ super(
59
+ type: INVALID_FORMAT_ERROR,
60
+ ref: "https://example.com/errors/#{INVALID_FORMAT_ERROR}.html",
61
+ message: message || "#{humanize(field)} #{default_message}"
62
+ )
63
+ end
64
+ end
65
+
66
+ class InvalidTypeError < Error
67
+ class Types
68
+ STRING = 'string'
69
+ INTEGER = 'integer'
70
+ NUMBER = 'number'
71
+ BOOLEAN = 'boolean'
72
+ ARRAY = 'array'
73
+ OBJECT = 'object'
74
+ end
75
+
76
+ def initialize(field:, type:, message: nil)
77
+ super(
78
+ type: INVALID_TYPE_ERROR,
79
+ ref: "https://example.com/errors/#{INVALID_TYPE_ERROR}.html",
80
+ message: message || "#{humanize(field)} must be of type #{type}",
81
+ error_details: { type: type }
82
+ )
83
+ end
84
+ end
85
+
86
+ class MissingValueError < Error
87
+ def initialize(field:, message: nil)
88
+ super(
89
+ type: MISSING_VALUE_ERROR,
90
+ ref: "https://example.com/errors/#{MISSING_VALUE_ERROR}.html",
91
+ message: message || "#{humanize(field)} is missing"
92
+ )
93
+ end
94
+ end
95
+
96
+ class UnknownError < Error
97
+ def initialize(field:, message: nil)
98
+ super(
99
+ type: UNKNOWN_ERROR,
100
+ ref: "https://example.com/errors/#{UNKNOWN_ERROR}.html",
101
+ message: message || "#{humanize(field)} validation failed with unknown error"
102
+ )
103
+ end
104
+ end
105
+
106
+ class ResourceNotFoundError < Error
107
+ def initialize(resource:, message: nil)
108
+ assert_snake_case(resource)
109
+
110
+ super(
111
+ type: RESOURCE_NOT_FOUND_ERROR,
112
+ ref: "https://example.com/errors/#{RESOURCE_NOT_FOUND_ERROR}.html",
113
+ message: message || "#{humanize(resource)} not found",
114
+ error_details: { resource: resource }
115
+ )
116
+ end
117
+ end
118
+
119
+ class NotVerifiedError < Error
120
+ def initialize(resource:, message: nil)
121
+ assert_snake_case(resource)
122
+
123
+ super(
124
+ type: NOT_VERIFIED_ERROR,
125
+ ref: "https://example.com/errors/#{NOT_VERIFIED_ERROR}.html",
126
+ message: message || "#{humanize(resource)} is not verified",
127
+ error_details: { resource: resource }
128
+ )
129
+ end
130
+ end
131
+
132
+ class RemainingAssociationError < Error
133
+ def initialize(resource:, associated_resource:, message: nil)
134
+ assert_snake_case(resource)
135
+ assert_snake_case(associated_resource)
136
+
137
+ default_message =
138
+ "cannot be modified/deleted because it is associated to one or more #{
139
+ humanize(associated_resource)
140
+ }(s)"
141
+ super(
142
+ type: REMAINING_ASSOCIATION_ERROR,
143
+ ref: "https://example.com/errors/#{REMAINING_ASSOCIATION_ERROR}.html",
144
+ message: message || "#{humanize(resource)} #{default_message}",
145
+ error_details: { resource: resource, associated_resource: associated_resource }
146
+ )
147
+ end
148
+ end
149
+
150
+ class LimitExceededError < Error
151
+ def initialize(resource:, max:, message: nil)
152
+ assert_snake_case(resource)
153
+
154
+ super(
155
+ type: LIMIT_EXCEEDED_ERROR,
156
+ ref: "https://example.com/errors/#{LIMIT_EXCEEDED_ERROR}.html",
157
+ message: message || "#{humanize(resource)} count must not exceed #{max}",
158
+ error_details: { resource: resource, max: max }
159
+ )
160
+ end
161
+ end
162
+
163
+ class ResourceAlreadyExistsError < Error
164
+ def initialize(resource:, message: nil)
165
+ assert_snake_case(resource)
166
+
167
+ super(
168
+ type: RESOURCE_ALREADY_EXISTS_ERROR,
169
+ ref: "https://example.com/errors/#{RESOURCE_ALREADY_EXISTS_ERROR}.html",
170
+ message: message || "#{humanize(resource)} already exists",
171
+ error_details: { resource: resource }
172
+ )
173
+ end
174
+ end
175
+
176
+ class InvalidResourceStateError < Error
177
+ def initialize(resource:, state:, message: nil)
178
+ assert_snake_case(resource)
179
+ assert_snake_case(state)
180
+
181
+ super(
182
+ type: INVALID_RESOURCE_STATE_ERROR,
183
+ ref: "https://example.com/errors/#{INVALID_RESOURCE_STATE_ERROR}.html",
184
+ message: message || "#{humanize(resource)} is in invalid state: #{state}",
185
+ error_details: { resource: resource, state: state }
186
+ )
187
+ end
188
+ end
189
+
190
+ class AuthorizationError < Error
191
+ def initialize(message: nil)
192
+ super(
193
+ type: AUTHORIZATION_ERROR,
194
+ ref: "https://example.com/errors/#{AUTHORIZATION_ERROR}.html",
195
+ message: message || 'You do not have permissions to perform the action'
196
+ )
197
+ end
198
+ end
199
+
200
+ class RecipientOptedOutError < Error
201
+ def initialize(message: nil)
202
+ super(
203
+ type: RECIPIENT_OPTED_OUT_ERROR,
204
+ ref:
205
+ 'https://docs.glia.com/glia-dev/reference/webhooks#example-engagementrequestfailure-event-with-fail_error',
206
+ message: message || 'Recipient has opted out'
207
+ )
208
+ end
209
+ end
210
+ # rubocop:enable Style/Documentation
211
+ end
212
+ end
@@ -4,6 +4,7 @@ module Glia
4
4
  module Errors
5
5
  # Base error
6
6
  class Error
7
+ SNAKE_CASE_REGEX = /^[a-z0-9]+(_[a-z0-9]+)*$/.freeze
7
8
  attr_reader :type, :ref, :message, :error_details
8
9
 
9
10
  def initialize(type:, ref:, message: nil, error_details: nil)
@@ -46,6 +47,12 @@ module Glia
46
47
  def humanize(value)
47
48
  value.to_s.capitalize.gsub('_', ' ')
48
49
  end
50
+
51
+ def assert_snake_case(value)
52
+ return if value.to_s.match(SNAKE_CASE_REGEX)
53
+
54
+ raise ArgumentError, "Expected '#{value}' to be in snake case"
55
+ end
49
56
  end
50
57
  end
51
58
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Glia
4
4
  module Errors
5
+ # Client errors
5
6
  INPUT_VALIDATION_ERROR = 'input_validation_error'
6
7
  INVALID_TYPE_ERROR = 'invalid_type_error'
7
8
  INVALID_NUMBER_ERROR = 'invalid_number_error'
@@ -10,5 +11,17 @@ module Glia
10
11
  INVALID_LENGTH_ERROR = 'invalid_length_error'
11
12
  MISSING_VALUE_ERROR = 'missing_value_error'
12
13
  UNKNOWN_ERROR = 'unknown_error'
14
+ RESOURCE_NOT_FOUND_ERROR = 'resource_not_found_error'
15
+ NOT_VERIFIED_ERROR = 'not_verified_error'
16
+ REMAINING_ASSOCIATION_ERROR = 'remaining_association_error'
17
+ LIMIT_EXCEEDED_ERROR = 'limit_exceeded_error'
18
+ RESOURCE_ALREADY_EXISTS_ERROR = 'resource_already_exists_error'
19
+ INVALID_RESOURCE_STATE_ERROR = 'invalid_resource_state_error'
20
+ AUTHORIZATION_ERROR = 'authorization_error'
21
+ RECIPIENT_OPTED_OUT_ERROR = 'recipient_opted_out_error'
22
+
23
+ # Server errors
24
+ INTERNAL_SERVER_ERROR = 'internal_server_error'
25
+ SERVICE_UNAVAILABLE_ERROR = 'service_unavailable_error'
13
26
  end
14
27
  end
@@ -8,17 +8,18 @@ module Glia
8
8
  lambda do |field, _value, message|
9
9
  type =
10
10
  case message
11
- when 'must be an array'
11
+ when 'must be an array', 'must be Array'
12
12
  InvalidTypeError::Types::ARRAY
13
- when 'must be an integer'
13
+ when 'must be an integer', 'must be Integer'
14
14
  InvalidTypeError::Types::INTEGER
15
- when 'must be a number', 'must be a float', 'must be a decimal'
15
+ when 'must be a number', 'must be a float', 'must be a decimal', 'must be Float',
16
+ 'must be BigDecimal'
16
17
  InvalidTypeError::Types::NUMBER
17
- when 'must be a hash'
18
+ when 'must be a hash', 'must be Hash'
18
19
  InvalidTypeError::Types::OBJECT
19
- when 'must be boolean'
20
+ when 'must be boolean', 'must be Boolean'
20
21
  InvalidTypeError::Types::BOOLEAN
21
- when 'must be a string'
22
+ when 'must be a string', 'must be String'
22
23
  InvalidTypeError::Types::STRING
23
24
  end
24
25
  InvalidTypeError.new(field: field, type: type)
@@ -45,40 +46,44 @@ module Glia
45
46
  end
46
47
  end
47
48
 
48
- # dry-validation will return `must be a date/time` even if we provide a number or boolean,
49
- # in which case `invalid_format_error` does not make sense, so instead we will return `invalid_type_error`
50
- INVALID_DATE_FORMAT_OR_TYPE_ERROR =
51
- lambda do |field, value, message|
52
- if value.is_a?(String)
53
- format =
54
- case message
55
- when 'must be a date'
56
- InvalidFormatError::Formats::DATE
57
- when 'must be a date time'
58
- InvalidFormatError::Formats::DATE_TIME
59
- when 'must be a time'
60
- InvalidFormatError::Formats::TIME
61
- end
62
- InvalidFormatError.new(field: field, format: format)
63
- else
64
- InvalidTypeError.new(field: field, type: InvalidTypeError::Types::STRING)
65
- end
49
+ INVALID_DATE_FORMAT =
50
+ lambda do |field, _value, message|
51
+ format =
52
+ case message
53
+ when 'must be a date', 'must be Date'
54
+ InvalidFormatError::Formats::DATE
55
+ when 'must be a date time', 'must be DateTime'
56
+ InvalidFormatError::Formats::DATE_TIME
57
+ when 'must be a time', 'must be Time'
58
+ InvalidFormatError::Formats::TIME
59
+ end
60
+ InvalidFormatError.new(field: field, format: format)
66
61
  end
67
62
 
68
63
  ERROR_MAP = {
69
64
  # InvalidTypeError
70
65
  'must be an array' => INVALID_TYPE_ERROR,
66
+ 'must be Array' => INVALID_TYPE_ERROR,
71
67
  'must be an integer' => INVALID_TYPE_ERROR,
68
+ 'must be Integer' => INVALID_TYPE_ERROR,
72
69
  'must be a number' => INVALID_TYPE_ERROR,
73
70
  'must be a float' => INVALID_TYPE_ERROR,
71
+ 'must be Float' => INVALID_TYPE_ERROR,
74
72
  'must be a decimal' => INVALID_TYPE_ERROR,
73
+ 'must be BigDecimal' => INVALID_TYPE_ERROR,
75
74
  'must be a hash' => INVALID_TYPE_ERROR,
75
+ 'must be Hash' => INVALID_TYPE_ERROR,
76
76
  'must be boolean' => INVALID_TYPE_ERROR,
77
+ 'must be Boolean' => INVALID_TYPE_ERROR,
77
78
  'must be a string' => INVALID_TYPE_ERROR,
78
- 'must be a date time' => INVALID_DATE_FORMAT_OR_TYPE_ERROR,
79
- 'must be a date' => INVALID_DATE_FORMAT_OR_TYPE_ERROR,
80
- 'must be a time' => INVALID_DATE_FORMAT_OR_TYPE_ERROR,
79
+ 'must be String' => INVALID_TYPE_ERROR,
81
80
  # InvalidFormatError
81
+ 'must be a date time' => INVALID_DATE_FORMAT,
82
+ 'must be DateTime' => INVALID_DATE_FORMAT,
83
+ 'must be a date' => INVALID_DATE_FORMAT,
84
+ 'must be Date' => INVALID_DATE_FORMAT,
85
+ 'must be a time' => INVALID_DATE_FORMAT,
86
+ 'must be Time' => INVALID_DATE_FORMAT,
82
87
  'is in invalid format' => INVALID_FORMAT_ERROR,
83
88
  'is not a valid UUID' => INVALID_UUID_ERROR,
84
89
  # InvalidNumberError
@@ -93,9 +98,11 @@ module Glia
93
98
  'must be false' => INVALID_VALUE_ERROR,
94
99
  'must include' => INVALID_VALUE_ERROR,
95
100
  'must not include' => INVALID_VALUE_ERROR,
96
- 'must be empty' => INVALID_VALUE_ERROR,
97
- 'must be filled' => INVALID_VALUE_ERROR,
98
- 'cannot be empty' => INVALID_VALUE_ERROR,
101
+ 'must be filled' =>
102
+ lambda do |field, value, _message|
103
+ # Consider `nil` as invalid value error, but empty string or array as invalid length error
104
+ value.nil? ? InvalidValueError.new(field: field) : InvalidLengthError.new(field: field)
105
+ end,
99
106
  'cannot be defined' => INVALID_VALUE_ERROR,
100
107
  # InvalidNumberError or InvalidValueError
101
108
  'must be equal to' => INVALID_NUMBER_OR_VALUE_ERROR,
@@ -112,6 +119,8 @@ module Glia
112
119
  'bytes long' => INVALID_LENGTH_ERROR,
113
120
  'length must be' => INVALID_LENGTH_ERROR,
114
121
  'length must be within' => INVALID_LENGTH_ERROR,
122
+ 'must be empty' => INVALID_LENGTH_ERROR,
123
+ 'cannot be empty' => INVALID_LENGTH_ERROR,
115
124
  # MissingValueError
116
125
  'is missing' => MISSING_VALUE_ERROR,
117
126
  # Custom format errors
@@ -132,7 +141,9 @@ module Glia
132
141
  field_value = output[field]
133
142
  acc[field] =
134
143
  if field_messages.is_a?(Hash)
135
- from_dry_validation_result_rec(field_value, field_messages, error_map)
144
+ # Wrap result in array as by defined structure each field has an array of errors.
145
+ # This is not needed for the `else` case as dry-validation already provides an array.
146
+ [from_dry_validation_result_rec(field_value, field_messages, error_map)]
136
147
  else
137
148
  field_messages.map do |message|
138
149
  from_dry_validation_error(field, field_value, message, error_map)
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Glia
4
+ module Errors
5
+ # rubocop:disable Style/Documentation
6
+ class InternalServerError < Error
7
+ def initialize(message: nil)
8
+ super(
9
+ type: INTERNAL_SERVER_ERROR,
10
+ ref: "https://example.com/errors/#{INTERNAL_SERVER_ERROR}.html",
11
+ message: message || 'Internal server error'
12
+ )
13
+ end
14
+ end
15
+
16
+ class ServiceUnavailableError < Error
17
+ def initialize(message: nil)
18
+ super(
19
+ type: SERVICE_UNAVAILABLE_ERROR,
20
+ ref: "https://example.com/errors/#{SERVICE_UNAVAILABLE_ERROR}.html",
21
+ message: message || 'Service unavailable'
22
+ )
23
+ end
24
+ end
25
+ # rubocop:enable Style/Documentation
26
+ end
27
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glia-errors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Glia TechMovers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-14 00:00:00.000000000 Z
11
+ date: 2021-03-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: ''
14
14
  email:
@@ -22,27 +22,22 @@ files:
22
22
  - ".prettierrc"
23
23
  - ".rspec"
24
24
  - ".rubocop.yml"
25
+ - ".ruby-version"
25
26
  - ".travis.yml"
26
27
  - Appraisals
27
28
  - Gemfile
28
29
  - Gemfile.lock
29
- - LICENSE
30
30
  - README.md
31
31
  - Rakefile
32
32
  - gemfiles/dry_validation_v0.gemfile
33
33
  - gemfiles/dry_validation_v1.gemfile
34
34
  - glia-errors.gemspec
35
35
  - lib/glia/errors.rb
36
+ - lib/glia/errors/client_errors.rb
36
37
  - lib/glia/errors/error.rb
37
38
  - lib/glia/errors/error_types.rb
38
39
  - lib/glia/errors/mapper.rb
39
- - lib/glia/errors/validation_errors.rb
40
- - test_cases/invalid_format_error_case.json
41
- - test_cases/invalid_length_error_case.json
42
- - test_cases/invalid_number_error_case.json
43
- - test_cases/invalid_type_error_case.json
44
- - test_cases/invalid_value_error_case.json
45
- - test_cases/missing_value_error_case.json
40
+ - lib/glia/errors/server_errors.rb
46
41
  homepage:
47
42
  licenses:
48
43
  - MIT
@@ -62,7 +57,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
57
  - !ruby/object:Gem::Version
63
58
  version: '0'
64
59
  requirements: []
65
- rubygems_version: 3.0.3
60
+ rubygems_version: 3.1.4
66
61
  signing_key:
67
62
  specification_version: 4
68
63
  summary: Glia REST API errors
data/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2020 Glia Inc.
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,115 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Glia
4
- module Errors
5
- # InputValidationError
6
- class InputValidationError < Error
7
- def initialize(error_details:, message: nil)
8
- super(
9
- type: INPUT_VALIDATION_ERROR,
10
- ref: "https://example.com/errors/#{INPUT_VALIDATION_ERROR}.html",
11
- message: message,
12
- error_details: error_details
13
- )
14
- end
15
- end
16
-
17
- # InvalidNumberError
18
- class InvalidNumberError < Error
19
- def initialize(field:)
20
- super(
21
- type: INVALID_NUMBER_ERROR,
22
- ref: "https://example.com/errors/#{INVALID_NUMBER_ERROR}.html",
23
- message: "#{humanize(field)} is invalid"
24
- )
25
- end
26
- end
27
-
28
- # InvalidValueError
29
- class InvalidValueError < Error
30
- def initialize(field:)
31
- super(
32
- type: INVALID_VALUE_ERROR,
33
- ref: "https://example.com/errors/#{INVALID_VALUE_ERROR}.html",
34
- message: "#{humanize(field)} is invalid"
35
- )
36
- end
37
- end
38
-
39
- # InvalidLengthError
40
- class InvalidLengthError < Error
41
- def initialize(field:)
42
- super(
43
- type: INVALID_LENGTH_ERROR,
44
- ref: "https://example.com/errors/#{INVALID_LENGTH_ERROR}.html",
45
- message: "#{humanize(field)} length is invalid"
46
- )
47
- end
48
- end
49
-
50
- # InvalidFormatError
51
- class InvalidFormatError < Error
52
- class Formats
53
- DATE_TIME = 'date_time'
54
- DATE = 'date'
55
- TIME = 'time'
56
- UUID = 'uuid'
57
- end
58
-
59
- def initialize(field:, format: nil)
60
- super(
61
- type: INVALID_FORMAT_ERROR,
62
- ref: "https://example.com/errors/#{INVALID_FORMAT_ERROR}.html",
63
- message:
64
- if format
65
- "#{humanize(field)} has invalid format, required format is #{format}"
66
- else
67
- "#{humanize(field)} has invalid format"
68
- end
69
- )
70
- end
71
- end
72
-
73
- # InvalidTypeError
74
- class InvalidTypeError < Error
75
- class Types
76
- STRING = 'string'
77
- INTEGER = 'integer'
78
- NUMBER = 'number'
79
- BOOLEAN = 'boolean'
80
- ARRAY = 'array'
81
- OBJECT = 'object'
82
- end
83
-
84
- def initialize(field:, type:)
85
- super(
86
- type: INVALID_TYPE_ERROR,
87
- ref: "https://example.com/errors/#{INVALID_TYPE_ERROR}.html",
88
- message: "#{humanize(field)} must be of type #{type}"
89
- )
90
- end
91
- end
92
-
93
- # MissingValueError
94
- class MissingValueError < Error
95
- def initialize(field:)
96
- super(
97
- type: MISSING_VALUE_ERROR,
98
- ref: "https://example.com/errors/#{MISSING_VALUE_ERROR}.html",
99
- message: "#{humanize(field)} is missing"
100
- )
101
- end
102
- end
103
-
104
- # UnknownError
105
- class UnknownError < Error
106
- def initialize(field:)
107
- super(
108
- type: UNKNOWN_ERROR,
109
- ref: "https://example.com/errors/#{UNKNOWN_ERROR}.html",
110
- message: "#{humanize(field)} validation failed with unknown error"
111
- )
112
- end
113
- end
114
- end
115
- end
@@ -1,74 +0,0 @@
1
- {
2
- "input": {
3
- "invalid_format_abc_regex": "defg",
4
- "invalid_format_date": "not date",
5
- "invalid_format_date_time": "not date time",
6
- "invalid_format_time": "not time",
7
- "invalid_format_uuid": "not uuid",
8
- "invalid_format_e164": "not phone number",
9
- "invalid_format_phone_extension": "not phone extension",
10
- "invalid_format_email": "not email"
11
- },
12
- "expectation": {
13
- "type": "input_validation_error",
14
- "ref": "https://example.com/errors/input_validation_error.html",
15
- "error_details": {
16
- "invalid_format_abc_regex": [
17
- {
18
- "type": "invalid_format_error",
19
- "ref": "https://example.com/errors/invalid_format_error.html",
20
- "message": "Invalid format abc regex has invalid format"
21
- }
22
- ],
23
- "invalid_format_date": [
24
- {
25
- "type": "invalid_format_error",
26
- "ref": "https://example.com/errors/invalid_format_error.html",
27
- "message": "Invalid format date has invalid format, required format is date"
28
- }
29
- ],
30
- "invalid_format_date_time": [
31
- {
32
- "type": "invalid_format_error",
33
- "ref": "https://example.com/errors/invalid_format_error.html",
34
- "message": "Invalid format date time has invalid format, required format is date_time"
35
- }
36
- ],
37
- "invalid_format_time": [
38
- {
39
- "type": "invalid_format_error",
40
- "ref": "https://example.com/errors/invalid_format_error.html",
41
- "message": "Invalid format time has invalid format, required format is time"
42
- }
43
- ],
44
- "invalid_format_uuid": [
45
- {
46
- "type": "invalid_format_error",
47
- "ref": "https://example.com/errors/invalid_format_error.html",
48
- "message": "Invalid format uuid has invalid format, required format is uuid"
49
- }
50
- ],
51
- "invalid_format_e164": [
52
- {
53
- "type": "invalid_format_error",
54
- "ref": "https://example.com/errors/invalid_format_error.html",
55
- "message": "Invalid format e164 has invalid format"
56
- }
57
- ],
58
- "invalid_format_phone_extension": [
59
- {
60
- "type": "invalid_format_error",
61
- "ref": "https://example.com/errors/invalid_format_error.html",
62
- "message": "Invalid format phone extension has invalid format"
63
- }
64
- ],
65
- "invalid_format_email": [
66
- {
67
- "type": "invalid_format_error",
68
- "ref": "https://example.com/errors/invalid_format_error.html",
69
- "message": "Invalid format email has invalid format"
70
- }
71
- ]
72
- }
73
- }
74
- }
@@ -1,106 +0,0 @@
1
- {
2
- "input": {
3
- "invalid_length_array_max_length_3": [1, 2, 3, 4],
4
- "invalid_length_array_min_length_3": [1, 2],
5
- "invalid_length_array_exact_length_3": [1, 2],
6
- "invalid_length_array_range_length_1_2": [1, 2, 3],
7
- "invalid_length_string_max_length_3": "abcd",
8
- "invalid_length_string_min_length_3": "ab",
9
- "invalid_length_string_exact_length_3": "ab",
10
- "invalid_length_string_range_length_1_2": "abc",
11
- "invalid_length_string_max_bytesize_3": "abcd",
12
- "invalid_length_string_min_bytesize_3": "a",
13
- "invalid_length_string_exact_bytesize_3": "ab",
14
- "invalid_length_string_range_bytesize_1_2": "abc"
15
- },
16
- "expectation": {
17
- "type": "input_validation_error",
18
- "ref": "https://example.com/errors/input_validation_error.html",
19
- "error_details": {
20
- "invalid_length_array_max_length_3": [
21
- {
22
- "type": "invalid_length_error",
23
- "ref": "https://example.com/errors/invalid_length_error.html",
24
- "message": "Invalid length array max length 3 length is invalid"
25
- }
26
- ],
27
- "invalid_length_array_min_length_3": [
28
- {
29
- "type": "invalid_length_error",
30
- "ref": "https://example.com/errors/invalid_length_error.html",
31
- "message": "Invalid length array min length 3 length is invalid"
32
- }
33
- ],
34
- "invalid_length_array_exact_length_3": [
35
- {
36
- "type": "invalid_length_error",
37
- "ref": "https://example.com/errors/invalid_length_error.html",
38
- "message": "Invalid length array exact length 3 length is invalid"
39
- }
40
- ],
41
- "invalid_length_array_range_length_1_2": [
42
- {
43
- "type": "invalid_length_error",
44
- "ref": "https://example.com/errors/invalid_length_error.html",
45
- "message": "Invalid length array range length 1 2 length is invalid"
46
- }
47
- ],
48
- "invalid_length_string_max_length_3": [
49
- {
50
- "type": "invalid_length_error",
51
- "ref": "https://example.com/errors/invalid_length_error.html",
52
- "message": "Invalid length string max length 3 length is invalid"
53
- }
54
- ],
55
- "invalid_length_string_min_length_3": [
56
- {
57
- "type": "invalid_length_error",
58
- "ref": "https://example.com/errors/invalid_length_error.html",
59
- "message": "Invalid length string min length 3 length is invalid"
60
- }
61
- ],
62
- "invalid_length_string_exact_length_3": [
63
- {
64
- "type": "invalid_length_error",
65
- "ref": "https://example.com/errors/invalid_length_error.html",
66
- "message": "Invalid length string exact length 3 length is invalid"
67
- }
68
- ],
69
- "invalid_length_string_range_length_1_2": [
70
- {
71
- "type": "invalid_length_error",
72
- "ref": "https://example.com/errors/invalid_length_error.html",
73
- "message": "Invalid length string range length 1 2 length is invalid"
74
- }
75
- ],
76
- "invalid_length_string_max_bytesize_3": [
77
- {
78
- "type": "invalid_length_error",
79
- "ref": "https://example.com/errors/invalid_length_error.html",
80
- "message": "Invalid length string max bytesize 3 length is invalid"
81
- }
82
- ],
83
- "invalid_length_string_min_bytesize_3": [
84
- {
85
- "type": "invalid_length_error",
86
- "ref": "https://example.com/errors/invalid_length_error.html",
87
- "message": "Invalid length string min bytesize 3 length is invalid"
88
- }
89
- ],
90
- "invalid_length_string_exact_bytesize_3": [
91
- {
92
- "type": "invalid_length_error",
93
- "ref": "https://example.com/errors/invalid_length_error.html",
94
- "message": "Invalid length string exact bytesize 3 length is invalid"
95
- }
96
- ],
97
- "invalid_length_string_range_bytesize_1_2": [
98
- {
99
- "type": "invalid_length_error",
100
- "ref": "https://example.com/errors/invalid_length_error.html",
101
- "message": "Invalid length string range bytesize 1 2 length is invalid"
102
- }
103
- ]
104
- }
105
- }
106
- }
@@ -1,90 +0,0 @@
1
- {
2
- "input": {
3
- "invalid_number_less_than_10": 20,
4
- "invalid_number_less_than_or_equal_10": 20,
5
- "invalid_number_more_than_10": 5,
6
- "invalid_number_more_than_or_equal_10": 5,
7
- "invalid_number_equal_10": 5,
8
- "invalid_number_not_equal_10": 10,
9
- "invalid_number_one_of_1_2": 4,
10
- "invalid_number_in_range_1_to_3": 4,
11
- "invalid_number_even": 3,
12
- "invalid_number_odd": 4
13
- },
14
- "expectation": {
15
- "type": "input_validation_error",
16
- "ref": "https://example.com/errors/input_validation_error.html",
17
- "error_details": {
18
- "invalid_number_less_than_10": [
19
- {
20
- "type": "invalid_number_error",
21
- "ref": "https://example.com/errors/invalid_number_error.html",
22
- "message": "Invalid number less than 10 is invalid"
23
- }
24
- ],
25
- "invalid_number_less_than_or_equal_10": [
26
- {
27
- "type": "invalid_number_error",
28
- "ref": "https://example.com/errors/invalid_number_error.html",
29
- "message": "Invalid number less than or equal 10 is invalid"
30
- }
31
- ],
32
- "invalid_number_more_than_10": [
33
- {
34
- "type": "invalid_number_error",
35
- "ref": "https://example.com/errors/invalid_number_error.html",
36
- "message": "Invalid number more than 10 is invalid"
37
- }
38
- ],
39
- "invalid_number_more_than_or_equal_10": [
40
- {
41
- "type": "invalid_number_error",
42
- "ref": "https://example.com/errors/invalid_number_error.html",
43
- "message": "Invalid number more than or equal 10 is invalid"
44
- }
45
- ],
46
- "invalid_number_equal_10": [
47
- {
48
- "type": "invalid_number_error",
49
- "ref": "https://example.com/errors/invalid_number_error.html",
50
- "message": "Invalid number equal 10 is invalid"
51
- }
52
- ],
53
- "invalid_number_not_equal_10": [
54
- {
55
- "type": "invalid_number_error",
56
- "ref": "https://example.com/errors/invalid_number_error.html",
57
- "message": "Invalid number not equal 10 is invalid"
58
- }
59
- ],
60
- "invalid_number_one_of_1_2": [
61
- {
62
- "type": "invalid_number_error",
63
- "ref": "https://example.com/errors/invalid_number_error.html",
64
- "message": "Invalid number one of 1 2 is invalid"
65
- }
66
- ],
67
- "invalid_number_in_range_1_to_3": [
68
- {
69
- "type": "invalid_number_error",
70
- "ref": "https://example.com/errors/invalid_number_error.html",
71
- "message": "Invalid number in range 1 to 3 is invalid"
72
- }
73
- ],
74
- "invalid_number_even": [
75
- {
76
- "type": "invalid_number_error",
77
- "ref": "https://example.com/errors/invalid_number_error.html",
78
- "message": "Invalid number even is invalid"
79
- }
80
- ],
81
- "invalid_number_odd": [
82
- {
83
- "type": "invalid_number_error",
84
- "ref": "https://example.com/errors/invalid_number_error.html",
85
- "message": "Invalid number odd is invalid"
86
- }
87
- ]
88
- }
89
- }
90
- }
@@ -1,98 +0,0 @@
1
- {
2
- "input": {
3
- "invalid_type_array": 0,
4
- "invalid_type_number": "str",
5
- "invalid_type_object": 0,
6
- "invalid_type_boolean": 0,
7
- "invalid_type_integer": 0.0,
8
- "invalid_type_float": 0,
9
- "invalid_type_decimal": 0,
10
- "invalid_type_date": 0,
11
- "invalid_type_date_time": 0,
12
- "invalid_type_time": 0,
13
- "invalid_type_string": 0
14
- },
15
- "expectation": {
16
- "type": "input_validation_error",
17
- "ref": "https://example.com/errors/input_validation_error.html",
18
- "error_details": {
19
- "invalid_type_array": [
20
- {
21
- "type": "invalid_type_error",
22
- "ref": "https://example.com/errors/invalid_type_error.html",
23
- "message": "Invalid type array must be of type array"
24
- }
25
- ],
26
- "invalid_type_number": [
27
- {
28
- "type": "invalid_type_error",
29
- "ref": "https://example.com/errors/invalid_type_error.html",
30
- "message": "Invalid type number must be of type number"
31
- }
32
- ],
33
- "invalid_type_object": [
34
- {
35
- "type": "invalid_type_error",
36
- "ref": "https://example.com/errors/invalid_type_error.html",
37
- "message": "Invalid type object must be of type object"
38
- }
39
- ],
40
- "invalid_type_boolean": [
41
- {
42
- "type": "invalid_type_error",
43
- "ref": "https://example.com/errors/invalid_type_error.html",
44
- "message": "Invalid type boolean must be of type boolean"
45
- }
46
- ],
47
- "invalid_type_integer": [
48
- {
49
- "type": "invalid_type_error",
50
- "ref": "https://example.com/errors/invalid_type_error.html",
51
- "message": "Invalid type integer must be of type integer"
52
- }
53
- ],
54
- "invalid_type_float": [
55
- {
56
- "type": "invalid_type_error",
57
- "ref": "https://example.com/errors/invalid_type_error.html",
58
- "message": "Invalid type float must be of type number"
59
- }
60
- ],
61
- "invalid_type_decimal": [
62
- {
63
- "type": "invalid_type_error",
64
- "ref": "https://example.com/errors/invalid_type_error.html",
65
- "message": "Invalid type decimal must be of type number"
66
- }
67
- ],
68
- "invalid_type_date": [
69
- {
70
- "type": "invalid_type_error",
71
- "ref": "https://example.com/errors/invalid_type_error.html",
72
- "message": "Invalid type date must be of type string"
73
- }
74
- ],
75
- "invalid_type_date_time": [
76
- {
77
- "type": "invalid_type_error",
78
- "ref": "https://example.com/errors/invalid_type_error.html",
79
- "message": "Invalid type date time must be of type string"
80
- }
81
- ],
82
- "invalid_type_time": [
83
- {
84
- "type": "invalid_type_error",
85
- "ref": "https://example.com/errors/invalid_type_error.html",
86
- "message": "Invalid type time must be of type string"
87
- }
88
- ],
89
- "invalid_type_string": [
90
- {
91
- "type": "invalid_type_error",
92
- "ref": "https://example.com/errors/invalid_type_error.html",
93
- "message": "Invalid type string must be of type string"
94
- }
95
- ]
96
- }
97
- }
98
- }
@@ -1,125 +0,0 @@
1
- {
2
- "input": {
3
- "invalid_value_string_equal_abc": "defg",
4
- "invalid_value_string_one_of_a_b_c": "d",
5
- "invalid_value_string_not_equal_abc": "abc",
6
- "invalid_value_string_not_one_of_a_b_c": "a",
7
- "invalid_value_string_empty": "a",
8
- "invalid_value_string_not_empty": "",
9
-
10
- "invalid_value_boolean_equal_true": false,
11
- "invalid_value_boolean_equal_false": true,
12
-
13
- "invalid_value_array_includes_a": ["b"],
14
- "invalid_value_array_excludes_a": ["a"],
15
- "invalid_value_array_empty": ["a"],
16
- "invalid_value_array_not_empty": [],
17
-
18
- "invalid_value_null": "a",
19
- "invalid_value_not_null": null
20
- },
21
- "expectation": {
22
- "type": "input_validation_error",
23
- "ref": "https://example.com/errors/input_validation_error.html",
24
- "error_details": {
25
- "invalid_value_string_equal_abc": [
26
- {
27
- "type": "invalid_value_error",
28
- "ref": "https://example.com/errors/invalid_value_error.html",
29
- "message": "Invalid value string equal abc is invalid"
30
- }
31
- ],
32
- "invalid_value_string_one_of_a_b_c": [
33
- {
34
- "type": "invalid_value_error",
35
- "ref": "https://example.com/errors/invalid_value_error.html",
36
- "message": "Invalid value string one of a b c is invalid"
37
- }
38
- ],
39
- "invalid_value_string_not_equal_abc": [
40
- {
41
- "type": "invalid_value_error",
42
- "ref": "https://example.com/errors/invalid_value_error.html",
43
- "message": "Invalid value string not equal abc is invalid"
44
- }
45
- ],
46
- "invalid_value_string_not_one_of_a_b_c": [
47
- {
48
- "type": "invalid_value_error",
49
- "ref": "https://example.com/errors/invalid_value_error.html",
50
- "message": "Invalid value string not one of a b c is invalid"
51
- }
52
- ],
53
- "invalid_value_string_empty": [
54
- {
55
- "type": "invalid_value_error",
56
- "ref": "https://example.com/errors/invalid_value_error.html",
57
- "message": "Invalid value string empty is invalid"
58
- }
59
- ],
60
- "invalid_value_string_not_empty": [
61
- {
62
- "type": "invalid_value_error",
63
- "ref": "https://example.com/errors/invalid_value_error.html",
64
- "message": "Invalid value string not empty is invalid"
65
- }
66
- ],
67
- "invalid_value_boolean_equal_true": [
68
- {
69
- "type": "invalid_value_error",
70
- "ref": "https://example.com/errors/invalid_value_error.html",
71
- "message": "Invalid value boolean equal true is invalid"
72
- }
73
- ],
74
- "invalid_value_boolean_equal_false": [
75
- {
76
- "type": "invalid_value_error",
77
- "ref": "https://example.com/errors/invalid_value_error.html",
78
- "message": "Invalid value boolean equal false is invalid"
79
- }
80
- ],
81
- "invalid_value_array_includes_a": [
82
- {
83
- "type": "invalid_value_error",
84
- "ref": "https://example.com/errors/invalid_value_error.html",
85
- "message": "Invalid value array includes a is invalid"
86
- }
87
- ],
88
- "invalid_value_array_excludes_a": [
89
- {
90
- "type": "invalid_value_error",
91
- "ref": "https://example.com/errors/invalid_value_error.html",
92
- "message": "Invalid value array excludes a is invalid"
93
- }
94
- ],
95
- "invalid_value_array_empty": [
96
- {
97
- "type": "invalid_value_error",
98
- "ref": "https://example.com/errors/invalid_value_error.html",
99
- "message": "Invalid value array empty is invalid"
100
- }
101
- ],
102
- "invalid_value_array_not_empty": [
103
- {
104
- "type": "invalid_value_error",
105
- "ref": "https://example.com/errors/invalid_value_error.html",
106
- "message": "Invalid value array not empty is invalid"
107
- }
108
- ],
109
- "invalid_value_null": [
110
- {
111
- "type": "invalid_value_error",
112
- "ref": "https://example.com/errors/invalid_value_error.html",
113
- "message": "Invalid value null is invalid"
114
- }
115
- ],
116
- "invalid_value_not_null": [
117
- {
118
- "type": "invalid_value_error",
119
- "ref": "https://example.com/errors/invalid_value_error.html",
120
- "message": "Invalid value not null is invalid"
121
- }
122
- ]
123
- }
124
- }
125
- }
@@ -1,16 +0,0 @@
1
- {
2
- "input": {},
3
- "expectation": {
4
- "type": "input_validation_error",
5
- "ref": "https://example.com/errors/input_validation_error.html",
6
- "error_details": {
7
- "missing_value": [
8
- {
9
- "type": "missing_value_error",
10
- "ref": "https://example.com/errors/missing_value_error.html",
11
- "message": "Missing value is missing"
12
- }
13
- ]
14
- }
15
- }
16
- }