Converter 1.0.0 → 1.0.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.
Files changed (3) hide show
  1. data/Converter.rb +89 -0
  2. metadata +6 -7
  3. data/lib/Converter.rb +0 -50
data/Converter.rb ADDED
@@ -0,0 +1,89 @@
1
+ # This module helps converting between to instances
2
+ # of different classes
3
+ module Converter
4
+ def self.included(base)
5
+ base.extend(ClassConverter)
6
+ end
7
+
8
+ # Create new Target_Type instance according to Conversion definition
9
+ # @param [source] The instance to copy from
10
+ # @param [target_type] to target type to create instance of
11
+ # @return instance of target_type with data from source
12
+ def self.convert(source, target_type)
13
+ # Create new target instance
14
+ target = target_type.new
15
+
16
+ # Gets source Conversion definition
17
+ conversion_properties = source.class.class_eval { @attribute_converter}
18
+
19
+ # update each accessor on the target according to the conversion definition
20
+ source.instance_variables.each do |var|
21
+ var_name = var.to_s.delete('@').to_sym
22
+
23
+ # Get the conversion definition for the current accessor if exists
24
+ if convert_property = conversion_properties[var_name]
25
+ target_property_name = convert_property.target_property_name.to_s.concat('=').to_sym
26
+
27
+ # Convert from one type to another (by default doesn't do anything)
28
+ target_value = convert_property.convert_block.call(source.send(var_name))
29
+ target.send(target_property_name, target_value)
30
+ end
31
+ end
32
+
33
+ target
34
+ end
35
+
36
+ def self.convertBack(target, source_type)
37
+ # Create new target instance
38
+ source = source_type.new
39
+
40
+ # Gets source Conversion definition
41
+ conversion_properties = source.class.class_eval { @attribute_converter }
42
+
43
+ # update each accessor on the target according to the conversion definition
44
+ source.methods.grep(/[a-zA-Z0-9]=$/).each do |var_name|
45
+ var_name_trimmed = var_name.to_s.delete('=').to_sym
46
+
47
+ # Get the conversion definition for the current accessor if exists
48
+ if convert_property = conversion_properties[var_name_trimmed]
49
+ target_property_name = convert_property.target_property_name
50
+
51
+ # Convert from one type to another (by default doesn't do anything)
52
+ source_value = convert_property.convert_back_block.call(target.send(target_property_name))
53
+ source.send(var_name, source_value)
54
+ end
55
+ end
56
+
57
+ source
58
+ end
59
+
60
+ # This module add class extension of attr_converter
61
+ module ClassConverter
62
+ def attr_converter(symbol, attr_another_name = nil, convert_bock = nil, convert_back_block = nil)
63
+ # Set default values for nil arguments
64
+ attr_another_name ||= symbol
65
+ convert_bock ||= lambda { |v| v }
66
+ convert_back_block ||= lambda { |v| v }
67
+ @attribute_converter ||= {}
68
+
69
+ # Create new ConversionMetadata
70
+ @attribute_converter[symbol] =ConversionMetadata.new(symbol, attr_another_name, convert_bock, convert_back_block)
71
+ attr_accessor symbol
72
+ end
73
+ end
74
+
75
+ # Represent conversion data of one property to another
76
+ class ConversionMetadata
77
+ def initialize(source_prop_name, target_prop_name, convert, convert_back)
78
+ @source_property_name = source_prop_name
79
+ @target_property_name = target_prop_name
80
+ @convert_block = convert
81
+ @convert_back_block = convert_back
82
+ end
83
+
84
+ attr_accessor :source_property_name
85
+ attr_accessor :target_property_name
86
+ attr_accessor :convert_block
87
+ attr_accessor :convert_back_block
88
+ end
89
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Converter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,17 +9,16 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-22 00:00:00.000000000 Z
12
+ date: 2012-07-19 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: Adds attr_converter attribute creator that maps attributes to another
15
- object
14
+ description: Add attr_converter attribute creator that aps attributes to another object
16
15
  email: shukyc19@gmail.com
17
16
  executables: []
18
17
  extensions: []
19
18
  extra_rdoc_files: []
20
19
  files:
21
- - lib/Converter.rb
22
- homepage: http://rubygems.org/gems/Converter
20
+ - Converter.rb
21
+ homepage: http://rubygem.org/gems/Converter
23
22
  licenses: []
24
23
  post_install_message:
25
24
  rdoc_options: []
@@ -42,5 +41,5 @@ rubyforge_project:
42
41
  rubygems_version: 1.8.23
43
42
  signing_key:
44
43
  specification_version: 3
45
- summary: Convert between to object by mapping their's attributes
44
+ summary: Convert between to object by mapping theirs attributes
46
45
  test_files: []
data/lib/Converter.rb DELETED
@@ -1,50 +0,0 @@
1
- module Converter
2
- def self.included(base)
3
- base.extend(ClassConverter)
4
- end
5
-
6
- def self.convert(source, targetType)
7
- target = targetType.new
8
- source.instance_variables.each do |var|
9
- varName = var.to_s.delete('@').to_sym
10
- converter = source.class.class_eval { @attribute_converter }
11
- if converter.has_key? varName
12
- targetPropertyName = converter[varName][0] || varName
13
- targetPropertyName = targetPropertyName.to_s.concat('=').to_sym
14
- targetValue = converter[varName][1] ?
15
- converter[varName][1].call(source.send(varName)) :
16
- source.send(varName)
17
-
18
- target.send(targetPropertyName, targetValue)
19
- end
20
- end
21
-
22
- target
23
- end
24
-
25
- def self.ConvertBack(target, sourceType)
26
- source = sourceType.new
27
- source.methods.grep(/[a-zA-Z0-9]=$/).each do |varName|
28
- varNameTrimmed = varName.to_s.delete('=').to_sym
29
- converter = source.class.class_eval { @attribute_converter }
30
- if converter.has_key? varNameTrimmed
31
- targetPropertyName = converter[varNameTrimmed][0] || varNameTrimmed
32
- sourceValue = converter[varNameTrimmed][2] ?
33
- converter[varNameTrimmed][2].call(target.send(targetPropertyName)) :
34
- target.send(targetPropertyName)
35
- source.send(varName, sourceValue)
36
- end
37
- end
38
-
39
- source
40
- end
41
-
42
- module ClassConverter
43
- def attr_converter(symbol, attr_another_name = nil, converterBlock = nil, converterBackBlock = nil)
44
- @attribute_converter ||= {}
45
- @attribute_converter[symbol] = [attr_another_name, converterBlock, converterBackBlock]
46
- class_eval( "def #{symbol}() @#{symbol}; end" )
47
- class_eval( "def #{symbol}=(val) @#{symbol} = val; end" )
48
- end
49
- end
50
- end