Converter 1.1.0.0 → 1.1.0.1
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.
- data/lib/Converter.rb +25 -12
- metadata +1 -1
data/lib/Converter.rb
CHANGED
@@ -51,29 +51,36 @@ module Converter
|
|
51
51
|
|
52
52
|
private
|
53
53
|
def self.get_convertable_object source, target
|
54
|
-
if source.class.included_modules.include? Converter
|
54
|
+
if source.class.included_modules.include?(Converter) && target.class.included_modules.include?(Converter)
|
55
|
+
if source.class == target.class
|
56
|
+
i = 7
|
57
|
+
else
|
58
|
+
raise ArgumentError.new "Unable to select from two Convertable objects"
|
59
|
+
end
|
60
|
+
elsif source.class.included_modules.include? Converter
|
55
61
|
source
|
56
62
|
elsif target.class.included_modules.include? Converter
|
57
63
|
target
|
58
64
|
else
|
59
|
-
raise ArgumentError.new "One of the given classes should include Converter module"
|
65
|
+
raise ArgumentError.new "One of the given classes should include Converter module, classes: #{source.class}, #{target.class}"
|
60
66
|
end
|
61
67
|
end
|
62
68
|
|
63
69
|
def self.convert_one_attribute source, target, conversion_metadata, is_source_convertable, hash
|
64
70
|
source_attribute_name = is_source_convertable ? conversion_metadata.convertable_attribute_name : conversion_metadata.poro_attribute_name
|
65
71
|
target_attribute_name = is_source_convertable ? conversion_metadata.poro_attribute_name : conversion_metadata.convertable_attribute_name
|
72
|
+
source_attribute_value = source.send(source_attribute_name)
|
66
73
|
target_attribute_value = target.send(target_attribute_name)
|
67
74
|
target_attribute_name = target_attribute_name.to_s.concat('=').to_sym
|
68
|
-
convert_block = conversion_metadata.get_converter(target_attribute_value, is_source_convertable)
|
75
|
+
convert_block = conversion_metadata.get_converter(source_attribute_value, target_attribute_value, is_source_convertable)
|
69
76
|
|
70
77
|
# Convert from one type to another (by default doesn't do anything)
|
71
78
|
if convert_block.parameters.count == 1
|
72
|
-
target_value = convert_block.call(
|
79
|
+
target_value = convert_block.call(source_attribute_value)
|
73
80
|
elsif convert_block.parameters.count == 2
|
74
|
-
target_value = convert_block.call(
|
81
|
+
target_value = convert_block.call(source_attribute_value, hash)
|
75
82
|
else
|
76
|
-
target_value = convert_block.call(
|
83
|
+
target_value = convert_block.call(source_attribute_value, target_attribute_value, hash)
|
77
84
|
end
|
78
85
|
|
79
86
|
target.send(target_attribute_name, target_value)
|
@@ -128,12 +135,18 @@ module Converter
|
|
128
135
|
attr_accessor :copy_from_convertable_block
|
129
136
|
attr_accessor :copy_from_poro_block
|
130
137
|
|
131
|
-
def get_converter target_old_attribute_value, is_source_convertable
|
132
|
-
if
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
138
|
+
def get_converter source_attribute_value, target_old_attribute_value, is_source_convertable
|
139
|
+
# Check if one of the attributes is Convertable
|
140
|
+
has_convertable_object = source_attribute_value.class.included_modules.include?(Converter) || target_old_attribute_value.class.included_modules.include?(Converter)
|
141
|
+
|
142
|
+
# Copy between inner attribute only if they are convertale and exists
|
143
|
+
if has_convertable_object && target_old_attribute_value
|
144
|
+
if is_source_convertable
|
145
|
+
copy_from_convertable_block
|
146
|
+
else
|
147
|
+
copy_from_poro_block
|
148
|
+
end
|
149
|
+
elsif is_source_convertable
|
137
150
|
convert_from_convertable_block
|
138
151
|
else
|
139
152
|
convert_from_poro_block
|