ree_lib 1.0.71 → 1.0.73

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 83750e368c52ed97daa01d069e57a184129c6bafb7bd7867aa8c71685562da16
4
- data.tar.gz: 37ea4a0f4c852bed89692d47f5c86891f281a16f1e13f04faeb2670f57bfd173
3
+ metadata.gz: 8bc7c01750d09b6274eabf44aa42ab5df1638372eed12a81bf2f79d09caf2920
4
+ data.tar.gz: 8dd947819db285b9ead46579f4eacb3b482a27fa525f48e0f997f21ac230744e
5
5
  SHA512:
6
- metadata.gz: ff00e69c9a2b54dd03eee000076e3aac5cb0236b53cdbba0ed669eba2d5918d1c14d88f0c8a6d8e58497a86e02208a0f5850fbef294e552ad2f994aaa83cf89c
7
- data.tar.gz: bb9a5580e423c17d894d07a69896f39d0d26ef9fc21b8bd3871c505034516a20fa2c5bf6a95827a1733a4cb06a6e6fea7bb4dd0a0e4735f13eca1fb5f2087cb9
6
+ metadata.gz: 498b93f53f71563223d74404aa958ea60618c3513c21a9344ae6c18bce4fd6664113eb47aae7f4626577c632417f355a09252411ebe244921c1443f5846c8e3c
7
+ data.tar.gz: d1c3ac12551051f7f9b5f71e785e4cbe22bc5854863b8e406c6b3f950ed486043c9f9c2fffc88ce2c95df471aab47f3c3401af2b6c353bffb2c22bd24d867619
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ree_lib (1.0.71)
4
+ ree_lib (1.0.73)
5
5
  binding_of_caller (~> 1.0.0)
6
6
  i18n (~> 1.12.0)
7
7
  loofah (~> 2.18.0)
@@ -51,7 +51,7 @@ GEM
51
51
  rack (>= 1.3)
52
52
  rainbow (3.1.1)
53
53
  rake (13.0.6)
54
- ree (1.0.29)
54
+ ree (1.0.31)
55
55
  commander (~> 4.6.0)
56
56
  rexml (3.2.5)
57
57
  roda (3.58.0)
@@ -3,14 +3,12 @@ module ReeDao
3
3
  include Ree::LinkDSL
4
4
  include ReeDao::AssociationMethods
5
5
 
6
- link :demodulize, from: :ree_string
7
6
  link :group_by, from: :ree_array
8
7
  link :index_by, from: :ree_array
9
- link :underscore, from: :ree_string
10
8
 
11
9
  attr_reader :parent, :parent_dao, :list, :global_opts
12
10
 
13
- contract(ReeDao::Associations, Sequel::Dataset, Array, Ksplat[RestKeys => Any] => Any)
11
+ contract(ReeDao::Associations, Nilor[Sequel::Dataset], Array, Ksplat[RestKeys => Any] => Any)
14
12
  def initialize(parent, parent_dao, list, **global_opts)
15
13
  @parent = parent
16
14
  @parent_dao = parent_dao
@@ -51,8 +49,7 @@ module ReeDao
51
49
 
52
50
  dao = if scope.is_a?(Array)
53
51
  return [] if scope.empty?
54
- name = underscore(demodulize(scope.first.class.name))
55
- find_dao(name, parent, nil)
52
+ nil
56
53
  else
57
54
  find_dao(assoc_name, parent, scope)
58
55
  end
@@ -125,7 +122,7 @@ module ReeDao
125
122
  **global_opts
126
123
  )
127
124
 
128
- if parent_dao.db.in_transaction? || ReeDao::Associations.sync_mode?
125
+ if parent_dao.nil? || parent_dao.db.in_transaction? || ReeDao::Associations.sync_mode?
129
126
  associations.instance_exec(assoc_list, &block)
130
127
  else
131
128
  threads = associations.instance_exec(assoc_list, &block)
@@ -145,7 +142,7 @@ module ReeDao
145
142
  end
146
143
 
