ree_lib 1.0.37 → 1.0.38

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: bfa479493ff3b8d80a181db242e9f443324b5c7f46b3629dae816f06eb2fd758
4
- data.tar.gz: 371e0a229e967c47f8ad61de6c86aba1bb0e0b17651bf6447e7727734629e294
3
+ metadata.gz: 9f94479d9a955ba5ba5f65a8eba245bfab7c050b5a55e16a5de1773d920837bf
4
+ data.tar.gz: e45a2a8f9166d4ed50d3cbc58a3bb73cb026adf3b09a8b32f64af986c1e15bdb
5
5
  SHA512:
6
- metadata.gz: 71b4a7f35d1a0569af42794acf8bf8c1193cf390ca773fd6ebab395cb86192199496812c9ae356e29a299a453304d6c25217cd20d9bd7884ded1e10fa798d68f
7
- data.tar.gz: c5b3cf9ea44d8012ea7be12cf8ef9f33ac735a28c8d9bb384bf69fec6f8bc7932b7a1cf6f43be4439d7fa220b3cc2e630d8e0816b75c732fcb9b13e3e1b6ef22
6
+ metadata.gz: 93db2ec2423d53c97f2ae8a43e989f18c9d6d47e062686d1f89d9f45c58b90eca0778eb6c7ed20f1f16a35d85af7474e3a230f89f437d146817539626df25bbf
7
+ data.tar.gz: fec05fa12a474168bc340ecf473a7cef26aa1ce8d7a0845e459c419228ddb954f52cacd35e4a4a58ca8ab7574218a47e274f55d4793e23c102801c81993b7c88
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ree_lib (1.0.37)
4
+ ree_lib (1.0.38)
5
5
  binding_of_caller (~> 1.0.0)
6
6
  i18n (~> 1.12.0)
7
7
  loofah (~> 2.18.0)
@@ -15,6 +15,7 @@ class ReeMapper::BuildMapperFactory
15
15
 
16
16
  klass.instance_eval {
17
17
  @types = {}
18
+ @wrappers = {}
18
19
  @strategies = strategies
19
20
  }
20
21
 
@@ -25,6 +26,9 @@ class ReeMapper::BuildMapperFactory
25
26
  klass.register_type(:float, ReeMapper::Float.new)
26
27
  klass.register_type(:integer, ReeMapper::Integer.new)
27
28
  klass.register_type(:string, ReeMapper::String.new)
29
+ klass.register_type(:any, ReeMapper::Any.new)
30
+
31
+ klass.register_wrapper(:array, ReeMapper::Array)
28
32
 
29
33
  klass
30
34
  end
@@ -1,13 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ReeMapper::Mapper
4
- contract(ArrayOf[ReeMapper::MapperStrategy], Nilor[ReeMapper::AbstractType] => Any).throws(ReeMapper::UnsupportedTypeError)
4
+ contract(
5
+ ArrayOf[ReeMapper::MapperStrategy],
6
+ Nilor[ReeMapper::AbstractType, ReeMapper::AbstractWrapper] => self
7
+ ).throws(ReeMapper::UnsupportedTypeError)
5
8
  def self.build(strategies, type = nil)
6
9
  if type
7
10
  strategies.each do |strategy|
8
11
  method = strategy.method
9
12
  next if type.respond_to?(method)
10
- raise ReeMapper::UnsupportedTypeError, "type #{type.inspect} should implement method `#{method}`"
13
+
14
+ raise ReeMapper::UnsupportedTypeError, "#{type.class} should implement method `#{method}`"
11
15
  end
12
16
  end
13
17
 
@@ -20,11 +24,13 @@ class ReeMapper::Mapper
20
24
  if type
21
25
  class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
22
26
  def #{method}(obj, name: nil, role: nil, only: nil, except: nil, fields_filters: [])
