ree_lib 1.0.84 → 1.0.86
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -7
- 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/association.rb +5 -29
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/agg.rb +4 -28
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_array.rb +2 -2
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_jsonb.rb +2 -2
- data/lib/ree_lib/packages/ree_dao/package/ree_dao.rb +0 -1
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/wrappers/pg_array_spec.rb +2 -2
- 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 +1 -6
- data/lib/ree_lib/packages/ree_enum/package/ree_enum/integer_value_enum_mapper.rb +1 -1
- data/lib/ree_lib/packages/ree_enum/package/ree_enum/string_value_enum_mapper.rb +1 -1
- data/lib/ree_lib/packages/ree_enum/spec/ree_enum/dsl_spec.rb +9 -1
- 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/bool.rb +2 -2
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/date.rb +3 -3
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/date_time.rb +3 -3
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/float.rb +3 -3
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/integer.rb +6 -6
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/rational.rb +3 -3
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/string.rb +1 -1
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/time.rb +3 -3
- 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 +4 -4
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper.rb +1 -0
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/mapper_factory_spec.rb +2 -2
- 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 +20 -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/version.rb +1 -1
- metadata +3 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef4605f8eb48973a2e9ee1c9df9fbef06a4e8be6efe39e2ccd06bc2a945649c3
|
4
|
+
data.tar.gz: 20b1504401c0e996617499d3b9d595bfcfa124036341f0ca81641c7184da5309
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f6969edfb467a49fa80864d8d27701d2379d846ce2cec01ec80dc0da740978a834597687e2da47ddfb21ec8abbc44a9d7779418e53550fd3bb60237279583cd8
|
7
|
+
data.tar.gz: 463d80dd677fbba864d2c9c9130b88f523e52c0f49c4ee7632ef781ca8c9af5eec19f1230483509bcb981e91b360aa9072918ceaab091ab21bfbb32d207d21e5
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ree_lib (1.0.
|
4
|
+
ree_lib (1.0.86)
|
5
5
|
binding_of_caller (~> 1.0.0)
|
6
|
-
fiber_scheduler (~> 0.13.0)
|
7
6
|
i18n (~> 1.12.0)
|
8
7
|
loofah (~> 2.18.0)
|
9
8
|
oj (~> 3.13.17)
|
@@ -27,11 +26,10 @@ GEM
|
|
27
26
|
crack (0.4.5)
|
28
27
|
rexml
|
29
28
|
crass (1.0.6)
|
30
|
-
debug_inspector (1.
|
29
|
+
debug_inspector (1.2.0)
|
31
30
|
diff-lcs (1.5.0)
|
32
31
|
faker (3.2.0)
|
33
32
|
i18n (>= 1.8.11, < 2)
|
34
|
-
fiber_scheduler (0.13.0)
|
35
33
|
hashdiff (1.0.1)
|
36
34
|
highline (2.0.3)
|
37
35
|
i18n (1.12.0)
|
@@ -40,9 +38,9 @@ GEM
|
|
40
38
|
crass (~> 1.0.2)
|
41
39
|
nokogiri (>= 1.5.9)
|
42
40
|
msgpack (1.6.0)
|
43
|
-
nokogiri (1.
|
41
|
+
nokogiri (1.16.0-x86_64-darwin)
|
44
42
|
racc (~> 1.4)
|
45
|
-
nokogiri (1.
|
43
|
+
nokogiri (1.16.0-x86_64-linux)
|
46
44
|
racc (~> 1.4)
|
47
45
|
oj (3.13.23)
|
48
46
|
pg (1.4.6)
|
@@ -53,7 +51,7 @@ GEM
|
|
53
51
|
rack (>= 1.3)
|
54
52
|
rainbow (3.1.1)
|
55
53
|
rake (13.0.6)
|
56
|
-
ree (1.0.
|
54
|
+
ree (1.0.33)
|
57
55
|
commander (~> 4.6.0)
|
58
56
|
rexml (3.2.5)
|
59
57
|
roda (3.58.0)
|
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
package_require("ree_mapper/errors/type_error")
|
3
|
+
package_require("ree_mapper/errors/coercion_error")
|
4
|
+
|
1
5
|
module ReeActions
|
2
6
|
module DSL
|
3
7
|
def self.included(base)
|
@@ -57,10 +61,14 @@ module ReeActions
|
|
57
61
|
raise ArgumentError.new("ActionCaster does not respond to `cast` method")
|
58
62
|
end
|
59
63
|
|
60
|
-
|
61
|
-
|
62
|
-
|
64
|
+
attrs = begin
|
65
|
+
caster.cast(attrs)
|
66
|
+
rescue ReeMapper::TypeError, ReeMapper::CoercionError => e
|
67
|
+
raise ReeActions::ParamError, e.message
|
68
|
+
end
|
63
69
|
end
|
70
|
+
|
71
|
+
__original_call(user_access, attrs)
|
64
72
|
ensure
|
65
73
|
__ree_dao_drop_cache
|
66
74
|
end
|
@@ -59,6 +59,10 @@ RSpec.describe ReeActions::DSL, type: [:autoclean] do
|
|
59
59
|
|
60
60
|
result = ReeActionsTest::TestAction.new.call('user_access', {user_id: 1})
|
61
61
|
expect(result).to eq(1)
|
62
|
+
|
63
|
+
expect {
|
64
|
+
ReeActionsTest::TestAction.new.call('user_access', {user_id: 'not integer'})
|
65
|
+
}.to raise_error(ReeActions::ParamError)
|
62
66
|
}
|
63
67
|
|
64
68
|
it {
|
@@ -161,7 +165,7 @@ RSpec.describe ReeActions::DSL, type: [:autoclean] do
|
|
161
165
|
users_dao.put(ReeActionsTest::User.new(name: 'Sam', age: 19))
|
162
166
|
end.join
|
163
167
|
end.join
|
164
|
-
|
168
|
+
|
165
169
|
$thread_cache = ReeDao::DaoCache.new.get(:users, $user.id)
|
166
170
|
|
167
171
|
attrs[:user_id]
|
@@ -127,18 +127,12 @@ module ReeDao
|
|
127
127
|
else
|
128
128
|
threads = associations.instance_exec(assoc_list, &block)
|
129
129
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
association.load(assoc_type, assoc_name, **__opts, &block)
|
134
|
-
end
|
135
|
-
end
|
130
|
+
threads[:association_threads].map do |association, assoc_type, assoc_name, __opts, block|
|
131
|
+
association.load(assoc_type, assoc_name, **__opts, &block)
|
132
|
+
end
|
136
133
|
|
137
|
-
|
138
|
-
|
139
|
-
association.handle_field(field_proc)
|
140
|
-
end
|
141
|
-
end
|
134
|
+
threads[:field_threads].map do |association, field_proc|
|
135
|
+
association.handle_field(field_proc)
|
142
136
|
end
|
143
137
|
end
|
144
138
|
end
|
@@ -355,24 +349,6 @@ module ReeDao
|
|
355
349
|
|
356
350
|
private
|
357
351
|
|
358
|
-
def task_proc(&proc)
|
359
|
-
if Sequel.current.is_a?(Fiber)
|
360
|
-
Fiber.schedule &proc
|
361
|
-
else
|
362
|
-
proc.call
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
366
|
-
def scheduler_proc(&proc)
|
367
|
-
if Sequel.current.is_a?(Fiber)
|
368
|
-
FiberScheduler do
|
369
|
-
Fiber.schedule(:waiting, &proc)
|
370
|
-
end
|
371
|
-
else
|
372
|
-
proc.call
|
373
|
-
end
|
374
|
-
end
|
375
|
-
|
376
352
|
def foreign_key_from_dao(dao)
|
377
353
|
"#{dao.first_source_table.to_s.gsub(/s$/, '')}_id".to_sym
|
378
354
|
end
|
@@ -64,37 +64,13 @@ class ReeDao::Agg
|
|
64
64
|
if dao.db.in_transaction? || ReeDao.load_sync_associations_enabled?
|
65
65
|
associations
|
66
66
|
else
|
67
|
-
|
68
|
-
|
69
|
-
task_proc do
|
70
|
-
association.load(assoc_type, assoc_name, **opts, &block)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
associations[:field_threads].map do |association, field_proc|
|
75
|
-
task_proc do
|
76
|
-
association.handle_field(field_proc)
|
77
|
-
end
|
78
|
-
end
|
67
|
+
associations[:association_threads].map do |association, assoc_type, assoc_name, opts, block|
|
68
|
+
association.load(assoc_type, assoc_name, **opts, &block)
|
79
69
|
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def task_proc(&proc)
|
84
|
-
if Sequel.current.is_a?(Fiber)
|
85
|
-
Fiber.schedule(&proc)
|
86
|
-
else
|
87
|
-
proc.call
|
88
|
-
end
|
89
|
-
end
|
90
70
|
|
91
|
-
|
92
|
-
|
93
|
-
FiberScheduler do
|
94
|
-
Fiber.schedule(:waiting, &proc)
|
71
|
+
associations[:field_threads].map do |association, field_proc|
|
72
|
+
association.handle_field(field_proc)
|
95
73
|
end
|
96
|
-
else
|
97
|
-
proc.call
|
98
74
|
end
|
99
75
|
end
|
100
76
|
end
|
@@ -13,7 +13,7 @@ class ReeDao::PgArray < ReeMapper::AbstractWrapper
|
|
13
13
|
)
|
14
14
|
def db_dump(value, name:, role: nil, fields_filters: [])
|
15
15
|
if !value.is_a?(Array)
|
16
|
-
raise ReeMapper::TypeError, "`#{name}` should be an array"
|
16
|
+
raise ReeMapper::TypeError, "`#{name}` should be an array, got `#{truncate(value.inspect)}`"
|
17
17
|
end
|
18
18
|
|
19
19
|
value = value.map.with_index do |el, index|
|
@@ -42,7 +42,7 @@ class ReeDao::PgArray < ReeMapper::AbstractWrapper
|
|
42
42
|
).throws(ReeMapper::TypeError)
|
43
43
|
def db_load(value, name:, role: nil, fields_filters: [])
|
44
44
|
if !value.is_a?(Sequel::Postgres::PGArray)
|
45
|
-
raise ReeMapper::TypeError, "`#{name}`
|
45
|
+
raise ReeMapper::TypeError, "`#{name}` should be a Sequel::Postgres::PGArray, got `#{truncate(value.inspect)}`"
|
46
46
|
end
|
47
47
|
|
48
48
|
value.map.with_index do |val, index|
|
@@ -31,7 +31,7 @@ class ReeDao::PgJsonb < ReeMapper::AbstractWrapper
|
|
31
31
|
begin
|
32
32
|
Sequel.pg_jsonb_wrap(value)
|
33
33
|
rescue Sequel::Error
|
34
|
-
raise ReeMapper::TypeError, "`#{name}` should be an jsonb primitive"
|
34
|
+
raise ReeMapper::TypeError, "`#{name}` should be an jsonb primitive, got `#{truncate(value.inspect)}`"
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -61,7 +61,7 @@ class ReeDao::PgJsonb < ReeMapper::AbstractWrapper
|
|
61
61
|
when Numeric, String, TrueClass, FalseClass, NilClass
|
62
62
|
value
|
63
63
|
else
|
64
|
-
raise ReeMapper::TypeError, "`#{name}`
|
64
|
+
raise ReeMapper::TypeError, "`#{name}` should be a Sequel::Postgres::JSONB, got `#{truncate(value.inspect)}`"
|
65
65
|
end
|
66
66
|
|
67
67
|
subject.type.db_load(
|
@@ -46,7 +46,7 @@ RSpec.describe 'ReeDao::PgArray' do
|
|
46
46
|
it {
|
47
47
|
expect {
|
48
48
|
mapper.db_dump({ tags: 1 })
|
49
|
-
}.to raise_error(ReeMapper::TypeError, "`tags` should be an array")
|
49
|
+
}.to raise_error(ReeMapper::TypeError, "`tags` should be an array, got `1`")
|
50
50
|
}
|
51
51
|
end
|
52
52
|
|
@@ -66,7 +66,7 @@ RSpec.describe 'ReeDao::PgArray' do
|
|
66
66
|
mapper.db_load({
|
67
67
|
tags: 1
|
68
68
|
})
|
69
|
-
}.to raise_error(ReeMapper::TypeError, "`tags`
|
69
|
+
}.to raise_error(ReeMapper::TypeError, "`tags` should be a Sequel::Postgres::PGArray, got `1`")
|
70
70
|
}
|
71
71
|
end
|
72
72
|
end
|
@@ -55,13 +55,14 @@ RSpec.describe 'ReeDao::PgJsonb' do
|
|
55
55
|
it {
|
56
56
|
expect {
|
57
57
|
mapper.db_dump({ numbers: ['1'] })
|
58
|
-
}.to raise_error(ReeMapper::TypeError, "`numbers[0]` should be an integer")
|
58
|
+
}.to raise_error(ReeMapper::TypeError, "`numbers[0]` should be an integer, got `\"1\"`")
|
59
59
|
}
|
60
60
|
|
61
61
|
it {
|
62
|
+
object = Object.new
|
62
63
|
expect {
|
63
|
-
mapper.db_dump({ any:
|
64
|
-
}.to raise_error(ReeMapper::TypeError, "`any` should be an jsonb primitive")
|
64
|
+
mapper.db_dump({ any: object })
|
65
|
+
}.to raise_error(ReeMapper::TypeError, "`any` should be an jsonb primitive, got `#{object.inspect}`")
|
65
66
|
}
|
66
67
|
end
|
67
68
|
|
@@ -87,13 +88,14 @@ RSpec.describe 'ReeDao::PgJsonb' do
|
|
87
88
|
it {
|
88
89
|
expect {
|
89
90
|
mapper.db_load({ numbers: Sequel::Postgres::JSONBArray.new([1.1]) })
|
90
|
-
}.to raise_error(ReeMapper::TypeError, "`numbers[0]` should be an integer")
|
91
|
+
}.to raise_error(ReeMapper::TypeError, "`numbers[0]` should be an integer, got `1.1`")
|
91
92
|
}
|
92
93
|
|
93
94
|
it {
|
95
|
+
object = Object.new
|
94
96
|
expect {
|
95
|
-
mapper.db_load({ numbers:
|
96
|
-
}.to raise_error(ReeMapper::TypeError, "`numbers`
|
97
|
+
mapper.db_load({ numbers: object })
|
98
|
+
}.to raise_error(ReeMapper::TypeError, "`numbers` should be a Sequel::Postgres::JSONB, got `#{object.inspect}`")
|
97
99
|
}
|
98
100
|
end
|
99
101
|
end
|
@@ -30,7 +30,7 @@ class ReeEnum::BaseEnumMapper < ReeMapper::AbstractType
|
|
30
30
|
enum_val = @enum.get_values.by_mapped_value(value)
|
31
31
|
|
32
32
|
if !enum_val
|
33
|
-
raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}"
|
33
|
+
raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}, got `#{truncate(value.inspect)}`"
|
34
34
|
end
|
35
35
|
|
36
36
|
enum_val
|
@@ -41,9 +41,4 @@ class ReeEnum::BaseEnumMapper < ReeMapper::AbstractType
|
|
41
41
|
def enum_inspection
|
42
42
|
@enum_inspection ||= truncate(@enum.get_values.each.map(&:to_s).inspect)
|
43
43
|
end
|
44
|
-
|
45
|
-
def truncate(str, limit = 180)
|
46
|
-
return str if str.length <= limit
|
47
|
-
"#{str[0..limit]}..."
|
48
|
-
end
|
49
44
|
end
|
@@ -34,7 +34,7 @@ class ReeEnum::IntegerValueEnumMapper < ReeEnum::BaseEnumMapper
|
|
34
34
|
end
|
35
35
|
|
36
36
|
if enum_value.nil?
|
37
|
-
raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}"
|
37
|
+
raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}, got `#{truncate(value.inspect)}`"
|
38
38
|
end
|
39
39
|
|
40
40
|
enum_value
|
@@ -29,7 +29,7 @@ class ReeEnum::StringValueEnumMapper < ReeEnum::BaseEnumMapper
|
|
29
29
|
end
|
30
30
|
|
31
31
|
if enum_value.nil?
|
32
|
-
raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}"
|
32
|
+
raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}, got `#{truncate(value.inspect)}`"
|
33
33
|
end
|
34
34
|
|
35
35
|
enum_value
|
@@ -152,7 +152,15 @@ RSpec.describe ReeEnum::DSL do
|
|
152
152
|
type: 'invalid',
|
153
153
|
number: 0,
|
154
154
|
})
|
155
|
-
|
155
|
+
}.to raise_error(ReeMapper::CoercionError, '`type` should be one of ["account"], got `"invalid"`')
|
156
|
+
|
157
|
+
expect {
|
158
|
+
mapper.db_load({
|
159
|
+
state: 'first',
|
160
|
+
type: 'invalid',
|
161
|
+
number: 0,
|
162
|
+
})
|
163
|
+
}.to raise_error(ReeMapper::CoercionError, '`type` should be one of ["account"], got `"invalid"`')
|
156
164
|
|
157
165
|
expect(
|
158
166
|
mapper.cast({
|
@@ -9,7 +9,7 @@ class ReeMapper::Bool < ReeMapper::AbstractType
|
|
9
9
|
if value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
10
10
|
value
|
11
11
|
else
|
12
|
-
raise ReeMapper::TypeError, "`#{name}` should be a boolean"
|
12
|
+
raise ReeMapper::TypeError, "`#{name}` should be a boolean, got `#{truncate(value.inspect)}`"
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -20,7 +20,7 @@ class ReeMapper::Bool < ReeMapper::AbstractType
|
|
20
20
|
elsif FALSE_CAST_VALUES.include?(value)
|
21
21
|
false
|
22
22
|
else
|
23
|
-
raise ReeMapper::CoercionError, "`#{name}` is invalid boolean"
|
23
|
+
raise ReeMapper::CoercionError, "`#{name}` is invalid boolean, got `#{truncate(value.inspect)}`"
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -8,7 +8,7 @@ class ReeMapper::Date < ReeMapper::AbstractType
|
|
8
8
|
if value.class == Date
|
9
9
|
value
|
10
10
|
else
|
11
|
-
raise ReeMapper::TypeError, "`#{name}` should be a date"
|
11
|
+
raise ReeMapper::TypeError, "`#{name}` should be a date, got `#{truncate(value.inspect)}`"
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -22,10 +22,10 @@ class ReeMapper::Date < ReeMapper::AbstractType
|
|
22
22
|
begin
|
23
23
|
Date.parse(value)
|
24
24
|
rescue ArgumentError => e
|
25
|
-
raise ReeMapper::CoercionError, "`#{name}` is invalid date"
|
25
|
+
raise ReeMapper::CoercionError, "`#{name}` is invalid date, got `#{truncate(value.inspect)}`"
|
26
26
|
end
|
27
27
|
else
|
28
|
-
raise ReeMapper::TypeError, "`#{name}` should be a date"
|
28
|
+
raise ReeMapper::TypeError, "`#{name}` should be a date, got `#{truncate(value.inspect)}`"
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -8,7 +8,7 @@ class ReeMapper::DateTime < ReeMapper::AbstractType
|
|
8
8
|
if value.class == DateTime
|
9
9
|
value
|
10
10
|
else
|
11
|
-
raise ReeMapper::TypeError, "`#{name}` should be a datetime"
|
11
|
+
raise ReeMapper::TypeError, "`#{name}` should be a datetime, got `#{truncate(value.inspect)}`"
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -22,10 +22,10 @@ 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, "`#{name}` is invalid datetime"
|
25
|
+
raise ReeMapper::CoercionError, "`#{name}` is invalid datetime, got `#{truncate(value.inspect)}`"
|
26
26
|
end
|
27
27
|
else
|
28
|
-
raise ReeMapper::TypeError, "`#{name}` should be a datetime"
|
28
|
+
raise ReeMapper::TypeError, "`#{name}` should be a datetime, got `#{truncate(value.inspect)}`"
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -6,7 +6,7 @@ class ReeMapper::Float < ReeMapper::AbstractType
|
|
6
6
|
if value.is_a?(Float)
|
7
7
|
value
|
8
8
|
else
|
9
|
-
raise ReeMapper::TypeError, "`#{name}` should be a float"
|
9
|
+
raise ReeMapper::TypeError, "`#{name}` should be a float, got `#{truncate(value.inspect)}`"
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -18,12 +18,12 @@ class ReeMapper::Float < ReeMapper::AbstractType
|
|
18
18
|
begin
|
19
19
|
Float(value)
|
20
20
|
rescue ArgumentError => e
|
21
|
-
raise ReeMapper::CoercionError, "`#{name}` is invalid float"
|
21
|
+
raise ReeMapper::CoercionError, "`#{name}` is invalid float, got `#{truncate(value.inspect)}`"
|
22
22
|
end
|
23
23
|
elsif defined?(BigDecimal) && value.is_a?(BigDecimal)
|
24
24
|
value.to_f
|
25
25
|
else
|
26
|
-
raise ReeMapper::TypeError, "`#{name}` should be a float"
|
26
|
+
raise ReeMapper::TypeError, "`#{name}` should be a float, got `#{truncate(value.inspect)}`"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -6,7 +6,7 @@ class ReeMapper::Integer < ReeMapper::AbstractType
|
|
6
6
|
if value.is_a? Integer
|
7
7
|
value
|
8
8
|
else
|
9
|
-
raise ReeMapper::TypeError, "`#{name}` should be an integer"
|
9
|
+
raise ReeMapper::TypeError, "`#{name}` should be an integer, got `#{truncate(value.inspect)}`"
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -15,13 +15,13 @@ class ReeMapper::Integer < ReeMapper::AbstractType
|
|
15
15
|
if value.is_a?(Integer)
|
16
16
|
value
|
17
17
|
elsif value.is_a?(String)
|
18
|
-
|
19
|
-
if
|
20
|
-
raise ReeMapper::CoercionError, "`#{name}` is invalid integer"
|
18
|
+
coerced_value = Integer(value, exception: false)
|
19
|
+
if coerced_value.nil?
|
20
|
+
raise ReeMapper::CoercionError, "`#{name}` is invalid integer, got `#{truncate(value.inspect)}`"
|
21
21
|
end
|
22
|
-
|
22
|
+
coerced_value
|
23
23
|
else
|
24
|
-
raise ReeMapper::TypeError, "`#{name}` should be an integer"
|
24
|
+
raise ReeMapper::TypeError, "`#{name}` should be an integer, got `#{truncate(value.inspect)}`"
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -6,7 +6,7 @@ class ReeMapper::Rational < ReeMapper::AbstractType
|
|
6
6
|
if value.is_a?(Rational)
|
7
7
|
value
|
8
8
|
else
|
9
|
-
raise ReeMapper::TypeError, "`#{name}` should be a rational"
|
9
|
+
raise ReeMapper::TypeError, "`#{name}` should be a rational, got `#{truncate(value.inspect)}`"
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -18,12 +18,12 @@ class ReeMapper::Rational < ReeMapper::AbstractType
|
|
18
18
|
begin
|
19
19
|
Rational(value)
|
20
20
|
rescue ArgumentError, ZeroDivisionError => e
|
21
|
-
raise ReeMapper::CoercionError, "`#{name}` is invalid rational"
|
21
|
+
raise ReeMapper::CoercionError, "`#{name}` is invalid rational, got `#{truncate(value.inspect)}`"
|
22
22
|
end
|
23
23
|
elsif value.is_a?(Numeric)
|
24
24
|
Rational(value)
|
25
25
|
else
|
26
|
-
raise ReeMapper::TypeError, "`#{name}` should be a rational"
|
26
|
+
raise ReeMapper::TypeError, "`#{name}` should be a rational, got `#{truncate(value.inspect)}`"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -8,7 +8,7 @@ class ReeMapper::Time < ReeMapper::AbstractType
|
|
8
8
|
if value.class == Time
|
9
9
|
value
|
10
10
|
else
|
11
|
-
raise ReeMapper::TypeError, "`#{name}` should be a time"
|
11
|
+
raise ReeMapper::TypeError, "`#{name}` should be a time, got `#{truncate(value.inspect)}`"
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -22,10 +22,10 @@ class ReeMapper::Time < ReeMapper::AbstractType
|
|
22
22
|
begin
|
23
23
|
Time.parse(value)
|
24
24
|
rescue ArgumentError
|
25
|
-
raise ReeMapper::CoercionError, "`#{name}` is invalid time"
|
25
|
+
raise ReeMapper::CoercionError, "`#{name}` is invalid time, got `#{truncate(value.inspect)}`"
|
26
26
|
end
|
27
27
|
else
|
28
|
-
raise ReeMapper::TypeError, "`#{name}` should be a time"
|
28
|
+
raise ReeMapper::TypeError, "`#{name}` should be a time, got `#{truncate(value.inspect)}`"
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -13,7 +13,7 @@ class ReeMapper::Array < ReeMapper::AbstractWrapper
|
|
13
13
|
end
|
14
14
|
}
|
15
15
|
else
|
16
|
-
raise ReeMapper::TypeError, "`#{name}` should be an array"
|
16
|
+
raise ReeMapper::TypeError, "`#{name}` should be an array, got `#{truncate(value.inspect)}`"
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -29,7 +29,7 @@ class ReeMapper::Array < ReeMapper::AbstractWrapper
|
|
29
29
|
end
|
30
30
|
}
|
31
31
|
else
|
32
|
-
raise ReeMapper::TypeError, "`#{name}` should be an array"
|
32
|
+
raise ReeMapper::TypeError, "`#{name}` should be an array, got `#{truncate(value.inspect)}`"
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -45,7 +45,7 @@ class ReeMapper::Array < ReeMapper::AbstractWrapper
|
|
45
45
|
end
|
46
46
|
}
|
47
47
|
else
|
48
|
-
raise ReeMapper::TypeError, "`#{name}` should be an array"
|
48
|
+
raise ReeMapper::TypeError, "`#{name}` should be an array, got `#{truncate(value.inspect)}`"
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -61,7 +61,7 @@ class ReeMapper::Array < ReeMapper::AbstractWrapper
|
|
61
61
|
end
|
62
62
|
}
|
63
63
|
else
|
64
|
-
raise ReeMapper::TypeError, "`#{name}` should be an array"
|
64
|
+
raise ReeMapper::TypeError, "`#{name}` should be an array, got `#{truncate(value.inspect)}`"
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -83,7 +83,7 @@ RSpec.describe ReeMapper::MapperFactory do
|
|
83
83
|
let(:round_wrapper) {
|
84
84
|
Class.new(ReeMapper::AbstractWrapper) do
|
85
85
|
def serialize(value, name:, **opts)
|
86
|
-
raise ReeMapper::TypeError, "`#{name}` should be a number" if !value.is_a?(Numeric)
|
86
|
+
raise ReeMapper::TypeError, "`#{name}` should be a number, got `#{truncate(value.inspect)}`" if !value.is_a?(Numeric)
|
87
87
|
|
88
88
|
subject.type.serialize(value.round, name: name, **opts)
|
89
89
|
end
|
@@ -103,7 +103,7 @@ RSpec.describe ReeMapper::MapperFactory do
|
|
103
103
|
def cast(value, name:, **opts)
|
104
104
|
value = subject.type.cast(value, name: name, **opts)
|
105
105
|
|
106
|
-
raise ReeMapper::TypeError, "`#{name}` should be a number" if !value.is_a?(Numeric)
|
106
|
+
raise ReeMapper::TypeError, "`#{name}` should be a number, got `#{truncate(value.inspect)}`" if !value.is_a?(Numeric)
|
107
107
|
value.round
|
108
108
|
end
|
109
109
|
end
|