ree_lib 1.0.84 → 1.0.86

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.
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