147
144
  contract(
148
- Sequel::Dataset,
145
+ Nilor[Sequel::Dataset],
149
146
  Symbol,
150
147
  Array,
151
148
  Kwargs[
@@ -170,7 +167,11 @@ module ReeDao
170
167
  if reverse
171
168
  # has_one
172
169
  if !foreign_key
173
- foreign_key = "#{parent_dao.first_source_table.to_s.gsub(/s$/,'')}_id".to_sym
170
+ if parent_dao.nil?
171
+ raise ArgumentError.new("foreign_key should be provided for :#{assoc_name} association")
172
+ end
173
+
174
+ foreign_key = foreign_key_from_dao(parent_dao)
174
175
  end
175
176
 
176
177
  root_ids = list.map(&:id).uniq
@@ -206,7 +207,7 @@ module ReeDao
206
207
  end
207
208
 
208
209
  contract(
209
- Sequel::Dataset,
210
+ Nilor[Sequel::Dataset],
210
211
  Symbol,
211
212
  Array,
212
213
  Kwargs[
@@ -228,7 +229,13 @@ module ReeDao
228
229
  assoc_dao = nil
229
230
  assoc_dao = find_dao(assoc_name, parent, scope)
230
231
 
231
- foreign_key ||= "#{parent_dao.first_source_table.to_s.gsub(/s$/, '')}_id".to_sym
232
+ if !foreign_key
233
+ if parent_dao.nil?
234
+ raise ArgumentError.new("foreign_key should be provided for :#{assoc_name} association")
235
+ end
236
+
237
+ foreign_key = foreign_key_from_dao(parent_dao)
238
+ end
232
239
 
233
240
  root_ids = list.map(&:"#{primary_key}")
234
241
 
@@ -343,5 +350,11 @@ module ReeDao
343
350
 
344
351
  parent.agg_caller.send(method, *args, &block)
345
352
  end
353
+
354
+ private
355
+
356
+ def foreign_key_from_dao(dao)
357
+ "#{dao.first_source_table.to_s.gsub(/s$/, '')}_id".to_sym
358
+ end
346
359
  end
347
360
  end
@@ -87,7 +87,7 @@ module ReeDao
87
87
  Optblock => Any
88
88
  )
89
89
  def association(assoc_type, assoc_name, __opts, &block)
90
- if parent_dao.db.in_transaction? || self.class.sync_mode?
90
+ if parent_dao.nil? || parent_dao.db.in_transaction? || self.class.sync_mode?
91
91
  return if association_is_not_included?(assoc_name) || list.empty?
92
92
 
93
93
  association = Association.new(self, parent_dao, list, **global_opts)
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+ require_relative "value"
3
+
4
+ class ReeEnum::BaseEnumMapper < ReeMapper::AbstractType
5
+ def initialize(enum)
6
+ @enum = enum
7
+ end
8
+
9
+ contract(
10
+ ReeEnum::Value,
11
+ Kwargs[
12
+ name: String,
13
+ role: Nilor[Symbol, ArrayOf[Symbol]]
14
+ ] => Or[Integer, String]
15
+ )
16
+ def db_dump(value, name:, role: nil)
17
+ value.mapped_value
18
+ end
19
+
20
+ contract(
21
+ Or[Integer, String],
22
+ Kwargs[
23
+ name: String,
24
+ role: Nilor[Symbol, ArrayOf[Symbol]]
25
+ ] => ReeEnum::Value
26
+ ).throws(ReeMapper::CoercionError)
27
+ def db_load(value, name:, role: nil)
28
+ enum_val = @enum.get_values.by_mapped_value(value)
29
+
30
+ if !enum_val
31
+ raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}"
32
+ end
33
+
34
+ enum_val
35
+ end
36
+
37
+ private
38
+
39
+ def enum_inspection
40
+ @enum_inspection ||= truncate(@enum.get_values.each.map(&:to_s).inspect)
41
+ end
42
+
43
+ def truncate(str, limit = 180)
44
+ return str if str.length <= limit
45
+ "#{str[0..limit]}..."
46
+ end
47
+ end
@@ -1,5 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  package_require 'ree_swagger/functions/register_type'
2
3
 
4
+ require_relative 'integer_value_enum_mapper'
5
+ require_relative 'string_value_enum_mapper'
6
+
3
7
  module ReeEnum
4
8
  module DSL
5
9
  def self.included(base)
@@ -27,100 +31,32 @@ module ReeEnum
27
31
  end
28
32
 
29
33
  def type_for_mapper
30
- @type_for_mapper ||= begin
31
- klass = Class.new(ReeMapper::AbstractType) do
32
- def initialize(enum)
33
- @enum = enum
34
- end
35
-
36
- contract(
37
- ReeEnum::Value,
38
- Kwargs[
39
- name: String,
40
- role: Nilor[Symbol, ArrayOf[Symbol]]
41
- ] => String
42
- )
43
- def serialize(value, name:, role: nil)
44
- value.to_s
45
- end
46
-
47
- contract(
48
- Any,
49
- Kwargs[
50
- name: String,
51
- role: Nilor[Symbol, ArrayOf[Symbol]]
52
- ] => ReeEnum::Value
53
- ).throws(ReeMapper::CoercionError)
54
- def cast(value, name:, role: nil)
55
- enum_value = if value.is_a?(String)
56
- @enum.get_values.by_value(value)
57
- elsif value.is_a?(ReeEnum::Value)
58
- @enum.get_values.each.find { _1 == value }
59
- end
60
-
61
- if enum_value.nil?
62
- raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}"
63
- end
64
-
65
- enum_value
66
- end
67
-
68
- contract(
69
- ReeEnum::Value,
70
- Kwargs[
71
- name: String,
72
- role: Nilor[Symbol, ArrayOf[Symbol]]
73
- ] => Or[Integer, String]
74
- )
75
- def db_dump(value, name:, role: nil)
76
- value.mapped_value
77
- end
78
-
79
- contract(
80
- Or[Integer, String],
81
- Kwargs[
82
- name: String,
83
- role: Nilor[Symbol, ArrayOf[Symbol]]
84
- ] => ReeEnum::Value
85
- ).throws(ReeMapper::CoercionError)
86
- def db_load(value, name:, role: nil)
87
- enum_val = @enum.get_values.by_mapped_value(value)
88
-
89
- if !enum_val
90
- raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}"
91
- end
92
-
93
- enum_val
94
- end
95
-
96
- private
97
-
98
- def enum_inspection
99
- @enum_inspect ||= truncate(@enum.get_values.each.map(&:to_s).inspect)
100
- end
101
-
102
- def truncate(str, limit = 180)
103
- return str if str.length <= limit
104
- "#{str[0..limit]}..."
105
- end
106
- end
107
-
108
- klass.new(self)
34
+ return @type_for_mapper if defined? @type_for_mapper
35
+
36
+ value_type = get_values.value_type
37
+
38
+ klass = if value_type == String
39
+ StringValueEnumMapper
40
+ elsif value_type == Integer
41
+ IntegerValueEnumMapper
42
+ else
43
+ raise NotImplementedError, "value_type #{value_type} is not supported"
109
44
  end
