ree_lib 1.0.37 → 1.0.38
Sign up to get free protection for your applications and to get access to all the features.
- 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
|