23
- if @type.is_a?(ReeMapper::Array)
24
- @type.#{method}(obj, name: name, role: role, fields_filters: fields_filters)
25
- else
26
- @type.#{method}(obj, name: name, role: role)
27
- end
27
+ #{
28
+ if type.is_a?(ReeMapper::AbstractWrapper)
29
+ "@type.#{method}(obj, name: name, role: role, fields_filters: fields_filters)"
30
+ else
31
+ "@type.#{method}(obj, name: name, role: role)"
32
+ end
33
+ }
28
34
  end
29
35
  RUBY
30
36
  else
@@ -95,9 +101,10 @@ class ReeMapper::Mapper
95
101
  end
96
102
  end
97
103
 
98
- contract(Any, Symbol, Ksplat[RestKeys => Any] => nil)
99
- def add_field(type, name, **opts)
100
- @fields[name] = ReeMapper::Field.new(type, name, **opts)
104
+ contract(ReeMapper::Field => nil)
105
+ def add_field(field)
106
+ raise ArgumentError if field.name.nil?
107
+ @fields[field.name] = field
101
108
  nil
102
109
  end
103
110
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  class ReeMapper::MapperFactory
4
4
  class << self
5
- attr_reader :types, :strategies
5
+ attr_reader :types, :strategies, :wrappers
6
6
  end
7
7
 
8
8
  contract(Symbol => Nilor[ReeMapper::MapperStrategy])
@@ -18,9 +18,9 @@ class ReeMapper::MapperFactory
18
18
  )
19
19
  end
20
20
 
21
- contract(Symbol, ReeMapper::Mapper => Class).throws(ArgumentError)
21
+ contract(Symbol, ReeMapper::Mapper => SubclassOf[self]).throws(ArgumentError)
22
22
  def self.register_mapper(name, type)
23
- raise ArgumentError, "name of mapper type should not end with `?`" if name.to_s.end_with?('?')
23
+ raise ArgumentError, "mapper registration name should not end with `?`" if name.to_s.end_with?('?')
24
24
 
25
25
  defined_strategy_method = types[name]&.flat_map(&:strategy_methods)&.detect { type.find_strategy(_1) }
26
26
  raise ArgumentError, "type :#{name} with `#{defined_strategy_method}` strategy already registered" if defined_strategy_method
@@ -35,7 +35,7 @@ class ReeMapper::MapperFactory
35
35
  class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
36
36
  def #{name}(field_name = nil, optional: false, **opts)
37
37
  raise ReeMapper::Error, "invalid DSL usage" unless @mapper
38
- raise ArgumentError, "array item can't be optional" if field_name.nil? && optional
38
+ raise ArgumentError, "wrapped item can't be optional" if field_name.nil? && optional
39
39
 
