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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +5 -7
  3. data/lib/ree_lib/packages/ree_actions/package/ree_actions/dsl.rb +11 -3
  4. data/lib/ree_lib/packages/ree_actions/package/ree_actions/errors.rb +3 -0
  5. data/lib/ree_lib/packages/ree_actions/package/ree_actions.rb +1 -0
  6. data/lib/ree_lib/packages/ree_actions/spec/ree_actions/dsl_spec.rb +5 -1
  7. data/lib/ree_lib/packages/ree_dao/package/ree_dao/association.rb +5 -29
  8. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/agg.rb +4 -28
  9. data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_array.rb +2 -2
  10. data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_jsonb.rb +2 -2
  11. data/lib/ree_lib/packages/ree_dao/package/ree_dao.rb +0 -1
  12. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/wrappers/pg_array_spec.rb +2 -2
  13. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/wrappers/pg_jsonb_spec.rb +8 -6
  14. data/lib/ree_lib/packages/ree_enum/package/ree_enum/base_enum_mapper.rb +1 -6
  15. data/lib/ree_lib/packages/ree_enum/package/ree_enum/integer_value_enum_mapper.rb +1 -1
  16. data/lib/ree_lib/packages/ree_enum/package/ree_enum/string_value_enum_mapper.rb +1 -1
  17. data/lib/ree_lib/packages/ree_enum/spec/ree_enum/dsl_spec.rb +9 -1
  18. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/abstract_type.rb +6 -0
  19. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/bool.rb +2 -2
  20. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/date.rb +3 -3
  21. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/date_time.rb +3 -3
  22. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/float.rb +3 -3
  23. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/integer.rb +6 -6
  24. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/rational.rb +3 -3
  25. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/string.rb +1 -1
  26. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/time.rb +3 -3
  27. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/wrappers/abstract_wrapper.rb +7 -0
  28. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/wrappers/array.rb +4 -4
  29. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper.rb +1 -0
  30. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/mapper_factory_spec.rb +2 -2
  31. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/bool_spec.rb +10 -8
  32. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/date_spec.rb +12 -10
  33. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/date_time_spec.rb +20 -16
  34. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/float_spec.rb +17 -13
  35. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb +1 -1
  36. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/integer_spec.rb +14 -14
  37. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/rational_spec.rb +16 -12
  38. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/string_spec.rb +24 -12
  39. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/time_spec.rb +20 -16
  40. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/type_options_spec.rb +4 -4
  41. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/wrappers/array_spec.rb +6 -6
  42. data/lib/ree_lib/packages/ree_roda/package/ree_roda/app.rb +3 -2
  43. data/lib/ree_lib/packages/ree_roda/spec/ree_roda/app_spec.rb +28 -0
  44. data/lib/ree_lib/version.rb +1 -1
  45. metadata +3 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68d91436860401eb57063022aeafa8fafa3f574ce56fe2e19082cf4c6fc42565
4
- data.tar.gz: 4e5620b188fd303242cc3943f617b83b9c933ceeacc8dd4e07f43f38d4cdda68
3
+ metadata.gz: ef4605f8eb48973a2e9ee1c9df9fbef06a4e8be6efe39e2ccd06bc2a945649c3
4
+ data.tar.gz: 20b1504401c0e996617499d3b9d595bfcfa124036341f0ca81641c7184da5309
5
5
  SHA512:
6
- metadata.gz: e7ba357081e00e5d96598a7efe22f17c62fabeafbee66354d02f770f4b3c3f0cf9c337bcf1a52ac94ca60c9706463c163ebfa7b4113dc73e165a62a1f5251d01
7
- data.tar.gz: 401f407e94dd2f9f540c495ddca201fb762e764d4a5dda6ad130f52211883edd3f3a1ff5b27a84a28ae3ff8e50a73b5ef0152cc86236dd6b84cb92c18f4c1076
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.84)
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.1.0)
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.15.5-x86_64-darwin)
41
+ nokogiri (1.16.0-x86_64-darwin)
44
42
  racc (~> 1.4)
45
- nokogiri (1.15.5-x86_64-linux)
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.32)
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
- __original_call(user_access, caster.cast(attrs))
61
- else
62
- __original_call(user_access, attrs)
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
@@ -0,0 +1,3 @@
1
+ module ReeActions
2
+ ParamError = Class.new(StandardError)
3
+ end
@@ -9,4 +9,5 @@ module ReeActions
9
9
  end
10
10
  end
11
11
 
12
+ require_relative "ree_actions/errors"
12
13
  require_relative "ree_actions/dsl"
@@ -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
- scheduler_proc do
131
- threads[:association_threads].map do |association, assoc_type, assoc_name, __opts, block|
132
- task_proc do
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
- threads[:field_threads].map do |association, field_proc|
138
- task_proc do
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
- scheduler_proc do
68
- associations[:association_threads].map do |association, assoc_type, assoc_name, opts, block|
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
- def scheduler_proc(&proc)
92
- if Sequel.current.is_a?(Fiber)
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}` is not Sequel::Postgres::PGArray"
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}` is not Sequel::Postgres::JSONB"
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(
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "sequel"
4
- require "fiber_scheduler"
5
4
 
6
5
  module ReeDao
7
6
  include Ree::PackageDSL
@@ -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` is not Sequel::Postgres::PGArray")
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: Object.new })
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: Object.new })
96
- }.to raise_error(ReeMapper::TypeError, "`numbers` is not Sequel::Postgres::JSONB")
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
- }.to raise_error(ReeMapper::CoercionError, '`type` should be one of ["account"]')
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({
@@ -1,2 +1,8 @@
1
1
  class ReeMapper::AbstractType
2
+ private
3
+
4
+ def truncate(str, limit = 180)
5
+ @trancator ||= ReeString::Truncate.new
6
+ @trancator.call(str, limit)
7
+ end
2
8
  end
@@ -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
- value = Integer(value, exception: false)
19
- if value.nil?
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
- value
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
 
@@ -6,7 +6,7 @@ class ReeMapper::String < ReeMapper::AbstractType
6
6
  if value.is_a? String
7
7
  value
8
8
  else
9
- raise ReeMapper::TypeError, "`#{name}` should be a string"
9
+ raise ReeMapper::TypeError, "`#{name}` should be a string, got `#{truncate(value.inspect)}`"
10
10
  end
11
11
  end
12
12
 
@@ -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
 
@@ -5,4 +5,11 @@ class ReeMapper::AbstractWrapper
5
5
  def initialize(field)
6
6
  @subject = field
7
7
  end
8
+
9
+ private
10
+
11
+ def truncate(str, limit = 180)
12
+ @trancator ||= ReeString::Truncate.new
13
+ @trancator.call(str, limit)
14
+ end
8
15
  end
@@ -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
@@ -9,6 +9,7 @@ module ReeMapper
9
9
  end
10
10
 
11
11
  package_require('ree_string/functions/underscore')
12
+ package_require('ree_string/functions/truncate')
12
13
  package_require('ree_datetime/functions/in_default_time_zone')
13
14
 
14
15
  require_relative 'ree_mapper/types/abstract_type'
@@ -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