glia-errors 0.0.1 → 0.3.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: 8336fd0b3da25f1ce3dd3e6b2f61ad4b9e736f391088e1824f6427b5619498b2
4
- data.tar.gz: 79481e2446fb498d3f606c118fcbfb2e50df1e16e559e8136bd8a30c5cc84109
3
+ metadata.gz: 71d9c420c3a6350067f4f47cba98ebb07598c203951106c743e8d245938e4fb5
4
+ data.tar.gz: 2d74dd1fbe3272416010b8ee66b698484002baaf9f2786efde680d6a6292150e
5
5
  SHA512:
6
- metadata.gz: 4ea9ab4f9b4e101ea50eb9813a28cc0ff0d221056447e91660e927d3579b531aafb8a1718706ca51ffb09c9bd2556c90c259670590d416b6e602cbbdbcc89389
7
- data.tar.gz: e83dede85cf3a57e01066970fbfc653fd28414624fda32173b9397691338c8d5e32a200a4e3f4e36eb0d8f480e97bbab7d0588dc7cc50978c0a1cf9cc8a4e93e
6
+ metadata.gz: 23120c8979c3ad4b4a9524a9ac61deb2a2452f8c44cd79a059099b201e5cc8e07357e102a20c74c2e1716e22154ce930096be2e8d45ceafa1006aacb643a28c6
7
+ data.tar.gz: 9f0848627646f37ee78b24cd3bf3dea1b193e5541f5302782ce891727cfaeb82b502a56103350de43e41ad284340f8e2cf8848d88febf00b30c1492f7bc74b65
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'
@@ -91,9 +90,9 @@ else
91
90
  end
92
91
  ```
93
92
 
94
- # Contributing
93
+ ## Contributing
95
94
 
96
- ## Testing
95
+ ### Testing
97
96
 
98
97
  Glia errors support multiple versions of `dry-validation` and tests are run against each supported major version.
99
98
  Under the hood we use `Appraisal` gem which generals additional gemfiles for each of the versions.
@@ -116,7 +115,7 @@ To run tests only for `dry-validation` v0:
116
115
  bundle exec rake test_dry_validation_v0
117
116
  ```
118
117
 
119
- ## Formatting
118
+ ### Formatting
120
119
 