40
40
  type = self.class.types.fetch(:#{name}).detect { (@mapper.strategy_methods - _1.strategy_methods).empty? }
41
41
 
@@ -43,9 +43,11 @@ class ReeMapper::MapperFactory
43
43
  raise ReeMapper::UnsupportedTypeError, "type :#{name} should implement `\#{@mapper.strategy_methods.join(', ')}`"
44
44
  end
45
45
 
46
- return ReeMapper::Field.new(type, optional: optional, **opts) unless field_name
46
+ field = ReeMapper::Field.new(type, field_name, optional: optional, **opts)
47
47
 
48
- @mapper.add_field(type, field_name, optional: optional, **opts)
48
+ return field unless field_name
49
+
50
+ @mapper.add_field(field)
49
51
  end
50
52
 
51
53
  def #{name}?(field_name, **opts)
@@ -56,6 +58,68 @@ class ReeMapper::MapperFactory
56
58
  self
57
59
  end
58
60
 
61
+ contract(Symbol, SubclassOf[ReeMapper::AbstractWrapper] => SubclassOf[self])
62
+ def self.register_wrapper(name, wrapper)
63
+ raise ArgumentError, "wrapper registration name should not end with `?`" if name.to_s.end_with?('?')
64
+ raise ArgumentError, "method :#{name} already defined" if !wrappers.key?(name) && method_defined?(name)
65
+
66
+ wrappers[name] ||= []
67
+ wrappers[name] << wrapper
68
+
69
+ class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
70
+ contract(
71
+ Nilor[Symbol, ReeMapper::Field],
72
+ Nilor[ReeMapper::Field],
73
+ Kwargs[optional: Bool, dto: Nilor[Class]],
74
+ Ksplat[RestKeys => Any],
75
+ Optblock => Nilor[ReeMapper::Field]
76
+ ).throws(ReeMapper::Error, ArgumentError, ReeMapper::UnsupportedTypeError)
77
+ def #{name}(field_name = nil, subject = nil, optional: false, dto: nil, **opts, &blk)
78
+ raise ReeMapper::Error, "invalid DSL usage" unless @mapper
79
+ raise ArgumentError, 'wrapped type does not permit :dto without :block' if dto && !blk
80
+
81
+ if field_name.is_a?(ReeMapper::Field)
82
+ raise ArgumentError, "field_name should be a Symbol" if subject
83
+
84
+ subject = field_name
85
+ field_name = nil
86
+ end
87
+
88
+ raise ArgumentError, "wrapped item can't be optional" if field_name.nil? && optional
89
+ raise ArgumentError, "wrapped type should use either :subject or :block" if subject && blk || !subject && !blk
90
+
91
+ if blk
92
+ subject = ReeMapper::Field.new(
93
+ hash_from_blk(dto: dto, &blk)
94
+ )
95
+ end
96
+
97
+ wrapper = self.class.wrappers.fetch(:#{name}).detect do |wrapper|
98
+ @mapper.strategy_methods.all? { wrapper.method_defined?(_1) }
99
+ end
100
+
101
+ unless wrapper
102
+ raise ReeMapper::UnsupportedTypeError, "wrapper :#{name} should implement `\#{@mapper.strategy_methods.join(', ')}`"
103
+ end
104
+
105
+ type = ReeMapper::Mapper.build(@mapper.strategies, wrapper.new(subject))
106
+ type.name = :#{name}
107
+
108
+ field = ReeMapper::Field.new(type, field_name, optional: optional, **opts)
109
+
110
+ return field unless field_name
111
+
112
+ @mapper.add_field(field)
113
+ end
114
+
115
+ def #{name}?(*args, **opts, &blk)
116
+ #{name}(*args, optional: true, **opts, &blk)
117
+ end
118
+ RUBY
119
+
120
+ self
121
+ end
122
+
59
123
  contract(
60
124
  Kwargs[
61
125
  register_as: Nilor[Symbol]
@@ -71,41 +135,15 @@ class ReeMapper::MapperFactory
71
135
  @mapper = mapper
72
136
  end
73
137
 
74
- contract(Nilor[Symbol], Kwargs[each: Nilor[ReeMapper::Field], optional: Bool, dto: Nilor[Class]], Ksplat[RestKeys => Any], Optblock => Nilor[ReeMapper::Field])
75
- def array(field_name = nil, each: nil, optional: false, dto: nil, **opts, &blk)
76
- raise ReeMapper::Error, "invalid DSL usage" unless @mapper
77
- raise ArgumentError, "array item can't be optional" if field_name.nil? && optional
78
- raise ArgumentError, 'array type should use either :each or :block' if each && blk || !each && !blk
79
- raise ArgumentError, 'array does not permit :dto without :block' if dto && !blk
80
- raise ArgumentError, 'array does not permit :only and :except keys' if opts.key?(:only) || opts.key?(:except)
81
-
82
- if blk
83
- each = ReeMapper::Field.new(
84
- hash_from_blk(dto: dto, &blk)
85
- )
86
- end
87
-
88
- type = ReeMapper::Mapper.build(@mapper.strategies, ReeMapper::Array.new(each))
89
-
90
- return ReeMapper::Field.new(type, optional: optional, **opts) unless field_name
91
-
92
- @mapper.add_field(type, field_name, optional: optional, **opts)
93
- end
94
-
95
- contract(Symbol, Kwargs[each: Nilor[ReeMapper::Field]], Ksplat[RestKeys => Any], Optblock => Nilor[ReeMapper::Field])
96
- def array?(field_name, each: nil, **opts, &blk)
97
- raise ArgumentError if opts.key?(:optional)
98
-
99
- array(field_name, each: each, optional: true, **opts, &blk)
100
- end
101
-
102
138
  contract(Symbol, Kwargs[dto: Nilor[Class]], Ksplat[RestKeys => Any], Block => nil)
103
139
  def hash(field_name, dto: nil, **opts, &blk)
104
140
  raise ReeMapper::Error, "invalid DSL usage" unless @mapper
105
141
 
106
142
  type = hash_from_blk(dto: dto, &blk)
107
143
 
108
- @mapper.add_field(type, field_name, **opts)
144
+ field = ReeMapper::Field.new(type, field_name, **opts)
145
+
146
+ @mapper.add_field(field)
109
147
  end
110
148
 
111
149
  contract(Symbol, Ksplat[RestKeys => Any], Block => nil)
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ReeMapper::Any < ReeMapper::AbstractType
4
+ contract(Any, Kwargs[name: String, role: Nilor[Symbol, ArrayOf[Symbol]]] => Any)
5
+ def serialize(value, name:, role: nil)
6
+ value
7
+ end
8
+
9
+ contract(Any , Kwargs[name: String, role: Nilor[Symbol, ArrayOf[Symbol]]] => Any)
10
+ def cast(value, name:, role: nil)
11
+ value
12
+ end
13
+
14
+ contract(Any, Kwargs[name: String, role: Nilor[Symbol, ArrayOf[Symbol]]] => Any)
15
+ def db_dump(value, name:, role: nil)
16
+ value
17
+ end
18
+
19
+ contract(Any, Kwargs[name: String, role: Nilor[Symbol, ArrayOf[Symbol]]] => Any)
20
+ def db_load(value, name:, role: nil)
21
+ value
22
+ end
23
+ end
@@ -0,0 +1,8 @@
1
+ class ReeMapper::AbstractWrapper
2
+ attr_reader :subject
3
+
4
+ contract ReeMapper::Field => Any
5
+ def initialize(field)
6
+ @subject = field
7
+ end
8
+ end
@@ -1,22 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class ReeMapper::Array < ReeMapper::AbstractType
4
- attr_reader :of
5
-
6
- contract ReeMapper::Field => Any
7
- def initialize(of)
8
- @of = of
9
- end
10
-
3
+ class ReeMapper::Array < ReeMapper::AbstractWrapper
11
4
  contract(Any, Kwargs[name: String, role: Nilor[Symbol, ArrayOf[Symbol]], fields_filters: ArrayOf[ReeMapper::FieldsFilter]] => Array)
12
5
  .throws(ReeMapper::TypeError)
13
6
  def serialize(value, name:, role: nil, fields_filters: [])
14
7
  if value.is_a?(Array)
15
8
  value.map.with_index {
16
- if _1.nil? && of.null
9
+ if _1.nil? && subject.null
17
10
  _1
18
11
  else
19
- of.type.serialize(_1, name: "#{name}[#{_2}]", role: role, fields_filters: fields_filters + [of.fields_filter])
12
+ subject.type.serialize(_1, name: "#{name}[#{_2}]", role: role, fields_filters: fields_filters + [subject.fields_filter])
20
13
  end
21
14
  }
22
15
  else
@@ -29,10 +22,10 @@ class ReeMapper::Array < ReeMapper::AbstractType
29
22
  def cast(value, name:, role: nil, fields_filters: [])
30
23
  if value.is_a?(Array)
31
24
  value.map.with_index {
32
- if _1.nil? && of.null
25
+ if _1.nil? && subject.null
33
26
  _1
34
27
  else
35
- of.type.cast(_1, name: "#{name}[#{_2}]", role: role, fields_filters: fields_filters + [of.fields_filter])
28
+ subject.type.cast(_1, name: "#{name}[#{_2}]", role: role, fields_filters: fields_filters + [subject.fields_filter])
36
29
  end
37
30
  }
38
31
  else
@@ -45,10 +38,10 @@ class ReeMapper::Array < ReeMapper::AbstractType
45
38
  def db_dump(value, name:, role: nil, fields_filters: [])
46
39
  if value.is_a?(Array)
47
40
  value.map.with_index {
48
- if _1.nil? && of.null
41
+ if _1.nil? && subject.null
49
42
  _1
50
43
  else
51
- of.type.db_dump(_1, name: "#{name}[#{_2}]", role: role, fields_filters: fields_filters + [of.fields_filter])
44
+ subject.type.db_dump(_1, name: "#{name}[#{_2}]", role: role, fields_filters: fields_filters + [subject.fields_filter])
52
45
  end
53
46
  }
54
47
  else
@@ -61,14 +54,14 @@ class ReeMapper::Array < ReeMapper::AbstractType
61
54
  def db_load(value, name:, role: nil, fields_filters: [])
62
55
  if value.is_a?(Array)
63
56
  value.map.with_index {
64
- if _1.nil? && of.null
57
+ if _1.nil? && subject.null
65
58
  _1
66
59
  else
67
- of.type.db_load(_1, name: "#{name}[#{_2}]", role: role, fields_filters: fields_filters + [of.fields_filter])
60
+ subject.type.db_load(_1, name: "#{name}[#{_2}]", role: role, fields_filters: fields_filters + [subject.fields_filter])
68
61
  end
69
62
  }
70
63
  else
71
64
  raise ReeMapper::TypeError, "`#{name}` should be an array"
72
65
  end
73
66
  end
74
- end
67
+ end
@@ -22,14 +22,18 @@ module ReeMapper
22
22
  require_relative 'ree_mapper/fields_filter'
23
23
  require_relative 'ree_mapper/field'
24
24
 
25
+
26
+ require_relative 'ree_mapper/wrappers/abstract_wrapper'
27
+ require_relative 'ree_mapper/wrappers/array'
28
+
25
29
  require_relative 'ree_mapper/types/bool'
30
+ require_relative 'ree_mapper/types/any'
26
31
  require_relative 'ree_mapper/types/date_time'
27
32
  require_relative 'ree_mapper/types/time'
28
33
  require_relative 'ree_mapper/types/date'
29
34
  require_relative 'ree_mapper/types/float'
30
35
  require_relative 'ree_mapper/types/integer'
31
36
  require_relative 'ree_mapper/types/string'
32
- require_relative 'ree_mapper/types/array'
33
37
 
34
38
  require_relative 'ree_mapper/strategy_outputs/strategy_output'
35
39
  require_relative 'ree_mapper/strategy_outputs/object_output'
@@ -43,7 +43,7 @@ RSpec.describe ReeMapper::MapperFactory do
43
43
  ).to eq({ val: { id: 1 } })
44
44
  }
45
45
 
46
- it 'allow to register caster and serializer with same name' do
46
+ it 'allow to register caster and serializer with the same name' do
47
47
  caster = mapper_factory.call.use(:cast) { string :name }
48
48
 
49
49
  mapper_factory.register_mapper(:new_type, serializer)
@@ -69,7 +69,7 @@ RSpec.describe ReeMapper::MapperFactory do
69
69
  it 'raise an error if the mapper name is ended by ?' do
70
70
  expect {
71
71
  mapper_factory.register_mapper(:new_type?, serializer)
72
- }.to raise_error(ArgumentError, 'name of mapper type should not end with `?`')
72
+ }.to raise_error(ArgumentError, 'mapper registration name should not end with `?`')
73
73
  end
74
74
 
75
75
  it 'raise an error if the mapper name is reserved' do
@@ -79,6 +79,66 @@ RSpec.describe ReeMapper::MapperFactory do
79
79
  end
80
80
  end
81
81
 
82
+ describe '.register_wrapper' do
83
+ let(:round_wrapper) {
84
+ Class.new(ReeMapper::AbstractWrapper) do
85
+ def serialize(value, name:, **opts)
86
+ raise ReeMapper::TypeError, "`#{name}` should be a number" if !value.is_a?(Numeric)
87
+
88
+ subject.type.serialize(value.round, name: name, **opts)
89
+ end
90
+ end
91
+ }
92
+
93
+ it {
94
+ mapper_factory.register_wrapper(:round, round_wrapper)
95
+
96
+ expect(
97
+ mapper_factory.call.use(:serialize) { round :val, integer }.serialize({ val: 1.1 })
98
+ ).to eq({ val: 1 })
99
+ }
100
+
101
+ it 'allow to register caster and serializer with the same name' do
102
+ caster_round_wrapper = Class.new(ReeMapper::AbstractWrapper) do
103
+ def cast(value, name:, **opts)
104
+ value = subject.type.cast(value, name: name, **opts)
105
+
106
+ raise ReeMapper::TypeError, "`#{name}` should be a number" if !value.is_a?(Numeric)
107
+ value.round
108
+ end
109
+ end
110
+
111
+ mapper_factory.register_wrapper(:round, round_wrapper)
112
+ mapper_factory.register_wrapper(:round, caster_round_wrapper)
113
+
114
+ expect(
115
+ mapper_factory.call.use(:serialize) { round :val, integer }.serialize({ val: 1.1 })
116
+ ).to eq({ val: 1 })
117
+
118
+ expect(
119
+ mapper_factory.call.use(:cast) { round :val, float }.cast({ val: '1.1' })
120
+ ).to eq({ val: 1 })
121
+ end
122
+
123
+ it 'raise an error if the registration wrapper name is ended by ?' do
124
+ expect {
125
+ mapper_factory.register_wrapper(:new_type?, round_wrapper)
126
+ }.to raise_error(ArgumentError, 'wrapper registration name should not end with `?`')
127
+ end
128
+
129
+ it 'raise an error if name is reserved' do
130
+ expect {
131
+ mapper_factory.register_wrapper(:hash, round_wrapper)
132
+ }.to raise_error(ArgumentError, 'method :hash already defined')
133
+ end
134
+
135
+ it 'raise an error if name is reserved by mapper' do
136
+ expect {
137
+ mapper_factory.register_wrapper(:integer, round_wrapper)
138
+ }.to raise_error(ArgumentError, 'method :integer already defined')
139
+ end
140
+ end
141
+
82
142
  describe '.use' do
83
143
  it {
84
144
  mapper = mapper_factory.call.use(:cast) do
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'ReeMapper::Bool' do
4
+ link :build_mapper_factory, from: :ree_mapper
5
+ link :build_mapper_strategy, from: :ree_mapper
6
+
7
+ let(:mapper_factory) {
8
+ build_mapper_factory(
9
+ strategies: [
10
+ build_mapper_strategy(method: :cast, dto: Hash),
11
+ build_mapper_strategy(method: :serialize, dto: Hash),
12
+ build_mapper_strategy(method: :db_dump, dto: Hash),
13
+ build_mapper_strategy(method: :db_load, dto: Hash)
14
+ ]
15
+ )
16
+ }
17
+
18
+ let(:mapper) {
19
+ mapper_factory.call.use(:cast).use(:serialize).use(:db_dump).use(:db_load) {
20
+ any :any
21
+ }
22
+ }
23
+
24
+ describe '#serialize' do
25
+ it {
26
+ expect(mapper.serialize({ any: true })).to eq({ any: true })
27
+ }
28
+ end
29
+
30
+ describe '#cast' do
31
+ it {
32
+ expect(mapper.cast({ 'any' => true })).to eq({ any: true })
33
+ }
34
+ end
35
+
36
+ describe '#db_dump' do
37
+ it {
38
+ expect(mapper.db_dump(OpenStruct.new({ any: true }))).to eq({ any: true })
39
+ }
40
+ end
41
+
42
+ describe '#db_load' do
43
+ it {
44
+ expect(mapper.db_load({ 'any' => true })).to eq({ any: true })
45
+ }
46
+ end
47
+ end
@@ -21,7 +21,7 @@ RSpec.describe 'ReeMapper::MapperFactory type options' do
21
21
  integer :x
22
22
  integer :y
23
23
  integer :z
24
- }
24
+ }
25
25
  }