45
+
46
+ @type_for_mapper = klass.new(self)
110
47
  end
111
48
 
112
49
  def register_as_swagger_type
113
50
  swagger_type_registrator = ReeSwagger::RegisterType.new
114
51
 
52
+ definition = swagger_definition
53
+
115
54
  [:casters, :serializers].each do |kind|
116
55
  swagger_type_registrator.call(
117
56
  kind,
118
57
  type_for_mapper.class,
119
58
  ->(*) {
120
- {
121
- type: 'string',
122
- enum: get_values.each.map(&:to_s)
123
- }
59
+ definition
124
60
  }
125
61
  )
126
62
  end
@@ -137,6 +73,23 @@ module ReeEnum
137
73
  self.get_enum_name, type_for_mapper
138
74
  )
139
75
  end
76
+
77
+ def swagger_definition
78
+ value_type = get_values.value_type
79
+
80
+ type = if value_type == String
81
+ "string"
82
+ elsif value_type == Integer
83
+ "integer"
84
+ else
85
+ raise NotImplementedError, "value_type #{value_type} is not supported"
86
+ end
87
+
88
+ {
89
+ type: type,
90
+ enum: get_values.each.map(&:value)
91
+ }
92
+ end
140
93
  end
141
94
  end
142
95
  end
@@ -29,8 +29,9 @@ module ReeEnum::Enumerable
29
29
  @values&.enum_name
