definition 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +0 -8
- data/Changelog.md +6 -0
- data/README.md +11 -13
- data/benchmark/coercion.rb +3 -1
- data/benchmark/complex_example.rb +3 -1
- data/benchmark/validation_only.rb +3 -1
- data/definition.gemspec +2 -2
- data/lib/definition/conform_error.rb +6 -0
- data/lib/definition/conform_result.rb +20 -13
- data/lib/definition/dsl.rb +14 -8
- data/lib/definition/dsl/comparators.rb +11 -11
- data/lib/definition/dsl/nil.rb +1 -1
- data/lib/definition/types/and.rb +1 -1
- data/lib/definition/types/each.rb +1 -1
- data/lib/definition/types/keys.rb +10 -4
- data/lib/definition/types/or.rb +1 -1
- data/lib/definition/value_object.rb +9 -2
- data/lib/definition/version.rb +1 -1
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b8b872d14fc97965062a65fcc1d75987cfd7b21c448fe4f61dfda1f11fd003b
|
4
|
+
data.tar.gz: 3195829dcc11b18abe5fa12826cefb2d16f70ce8d2bb127f715dc4ee6193b181
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4861a2c4f8ee02c9706546b24dbf9040edc02e6ba8d05f6038529f7132d72d35403de1e079d46d40bb5b00e1d5e65fa2be93781cff4e920da58f5e835f84f242
|
7
|
+
data.tar.gz: 53c7365d464f2fed498ebb405dac60bffd5d960dd643485ff571c06c3bb76ca593bd7a2758295011e27f1c35cc38c7da687935f280fad03704791d5b412387ed
|
data/.rubocop.yml
CHANGED
@@ -24,10 +24,6 @@ Metrics/MethodLength:
|
|
24
24
|
Style/Documentation:
|
25
25
|
Enabled: false
|
26
26
|
|
27
|
-
Style/AlignHash:
|
28
|
-
EnforcedColonStyle: table
|
29
|
-
EnforcedHashRocketStyle: table
|
30
|
-
|
31
27
|
Layout/AlignHash:
|
32
28
|
EnforcedColonStyle: table
|
33
29
|
EnforcedHashRocketStyle: table
|
@@ -35,10 +31,6 @@ Layout/AlignHash:
|
|
35
31
|
Style/HashSyntax:
|
36
32
|
EnforcedStyle: ruby19_no_mixed_keys
|
37
33
|
|
38
|
-
Style/MultilineOperationIndentation:
|
39
|
-
Description: Checks indentation of binary operations that span more than one line.
|
40
|
-
EnforcedStyle: indented
|
41
|
-
|
42
34
|
Layout/MultilineOperationIndentation:
|
43
35
|
Description: Checks indentation of binary operations that span more than one line.
|
44
36
|
EnforcedStyle: indented
|
data/Changelog.md
CHANGED
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [0.4.0] - 2019-03-22
|
8
|
+
### Added
|
9
|
+
- Added support for default values to Keys Definition
|
10
|
+
### Changed
|
11
|
+
- Errors returned from ConformResult were restructured for better debugging and usage
|
12
|
+
|
7
13
|
## [0.3.0] - 2019-02-03
|
8
14
|
### Added
|
9
15
|
- Added I18n translation support for errors
|
data/README.md
CHANGED
@@ -41,7 +41,9 @@ conform_result.error_message # => hash fails validation for key birthday: { Is o
|
|
41
41
|
conform_result.error_hash # =>
|
42
42
|
# {
|
43
43
|
# :birthday => [
|
44
|
-
# [0]
|
44
|
+
# [0] <Definition::ConformError
|
45
|
+
# desciption: "hash fails validation for key birthday: { Is of type String instead of Date }",
|
46
|
+
# json_pointer: "/birthday">
|
45
47
|
# ]
|
46
48
|
# }
|
47
49
|
```
|
@@ -107,6 +109,8 @@ array.first # => 1
|
|
107
109
|
IntegerArray.new([1,2,"3"]) # => Definition::InvalidValueObjectError: Not all items conform with each: { Item "3" did not conform to each: { Is of type String instead of Integer } }
|
108
110
|
```
|
109
111
|
|
112
|
+
You can access the conform result object via `InvalidValueObjectError#conform_result`
|
113
|
+
|
110
114
|
### Conforming Hashes
|
111
115
|
|
112
116
|
Hashes can be conformed by using the `Keys` definition. It allows you to configure
|
@@ -116,10 +120,13 @@ needs to have a Symbol key with that name, otherwise a string key.
|
|
116
120
|
|
117
121
|
The key definition will also fail if the input value contains extra keys.
|
118
122
|
|
123
|
+
You can configure default values for optional keys, see the following example.
|
124
|
+
|
119
125
|
```ruby
|
120
126
|
Definition.Keys do
|
121
|
-
required :title, Definition.
|
127
|
+
required :title, Definition.NonEmptyString
|
122
128
|
optional :publication_date, Definition.Type(Date)
|
129
|
+
optional :is_draft, Definition.Boolean, default: true
|
123
130
|
end
|
124
131
|
```
|
125
132
|
|
@@ -301,11 +308,9 @@ Every error object has a method `translated_error` that will give you a translat
|
|
301
308
|
version of the error message. You can load the default English translations shipped
|
302
309
|
with the gem by adding them to your I18n load path.
|
303
310
|
|
304
|
-
If you use the `error_hash` method on a `ConformResult` you also get the translated
|
305
|
-
error messages
|
306
311
|
|
307
312
|
```ruby
|
308
|
-
|
313
|
+
schema = Definition.Keys do
|
309
314
|
required :title, Definition.Type(String)
|
310
315
|
required :body, Definition.Type(String)
|
311
316
|
required(:author, Definition.Keys do
|
@@ -313,14 +318,7 @@ chema = Definition.Keys do
|
|
313
318
|
required :email, Definition.Type(String)
|
314
319
|
end)
|
315
320
|
end
|
316
|
-
|
317
|
-
# {
|
318
|
-
# :author => {
|
319
|
-
# :email => [
|
320
|
-
# [0] "Value is of wrong type, needs to be a String"
|
321
|
-
# ]
|
322
|
-
# }
|
323
|
-
# }
|
321
|
+
schema.conform(input_hash).errors.first.translated_error # => Value is of wrong type, needs to be a String"
|
324
322
|
```
|
325
323
|
|
326
324
|
## Development
|
data/benchmark/coercion.rb
CHANGED
@@ -4,7 +4,9 @@ require "bundler/inline"
|
|
4
4
|
|
5
5
|
gemfile do
|
6
6
|
source "https://rubygems.org"
|
7
|
-
|
7
|
+
# FIXME: benchmark needs to be updated to work with dry-validation 1.0.0"
|
8
|
+
gem "dry-validation", "< 1.0.0"
|
9
|
+
gem "dry-types", "< 0.15"
|
8
10
|
gem "awesome_print"
|
9
11
|
gem "benchmark-ips"
|
10
12
|
gem "pry"
|
@@ -4,7 +4,9 @@ require "bundler/inline"
|
|
4
4
|
|
5
5
|
gemfile do
|
6
6
|
source "https://rubygems.org"
|
7
|
-
|
7
|
+
# FIXME: benchmark needs to be updated to work with dry-validation 1.0.0"
|
8
|
+
gem "dry-validation", "< 1.0.0"
|
9
|
+
gem "dry-types", "< 0.15"
|
8
10
|
gem "awesome_print"
|
9
11
|
gem "benchmark-ips"
|
10
12
|
gem "pry"
|
@@ -4,7 +4,9 @@ require "bundler/inline"
|
|
4
4
|
|
5
5
|
gemfile do
|
6
6
|
source "https://rubygems.org"
|
7
|
-
|
7
|
+
# FIXME: benchmark needs to be updated to work with dry-validation 1.0.0"
|
8
|
+
gem "dry-validation", "< 1.0.0"
|
9
|
+
gem "dry-types", "< 0.15"
|
8
10
|
gem "awesome_print"
|
9
11
|
gem "benchmark-ips"
|
10
12
|
gem "definition", path: File.expand_path("../.", __dir__)
|
data/definition.gemspec
CHANGED
@@ -34,8 +34,8 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.add_development_dependency "rake", "~> 10.0"
|
35
35
|
spec.add_development_dependency "rspec", "~> 3.0"
|
36
36
|
spec.add_development_dependency "rspec-its", "~> 1.2"
|
37
|
-
spec.add_development_dependency "rubocop"
|
38
|
-
spec.add_development_dependency "rubocop-rspec"
|
37
|
+
spec.add_development_dependency "rubocop", "0.66.0"
|
38
|
+
spec.add_development_dependency "rubocop-rspec", "1.32.0"
|
39
39
|
spec.add_development_dependency "rubocop_runner"
|
40
40
|
spec.add_development_dependency "timecop"
|
41
41
|
end
|
@@ -23,6 +23,12 @@ module Definition
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
def to_s
|
27
|
+
"<Definition::ConformError \n\t desciption: \"#{message}\", \n\t json_pointer: \"#{json_pointer}\">"
|
28
|
+
end
|
29
|
+
|
30
|
+
alias inspect to_s
|
31
|
+
|
26
32
|
def error_path
|
27
33
|
current = self
|
28
34
|
path = current.is_a?(KeyConformError) ? [key] : []
|
@@ -16,31 +16,27 @@ module Definition
|
|
16
16
|
end
|
17
17
|
alias conformed? passed?
|
18
18
|
|
19
|
-
def descriptive_errors
|
20
|
-
errors.map do |e|
|
21
|
-
{
|
22
|
-
description: e.message,
|
23
|
-
pointer: e.json_pointer
|
24
|
-
}
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
19
|
def error_message
|
29
20
|
error_tree.map(&:message).join(", ")
|
30
21
|
end
|
31
22
|
|
32
|
-
def
|
23
|
+
def leaf_errors
|
33
24
|
conform_errors.map(&:leaf_errors).flatten
|
34
25
|
end
|
35
26
|
|
36
|
-
def
|
27
|
+
def errors
|
28
|
+
leaf_errors.map do |error|
|
29
|
+
find_next_parent_key_error(error) || error
|
30
|
+
end.compact.uniq
|
31
|
+
end
|
32
|
+
|
33
|
+
def error_hash
|
37
34
|
{}.tap do |error_hash|
|
38
35
|
errors.each do |error|
|
39
36
|
next if error.error_path.empty?
|
40
37
|
|
41
|
-
message = error.translated_error(i18n_namespace)
|
42
38
|
path_hash = error.error_path.reverse
|
43
|
-
.inject([
|
39
|
+
.inject([error]) { |errors, key| { key => errors } }
|
44
40
|
|
45
41
|
error_hash.deep_merge!(path_hash) do |_key, old, new|
|
46
42
|
old + new if old.is_a?(Array) && new.is_a?(Array) # concat arrays during deep_merge
|
@@ -55,6 +51,17 @@ module Definition
|
|
55
51
|
|
56
52
|
private
|
57
53
|
|
54
|
+
def find_next_parent_key_error(error)
|
55
|
+
current = error
|
56
|
+
loop do
|
57
|
+
return current if current.is_a?(KeyConformError)
|
58
|
+
|
59
|
+
current = current.parent
|
60
|
+
break unless current
|
61
|
+
end
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
|
58
65
|
attr_accessor :conform_errors
|
59
66
|
end
|
60
67
|
end
|
data/lib/definition/dsl.rb
CHANGED
@@ -9,7 +9,7 @@ module Definition
|
|
9
9
|
# required :name, Types::Type(String)
|
10
10
|
# optional :age, Types::Type(Integer)
|
11
11
|
# end
|
12
|
-
def Keys(&block) # rubocop:disable
|
12
|
+
def Keys(&block) # rubocop:disable Style/MethodName
|
13
13
|
Types::Keys.new(:hash).tap do |instance|
|
14
14
|
instance.instance_exec(&block)
|
15
15
|
end
|
@@ -17,25 +17,25 @@ module Definition
|
|
17
17
|
|
18
18
|
# Example:
|
19
19
|
# And(Types::Type(Float), Types::GreaterThen(10.0))
|
20
|
-
def And(*definitions) # rubocop:disable
|
20
|
+
def And(*definitions) # rubocop:disable Style/MethodName
|
21
21
|
Types::And.new(:and, *definitions)
|
22
22
|
end
|
23
23
|
|
24
24
|
# Example:
|
25
25
|
# Or(Types::Type(Float), Types::Type(Integer))
|
26
|
-
def Or(*definitions) # rubocop:disable
|
26
|
+
def Or(*definitions) # rubocop:disable Style/MethodName
|
27
27
|
Types::Or.new(:or, *definitions)
|
28
28
|
end
|
29
29
|
|
30
30
|
# Example:
|
31
31
|
# Type(Integer)
|
32
|
-
def Type(klass) # rubocop:disable
|
32
|
+
def Type(klass) # rubocop:disable Style/MethodName
|
33
33
|
Types::Type.new(:type, klass)
|
34
34
|
end
|
35
35
|
|
36
36
|
# Example:
|
37
37
|
# CoercibleType(Integer)
|
38
|
-
def CoercibleType(klass) # rubocop:disable
|
38
|
+
def CoercibleType(klass) # rubocop:disable Style/MethodName
|
39
39
|
unless Kernel.respond_to?(klass.name)
|
40
40
|
raise ArgumentError.new("#{klass} can't be used as CoercibleType because its not "\
|
41
41
|
"a primitive that has a coercion function defined")
|
@@ -53,13 +53,13 @@ module Definition
|
|
53
53
|
# Lambda(:even) do |value|
|
54
54
|
# value.even?
|
55
55
|
# end
|
56
|
-
def Lambda(name, context: {}, &block) # rubocop:disable
|
56
|
+
def Lambda(name, context: {}, &block) # rubocop:disable Style/MethodName
|
57
57
|
Types::Lambda.new(name, context: context, &block)
|
58
58
|
end
|
59
59
|
|
60
60
|
# Example:
|
61
61
|
# Enum("allowed_value1", "allowed_value2")
|
62
|
-
def Enum(*allowed_values) # rubocop:disable
|
62
|
+
def Enum(*allowed_values) # rubocop:disable Style/MethodName
|
63
63
|
Lambda("enum", context: { allowed_values: allowed_values }) do |value|
|
64
64
|
conform_with(value) if allowed_values.include?(value)
|
65
65
|
end
|
@@ -67,8 +67,14 @@ module Definition
|
|
67
67
|
|
68
68
|
# Example:
|
69
69
|
# Each(Definition::Type(Integer))
|
70
|
-
def Each(definition) # rubocop:disable
|
70
|
+
def Each(definition) # rubocop:disable Style/MethodName
|
71
71
|
Types::Each.new(:each, definition: definition)
|
72
72
|
end
|
73
|
+
|
74
|
+
# Example:
|
75
|
+
# Boolean
|
76
|
+
def Boolean # rubocop:disable Style/MethodName
|
77
|
+
Types::Or.new(:boolean, Type(TrueClass), Type(FalseClass))
|
78
|
+
end
|
73
79
|
end
|
74
80
|
end
|
@@ -5,7 +5,7 @@ module Definition
|
|
5
5
|
module Comparators
|
6
6
|
# Example:
|
7
7
|
# MaxSize(5)
|
8
|
-
def MaxSize(max_size) # rubocop:disable
|
8
|
+
def MaxSize(max_size) # rubocop:disable Style/MethodName
|
9
9
|
Types::Lambda.new(:max_size, context: { max_size: max_size }) do |value|
|
10
10
|
case value
|
11
11
|
when String, Enumerable
|
@@ -18,7 +18,7 @@ module Definition
|
|
18
18
|
|
19
19
|
# Example:
|
20
20
|
# MinSize(5)
|
21
|
-
def MinSize(min_size) # rubocop:disable
|
21
|
+
def MinSize(min_size) # rubocop:disable Style/MethodName
|
22
22
|
Types::Lambda.new(:min_size, context: { min_size: min_size }) do |value|
|
23
23
|
case value
|
24
24
|
when String, Enumerable
|
@@ -31,13 +31,13 @@ module Definition
|
|
31
31
|
|
32
32
|
# Example:
|
33
33
|
# NonEmptyString
|
34
|
-
def NonEmptyString # rubocop:disable
|
34
|
+
def NonEmptyString # rubocop:disable Style/MethodName
|
35
35
|
Types::And.new(:non_empty_string, Type(String), MinSize(1))
|
36
36
|
end
|
37
37
|
|
38
38
|
# Example:
|
39
39
|
# GreaterThen(5)
|
40
|
-
def GreaterThen(min_value) # rubocop:disable
|
40
|
+
def GreaterThen(min_value) # rubocop:disable Style/MethodName
|
41
41
|
Types::Lambda.new("greater_then", context: { min_value: min_value }) do |value|
|
42
42
|
conform_with(value) if value.is_a?(Numeric) && value > min_value
|
43
43
|
end
|
@@ -45,7 +45,7 @@ module Definition
|
|
45
45
|
|
46
46
|
# Example:
|
47
47
|
# GreaterThenEqual(5)
|
48
|
-
def GreaterThenEqual(min_value) # rubocop:disable
|
48
|
+
def GreaterThenEqual(min_value) # rubocop:disable Style/MethodName
|
49
49
|
Types::Lambda.new("greater_then_equal", context: { min_value: min_value }) do |value|
|
50
50
|
conform_with(value) if value.is_a?(Numeric) && value >= min_value
|
51
51
|
end
|
@@ -53,7 +53,7 @@ module Definition
|
|
53
53
|
|
54
54
|
# Example:
|
55
55
|
# LessThen(5)
|
56
|
-
def LessThen(max_value) # rubocop:disable
|
56
|
+
def LessThen(max_value) # rubocop:disable Style/MethodName
|
57
57
|
Types::Lambda.new("less_then", context: { max_value: max_value }) do |value|
|
58
58
|
conform_with(value) if value.is_a?(Numeric) && value < max_value
|
59
59
|
end
|
@@ -61,7 +61,7 @@ module Definition
|
|
61
61
|
|
62
62
|
# Example:
|
63
63
|
# LessThenEqual(5)
|
64
|
-
def LessThenEqual(max_value) # rubocop:disable
|
64
|
+
def LessThenEqual(max_value) # rubocop:disable Style/MethodName
|
65
65
|
Types::Lambda.new("less_then_equal", context: { max_value: max_value }) do |value|
|
66
66
|
conform_with(value) if value.is_a?(Numeric) && value <= max_value
|
67
67
|
end
|
@@ -69,7 +69,7 @@ module Definition
|
|
69
69
|
|
70
70
|
# Example:
|
71
71
|
# Equal("value")
|
72
|
-
def Equal(expected_value) # rubocop:disable
|
72
|
+
def Equal(expected_value) # rubocop:disable Style/MethodName
|
73
73
|
Types::Lambda.new(:equal, context: { expected_value: expected_value }) do |value|
|
74
74
|
conform_with(value) if value == expected_value
|
75
75
|
end
|
@@ -77,7 +77,7 @@ module Definition
|
|
77
77
|
|
78
78
|
# Example:
|
79
79
|
# Empty
|
80
|
-
def Empty # rubocop:disable
|
80
|
+
def Empty # rubocop:disable Style/MethodName
|
81
81
|
Types::Lambda.new(:empty) do |value|
|
82
82
|
case value
|
83
83
|
when String, Array, Hash
|
@@ -90,7 +90,7 @@ module Definition
|
|
90
90
|
|
91
91
|
# Example:
|
92
92
|
# NonEmpty
|
93
|
-
def NonEmpty # rubocop:disable
|
93
|
+
def NonEmpty # rubocop:disable Style/MethodName
|
94
94
|
Types::Lambda.new(:non_empty) do |value|
|
95
95
|
case value
|
96
96
|
when String, Array, Hash
|
@@ -103,7 +103,7 @@ module Definition
|
|
103
103
|
|
104
104
|
# Example:
|
105
105
|
# Regex
|
106
|
-
def Regex(regex, name: :regex) # rubocop:disable
|
106
|
+
def Regex(regex, name: :regex) # rubocop:disable Style/MethodName
|
107
107
|
Types::Lambda.new(name, context: { regex: regex.inspect }) do |value|
|
108
108
|
case value
|
109
109
|
when String
|
data/lib/definition/dsl/nil.rb
CHANGED
data/lib/definition/types/and.rb
CHANGED
@@ -35,7 +35,7 @@ module Definition
|
|
35
35
|
ConformResult.new(results.last.value)
|
36
36
|
else
|
37
37
|
ConformResult.new(value, errors: [
|
38
|
-
ConformError.new(definition, "Not all definitions are valid for #{definition.name}",
|
38
|
+
ConformError.new(definition, "Not all definitions are valid for '#{definition.name}'",
|
39
39
|
sub_errors: results.map(&:error_tree).flatten)
|
40
40
|
])
|
41
41
|
end
|
@@ -30,7 +30,7 @@ module Definition
|
|
30
30
|
ConformResult.new(results.map(&:value))
|
31
31
|
else
|
32
32
|
ConformResult.new(value, errors: [ConformError.new(definition,
|
33
|
-
"Not all items conform with #{definition.name}",
|
33
|
+
"Not all items conform with '#{definition.name}'",
|
34
34
|
sub_errors: errors(results))])
|
35
35
|
end
|
36
36
|
end
|
@@ -14,18 +14,24 @@ module Definition
|
|
14
14
|
required_definitions[key] = definition
|
15
15
|
end
|
16
16
|
|
17
|
-
def optional(key, definition)
|
17
|
+
def optional(key, definition, **opts)
|
18
18
|
optional_definitions[key] = definition
|
19
|
+
default(key, opts[:default]) if opts.key?(:default)
|
20
|
+
end
|
21
|
+
|
22
|
+
def default(key, value)
|
23
|
+
defaults[key] = value
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
22
27
|
include Dsl
|
23
|
-
attr_accessor :required_definitions, :optional_definitions
|
28
|
+
attr_accessor :required_definitions, :optional_definitions, :defaults
|
24
29
|
|
25
|
-
def initialize(name, req: {}, opt: {})
|
30
|
+
def initialize(name, req: {}, opt: {}, defaults: {})
|
26
31
|
super(name)
|
27
32
|
self.required_definitions = req
|
28
33
|
self.optional_definitions = opt
|
34
|
+
self.defaults = defaults
|
29
35
|
end
|
30
36
|
|
31
37
|
def conform(value)
|
@@ -73,7 +79,7 @@ module Definition
|
|
73
79
|
required_keys_values = conform_definitions(required_definitions)
|
74
80
|
optional_keys_values = conform_definitions(optional_definitions)
|
75
81
|
|
76
|
-
required_keys_values.merge!(optional_keys_values)
|
82
|
+
definition.defaults.merge(required_keys_values.merge!(optional_keys_values))
|
77
83
|
end
|
78
84
|
|
79
85
|
def all_keys
|
data/lib/definition/types/or.rb
CHANGED
@@ -34,7 +34,7 @@ module Definition
|
|
34
34
|
result
|
35
35
|
else
|
36
36
|
error = ConformError.new(definition,
|
37
|
-
"None of the definitions are valid for #{definition.name}",
|
37
|
+
"None of the definitions are valid for '#{definition.name}'",
|
38
38
|
sub_errors: result)
|
39
39
|
ConformResult.new(value, errors: [error])
|
40
40
|
end
|
@@ -1,13 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Definition
|
4
|
-
class InvalidValueObjectError < StandardError
|
4
|
+
class InvalidValueObjectError < StandardError
|
5
|
+
attr_accessor :conform_result
|
6
|
+
|
7
|
+
def initialize(conform_result)
|
8
|
+
super(conform_result.error_message)
|
9
|
+
self.conform_result = conform_result
|
10
|
+
end
|
11
|
+
end
|
5
12
|
class NotConfiguredError < StandardError; end
|
6
13
|
|
7
14
|
class ValueObject < SimpleDelegator
|
8
15
|
def initialize(args = nil, **kwargs)
|
9
16
|
result = self.class.conform(args || kwargs)
|
10
|
-
raise InvalidValueObjectError.new(result
|
17
|
+
raise InvalidValueObjectError.new(result) unless result.passed?
|
11
18
|
|
12
19
|
super(result.value.freeze)
|
13
20
|
end
|
data/lib/definition/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: definition
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominik Goltermann
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -182,30 +182,30 @@ dependencies:
|
|
182
182
|
name: rubocop
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
|
-
- -
|
185
|
+
- - '='
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version:
|
187
|
+
version: 0.66.0
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
|
-
- -
|
192
|
+
- - '='
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version:
|
194
|
+
version: 0.66.0
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: rubocop-rspec
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
198
198
|
requirements:
|
199
|
-
- -
|
199
|
+
- - '='
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version:
|
201
|
+
version: 1.32.0
|
202
202
|
type: :development
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
|
-
- -
|
206
|
+
- - '='
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version:
|
208
|
+
version: 1.32.0
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: rubocop_runner
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|