26
26
 
27
27
  context 'with only' do
@@ -71,7 +71,7 @@ RSpec.describe 'ReeMapper::MapperFactory type options' do
71
71
  point :y, except: [:x, :z]
72
72
  end
73
73
 
74
- array :points, each: point(only: [:x, :y])
74
+ array :points, point(only: [:x, :y])
75
75
  }
76
76
  }
77
77
 
@@ -169,7 +169,7 @@ RSpec.describe 'ReeMapper::MapperFactory type options' do
169
169
  integer :number
170
170
  integer? :opt_number
171
171
  integer :opt_number_long, optional: true
172
- array? :opt_array, each: integer
172
+ array? :opt_array, integer
173
173
  array? :opt_array_with_blk do
174
174
  integer :id
175
175
  end
@@ -278,7 +278,7 @@ RSpec.describe 'ReeMapper::MapperFactory type options' do
278
278
  integer :for_all
279
279
  integer :for_admin, role: :admin
280
280
  }
281
-
281
+
282
282
  mapper_factory.call.use(:cast) {
283
283
  nested_type :my_field
284
284
  }
@@ -17,8 +17,8 @@ RSpec.describe 'ReeMapper::Array' do
17
17
 
18
18
  let(:mapper) {
19
19
  mapper_factory.call.use(:cast).use(:serialize).use(:db_dump).use(:db_load) {
20
- array :tags, each: integer
21
- array? :ary_of_ary, each: array(each: integer)
20
+ array :tags, integer
21
+ array? :ary_of_ary, array(integer)
22
22
  }
23
23
  }