30
30
  end
31
31
 
32
- def val(value, mapped_value = value.to_s, method: value.to_sym)
33
- value = value.to_s
32
+ def val(value, mapped_value = nil, method: value.to_s.to_sym)
33
+ value = value.to_s if value.is_a?(Symbol)
34
+ mapped_value ||= value
34
35
 
35
36
  if RESTRICTED_METHODS.include?(method)
36
37
  raise ArgumentError.new("#{method.inspect} is not allowed as enum method")
@@ -38,13 +39,15 @@ module ReeEnum::Enumerable
38
39
 
39
40
  enum_value = @values.add(value, mapped_value, method)
40
41
 
41
- define_method(enum_value.method) do
42
- get_values.by_value(enum_value.value)
43
- end
42
+ class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
43
+ def #{method}
44
+ get_values.by_value(#{value.inspect}.freeze)
45
+ end
44
46
 
45
- define_singleton_method(enum_value.method) do
46
- get_values.by_value(enum_value.value)
47
- end
47
+ def self.#{method}
48
+ get_values.by_value(#{value.inspect}.freeze)
49
+ end
50
+ RUBY
48
51
 
49
52
  enum_value
50
53
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+ require_relative "base_enum_mapper"
3
+
4
+ class ReeEnum::IntegerValueEnumMapper < ReeEnum::BaseEnumMapper
5
+ contract(
6
+ ReeEnum::Value,
7
+ Kwargs[
8
+ name: String,
9
+ role: Nilor[Symbol, ArrayOf[Symbol]]
10
+ ] => Integer
11
+ )
12
+ def serialize(value, name:, role: nil)
13
+ value.value
14
+ end
15
+
16
+ contract(
17
+ Any,
18
+ Kwargs[
19
+ name: String,
20
+ role: Nilor[Symbol, ArrayOf[Symbol]]
21
+ ] => ReeEnum::Value
22
+ ).throws(ReeMapper::CoercionError)
23
+ def cast(value, name:, role: nil)
24
+ enum_value = case value
25
+ when Integer
26
+ @enum.get_values.by_value(value)
27
+ when String
28
+ value = Integer(value, exception: false)
29
+ if !value.nil?
30
+ @enum.get_values.by_value(value)
31
+ end
32
+ when ReeEnum::Value
33
+ @enum.get_values.each.find { _1 == value }
34
+ end
35
+
36
+ if enum_value.nil?
37
+ raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}"
38
+ end
39
+
40
+ enum_value
41
+ end
42
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ require_relative "base_enum_mapper"
3
+
4
+ class ReeEnum::StringValueEnumMapper < ReeEnum::BaseEnumMapper
5
+ contract(
6
+ ReeEnum::Value,
7
+ Kwargs[
8
+ name: String,
9
+ role: Nilor[Symbol, ArrayOf[Symbol]]
10
+ ] => String
11
+ )
12
+ def serialize(value, name:, role: nil)
13
+ value.value
14
+ end
15
+
16
+ contract(
17
+ Any,
18
+ Kwargs[
19
+ name: String,
20
+ role: Nilor[Symbol, ArrayOf[Symbol]]
21
+ ] => ReeEnum::Value
22
+ ).throws(ReeMapper::CoercionError)
23
+ def cast(value, name:, role: nil)
24
+ enum_value = case value
25
+ when String
26
+ @enum.get_values.by_value(value)
27
+ when ReeEnum::Value
28
+ @enum.get_values.each.find { _1 == value }
29
+ end
30
+
31
+ if enum_value.nil?
32
+ raise ReeMapper::CoercionError, "`#{name}` should be one of #{enum_inspection}"
33
+ end
34
+
35
+ enum_value
36
+ end
37
+ end
@@ -3,7 +3,7 @@
3
3
  class ReeEnum::Value
4
4
  attr_reader :enum_class, :enum_name, :value, :method, :mapped_value
5
5
 
6
- contract(Class, Symbol, String, Or[Integer, String], Symbol => Any)
6
+ contract(Class, Symbol, Or[String, Integer], Or[Integer, String], Symbol => Any)
7
7
  def initialize(enum_class, enum_name, value, mapped_value, method)
8
8
  @enum_class = enum_class
9
9
  @enum_name = enum_name
@@ -13,25 +13,21 @@ class ReeEnum::Value
13
13
  end
14
14
 
15
15
  def to_s
16
- value
16
+ value.to_s
17
17
  end
18
18
 
19
19
  def as_json(*args)
20
- to_s
20
+ value
21
21
  end
22
22
 
23
23
  contract(Or[ReeEnum::Value, String, Symbol, Integer, Any] => Bool)
24
24
  def ==(compare)
25
25
  if compare.is_a?(self.class)
26
26
  value == compare.value
27
- elsif compare.is_a?(Symbol)
28
- value == compare.to_s
29
- elsif compare.is_a?(String)
30
- value == compare || mapped_value == compare
31
- elsif compare.is_a?(Integer)
32
- mapped_value == compare
27
+ elsif compare.is_a?(Symbol) && value.is_a?(String)
28
+ value.to_sym == compare
33
29
  else
34
- false
30
+ value == compare || mapped_value == compare
35
31
  end
36
32
  end
37
33
 
@@ -11,6 +11,11 @@ class ReeEnum::Values
11
11
  @collection_by_mapped_value = {}
12
12
  end
13
13
 
14
+ def value_type
15
+ raise ArgumentError, "value_type is not defined" unless defined?(@value_type)
16
+ @value_type
17
+ end
18
+
14
19
  def to_a
15
20
  @collection
16
21
  end
@@ -19,12 +24,13 @@ class ReeEnum::Values
19
24
  @collection.each(&)
20
25
  end
21
26
 
22
- contract(Or[Symbol, String] => Nilor[ReeEnum::Value])
27
+ contract(Or[Symbol, String, Integer] => Nilor[ReeEnum::Value])
23
28
  def by_value(value)
24
- @collection_by_value[value.to_s]
29
+ value = value.to_s if value.is_a?(Symbol)
30
+ @collection_by_value[value]
25
31
  end
26
32
 
27
- contract(Or[Symbol, String] => ReeEnum::Value).throws(ArgumentError)
33
+ contract(Or[Symbol, String, Integer] => ReeEnum::Value).throws(ArgumentError)
28
34
  def by_value!(value)
29
35
  by_value(value) ||
30
36
  (raise ArgumentError.new("constant for value #{value.inspect} is not found in #{self.inspect}"))
@@ -45,8 +51,14 @@ class ReeEnum::Values
45
51
  @collection.map(&:inspect).inspect
46
52
  end
47
53
 
48
- contract(String, Or[Integer, String], Symbol => ReeEnum::Value)
54
+ contract(Or[String, Integer], Or[Integer, String], Symbol => ReeEnum::Value)
49
55
  def add(value, mapped_value, method)
56
+ if @value_type.nil?
57
+ @value_type = value.class
58
+ elsif @value_type != value.class
59
+ raise ArgumentError, "#{@klass}: value types should be the same for all enum values"
60
+ end
61
+
50
62
  if @collection.any? { _1.method == method }
51
63
  raise ArgumentError, "#{@klass}: method #{method.inspect} was already added"
52
64
  end
@@ -37,6 +37,17 @@ RSpec.describe ReeEnum::DSL do
37
37
  register_as_mapper_type
38
38
  end
39
39
 
40
+ class Numbers
41
+ include ReeEnum::DSL
42
+
43
+ enum :numbers
44
+
45
+ val 0, method: :zero
46
+ val 1, method: :one
47
+
48
+ register_as_mapper_type
49
+ end
50
+
40
51
  class Reflexives
41
52
  include ReeEnum::DSL
42
53
 
@@ -52,19 +63,22 @@ RSpec.describe ReeEnum::DSL do
52
63
  mapper :test_mapper do
53
64
  link :states
54
65
  link :types
66
+ link :numbers
55
67
  end
56
68
 
57
69
  class Dto
58
- attr_reader :type, :state
59
- def initialize(type, state)
70
+ attr_reader :type, :state, :number
71
+ def initialize(type, state, number)
60
72
  @type = type
61
73
  @state = state
74
+ @number = number
62
75
  end
63
76
  end
64
77
 
65
78
  build_mapper.use(:serialize).use(:cast).use(:db_dump).use(:db_load, dto: Dto) do
66
79
  types :type
67
80
  states :state
81
+ numbers :number
68
82
  end
69
83
  end
70
84
 
@@ -86,6 +100,8 @@ RSpec.describe ReeEnum::DSL do
86
100
  expect(o.second).to eq(1)
87
101
  expect(o.get_values.by_value(:first)).to eq(o.first)
88
102
  expect(o.get_values.by_value(:second)).to eq(o.second)
103
+ expect(o.get_values.by_value("first")).to eq(o.first)
104
+ expect(o.get_values.by_value("second")).to eq(o.second)
89
105
  expect(o.get_values.by_mapped_value(0)).to eq(o.first)
90
106
  expect(o.get_values.by_mapped_value(1)).to eq(o.second)
91
107
  expect(o.get_values.to_a).to eq([o.first, o.second])
@@ -108,11 +124,13 @@ RSpec.describe ReeEnum::DSL do
108
124
  mapper.serialize({
109
125
  state: TestReeEnum::States.first,
110
126
  type: TestReeEnum::Types.account,
127
+ number: TestReeEnum::Numbers.zero,
111
128
  })
112
129
  ).to eq(
113
130
  {
114
131
  state: 'first',
115
- type: 'account'
132
+ type: 'account',
133
+ number: 0,
116
134
  }
117
135
  )
