ree_lib 1.0.85 → 1.0.87
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 +4 -4
- data/.ruby-version +1 -1
- data/Gemfile.lock +31 -26
- data/lib/ree_lib/packages/ree_actions/package/ree_actions/dsl.rb +11 -3
- data/lib/ree_lib/packages/ree_actions/package/ree_actions/errors.rb +3 -0
- data/lib/ree_lib/packages/ree_actions/package/ree_actions.rb +1 -0
- data/lib/ree_lib/packages/ree_actions/spec/ree_actions/dsl_spec.rb +5 -1
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_array.rb +12 -8
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_jsonb.rb +12 -8
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/wrappers/pg_array_spec.rb +3 -3
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/wrappers/pg_jsonb_spec.rb +8 -6
- data/lib/ree_lib/packages/ree_enum/package/ree_enum/base_enum_mapper.rb +5 -10
- data/lib/ree_lib/packages/ree_enum/package/ree_enum/integer_value_enum_mapper.rb +5 -5
- data/lib/ree_lib/packages/ree_enum/package/ree_enum/string_value_enum_mapper.rb +5 -5
- data/lib/ree_lib/packages/ree_enum/spec/ree_enum/dsl_spec.rb +10 -2
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/errors/coercion_error.rb +1 -1
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/errors/error_with_location.rb +25 -0
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/errors/type_error.rb +1 -1
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/field.rb +12 -4
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb +12 -6
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper_factory.rb +17 -4
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/abstract_type.rb +6 -0
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/any.rb +8 -8
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/bool.rb +12 -12
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/date.rb +13 -13
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/date_time.rb +13 -13
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/float.rb +13 -13
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/integer.rb +16 -16
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/rational.rb +13 -13
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/string.rb +12 -12
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/time.rb +13 -13
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/wrappers/abstract_wrapper.rb +7 -0
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/wrappers/array.rb +73 -21
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper.rb +2 -0
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/mapper_factory_spec.rb +10 -6
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/mapper_spec.rb +7 -0
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/bool_spec.rb +10 -8
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/date_spec.rb +12 -10
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/date_time_spec.rb +20 -16
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/float_spec.rb +17 -13
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/integer_spec.rb +14 -14
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/rational_spec.rb +16 -12
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/string_spec.rb +24 -12
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/time_spec.rb +21 -16
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/type_options_spec.rb +4 -4
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/wrappers/array_spec.rb +6 -6
- data/lib/ree_lib/packages/ree_roda/package/ree_roda/app.rb +3 -2
- data/lib/ree_lib/packages/ree_roda/spec/ree_roda/app_spec.rb +28 -0
- data/lib/ree_lib/spec.init.rb +3 -1
- data/lib/ree_lib/version.rb +1 -1
- metadata +19 -3
@@ -43,7 +43,13 @@ class ReeMapper::MapperFactory
|
|
43
43
|
raise ReeMapper::UnsupportedTypeError, "type :#{name} should implement `\#{@mapper.strategy_methods.join(', ')}`"
|
44
44
|
end
|
45
45
|
|
46
|
-
field = ReeMapper::Field.new(
|
46
|
+
field = ReeMapper::Field.new(
|
47
|
+
type,
|
48
|
+
field_name,
|
49
|
+
optional: optional,
|
50
|
+
**opts,
|
51
|
+
location: caller_locations&.first&.to_s
|
52
|
+
)
|
47
53
|
|
48
54
|
return field unless field_name
|
49
55
|
|
@@ -90,7 +96,8 @@ class ReeMapper::MapperFactory
|
|
90
96
|
|
91
97
|
if blk
|
92
98
|
subject = ReeMapper::Field.new(
|
93
|
-
hash_from_blk(dto: dto, &blk)
|
99
|
+
hash_from_blk(dto: dto, &blk),
|
100
|
+
location: caller_locations&.first&.to_s,
|
94
101
|
)
|
95
102
|
end
|
96
103
|
|
@@ -105,7 +112,13 @@ class ReeMapper::MapperFactory
|
|
105
112
|
type = ReeMapper::Mapper.build(@mapper.strategies, wrapper.new(subject))
|
106
113
|
type.name = :#{name}
|
107
114
|
|
108
|
-
field = ReeMapper::Field.new(
|
115
|
+
field = ReeMapper::Field.new(
|
116
|
+
type,
|
117
|
+
field_name,
|
118
|
+
optional: optional,
|
119
|
+
**opts,
|
120
|
+
location: caller_locations&.first&.to_s,
|
121
|
+
)
|
109
122
|
|
110
123
|
return field unless field_name
|
111
124
|
|
@@ -141,7 +154,7 @@ class ReeMapper::MapperFactory
|
|
141
154
|
|
142
155
|
type = hash_from_blk(dto: dto, &blk)
|
143
156
|
|
144
|
-
field = ReeMapper::Field.new(type, field_name, **opts)
|
157
|
+
field = ReeMapper::Field.new(type, field_name, **opts, location: caller_locations&.first&.to_s)
|
145
158
|
|
146
159
|
@mapper.add_field(field)
|
147
160
|
end
|
@@ -1,23 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class ReeMapper::Any < ReeMapper::AbstractType
|
4
|
-
contract(Any, Kwargs[name: String,
|
5
|
-
def serialize(value, name:,
|
4
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Any)
|
5
|
+
def serialize(value, name:, location: nil)
|
6
6
|
value
|
7
7
|
end
|
8
8
|
|
9
|
-
contract(Any
|
10
|
-
def cast(value, name:,
|
9
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Any)
|
10
|
+
def cast(value, name:, location: nil)
|
11
11
|
value
|
12
12
|
end
|
13
13
|
|
14
|
-
contract(Any, Kwargs[name: String,
|
15
|
-
def db_dump(value, name:,
|
14
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Any)
|
15
|
+
def db_dump(value, name:, location: nil)
|
16
16
|
value
|
17
17
|
end
|
18
18
|
|
19
|
-
contract(Any, Kwargs[name: String,
|
20
|
-
def db_load(value, name:,
|
19
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Any)
|
20
|
+
def db_load(value, name:, location: nil)
|
21
21
|
value
|
22
22
|
end
|
23
23
|
end
|
@@ -4,33 +4,33 @@ class ReeMapper::Bool < ReeMapper::AbstractType
|
|
4
4
|
TRUE_CAST_VALUES = ['1', 'true', 'on', 1, true].freeze
|
5
5
|
FALSE_CAST_VALUES = ['0', 'false', 'off', 0, false].freeze
|
6
6
|
|
7
|
-
contract(Any, Kwargs[name: String,
|
8
|
-
def serialize(value, name:,
|
7
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Bool).throws(ReeMapper::TypeError)
|
8
|
+
def serialize(value, name:, location: nil)
|
9
9
|
if value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
10
10
|
value
|
11
11
|
else
|
12
|
-
raise ReeMapper::TypeError
|
12
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a boolean, got `#{truncate(value.inspect)}`", location)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
contract(Any, Kwargs[name: String,
|
17
|
-
def cast(value, name:,
|
16
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Bool).throws(ReeMapper::CoercionError)
|
17
|
+
def cast(value, name:, location: nil)
|
18
18
|
if TRUE_CAST_VALUES.include?(value)
|
19
19
|
true
|
20
20
|
elsif FALSE_CAST_VALUES.include?(value)
|
21
21
|
false
|
22
22
|
else
|
23
|
-
raise ReeMapper::CoercionError
|
23
|
+
raise ReeMapper::CoercionError.new("`#{name}` is invalid boolean, got `#{truncate(value.inspect)}`", location)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
contract(Any, Kwargs[name: String,
|
28
|
-
def db_dump(value, name:,
|
29
|
-
serialize(value, name: name,
|
27
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Bool).throws(ReeMapper::TypeError)
|
28
|
+
def db_dump(value, name:, location: nil)
|
29
|
+
serialize(value, name: name, location: location)
|
30
30
|
end
|
31
31
|
|
32
|
-
contract(Any, Kwargs[name: String,
|
33
|
-
def db_load(value, name:,
|
34
|
-
cast(value, name: name,
|
32
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Bool).throws(ReeMapper::CoercionError)
|
33
|
+
def db_load(value, name:, location: nil)
|
34
|
+
cast(value, name: name, location: location)
|
35
35
|
end
|
36
36
|
end
|
@@ -3,17 +3,17 @@
|
|
3
3
|
require 'date'
|
4
4
|
|
5
5
|
class ReeMapper::Date < ReeMapper::AbstractType
|
6
|
-
contract(Any, Kwargs[name: String,
|
7
|
-
def serialize(value, name:,
|
6
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Date).throws(ReeMapper::TypeError)
|
7
|
+
def serialize(value, name:, location: nil)
|
8
8
|
if value.class == Date
|
9
9
|
value
|
10
10
|
else
|
11
|
-
raise ReeMapper::TypeError
|
11
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a date, got `#{truncate(value.inspect)}`", location)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
contract(Any, Kwargs[name: String,
|
16
|
-
def cast(value, name:,
|
15
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Date).throws(ReeMapper::TypeError, ReeMapper::CoercionError)
|
16
|
+
def cast(value, name:, location: nil)
|
17
17
|
if value.class == Date
|
18
18
|
value
|
19
19
|
elsif value.class == DateTime || value.class == Time
|
@@ -22,20 +22,20 @@ class ReeMapper::Date < ReeMapper::AbstractType
|
|
22
22
|
begin
|
23
23
|
Date.parse(value)
|
24
24
|
rescue ArgumentError => e
|
25
|
-
raise ReeMapper::CoercionError
|
25
|
+
raise ReeMapper::CoercionError.new("`#{name}` is invalid date, got `#{truncate(value.inspect)}`", location)
|
26
26
|
end
|
27
27
|
else
|
28
|
-
raise ReeMapper::TypeError
|
28
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a date, got `#{truncate(value.inspect)}`", location)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
contract(Any, Kwargs[name: String,
|
33
|
-
def db_dump(value, name:,
|
34
|
-
serialize(value, name: name,
|
32
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Date).throws(ReeMapper::TypeError)
|
33
|
+
def db_dump(value, name:, location: nil)
|
34
|
+
serialize(value, name: name, location: location)
|
35
35
|
end
|
36
36
|
|
37
|
-
contract(Any, Kwargs[name: String,
|
38
|
-
def db_load(value, name:,
|
39
|
-
cast(value, name: name,
|
37
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Date).throws(ReeMapper::TypeError, ReeMapper::CoercionError)
|
38
|
+
def db_load(value, name:, location: nil)
|
39
|
+
cast(value, name: name, location: location)
|
40
40
|
end
|
41
41
|
end
|
@@ -3,17 +3,17 @@
|
|
3
3
|
require 'date'
|
4
4
|
|
5
5
|
class ReeMapper::DateTime < ReeMapper::AbstractType
|
6
|
-
contract(Any, Kwargs[name: String,
|
7
|
-
def serialize(value, name:,
|
6
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => DateTime).throws(ReeMapper::TypeError)
|
7
|
+
def serialize(value, name:, location: nil)
|
8
8
|
if value.class == DateTime
|
9
9
|
value
|
10
10
|
else
|
11
|
-
raise ReeMapper::TypeError
|
11
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a datetime, got `#{truncate(value.inspect)}`", location)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
contract(Any, Kwargs[name: String,
|
16
|
-
def cast(value, name:,
|
15
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => DateTime).throws(ReeMapper::CoercionError, ReeMapper::TypeError)
|
16
|
+
def cast(value, name:, location: nil)
|
17
17
|
if value.class == DateTime
|
18
18
|
value
|
19
19
|
elsif value.class == Time
|
@@ -22,20 +22,20 @@ class ReeMapper::DateTime < ReeMapper::AbstractType
|
|
22
22
|
begin
|
23
23
|
ReeDatetime::InDefaultTimeZone.new.call(DateTime.parse(value))
|
24
24
|
rescue ArgumentError
|
25
|
-
raise ReeMapper::CoercionError
|
25
|
+
raise ReeMapper::CoercionError.new("`#{name}` is invalid datetime, got `#{truncate(value.inspect)}`", location)
|
26
26
|
end
|
27
27
|
else
|
28
|
-
raise ReeMapper::TypeError
|
28
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a datetime, got `#{truncate(value.inspect)}`", location)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
contract(Any, Kwargs[name: String,
|
33
|
-
def db_dump(value, name:,
|
34
|
-
serialize(value, name: name,
|
32
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => DateTime).throws(ReeMapper::TypeError)
|
33
|
+
def db_dump(value, name:, location: nil)
|
34
|
+
serialize(value, name: name, location: location)
|
35
35
|
end
|
36
36
|
|
37
|
-
contract(Any, Kwargs[name: String,
|
38
|
-
def db_load(value, name:,
|
39
|
-
cast(value, name: name,
|
37
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => DateTime).throws(ReeMapper::CoercionError, ReeMapper::TypeError)
|
38
|
+
def db_load(value, name:, location: nil)
|
39
|
+
cast(value, name: name, location: location)
|
40
40
|
end
|
41
41
|
end
|
@@ -1,39 +1,39 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class ReeMapper::Float < ReeMapper::AbstractType
|
4
|
-
contract(Any, Kwargs[name: String,
|
5
|
-
def serialize(value, name:,
|
4
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Float).throws(ReeMapper::TypeError)
|
5
|
+
def serialize(value, name:, location: nil)
|
6
6
|
if value.is_a?(Float)
|
7
7
|
value
|
8
8
|
else
|
9
|
-
raise ReeMapper::TypeError
|
9
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a float, got `#{truncate(value.inspect)}`", location)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
contract(Any, Kwargs[name: String,
|
14
|
-
def cast(value, name:,
|
13
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Float).throws(ReeMapper::CoercionError, ReeMapper::TypeError)
|
14
|
+
def cast(value, name:, location: nil)
|
15
15
|
if value.is_a?(Numeric)
|
16
16
|
value.to_f
|
17
17
|
elsif value.is_a?(String)
|
18
18
|
begin
|
19
19
|
Float(value)
|
20
20
|
rescue ArgumentError => e
|
21
|
-
raise ReeMapper::CoercionError
|
21
|
+
raise ReeMapper::CoercionError.new("`#{name}` is invalid float, got `#{truncate(value.inspect)}`", location)
|
22
22
|
end
|
23
23
|
elsif defined?(BigDecimal) && value.is_a?(BigDecimal)
|
24
24
|
value.to_f
|
25
25
|
else
|
26
|
-
raise ReeMapper::TypeError
|
26
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a float, got `#{truncate(value.inspect)}`", location)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
contract(Any, Kwargs[name: String,
|
31
|
-
def db_dump(value, name:,
|
32
|
-
serialize(value, name: name,
|
30
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Float).throws(ReeMapper::CoercionError)
|
31
|
+
def db_dump(value, name:, location: nil)
|
32
|
+
serialize(value, name: name, location: location)
|
33
33
|
end
|
34
34
|
|
35
|
-
contract(Any, Kwargs[name: String,
|
36
|
-
def db_load(value, name:,
|
37
|
-
cast(value, name: name,
|
35
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Float).throws(ReeMapper::CoercionError, ReeMapper::TypeError)
|
36
|
+
def db_load(value, name:, location: nil)
|
37
|
+
cast(value, name: name, location: location)
|
38
38
|
end
|
39
39
|
end
|
@@ -1,37 +1,37 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class ReeMapper::Integer < ReeMapper::AbstractType
|
4
|
-
contract(Any, Kwargs[name: String,
|
5
|
-
def serialize(value, name:,
|
4
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Integer).throws(ReeMapper::TypeError)
|
5
|
+
def serialize(value, name:, location: nil)
|
6
6
|
if value.is_a? Integer
|
7
7
|
value
|
8
8
|
else
|
9
|
-
raise ReeMapper::TypeError
|
9
|
+
raise ReeMapper::TypeError.new("`#{name}` should be an integer, got `#{truncate(value.inspect)}`", location)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
contract(Any
|
14
|
-
def cast(value, name:,
|
13
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Integer).throws(ReeMapper::CoercionError, ReeMapper::TypeError)
|
14
|
+
def cast(value, name:, location: nil)
|
15
15
|
if value.is_a?(Integer)
|
16
16
|
value
|
17
17
|
elsif value.is_a?(String)
|
18
|
-
|
19
|
-
if
|
20
|
-
raise ReeMapper::CoercionError
|
18
|
+
coerced_value = Integer(value, exception: false)
|
19
|
+
if coerced_value.nil?
|
20
|
+
raise ReeMapper::CoercionError.new("`#{name}` is invalid integer, got `#{truncate(value.inspect)}`", location)
|
21
21
|
end
|
22
|
-
|
22
|
+
coerced_value
|
23
23
|
else
|
24
|
-
raise ReeMapper::TypeError
|
24
|
+
raise ReeMapper::TypeError.new("`#{name}` should be an integer, got `#{truncate(value.inspect)}`", location)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
contract(Any, Kwargs[name: String,
|
29
|
-
def db_dump(value, name:,
|
30
|
-
serialize(value, name: name,
|
28
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Integer).throws(ReeMapper::TypeError)
|
29
|
+
def db_dump(value, name:, location: nil)
|
30
|
+
serialize(value, name: name, location: location)
|
31
31
|
end
|
32
32
|
|
33
|
-
contract(Any, Kwargs[name: String,
|
34
|
-
def db_load(value, name:,
|
35
|
-
cast(value, name: name,
|
33
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Integer).throws(ReeMapper::CoercionError, ReeMapper::TypeError)
|
34
|
+
def db_load(value, name:, location: nil)
|
35
|
+
cast(value, name: name, location: location)
|
36
36
|
end
|
37
37
|
end
|
@@ -1,39 +1,39 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class ReeMapper::Rational < ReeMapper::AbstractType
|
4
|
-
contract(Any, Kwargs[name: String,
|
5
|
-
def serialize(value, name:,
|
4
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Rational).throws(ReeMapper::TypeError)
|
5
|
+
def serialize(value, name:, location: nil)
|
6
6
|
if value.is_a?(Rational)
|
7
7
|
value
|
8
8
|
else
|
9
|
-
raise ReeMapper::TypeError
|
9
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a rational, got `#{truncate(value.inspect)}`", location)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
contract(Any, Kwargs[name: String,
|
14
|
-
def cast(value, name:,
|
13
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Rational).throws(ReeMapper::CoercionError, ReeMapper::TypeError)
|
14
|
+
def cast(value, name:, location: nil)
|
15
15
|
if value.is_a?(Rational)
|
16
16
|
value
|
17
17
|
elsif value.is_a?(String)
|
18
18
|
begin
|
19
19
|
Rational(value)
|
20
20
|
rescue ArgumentError, ZeroDivisionError => e
|
21
|
-
raise ReeMapper::CoercionError
|
21
|
+
raise ReeMapper::CoercionError.new("`#{name}` is invalid rational, got `#{truncate(value.inspect)}`", location)
|
22
22
|
end
|
23
23
|
elsif value.is_a?(Numeric)
|
24
24
|
Rational(value)
|
25
25
|
else
|
26
|
-
raise ReeMapper::TypeError
|
26
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a rational, got `#{truncate(value.inspect)}`", location)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
contract(Any, Kwargs[name: String,
|
31
|
-
def db_dump(value, name:,
|
32
|
-
serialize(value, name: name,
|
30
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => String)
|
31
|
+
def db_dump(value, name:, location: nil)
|
32
|
+
serialize(value, name: name, location: location).to_s
|
33
33
|
end
|
34
34
|
|
35
|
-
contract(Any, Kwargs[name: String,
|
36
|
-
def db_load(value, name:,
|
37
|
-
cast(value, name: name,
|
35
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Rational)
|
36
|
+
def db_load(value, name:, location: nil)
|
37
|
+
cast(value, name: name, location: location)
|
38
38
|
end
|
39
39
|
end
|
@@ -1,27 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class ReeMapper::String < ReeMapper::AbstractType
|
4
|
-
contract(Any, Kwargs[name: String,
|
5
|
-
def serialize(value, name:,
|
4
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => String).throws(ReeMapper::TypeError)
|
5
|
+
def serialize(value, name:, location: nil)
|
6
6
|
if value.is_a? String
|
7
7
|
value
|
8
8
|
else
|
9
|
-
raise ReeMapper::TypeError
|
9
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a string, got `#{truncate(value.inspect)}`", location)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
contract(Any, Kwargs[name: String,
|
14
|
-
def cast(value, name:,
|
15
|
-
serialize(value, name: name,
|
13
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => String).throws(ReeMapper::TypeError)
|
14
|
+
def cast(value, name:, location: nil)
|
15
|
+
serialize(value, name: name, location: location)
|
16
16
|
end
|
17
17
|
|
18
|
-
contract(Any, Kwargs[name: String,
|
19
|
-
def db_dump(value, name:,
|
20
|
-
serialize(value, name: name,
|
18
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => String).throws(ReeMapper::TypeError)
|
19
|
+
def db_dump(value, name:, location: nil)
|
20
|
+
serialize(value, name: name, location: location)
|
21
21
|
end
|
22
22
|
|
23
|
-
contract(Any, Kwargs[name: String,
|
24
|
-
def db_load(value, name:,
|
25
|
-
serialize(value, name: name,
|
23
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => String).throws(ReeMapper::TypeError)
|
24
|
+
def db_load(value, name:, location: nil)
|
25
|
+
serialize(value, name: name, location: location)
|
26
26
|
end
|
27
27
|
end
|
@@ -3,17 +3,17 @@
|
|
3
3
|
require 'time'
|
4
4
|
|
5
5
|
class ReeMapper::Time < ReeMapper::AbstractType
|
6
|
-
contract(Any, Kwargs[name: String,
|
7
|
-
def serialize(value, name:,
|
6
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Time).throws(ReeMapper::TypeError)
|
7
|
+
def serialize(value, name:, location: nil)
|
8
8
|
if value.class == Time
|
9
9
|
value
|
10
10
|
else
|
11
|
-
raise ReeMapper::TypeError
|
11
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a time, got `#{truncate(value.inspect)}`", location)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
contract(Any, Kwargs[name: String,
|
16
|
-
def cast(value, name:,
|
15
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Time).throws(ReeMapper::CoercionError, ReeMapper::TypeError)
|
16
|
+
def cast(value, name:, location: nil)
|
17
17
|
if value.class == Time
|
18
18
|
value
|
19
19
|
elsif value.class == DateTime
|
@@ -22,20 +22,20 @@ class ReeMapper::Time < ReeMapper::AbstractType
|
|
22
22
|
begin
|
23
23
|
Time.parse(value)
|
24
24
|
rescue ArgumentError
|
25
|
-
raise ReeMapper::CoercionError
|
25
|
+
raise ReeMapper::CoercionError.new("`#{name}` is invalid time, got `#{truncate(value.inspect)}`", location)
|
26
26
|
end
|
27
27
|
else
|
28
|
-
raise ReeMapper::TypeError
|
28
|
+
raise ReeMapper::TypeError.new("`#{name}` should be a time, got `#{truncate(value.inspect)}`", location)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
contract(Any, Kwargs[name: String,
|
33
|
-
def db_dump(value, name:,
|
34
|
-
serialize(value, name: name,
|
32
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Time).throws(ReeMapper::TypeError)
|
33
|
+
def db_dump(value, name:, location: nil)
|
34
|
+
serialize(value, name: name, location: location)
|
35
35
|
end
|
36
36
|
|
37
|
-
contract(Any, Kwargs[name: String,
|
38
|
-
def db_load(value, name:,
|
39
|
-
cast(value, name: name,
|
37
|
+
contract(Any, Kwargs[name: String, location: Nilor[String]] => Time).throws(ReeMapper::CoercionError, ReeMapper::TypeError)
|
38
|
+
def db_load(value, name:, location: nil)
|
39
|
+
cast(value, name: name, location: location)
|
40
40
|
end
|
41
41
|
end
|
@@ -1,67 +1,119 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class ReeMapper::Array < ReeMapper::AbstractWrapper
|
4
|
-
contract(
|
5
|
-
|
6
|
-
|
4
|
+
contract(
|
5
|
+
Any,
|
6
|
+
Kwargs[
|
7
|
+
name: String,
|
8
|
+
role: Nilor[Symbol, ArrayOf[Symbol]],
|
9
|
+
fields_filters: ArrayOf[ReeMapper::FieldsFilter],
|
10
|
+
location: Nilor[String],
|
11
|
+
] => Array
|
12
|
+
).throws(ReeMapper::TypeError)
|
13
|
+
def serialize(value, name:, role: nil, fields_filters: [], location: nil)
|
7
14
|
if value.is_a?(Array)
|
8
15
|
value.map.with_index {
|
9
16
|
if _1.nil? && subject.null
|
10
17
|
_1
|
11
18
|
else
|
12
|
-
subject.type.serialize(
|
19
|
+
subject.type.serialize(
|
20
|
+
_1,
|
21
|
+
name: "#{name}[#{_2}]",
|
22
|
+
role: role,
|
23
|
+
fields_filters: fields_filters + [subject.fields_filter],
|
24
|
+
location: subject.location,
|
25
|
+
)
|
13
26
|
end
|
14
27
|
}
|
15
28
|
else
|
16
|
-
raise ReeMapper::TypeError
|
29
|
+
raise ReeMapper::TypeError.new("`#{name}` should be an array, got `#{truncate(value.inspect)}`", location)
|
17
30
|
end
|
18
31
|
end
|
19
32
|
|
20
|
-
contract(
|
21
|
-
|
22
|
-
|
33
|
+
contract(
|
34
|
+
Any,
|
35
|
+
Kwargs[
|
36
|
+
name: String,
|
37
|
+
role: Nilor[Symbol, ArrayOf[Symbol]],
|
38
|
+
fields_filters: ArrayOf[ReeMapper::FieldsFilter],
|
39
|
+
location: Nilor[String],
|
40
|
+
] => Array
|
41
|
+
).throws(ReeMapper::TypeError)
|
42
|
+
def cast(value, name:, role: nil, fields_filters: [], location: nil)
|
23
43
|
if value.is_a?(Array)
|
24
44
|
value.map.with_index {
|
25
45
|
if _1.nil? && subject.null
|
26
46
|
_1
|
27
47
|
else
|
28
|
-
subject.type.cast(
|
48
|
+
subject.type.cast(
|
49
|
+
_1,
|
50
|
+
name: "#{name}[#{_2}]",
|
51
|
+
role: role,
|
52
|
+
fields_filters: fields_filters + [subject.fields_filter],
|
53
|
+
location: subject.location,
|
54
|
+
)
|
29
55
|
end
|
30
56
|
}
|
31
57
|
else
|
32
|
-
raise ReeMapper::TypeError
|
58
|
+
raise ReeMapper::TypeError.new("`#{name}` should be an array, got `#{truncate(value.inspect)}`", location)
|
33
59
|
end
|
34
60
|
end
|
35
61
|
|
36
|
-
contract(
|
37
|
-
|
38
|
-
|
62
|
+
contract(
|
63
|
+
Any,
|
64
|
+
Kwargs[
|
65
|
+
name: String,
|
66
|
+
role: Nilor[Symbol, ArrayOf[Symbol]],
|
67
|
+
fields_filters: ArrayOf[ReeMapper::FieldsFilter],
|
68
|
+
location: Nilor[String],
|
69
|
+
] => Array
|
70
|
+
).throws(ReeMapper::TypeError)
|
71
|
+
def db_dump(value, name:, role: nil, fields_filters: [], location: nil)
|
39
72
|
if value.is_a?(Array)
|
40
73
|
value.map.with_index {
|
41
74
|
if _1.nil? && subject.null
|
42
75
|
_1
|
43
76
|
else
|
44
|
-
subject.type.db_dump(
|
77
|
+
subject.type.db_dump(
|
78
|
+
_1,
|
79
|
+
name: "#{name}[#{_2}]",
|
80
|
+
role: role,
|
81
|
+
fields_filters: fields_filters + [subject.fields_filter],
|
82
|
+
location: subject.location,
|
83
|
+
)
|
45
84
|
end
|
46
85
|
}
|
47
86
|
else
|
48
|
-
raise ReeMapper::TypeError
|
87
|
+
raise ReeMapper::TypeError.new("`#{name}` should be an array, got `#{truncate(value.inspect)}`", location)
|
49
88
|
end
|
50
89
|
end
|
51
90
|
|
52
|
-
contract(
|
53
|
-
|
54
|
-
|
91
|
+
contract(
|
92
|
+
Any,
|
93
|
+
Kwargs[
|
94
|
+
name: String,
|
95
|
+
role: Nilor[Symbol, ArrayOf[Symbol]],
|
96
|
+
fields_filters: ArrayOf[ReeMapper::FieldsFilter],
|
97
|
+
location: Nilor[String],
|
98
|
+
] => Array
|
99
|
+
).throws(ReeMapper::TypeError)
|
100
|
+
def db_load(value, name:, role: nil, fields_filters: [], location: nil)
|
55
101
|
if value.is_a?(Array)
|
56
102
|
value.map.with_index {
|
57
103
|
if _1.nil? && subject.null
|
58
104
|
_1
|
59
105
|
else
|
60
|
-
subject.type.db_load(
|
106
|
+
subject.type.db_load(
|
107
|
+
_1,
|
108
|
+
name: "#{name}[#{_2}]",
|
109
|
+
role: role,
|
110
|
+
fields_filters: fields_filters + [subject.fields_filter],
|
111
|
+
location: subject.location,
|
112
|
+
)
|
61
113
|
end
|
62
114
|
}
|
63
115
|
else
|
64
|
-
raise ReeMapper::TypeError
|
116
|
+
raise ReeMapper::TypeError.new("`#{name}` should be an array, got `#{truncate(value.inspect)}`", location)
|
65
117
|
end
|
66
118
|
end
|
67
|
-
end
|
119
|
+
end
|