24
24
 
@@ -73,7 +73,7 @@ RSpec.describe 'ReeMapper::Array' do
73
73
  context 'with array of array' do
74
74
  let(:mapper) {
75
75
  mapper_factory.call.use(:serialize) {
76
- array :coords, each: array(each: integer)
76
+ array :coords, array(integer)
77
77
  }
78
78
  }
79
79
 
@@ -85,7 +85,7 @@ RSpec.describe 'ReeMapper::Array' do
85
85
  context 'with nullable element of array' do
86
86
  let(:mapper) {
87
87
  mapper_factory.call.use(:serialize) {
88
- array :tags, each: integer(null: true)
88
+ array :tags, integer(null: true)
89
89
  }
90
90
  }
91
91
 
@@ -98,7 +98,7 @@ RSpec.describe 'ReeMapper::Array' do
98
98
  it {
99
99
  expect {
100
100
  mapper_factory.call.use(:serialize) {
101
- array :tags, each: integer?
101
+ array :tags, integer?
102
102
  }
103
103
  }.to raise_error(ArgumentError)
104
104
  }
@@ -106,7 +106,7 @@ RSpec.describe 'ReeMapper::Array' do
106
106
  it {
107
107
  expect {
108
108
  mapper_factory.call.use(:serialize) {
109
- array :tags, each: integer(optional: true)
109
+ array :tags, integer(optional: true)
110
110
  }
111
111
  }.to raise_error(ArgumentError)
112
112
  }