118
136
 
@@ -120,6 +138,7 @@ RSpec.describe ReeEnum::DSL do
120
138
  mapper.cast({
121
139
  state: 'first',
122
140
  type: 'invalid',
141
+ number: 0,
123
142
  })
124
143
  }.to raise_error(ReeMapper::CoercionError, '`type` should be one of ["account"]')
125
144
 
@@ -127,11 +146,13 @@ RSpec.describe ReeEnum::DSL do
127
146
  mapper.cast({
128
147
  state: 'first',
129
148
  type: 'account',
149
+ number: 0,
130
150
  })
131
151
  ).to eq(
132
152
  {
133
153
  state: TestReeEnum::States.first,
134
- type: TestReeEnum::Types.account
154
+ type: TestReeEnum::Types.account,
155
+ number: TestReeEnum::Numbers.zero,
135
156
  }
136
157
  )
137
158
 
@@ -139,11 +160,27 @@ RSpec.describe ReeEnum::DSL do
139
160
  mapper.cast({
140
161
  state: TestReeEnum::States.first,
141
162
  type: TestReeEnum::Types.account,
163
+ number: TestReeEnum::Numbers.zero,
142
164
  })
143
165
  ).to eq(
144
166
  {
145
167
  state: TestReeEnum::States.first,
146
- type: TestReeEnum::Types.account
168
+ type: TestReeEnum::Types.account,
169
+ number: TestReeEnum::Numbers.zero,
170
+ }
171
+ )
172
+
173
+ expect(
174
+ mapper.cast({
175
+ state: TestReeEnum::States.first,
176
+ type: TestReeEnum::Types.account,
177
+ number: TestReeEnum::Numbers.zero,
178
+ })
179
+ ).to eq(
180
+ {
181
+ state: "first",
182
+ type: "account",
183
+ number: 0,
147
184
  }
148
185
  )
