yaoc 0.0.13 → 0.0.14
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/.rubocop.yml +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +5 -1
- data/Guardfile +5 -0
- data/Rakefile +3 -0
- data/examples/01_hash_enabled_constructors.rb +8 -8
- data/examples/02_procs_as_constructors.rb +11 -13
- data/examples/03_positional_constructors.rb +7 -13
- data/examples/04_compositions.rb +3 -8
- data/examples/05_fill_existing_objects.rb +2 -8
- data/examples/06_lazy_loading.rb +0 -7
- data/examples/all_examples.rb +2 -2
- data/lib/yaoc.rb +2 -3
- data/lib/yaoc/converter_builder.rb +14 -21
- data/lib/yaoc/helper/struct_hash_constructor.rb +3 -4
- data/lib/yaoc/helper/to_proc_delegator.rb +4 -6
- data/lib/yaoc/many_to_one_mapper_chain.rb +11 -13
- data/lib/yaoc/mapper_registry.rb +3 -4
- data/lib/yaoc/mapping_base.rb +11 -12
- data/lib/yaoc/mapping_to_class.rb +7 -9
- data/lib/yaoc/object_mapper.rb +10 -13
- data/lib/yaoc/one_to_many_mapper_chain.rb +4 -6
- data/lib/yaoc/strategies/to_array_mapping.rb +1 -3
- data/lib/yaoc/strategies/to_hash_mapping.rb +1 -3
- data/lib/yaoc/transformation_command.rb +27 -8
- data/lib/yaoc/transformation_deferred_command.rb +3 -5
- data/lib/yaoc/version.rb +1 -1
- data/rubocop-todo.yml +96 -0
- data/spec/acceptance/fill_existing_objects_spec.rb +30 -30
- data/spec/acceptance/map_multiple_objects_to_one_in_a_chain_spec.rb +15 -15
- data/spec/acceptance/map_objects_spec.rb +22 -22
- data/spec/acceptance/map_one_object_to_many_in_a_chain_spec.rb +15 -15
- data/spec/acceptance/map_to_objects_using_other_converters_spec.rb +53 -55
- data/spec/acceptance/map_to_objects_with_lazy_loading_spec.rb +17 -17
- data/spec/acceptance/map_to_objects_with_positional_constructors_spec.rb +19 -19
- data/spec/integration/lib/yaoc/converter_builder_spec.rb +21 -21
- data/spec/spec_helper.rb +7 -7
- data/spec/support/feature.rb +1 -2
- data/spec/unit/lib/yaoc/converter_builder_spec.rb +42 -44
- data/spec/unit/lib/yaoc/helper/struct_hash_constructor_spec.rb +15 -15
- data/spec/unit/lib/yaoc/helper/to_proc_delegator_spec.rb +11 -11
- data/spec/unit/lib/yaoc/many_to_one_mapper_chain_spec.rb +19 -20
- data/spec/unit/lib/yaoc/mapper_registry_spec.rb +6 -6
- data/spec/unit/lib/yaoc/mapping_base_spec.rb +36 -36
- data/spec/unit/lib/yaoc/mapping_to_class_spec.rb +19 -21
- data/spec/unit/lib/yaoc/object_mapper_spec.rb +45 -49
- data/spec/unit/lib/yaoc/one_to_many_mapper_chain_spec.rb +17 -18
- data/spec/unit/lib/yaoc/strategies/to_array_mapping_spec.rb +23 -24
- data/spec/unit/lib/yaoc/strategies/to_hash_mapping_spec.rb +25 -25
- data/spec/unit/lib/yaoc/transformation_command_spec.rb +13 -13
- data/spec/unit/lib/yaoc/transformation_deferred_command_spec.rb +9 -9
- data/yaoc.gemspec +1 -0
- metadata +18 -2
@@ -6,11 +6,11 @@ module Yaoc
|
|
6
6
|
end
|
7
7
|
|
8
8
|
module Initializer
|
9
|
-
def initialize(params={})
|
9
|
+
def initialize(params = {})
|
10
10
|
super()
|
11
11
|
|
12
12
|
params.each do |attr, value|
|
13
|
-
|
13
|
+
public_send("#{attr}=", value)
|
14
14
|
end if params
|
15
15
|
end
|
16
16
|
end
|
@@ -28,6 +28,5 @@ module Yaoc
|
|
28
28
|
include Equalizer.new(*args)
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
32
31
|
end
|
33
|
-
end
|
32
|
+
end
|
@@ -12,11 +12,10 @@ module Yaoc
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
15
|
def __getobj__
|
17
|
-
unless
|
16
|
+
unless _initialisation_proc_loaded
|
18
17
|
self._initialisation_proc_loaded = true
|
19
|
-
__setobj__(
|
18
|
+
__setobj__(_initialisation_proc.call)
|
20
19
|
end
|
21
20
|
|
22
21
|
super
|
@@ -35,13 +34,12 @@ module Yaoc
|
|
35
34
|
end
|
36
35
|
|
37
36
|
def _initialisation_proc_loaded?
|
38
|
-
|
37
|
+
_initialisation_proc_loaded
|
39
38
|
end
|
40
39
|
|
41
40
|
def _needs_conversion?
|
42
41
|
_initialisation_proc_loaded? && ! nil?
|
43
42
|
end
|
44
|
-
|
45
43
|
end
|
46
44
|
end
|
47
|
-
end
|
45
|
+
end
|
@@ -10,18 +10,18 @@ module Yaoc
|
|
10
10
|
self.converter = converter
|
11
11
|
end
|
12
12
|
|
13
|
-
def load_first(input_object, object_to_fill=nil)
|
13
|
+
def load_first(input_object, object_to_fill = nil)
|
14
14
|
converter_iterator.rewind
|
15
15
|
self.next_result = converter_iterator.next.load(input_object, object_to_fill)
|
16
16
|
end
|
17
17
|
|
18
18
|
def load_next(input_object)
|
19
|
-
self.next_result = converter_iterator.next.load(input_object,
|
19
|
+
self.next_result = converter_iterator.next.load(input_object, next_result)
|
20
20
|
rescue StopIteration
|
21
|
-
raise
|
21
|
+
raise 'ToManyInputObjects'
|
22
22
|
end
|
23
23
|
|
24
|
-
def load_all(input_objects, object_to_fill=nil)
|
24
|
+
def load_all(input_objects, object_to_fill = nil)
|
25
25
|
each_object_with_converter(input_objects) do |converter, input_object|
|
26
26
|
object_to_fill = converter.load(input_object, object_to_fill)
|
27
27
|
end
|
@@ -29,17 +29,16 @@ module Yaoc
|
|
29
29
|
self.last_result = object_to_fill
|
30
30
|
end
|
31
31
|
|
32
|
-
def dump_first(input_object, object_to_fill=nil)
|
32
|
+
def dump_first(input_object, object_to_fill = nil)
|
33
33
|
converter_iterator.rewind
|
34
34
|
self.next_result = converter_iterator.next.dump(input_object, object_to_fill)
|
35
35
|
end
|
36
36
|
|
37
37
|
def dump_next(input_object)
|
38
|
-
self.next_result = converter_iterator.next.dump(input_object,
|
38
|
+
self.next_result = converter_iterator.next.dump(input_object, next_result)
|
39
39
|
end
|
40
40
|
|
41
|
-
def dump_all(input_objects, object_to_fill=nil)
|
42
|
-
|
41
|
+
def dump_all(input_objects, object_to_fill = nil)
|
43
42
|
each_object_with_converter(input_objects) do |converter, input_object|
|
44
43
|
object_to_fill = converter.dump(input_object, object_to_fill)
|
45
44
|
end
|
@@ -50,16 +49,16 @@ module Yaoc
|
|
50
49
|
protected
|
51
50
|
|
52
51
|
def converter=(new_converter)
|
53
|
-
@converter = new_converter.map{|converter| converter.is_a?(Symbol) ? ManyToOneMapperChain.registry.for(converter) : converter}
|
52
|
+
@converter = new_converter.map { |converter| converter.is_a?(Symbol) ? ManyToOneMapperChain.registry.for(converter) : converter }
|
54
53
|
end
|
55
54
|
|
56
55
|
def converter_iterator
|
57
|
-
@converter_iterator ||=
|
56
|
+
@converter_iterator ||= converter.each
|
58
57
|
end
|
59
58
|
|
60
59
|
def each_object_with_converter(input_objects)
|
61
60
|
it_input_objects = input_objects.each
|
62
|
-
it_converters =
|
61
|
+
it_converters = converter.each
|
63
62
|
|
64
63
|
loop do
|
65
64
|
begin
|
@@ -73,6 +72,5 @@ module Yaoc
|
|
73
72
|
end
|
74
73
|
end
|
75
74
|
end
|
76
|
-
|
77
75
|
end
|
78
|
-
end
|
76
|
+
end
|
data/lib/yaoc/mapper_registry.rb
CHANGED
@@ -3,11 +3,11 @@ module Yaoc
|
|
3
3
|
module_function
|
4
4
|
|
5
5
|
def scope_storage(new_storage)
|
6
|
-
@scope = ScopedStorage::Scope.new(
|
6
|
+
@scope = ScopedStorage::Scope.new('mappings', new_storage)
|
7
7
|
end
|
8
8
|
|
9
9
|
def scope
|
10
|
-
@scope ||= ScopedStorage::Scope.new(
|
10
|
+
@scope ||= ScopedStorage::Scope.new('mappings')
|
11
11
|
end
|
12
12
|
|
13
13
|
def add(key, mapper)
|
@@ -17,6 +17,5 @@ module Yaoc
|
|
17
17
|
def for(key)
|
18
18
|
scope[key.to_sym]
|
19
19
|
end
|
20
|
-
|
21
20
|
end
|
22
|
-
end
|
21
|
+
end
|
data/lib/yaoc/mapping_base.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
module Yaoc
|
2
2
|
module MappingBase
|
3
|
-
|
4
3
|
def self.included(other)
|
5
4
|
other.extend(ClassMethods)
|
6
5
|
end
|
7
6
|
|
8
7
|
def to_proc
|
9
|
-
->(to_convert)
|
8
|
+
->(to_convert)do
|
10
9
|
old_to_convert = self.to_convert
|
11
10
|
begin
|
12
11
|
self.to_convert = to_convert
|
@@ -14,7 +13,7 @@ module Yaoc
|
|
14
13
|
ensure
|
15
14
|
self.to_convert = old_to_convert
|
16
15
|
end
|
17
|
-
|
16
|
+
end
|
18
17
|
end
|
19
18
|
|
20
19
|
def call
|
@@ -26,7 +25,6 @@ module Yaoc
|
|
26
25
|
end
|
27
26
|
alias_method :to_hash_or_array, :call
|
28
27
|
|
29
|
-
|
30
28
|
def converter_methods
|
31
29
|
self.class.converter_methods
|
32
30
|
end
|
@@ -36,7 +34,6 @@ module Yaoc
|
|
36
34
|
end
|
37
35
|
|
38
36
|
module ClassMethods
|
39
|
-
|
40
37
|
def mapping_strategy=(new_strat)
|
41
38
|
@mapping_strategy = new_strat
|
42
39
|
end
|
@@ -49,18 +46,22 @@ module Yaoc
|
|
49
46
|
class_private_module(:Mapping).tap do |mod|
|
50
47
|
method_implementation = TransformationCommand.create(to: to, from: from, deferred: lazy_loading, conversion_proc: converter)
|
51
48
|
|
52
|
-
|
49
|
+
method_name = "map_#{"%04d" % [converter_methods.count]}_#{from}_to_#{to}".to_sym
|
50
|
+
converter_methods << method_name
|
51
|
+
|
52
|
+
converter_methods.sort!.uniq!
|
53
|
+
|
54
|
+
mod.send :define_method, method_name, method_implementation
|
53
55
|
include mod
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
57
59
|
def converter_methods
|
58
|
-
|
60
|
+
@converter_methods ||= []
|
59
61
|
end
|
60
62
|
|
61
63
|
# inspired by Avdi Grimm, rubytapas.com 028-macros-and-modules
|
62
|
-
def class_private_module(name
|
63
|
-
|
64
|
+
def class_private_module(name = :Mapping)
|
64
65
|
if const_defined?(name, false)
|
65
66
|
const_get(name)
|
66
67
|
else
|
@@ -76,8 +77,6 @@ module Yaoc
|
|
76
77
|
const_set(name, new_mod)
|
77
78
|
end
|
78
79
|
end
|
79
|
-
|
80
80
|
end
|
81
|
-
|
82
81
|
end
|
83
|
-
end
|
82
|
+
end
|
@@ -1,14 +1,13 @@
|
|
1
1
|
module Yaoc
|
2
2
|
module MappingToClass
|
3
|
-
|
4
3
|
def self.included(other)
|
5
4
|
other.send(:include, MappingBase)
|
6
5
|
other.send(:include, InstanceMethods)
|
7
6
|
end
|
8
7
|
|
9
8
|
module InstanceMethods
|
10
|
-
def call(pre_created_object=nil)
|
11
|
-
source_converted_to_hash_or_array = to_hash_or_array
|
9
|
+
def call(pre_created_object = nil)
|
10
|
+
source_converted_to_hash_or_array = to_hash_or_array
|
12
11
|
unless source_converted_to_hash_or_array.nil?
|
13
12
|
if pre_created_object.nil?
|
14
13
|
create_target_from_class(source_converted_to_hash_or_array)
|
@@ -22,21 +21,21 @@ module Yaoc
|
|
22
21
|
alias_method :to_object, :call
|
23
22
|
|
24
23
|
def source_method
|
25
|
-
|
24
|
+
target_source.respond_to?(:call) ? :call : :new
|
26
25
|
end
|
27
26
|
|
28
27
|
def create_target_from_class(args)
|
29
28
|
array_based_constructor = args.is_a? Array
|
30
29
|
|
31
30
|
if array_based_constructor
|
32
|
-
|
31
|
+
target_source.send(source_method, *args)
|
33
32
|
else
|
34
|
-
|
33
|
+
target_source.send(source_method, args)
|
35
34
|
end
|
36
35
|
end
|
37
36
|
|
38
37
|
def fill_target_object(attribute_hash, pre_created_object)
|
39
|
-
|
38
|
+
fail 'UnexpectedStrategy' unless attribute_hash.respond_to? :each_pair
|
40
39
|
|
41
40
|
attribute_hash.each_pair do |key, value|
|
42
41
|
pre_created_object.send("#{key}=", value)
|
@@ -49,6 +48,5 @@ module Yaoc
|
|
49
48
|
[self]
|
50
49
|
end
|
51
50
|
end
|
52
|
-
|
53
51
|
end
|
54
|
-
end
|
52
|
+
end
|
data/lib/yaoc/object_mapper.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
module Yaoc
|
2
|
-
|
3
2
|
module MapperDSLMethods
|
4
3
|
def add_mapping(&block)
|
5
4
|
instance_eval &block
|
@@ -18,8 +17,8 @@ module Yaoc
|
|
18
17
|
lazy_loading: nil,
|
19
18
|
reverse_lazy_loading: lazy_loading)
|
20
19
|
|
21
|
-
object_converter = Array(object_converter).map{|converter| converter.is_a?(Symbol) ? registry.for(converter) : converter}
|
22
|
-
reverse_object_converter = Array(reverse_object_converter).map{|converter| converter.is_a?(Symbol) ? registry.for(converter) : converter}
|
20
|
+
object_converter = Array(object_converter).map { |converter| converter.is_a?(Symbol) ? registry.for(converter) : converter }
|
21
|
+
reverse_object_converter = Array(reverse_object_converter).map { |converter| converter.is_a?(Symbol) ? registry.for(converter) : converter }
|
23
22
|
|
24
23
|
converter_builder.rule(
|
25
24
|
to: to,
|
@@ -57,13 +56,12 @@ module Yaoc
|
|
57
56
|
end
|
58
57
|
|
59
58
|
def noop
|
60
|
-
->(_, result){ result }
|
59
|
+
->(_, result) { result }
|
61
60
|
end
|
62
61
|
|
63
62
|
def register_as(name)
|
64
63
|
registry.add(name, self) unless name.nil?
|
65
64
|
end
|
66
|
-
|
67
65
|
end
|
68
66
|
|
69
67
|
class ObjectMapper
|
@@ -71,25 +69,25 @@ module Yaoc
|
|
71
69
|
|
72
70
|
attr_accessor :load_result_source, :dump_result_source, :registry
|
73
71
|
|
74
|
-
def initialize(load_result_source, dump_result_source=nil, registry=Yaoc::MapperRegistry)
|
72
|
+
def initialize(load_result_source, dump_result_source = nil, registry = Yaoc::MapperRegistry)
|
75
73
|
self.load_result_source = load_result_source
|
76
74
|
self.dump_result_source = dump_result_source
|
77
75
|
self.registry = registry
|
78
76
|
end
|
79
77
|
|
80
|
-
def load(fetch_able, object_to_fill=nil)
|
78
|
+
def load(fetch_able, object_to_fill = nil)
|
81
79
|
converter(fetch_able).call(object_to_fill)
|
82
80
|
end
|
83
81
|
|
84
|
-
def dump(object, object_to_fill=nil)
|
82
|
+
def dump(object, object_to_fill = nil)
|
85
83
|
reverse_converter(object).call(object_to_fill)
|
86
84
|
end
|
87
85
|
|
88
|
-
def converter(fetch_able=nil)
|
86
|
+
def converter(fetch_able = nil)
|
89
87
|
converter_builder.converter(fetch_able, load_result_source)
|
90
88
|
end
|
91
89
|
|
92
|
-
def reverse_converter(fetch_able=nil)
|
90
|
+
def reverse_converter(fetch_able = nil)
|
93
91
|
reverse_converter_builder.converter(fetch_able, dump_result_source)
|
94
92
|
end
|
95
93
|
|
@@ -113,12 +111,11 @@ module Yaoc
|
|
113
111
|
end
|
114
112
|
|
115
113
|
def converter_builder
|
116
|
-
@converter_builder ||= Yaoc::ConverterBuilder.new
|
114
|
+
@converter_builder ||= Yaoc::ConverterBuilder.new
|
117
115
|
end
|
118
116
|
|
119
117
|
def reverse_converter_builder
|
120
118
|
@reverse_converter_builder ||= Yaoc::ConverterBuilder.new(:reverse_order, :public_send)
|
121
119
|
end
|
122
|
-
|
123
120
|
end
|
124
|
-
end
|
121
|
+
end
|
@@ -10,7 +10,7 @@ module Yaoc
|
|
10
10
|
self.converter = converter
|
11
11
|
end
|
12
12
|
|
13
|
-
def load_all(input_object, objects_to_fill=[])
|
13
|
+
def load_all(input_object, objects_to_fill = [])
|
14
14
|
objects_to_fill = Array(objects_to_fill)
|
15
15
|
results = []
|
16
16
|
|
@@ -21,7 +21,7 @@ module Yaoc
|
|
21
21
|
self.last_result = results
|
22
22
|
end
|
23
23
|
|
24
|
-
def dump_all(input_object, objects_to_fill=nil)
|
24
|
+
def dump_all(input_object, objects_to_fill = nil)
|
25
25
|
objects_to_fill = Array(objects_to_fill)
|
26
26
|
results = []
|
27
27
|
|
@@ -35,17 +35,15 @@ module Yaoc
|
|
35
35
|
protected
|
36
36
|
|
37
37
|
def converter=(new_converter)
|
38
|
-
@converter = new_converter.map{|converter| converter.is_a?(Symbol) ? OneToManyMapperChain.registry.for(converter) : converter}
|
38
|
+
@converter = new_converter.map { |converter| converter.is_a?(Symbol) ? OneToManyMapperChain.registry.for(converter) : converter }
|
39
39
|
end
|
40
40
|
|
41
41
|
def each_object_with_converter(objects_to_fill)
|
42
|
-
|
43
42
|
converter.each_with_index do |converter, index|
|
44
43
|
object_to_fill = objects_to_fill[index]
|
45
44
|
|
46
45
|
yield converter, object_to_fill
|
47
46
|
end
|
48
47
|
end
|
49
|
-
|
50
48
|
end
|
51
|
-
end
|
49
|
+
end
|
@@ -1,13 +1,11 @@
|
|
1
1
|
module Yaoc
|
2
2
|
module Strategies
|
3
3
|
module ToHashMapping
|
4
|
-
|
5
4
|
def self.call(conv_object)
|
6
5
|
conv_object.converter_methods.reduce({}) do |result, method_name|
|
7
6
|
conv_object.public_send(method_name, conv_object.to_convert, result)
|
8
7
|
end
|
9
8
|
end
|
10
|
-
|
11
9
|
end
|
12
10
|
end
|
13
|
-
end
|
11
|
+
end
|
@@ -1,7 +1,19 @@
|
|
1
1
|
module Yaoc
|
2
2
|
class TransformationCommand
|
3
|
+
module WithProc
|
4
|
+
def call(to_convert, result)
|
5
|
+
instance_exec(to_convert, result, &proc)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module WithoutProc
|
10
|
+
def call(to_convert, result)
|
11
|
+
TransformationCommand.fill_result_with_value(result, to, value(to_convert))
|
12
|
+
end
|
13
|
+
end
|
3
14
|
|
4
15
|
protected
|
16
|
+
|
5
17
|
attr_accessor :to, :from, :fetcher , :proc, :value_fetcher_proc
|
6
18
|
|
7
19
|
public
|
@@ -18,13 +30,13 @@ module Yaoc
|
|
18
30
|
# will be executed in mapper object instance context later through :define_method
|
19
31
|
tc_source = deferred ? deferred_source : default_source
|
20
32
|
|
21
|
-
-> (to_convert, result)
|
33
|
+
-> (to_convert, result)do
|
22
34
|
tc_source.new(to: to, from: from, fetch_method: fetcher, conversion_proc: conversion_proc, fetcher_proc: fetcher_proc).call(to_convert, result)
|
23
|
-
|
35
|
+
end
|
24
36
|
end
|
25
37
|
|
26
38
|
def self.fill_result_with_value(result, key, value)
|
27
|
-
result.tap{|taped_result| taped_result[key] = value}
|
39
|
+
result.tap { |taped_result| taped_result[key] = value }
|
28
40
|
end
|
29
41
|
|
30
42
|
def initialize(to: nil, from: nil, fetch_method: nil, conversion_proc: nil, fetcher_proc: nil)
|
@@ -32,22 +44,29 @@ module Yaoc
|
|
32
44
|
self.from = from
|
33
45
|
self.proc = conversion_proc
|
34
46
|
self.fetcher = fetch_method
|
35
|
-
self.value_fetcher_proc = fetcher_proc || ->(to_convert, fetcher, from){ to_convert.public_send(fetcher, from)}
|
47
|
+
self.value_fetcher_proc = fetcher_proc || ->(to_convert, fetcher, from) { to_convert.public_send(fetcher, from) }
|
36
48
|
end
|
37
49
|
|
38
|
-
def
|
50
|
+
def proc=(new_proc)
|
51
|
+
@proc = new_proc
|
52
|
+
|
53
|
+
if new_proc.nil?
|
54
|
+
extend WithoutProc
|
55
|
+
else
|
56
|
+
extend WithProc
|
57
|
+
end
|
58
|
+
end
|
39
59
|
|
60
|
+
def call(to_convert, result)
|
40
61
|
unless proc.nil?
|
41
62
|
instance_exec(to_convert, result, &proc)
|
42
63
|
else
|
43
64
|
TransformationCommand.fill_result_with_value(result, to, value(to_convert))
|
44
65
|
end
|
45
|
-
|
46
66
|
end
|
47
67
|
|
48
68
|
def value(to_convert)
|
49
69
|
value_fetcher_proc.call(to_convert, fetcher, from)
|
50
70
|
end
|
51
|
-
|
52
71
|
end
|
53
|
-
end
|
72
|
+
end
|