@@ -114,7 +114,7 @@ RSpec.describe 'ReeMapper::Array' do
114
114
  it {
115
115
  expect {
116
116
  mapper_factory.call.use(:serialize) {
117
- array :tags, each: array(each: integer, optional: true)
117
+ array :tags, array(integer, optional: true)
118
118
  }
119
119
  }.to raise_error(ArgumentError)
120
120
  }
@@ -27,7 +27,7 @@ class ReeSwagger::TypeDefinitionsRepo
27
27
  ReeMapper::Array => ->(type, build_serializer_schema) {
28
28
  {
29
29
  type: 'array',
30
- items: build_serializer_schema.(type.of.type)
30
+ items: build_serializer_schema.(type.subject.type)
31
31
  }
32
32
  },
33
33
  ReeMapper::DateTime => ->(*) {
@@ -30,7 +30,7 @@ RSpec.describe :build_parameters_spec do
30
30
 
31
31
  it {
32
32
  caster = mapper_factory.call.use(:cast) do
33
- array :id, each: string
33
+ array :id, string
34
34
  end
35
35
 
36
36
  expect {
@@ -39,17 +39,17 @@ RSpec.describe :build_serializer_schema do
39
39
  end
40
40
 
41
41
  mapper_factory.call.use(:serialize) do
42
- integer :id, doc: 'Identificator'
42
+ integer :id, doc: 'Identificator'
43
43
  string :name
44
44
  bool :is_admin
45
45
  float :free_space
46
- array :tags, each: string
46
+ array :tags, string
47
47
  date_time :created_at
48
48
  date :birth_day
49
49
  time :updated_at
50
50
 
51
51
  setting :one_setting
52
- array :many_settings, each: setting
52
+ array :many_settings, setting
53
53
 
54
54
  hash :cart do
55
55
  integer :size
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.37"
4
+ VERSION = "1.0.38"
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.37
4
+ version: 1.0.38
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-03-12 00:00:00.000000000 Z
11
+ date: 2023-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ree
@@ -967,7 +967,7 @@ files:
967
967
  - lib/ree_lib/packages/ree_mapper/package/ree_mapper/strategy_outputs/strategy_output.rb
968
968
  - lib/ree_lib/packages/ree_mapper/package/ree_mapper/strategy_outputs/struct_output.rb
969
969
  - lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/abstract_type.rb
970
- - lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/array.rb
970
+ - lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/any.rb
971
971
  - lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/bool.rb
972
972
  - lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/date.rb
973
973
  - lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/date_time.rb
@@ -975,6 +975,8 @@ files:
975
975
  - lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/integer.rb
976
976
  - lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/string.rb
977
977
  - lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/time.rb
978
+ - lib/ree_lib/packages/ree_mapper/package/ree_mapper/wrappers/abstract_wrapper.rb
979
+ - lib/ree_lib/packages/ree_mapper/package/ree_mapper/wrappers/array.rb
978
980
  - lib/ree_lib/packages/ree_mapper/schemas/ree_mapper/default_factory.schema.json
979
981
  - lib/ree_lib/packages/ree_mapper/schemas/ree_mapper/functions/build_mapper_factory.schema.json
980
982
  - lib/ree_lib/packages/ree_mapper/schemas/ree_mapper/functions/build_mapper_strategy.schema.json
@@ -984,7 +986,7 @@ files:
984
986
  - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/functions/build_mapper_strategy_spec.rb
985
987
  - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/mapper_factory_spec.rb
986
988
  - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/mapper_spec.rb
987
- - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/array_spec.rb
989
+ - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/any_spec.rb
988
990
  - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/bool_spec.rb
989
991
  - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/date_spec.rb
990
992
  - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/date_time_spec.rb
@@ -994,6 +996,7 @@ files:
994
996
  - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/string_spec.rb
995
997
  - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/time_spec.rb
996
998
  - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/type_options_spec.rb
999
+ - lib/ree_lib/packages/ree_mapper/spec/ree_mapper/wrappers/array_spec.rb
997
1000
  - lib/ree_lib/packages/ree_mapper/spec/spec_helper.rb
998
1001
  - lib/ree_lib/packages/ree_migrator/.gitignore
999
1002
  - lib/ree_lib/packages/ree_migrator/.rspec