149
186
 
@@ -151,23 +188,28 @@ RSpec.describe ReeEnum::DSL do
151
188
  mapper.db_dump({
152
189
  state: TestReeEnum::States.first,
153
190
  type: TestReeEnum::Types.account,
191
+ number: TestReeEnum::Numbers.zero,
154
192
  })
155
193
  ).to eq(
156
194
  {
157
195
  state: 0,
158
- type: "account"
196
+ type: "account",
197
+ number: 0,
159
198
  }
160
199
  )
161
200
 
162
201
  dto = mapper.db_load({
163
202
  state: 0,
164
203
  type: "account",
204
+ number: 0,
165
205
  })
166
206
 
167
207
  expect(dto.state).to eq(TestReeEnum::States.first)
168
208
  expect(dto.state).to be_a(ReeEnum::Value)
169
209
  expect(dto.type).to eq(TestReeEnum::Types.account)
170
210
  expect(dto.type).to be_a(ReeEnum::Value)
211
+ expect(dto.number).to eq(TestReeEnum::Numbers.zero)
212
+ expect(dto.number).to be_a(ReeEnum::Value)
171
213
 
172
214
  expect(TestReeEnum::Reflexives.myself).to eq(:self)
173
215
  }
@@ -6,14 +6,15 @@ class ReeHash::Slice
6
6
  fn :slice do