121
120
  ```
122
121
  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.1'
8
+ spec.version = '0.3.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,7 @@
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
6
  require_relative './errors/mapper'
7
7
 
8
8
  module Glia
@@ -0,0 +1,176 @@
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: "#{humanize(field)} " + (message || '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: "#{humanize(field)} " + (message || '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: "#{humanize(field)} " + (message || '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: "#{humanize(field)} " + (message || 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: "#{humanize(field)} " + (message || "must be of type #{type}")
81
+ )
82
+ end
83
+ end
84
+
85
+ class MissingValueError < Error
86
+ def initialize(field:, message: nil)
87
+ super(
88
+ type: MISSING_VALUE_ERROR,
89
+ ref: "https://example.com/errors/#{MISSING_VALUE_ERROR}.html",
90
+ message: "#{humanize(field)} " + (message || 'is missing')
91
+ )
92
+ end
93
+ end
94
+
95
+ class UnknownError < Error
96
+ def initialize(field:, message: nil)
97
+ super(
98
+ type: UNKNOWN_ERROR,
99
+ ref: "https://example.com/errors/#{UNKNOWN_ERROR}.html",
100
+ message: "#{humanize(field)} " + (message || 'validation failed with unknown error')
101
+ )
102
+ end
103
+ end
104
+
105
+ class ResourceNotFoundError < Error
106
+ def initialize(resource:, message: nil)
107
+ super(
108
+ type: RESOURCE_NOT_FOUND_ERROR,
109
+ ref: "https://example.com/errors/#{RESOURCE_NOT_FOUND_ERROR}.html",
110
+ message: "#{humanize(resource)} " + (message || 'not found'),
111
+ error_details: { resource: resource }
112
+ )
113
+ end
114
+ end
115
+
116
+ class NotVerifiedError < Error
117
+ def initialize(resource:, message: nil)
118
+ super(
119
+ type: NOT_VERIFIED_ERROR,
120
+ ref: "https://example.com/errors/#{NOT_VERIFIED_ERROR}.html",
121
+ message: "#{humanize(resource)} " + (message || 'is not verified'),
122
+ error_details: { resource: resource }
123
+ )
124
+ end
125
+ end
126
+
127
+ class RemainingAssociationError < Error
128
+ def initialize(resource:, associated_resource:, message: nil)
129
+ default_message =
130
+ "cannot be modified/deleted because it is associated to one or more #{
131
+ humanize(associated_resource)
132
+ }(s)"
133
+ super(
134
+ type: REMAINING_ASSOCIATION_ERROR,
135
+ ref: "https://example.com/errors/#{REMAINING_ASSOCIATION_ERROR}.html",
136
+ message: "#{humanize(resource)} " + (message || default_message),
137
+ error_details: { resource: resource, associated_resource: associated_resource }
138
+ )
139
+ end
140
+ end
141
+
142
+ class LimitExceededError < Error
143
+ def initialize(resource:, max:, message: nil)
144
+ super(
145
+ type: LIMIT_EXCEEDED_ERROR,
146
+ ref: "https://example.com/errors/#{LIMIT_EXCEEDED_ERROR}.html",
147
+ message: "#{humanize(resource)} " + (message || "count must not exceed #{max}"),
148
+ error_details: { resource: resource, max: max }
149
+ )
150
+ end
151
+ end
152
+
153
+ class ResourceAlreadyExistsError < Error
154
+ def initialize(resource:, message: nil)
155
+ super(
156
+ type: RESOURCE_ALREADY_EXISTS_ERROR,
157
+ ref: "https://example.com/errors/#{RESOURCE_ALREADY_EXISTS_ERROR}.html",
158
+ message: "#{humanize(resource)} " + (message || 'already exists'),
159
+ error_details: { resource: resource }
160
+ )
161
+ end
162
+ end
163
+
164
+ class InvalidResourceStateError < Error
165
+ def initialize(resource:, state:, message: nil)
166
+ super(
167
+ type: INVALID_RESOURCE_STATE_ERROR,
168
+ ref: "https://example.com/errors/#{INVALID_RESOURCE_STATE_ERROR}.html",
169
+ message: "#{humanize(resource)} " + (message || "is in invalid state: #{state}"),
170
+ error_details: { resource: resource, state: state }
171
+ )
172
+ end
173
+ end
174
+ # rubocop:enable Style/Documentation
175
+ end
176
+ end
@@ -10,5 +10,11 @@ module Glia
10
10
  INVALID_LENGTH_ERROR = 'invalid_length_error'
11
11
  MISSING_VALUE_ERROR = 'missing_value_error'
12
12
  UNKNOWN_ERROR = 'unknown_error'
13
+ RESOURCE_NOT_FOUND_ERROR = 'resource_not_found_error'
14
+ NOT_VERIFIED_ERROR = 'not_verified_error'
15
+ REMAINING_ASSOCIATION_ERROR = 'remaining_association_error'
16
+ LIMIT_EXCEEDED_ERROR = 'limit_exceeded_error'
17
+ RESOURCE_ALREADY_EXISTS_ERROR = 'resource_already_exists_error'
18
+ INVALID_RESOURCE_STATE_ERROR = 'invalid_resource_state_error'
13
19
  end
14
20
  end
@@ -46,24 +46,18 @@ module Glia
46
46
  end
47
47
  end
48
48
 
49
- # dry-validation will return `must be a date/time` even if we provide a number or boolean,
50
- # in which case `invalid_format_error` does not make sense, so instead we will return `invalid_type_error`
51
- INVALID_DATE_FORMAT_OR_TYPE_ERROR =
52
- lambda do |field, value, message|
53
- if value.is_a?(String)
54
- format =
55
- case message
56
- when 'must be a date', 'must be Date'
57
- InvalidFormatError::Formats::DATE
58
- when 'must be a date time', 'must be DateTime'
59
- InvalidFormatError::Formats::DATE_TIME
60
- when 'must be a time', 'must be Time'
61
- InvalidFormatError::Formats::TIME
62
- end
63
- InvalidFormatError.new(field: field, format: format)
64
- else
65
- InvalidTypeError.new(field: field, type: InvalidTypeError::Types::STRING)
66
- 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)
67
61
  end
68
62
 
69
63
  ERROR_MAP = {
@@ -83,13 +77,13 @@ module Glia
83
77
  'must be Boolean' => INVALID_TYPE_ERROR,
84
78
  'must be a string' => INVALID_TYPE_ERROR,
85
79
  'must be String' => INVALID_TYPE_ERROR,
86
- 'must be a date time' => INVALID_DATE_FORMAT_OR_TYPE_ERROR,
87
- 'must be DateTime' => INVALID_DATE_FORMAT_OR_TYPE_ERROR,
88
- 'must be a date' => INVALID_DATE_FORMAT_OR_TYPE_ERROR,
89
- 'must be Date' => INVALID_DATE_FORMAT_OR_TYPE_ERROR,
90
- 'must be a time' => INVALID_DATE_FORMAT_OR_TYPE_ERROR,
91
- 'must be Time' => INVALID_DATE_FORMAT_OR_TYPE_ERROR,
92
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,
93
87
  'is in invalid format' => INVALID_FORMAT_ERROR,
94
88
  'is not a valid UUID' => INVALID_UUID_ERROR,
95
89
  # InvalidNumberError
@@ -104,9 +98,11 @@ module Glia
104
98
  'must be false' => INVALID_VALUE_ERROR,
105
99
  'must include' => INVALID_VALUE_ERROR,
106
100
  'must not include' => INVALID_VALUE_ERROR,
107
- 'must be empty' => INVALID_VALUE_ERROR,
108
- 'must be filled' => INVALID_VALUE_ERROR,
109
- '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,
110
106
  'cannot be defined' => INVALID_VALUE_ERROR,
111
107
  # InvalidNumberError or InvalidValueError
112
108
  'must be equal to' => INVALID_NUMBER_OR_VALUE_ERROR,
@@ -123,6 +119,8 @@ module Glia
123
119
  'bytes long' => INVALID_LENGTH_ERROR,
124
120
  'length must be' => INVALID_LENGTH_ERROR,
125
121
  'length must be within' => INVALID_LENGTH_ERROR,
122
+ 'must be empty' => INVALID_LENGTH_ERROR,
123
+ 'cannot be empty' => INVALID_LENGTH_ERROR,
126
124
  # MissingValueError
127
125
  'is missing' => MISSING_VALUE_ERROR,
128
126
  # Custom format errors
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.1
4
+ version: 0.3.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-19 00:00:00.000000000 Z
11
+ date: 2021-02-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: ''
14
14
  email:
@@ -26,24 +26,16 @@ files:
26
26
  - Appraisals
27
27
  - Gemfile
28
28
  - Gemfile.lock
29
- - LICENSE
30
29
  - README.md
31
30
  - Rakefile
32
31
  - gemfiles/dry_validation_v0.gemfile
33
32
  - gemfiles/dry_validation_v1.gemfile
34
33
  - glia-errors.gemspec
35
34
  - lib/glia/errors.rb
35
+ - lib/glia/errors/client_errors.rb
36
36
  - lib/glia/errors/error.rb
37
37
  - lib/glia/errors/error_types.rb
38
38
  - 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_nested_params_case.json
43
- - test_cases/invalid_number_error_case.json
44
- - test_cases/invalid_type_error_case.json
45
- - test_cases/invalid_value_error_case.json
46
- - test_cases/missing_value_error_case.json
47
39
  homepage:
48
40
  licenses:
49
41
  - MIT
@@ -63,7 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
55
  - !ruby/object:Gem::Version
64
56
  version: '0'
65
57
  requirements: []
66
- rubygems_version: 3.0.6
58
+ rubygems_version: 3.1.2
67
59
  signing_key:
68
60
  specification_version: 4
69
61
  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,77 +0,0 @@
1
- {
2
- "input": {
3
- "object": {
4
- "invalid_nested_object_value": "invalid"
5
- },
6
- "array": [
7
- {
8
- "invalid_nested_array_value": "invalid"
9
- },
10
- {
11
- "invalid_nested_array_value": "valid"
12
- },
13
- {
14
- "invalid_nested_array_value": "invalid"
15
- }
16
- ]
17
- },
18
- "expectation": {
19
- "type": "input_validation_error",
20
- "ref": "https://example.com/errors/input_validation_error.html",
21
- "error_details": {
22
- "object": [
23
- {
24
- "type": "input_validation_error",
25
- "ref": "https://example.com/errors/input_validation_error.html",
26
- "error_details": {
27
- "invalid_nested_object_value": [
28
- {
29
- "type": "invalid_value_error",
30
- "ref": "https://example.com/errors/invalid_value_error.html",
31
- "message": "Invalid nested object value is invalid"
32
- }
33
- ]
34
- }
35
- }
36
- ],
37
- "array": [
38
- {
39
- "type": "input_validation_error",
40
- "ref": "https://example.com/errors/input_validation_error.html",
41
- "error_details": {
42
- "0": [
43
- {
44
- "type": "input_validation_error",
45
- "ref": "https://example.com/errors/input_validation_error.html",
46
- "error_details": {
47
- "invalid_nested_array_value": [
48
- {
49
- "type": "invalid_value_error",
50
- "ref": "https://example.com/errors/invalid_value_error.html",
51
- "message": "Invalid nested array value is invalid"
52
- }
53
- ]
54
- }
55
- }
56
- ],
57
- "2": [
58
- {
59
- "type": "input_validation_error",
60
- "ref": "https://example.com/errors/input_validation_error.html",
61
- "error_details": {
62
- "invalid_nested_array_value": [
63
- {
64
- "type": "invalid_value_error",
65
- "ref": "https://example.com/errors/invalid_value_error.html",
66
- "message": "Invalid nested array value is invalid"
67
- }
68
- ]
69
- }
70
- }
71
- ]
72
- }
73
- }
74
- ]
75
- }
76
- }
77
- }
@@ -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
- }