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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/functions/build_mapper_factory.rb +4 -0
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb +17 -10
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper_factory.rb +73 -35
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/types/any.rb +23 -0
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/wrappers/abstract_wrapper.rb +8 -0
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/{types → wrappers}/array.rb +10 -17
- data/lib/ree_lib/packages/ree_mapper/package/ree_mapper.rb +5 -1
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/mapper_factory_spec.rb +62 -2
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/any_spec.rb +47 -0
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/type_options_spec.rb +4 -4
- data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/{types → wrappers}/array_spec.rb +7 -7
- data/lib/ree_lib/packages/ree_swagger/package/ree_swagger/beans/type_definitions_repo.rb +1 -1
- data/lib/ree_lib/packages/ree_swagger/spec/functions/build_parameters_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_swagger/spec/functions/build_serializer_schema_spec.rb +3 -3
- data/lib/ree_lib/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f94479d9a955ba5ba5f65a8eba245bfab7c050b5a55e16a5de1773d920837bf
|
4
|
+
data.tar.gz: e45a2a8f9166d4ed50d3cbc58a3bb73cb026adf3b09a8b32f64af986c1e15bdb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93db2ec2423d53c97f2ae8a43e989f18c9d6d47e062686d1f89d9f45c58b90eca0778eb6c7ed20f1f16a35d85af7474e3a230f89f437d146817539626df25bbf
|
7
|
+
data.tar.gz: fec05fa12a474168bc340ecf473a7cef26aa1ce8d7a0845e459c419228ddb954f52cacd35e4a4a58ca8ab7574218a47e274f55d4793e23c102801c81993b7c88
|
data/Gemfile.lock
CHANGED
@@ -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(
|
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
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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(
|
99
|
-
def add_field(
|
100
|
-
|
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 =>
|
21
|
+
contract(Symbol, ReeMapper::Mapper => SubclassOf[self]).throws(ArgumentError)
|
22
22
|
def self.register_mapper(name, type)
|
23
|
-
raise ArgumentError, "
|
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, "
|
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
|
-
|
46
|
+
field = ReeMapper::Field.new(type, field_name, optional: optional, **opts)
|
47
47
|
|
48
|
-
|
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
|
-
|
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
|
@@ -1,22 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
class ReeMapper::Array < ReeMapper::
|
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? &&
|
9
|
+
if _1.nil? && subject.null
|
17
10
|
_1
|
18
11
|
else
|
19
|
-
|
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? &&
|
25
|
+
if _1.nil? && subject.null
|
33
26
|
_1
|
34
27
|
else
|
35
|
-
|
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? &&
|
41
|
+
if _1.nil? && subject.null
|
49
42
|
_1
|
50
43
|
else
|
51
|
-
|
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? &&
|
57
|
+
if _1.nil? && subject.null
|
65
58
|
_1
|
66
59
|
else
|
67
|
-
|
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, '
|
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,
|
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,
|
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,
|
21
|
-
array? :ary_of_ary,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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.
|
30
|
+
items: build_serializer_schema.(type.subject.type)
|
31
31
|
}
|
32
32
|
},
|
33
33
|
ReeMapper::DateTime => ->(*) {
|
@@ -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:
|
42
|
+
integer :id, doc: 'Identificator'
|
43
43
|
string :name
|
44
44
|
bool :is_admin
|
45
45
|
float :free_space
|
46
|
-
array :tags,
|
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,
|
52
|
+
array :many_settings, setting
|
53
53
|
|
54
54
|
hash :cart do
|
55
55
|
integer :size
|
data/lib/ree_lib/version.rb
CHANGED
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.
|
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-
|
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/
|
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/
|
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
|