7
7
  link :build_filter_keys
8
8
  link 'ree_hash/contracts/hash_keys_contract', -> { HashKeysContract }
9
- def_error { MissingKeyErr }
10
- def_error { InvalidFilterKey }
11
9
  end
12
10
 
11
+ MissingKeyErr = Class.new(ArgumentError)
12
+ InvalidFilterKey = Class.new(ArgumentError)
13
+
13
14
  doc(<<~DOC)
14
15
  Replaces the hash with only the given keys.
15
16
  Returns a hash containing the removed key/value pairs.
16
-
17
+
17
18
  hash = { a: 1, b: {e: 2, f: 1}, c: 3, d: 4 }
18
19
  slice(hash, [:a, :b]) # => {a: 1, b: 2}
19
20
  slice(hash, [:a, b: [:e]]) # => {a: 1, b: {e: 2}}
@@ -17,7 +17,7 @@
17
17
  {
18
18
  "arg": "locale",
19
19
  "arg_type": "req",
20
- "type": "Symbol"
20
+ "type": "Or[Symbol, String]"
21
21
  }
22
22
  ]
23
23
  }
@@ -15,11 +15,11 @@ class ReeMapper::Integer < ReeMapper::AbstractType
15
15
  if value.is_a?(Integer)
16
16
  value
17
17
  elsif value.is_a?(String)
18
- begin
19
- Integer(value)
20
- rescue ArgumentError => e
18
+ value = Integer(value, exception: false)
19
+ if value.nil?
21
20
  raise ReeMapper::CoercionError, "`#{name}` is invalid integer"
22
21
  end
22
+ value
23
23
  else
24
24
  raise ReeMapper::TypeError, "`#{name}` should be an integer"
25
25
  end
@@ -3,9 +3,9 @@
3
3
  class ReeObject::ToHash
4
4
  include Ree::FnDSL
5
5
 
6
- fn :to_hash do
7
- def_error { RecursiveObjectErr }
8
- end
6
+ fn :to_hash
7
+
8
+ RecursiveObjectErr = Class.new(ArgumentError)
9
9
 
10
10
  BASIC_TYPES = [
11
11
  Date, Time, Numeric, String, FalseClass, TrueClass, NilClass, Symbol,
@@ -1,7 +1 @@
1
- Ree.add_error_types(
2
- :invalid_param,
3
- :not_found,
4
- :validation
5
- )
6
-
7
1
  Ree.set_performance_mode
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.71"
4
+ VERSION = "1.0.73"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ree_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.71
4
+ version: 1.0.73
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-08-28 00:00:00.000000000 Z
11
+ date: 2023-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ree
@@ -809,9 +809,12 @@ files:
809
809
  - lib/ree_lib/packages/ree_enum/Package.schema.json
810
810
  - lib/ree_lib/packages/ree_enum/bin/console
811
811
  - lib/ree_lib/packages/ree_enum/package/ree_enum.rb
812
+ - lib/ree_lib/packages/ree_enum/package/ree_enum/base_enum_mapper.rb
812
813
  - lib/ree_lib/packages/ree_enum/package/ree_enum/contractable.rb
813
814
  - lib/ree_lib/packages/ree_enum/package/ree_enum/dsl.rb
814
815
  - lib/ree_lib/packages/ree_enum/package/ree_enum/enumerable.rb
816
+ - lib/ree_lib/packages/ree_enum/package/ree_enum/integer_value_enum_mapper.rb
817
+ - lib/ree_lib/packages/ree_enum/package/ree_enum/string_value_enum_mapper.rb
815
818
  - lib/ree_lib/packages/ree_enum/package/ree_enum/value.rb
816
819
  - lib/ree_lib/packages/ree_enum/package/ree_enum/values.rb
817
820
  - lib/ree_lib/packages/ree_enum/spec/package_schema_spec.rb