mappum 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/mappum/dsl.rb +29 -3
- data/lib/mappum/map.rb +10 -6
- data/lib/mappum/ruby_transform.rb +74 -32
- data/lib/mappum/xml_transform.rb +3 -3
- data/mappum.gemspec +2 -2
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
data/lib/mappum/dsl.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'facets/kernel/instance_exec'
|
1
|
+
#require 'facets/kernel/instance_exec'
|
2
2
|
class Object
|
3
3
|
def >> field
|
4
4
|
return {Mappum::DSL::Constant.new(self) => field} if field.kind_of?(Mappum::DSL::Field)
|
@@ -49,6 +49,29 @@ module Mappum
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
#
|
52
|
+
# Define how "to" array is passed to function.
|
53
|
+
# First argument is a label
|
54
|
+
# :> - left to right map
|
55
|
+
# :< - right to left map
|
56
|
+
# :<=> - both maps
|
57
|
+
# Second argument is the_way and can be:
|
58
|
+
# :new - will create new element
|
59
|
+
# :first - will map to the first element
|
60
|
+
# :all - will map to all elements
|
61
|
+
#
|
62
|
+
def to_array_take(label, the_way)
|
63
|
+
raise "the_way should be one of :new, :first, :all" unless [:new, :first, :all].include? the_way.to_sym
|
64
|
+
case label
|
65
|
+
when :<=>
|
66
|
+
@def.to_array_take_l2r = the_way.to_sym
|
67
|
+
@def.to_array_take_r2l = the_way.to_sym
|
68
|
+
when :>, '>'
|
69
|
+
@def.to_array_take_l2r = the_way.to_sym
|
70
|
+
when :<, '<'
|
71
|
+
@def.to_array_take_r2l = the_way.to_sym
|
72
|
+
end
|
73
|
+
end
|
74
|
+
#
|
52
75
|
# Add comment to mapping.
|
53
76
|
#
|
54
77
|
def `(str)
|
@@ -159,7 +182,10 @@ module Mappum
|
|
159
182
|
if not @def.normalized? and not @def.map_when.nil?
|
160
183
|
raise ":when function can be set only on unidirectional maps use :when_r2l and :when_l2r or map_when function"
|
161
184
|
end
|
162
|
-
|
185
|
+
@def.to_array_take = attr[0][1][:to_array_take] if attr[0].size > type_size
|
186
|
+
if not @def.normalized? and not @def.to_array_take.nil?
|
187
|
+
raise ":to_array_take property can be set only on unidirectional maps use :to_array_take_r2l and :to_array_take_l2r or to_array_take function"
|
188
|
+
end
|
163
189
|
@def.submap_alias = attr[0][1][:map] if attr[0].size > type_size
|
164
190
|
|
165
191
|
end
|
@@ -235,7 +261,7 @@ module Mappum
|
|
235
261
|
end
|
236
262
|
end
|
237
263
|
#this functions also indicate Array -> element
|
238
|
-
if symbol == :find or symbol == :detect
|
264
|
+
if symbol == :find or symbol == :detect or symbol == :select
|
239
265
|
@def.is_array = true
|
240
266
|
end
|
241
267
|
arguments = args.clone
|
data/lib/mappum/map.rb
CHANGED
@@ -94,6 +94,7 @@ module Mappum
|
|
94
94
|
class FieldMap < Map
|
95
95
|
attr_accessor :dict, :desc, :left, :right, :func, :block, :to, :from, :func_on_nil, :submap_alias
|
96
96
|
attr_accessor :name, :l2r_name, :r2l_name, :name_prefix, :map_when, :when_r2l, :when_l2r
|
97
|
+
attr_accessor :to_array_take, :to_array_take_r2l, :to_array_take_l2r
|
97
98
|
# True if map is unidirectional. Map is unidirectional
|
98
99
|
# when maps one way only.
|
99
100
|
def normalized?
|
@@ -118,6 +119,8 @@ module Mappum
|
|
118
119
|
map_r2l.r2l_name, map_r2l.l2r_name = nil, nil
|
119
120
|
map_r2l.map_when = self.when_r2l
|
120
121
|
map_r2l.when_r2l, map_r2l.when_l2r = nil, nil
|
122
|
+
map_r2l.to_array_take = self.to_array_take_r2l
|
123
|
+
map_r2l.to_array_take_r2l, map_r2l.to_array_take_l2r = nil, nil
|
121
124
|
map_r2l.maps = self.maps.select do |m|
|
122
125
|
m.to.parent == map_r2l.to
|
123
126
|
end
|
@@ -131,6 +134,8 @@ module Mappum
|
|
131
134
|
map_l2r.r2l_name, map_l2r.l2r_name = nil, nil
|
132
135
|
map_l2r.map_when = self.when_l2r
|
133
136
|
map_l2r.when_r2l, map_l2r.when_l2r = nil, nil
|
137
|
+
map_l2r.to_array_take = self.to_array_take_l2r
|
138
|
+
map_l2r.to_array_take_r2l, map_l2r.to_array_take_l2r = nil, nil
|
134
139
|
map_l2r.maps = self.maps.select do |m|
|
135
140
|
m.to.parent == map_l2r.to
|
136
141
|
end
|
@@ -158,7 +163,9 @@ module Mappum
|
|
158
163
|
return Field.new(@parent, symbol, args[0])
|
159
164
|
end
|
160
165
|
end
|
161
|
-
class Field < Struct.new(:name, :clazz, :parent, :func, :block, :is_root, :
|
166
|
+
class Field < Struct.new(:name, :clazz, :parent, :func, :block, :is_root, :is_placeholder)
|
167
|
+
#define is_array separetly to exclude it from equals
|
168
|
+
attr_accessor :is_array
|
162
169
|
def array?
|
163
170
|
is_array
|
164
171
|
end
|
@@ -166,7 +173,7 @@ module Mappum
|
|
166
173
|
is_placeholder
|
167
174
|
end
|
168
175
|
end
|
169
|
-
class Constant < Struct.new(:value)
|
176
|
+
class Constant < Struct.new(:value,:parent)
|
170
177
|
def parent
|
171
178
|
nil
|
172
179
|
end
|
@@ -177,10 +184,7 @@ module Mappum
|
|
177
184
|
nil
|
178
185
|
end
|
179
186
|
end
|
180
|
-
class Function
|
181
|
-
def parent
|
182
|
-
nil
|
183
|
-
end
|
187
|
+
class Function < Struct.new(:parent)
|
184
188
|
def array?
|
185
189
|
false
|
186
190
|
end
|
@@ -40,11 +40,7 @@ module Mappum
|
|
40
40
|
map.maps.each do |sm|
|
41
41
|
from_value, to_value = nil, nil
|
42
42
|
|
43
|
-
|
44
|
-
from_value = get(from, sm.from.name)
|
45
|
-
else
|
46
|
-
from_value = sm.from.value
|
47
|
-
end
|
43
|
+
from_value = get(from, sm.from, map.from)
|
48
44
|
|
49
45
|
# skip to next mapping on false :map_when function
|
50
46
|
next unless sm.map_when.nil? or sm.map_when.call(from_value)
|
@@ -81,6 +77,8 @@ module Mappum
|
|
81
77
|
end
|
82
78
|
end
|
83
79
|
unless submaps.empty? or from_value.nil?
|
80
|
+
#We should make some kind of test like this
|
81
|
+
#raise "Not an array: #{sm.from.name} inspect:" + from_value.inspect if sm.from.is_array and not from_value.kind_of?(Array)
|
84
82
|
if from_value.kind_of?(Array) or
|
85
83
|
(Module.constants.include? "ArrayJavaProxy" and from_value.kind_of?(Module.const_get(:ArrayJavaProxy)))
|
86
84
|
sm_v = sm.clone
|
@@ -92,21 +90,41 @@ module Mappum
|
|
92
90
|
sm_v.to = sm.to.clone
|
93
91
|
sm_v.to.is_array = false
|
94
92
|
end
|
95
|
-
|
96
|
-
|
97
|
-
|
93
|
+
if sm_v.maps.empty?
|
94
|
+
sm_v.maps = submaps
|
95
|
+
sm_v.maps.each{|m| m.from.parent = sm_v.from}
|
96
|
+
#don't add parent we need separation
|
97
|
+
to_value = from_value.collect{|v| transform(v, sm_v)}
|
98
|
+
else
|
99
|
+
to_value = from_value.collect{|v| transform(add_parent(v, from), sm_v)}
|
100
|
+
end
|
98
101
|
else
|
99
102
|
to ||= map.to.clazz.new unless @force_open_struct or map.to.clazz.nil? or map.to.clazz.kind_of?(Symbol)
|
100
103
|
to ||= @default_struct_class.new
|
101
|
-
v_to =
|
104
|
+
v_to = []
|
102
105
|
#array values are assigned after return
|
103
|
-
v_to
|
104
|
-
|
105
|
-
if
|
106
|
-
|
107
|
-
|
106
|
+
v_to << get(to, sm.to) unless sm.to.is_array and not sm.from.is_array
|
107
|
+
#nless one whants to update existing to array
|
108
|
+
if sm.to_array_take == :first
|
109
|
+
arr_v = get(to, sm.to)
|
110
|
+
v_to << arr_v[0] if not arr_v.nil?
|
111
|
+
end
|
112
|
+
if sm.to_array_take == :all
|
113
|
+
arr_v = get(to, sm.to)
|
114
|
+
v_to += arr_v if not arr_v.nil?
|
108
115
|
end
|
109
|
-
|
116
|
+
v_to.each do |v_t|
|
117
|
+
sm_v = sm
|
118
|
+
if sm_v.maps.empty?
|
119
|
+
sm_v = sm.clone
|
120
|
+
sm_v.maps = submaps
|
121
|
+
sm_v.maps.each{|m| m.from.parent = sm_v.from}
|
122
|
+
#don't add parent we need separation
|
123
|
+
to_value = transform(from_value, sm_v, v_t)
|
124
|
+
else
|
125
|
+
to_value = transform(add_parent(from_value, from), sm_v, v_t)
|
126
|
+
end
|
127
|
+
end
|
110
128
|
end
|
111
129
|
|
112
130
|
end
|
@@ -114,9 +132,9 @@ module Mappum
|
|
114
132
|
to_value = sm.dict[to_value]
|
115
133
|
end
|
116
134
|
if sm.to.is_array and not sm.from.is_array
|
117
|
-
to_array = convert_from(get(to,sm.to
|
135
|
+
to_array = convert_from(get(to,sm.to),sm.from)
|
118
136
|
to_array ||= []
|
119
|
-
to_array << to_value
|
137
|
+
to_array << to_value unless sm.to_array_take == :first or sm.to_array_take == :all
|
120
138
|
|
121
139
|
if to_array.empty? and sm.strip_empty?
|
122
140
|
to_array = nil
|
@@ -157,21 +175,36 @@ module Mappum
|
|
157
175
|
|
158
176
|
protected
|
159
177
|
|
160
|
-
def get(object, field)
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
178
|
+
def get(object, field, parent_field=nil)
|
179
|
+
if field.kind_of?(String) or field.kind_of?(Symbol)
|
180
|
+
field_name = field
|
181
|
+
else
|
182
|
+
unless field.respond_to?(:name)
|
183
|
+
return field.value
|
184
|
+
end
|
185
|
+
if field.name.nil? or object.nil?
|
186
|
+
return object
|
187
|
+
end
|
188
|
+
#for fields targeted at parents go up the tree
|
189
|
+
if (not parent_field.nil?) and field.parent != parent_field
|
190
|
+
if object.respond_to?(:_mpum_parent)
|
191
|
+
return get(object._mpum_parent, field, parent_field.parent)
|
192
|
+
else
|
193
|
+
raise "We hit an element with no parent: #{object.inspect}"
|
194
|
+
end
|
195
|
+
end
|
196
|
+
field_name = field.name
|
197
|
+
end
|
198
|
+
begin
|
199
|
+
return object.send(field_name)
|
200
|
+
rescue NoMethodError => e
|
201
|
+
#for open structures field will be defined later
|
202
|
+
if object.kind_of?(@default_struct_class)
|
203
|
+
return nil
|
204
|
+
else
|
205
|
+
raise e
|
206
|
+
end
|
207
|
+
end
|
175
208
|
end
|
176
209
|
def convert_to(to, field_def)
|
177
210
|
return to
|
@@ -179,6 +212,15 @@ module Mappum
|
|
179
212
|
def convert_from(from, field_def)
|
180
213
|
return from
|
181
214
|
end
|
215
|
+
def add_parent(value, parent)
|
216
|
+
#don't work for Fixnums and Floats
|
217
|
+
return value if value.kind_of?(Fixnum) or value.kind_of?(Float)
|
218
|
+
class << value
|
219
|
+
attr_accessor :_mpum_parent
|
220
|
+
end
|
221
|
+
value._mpum_parent = parent
|
222
|
+
return value
|
223
|
+
end
|
182
224
|
end
|
183
225
|
class OpenStruct < OpenStruct
|
184
226
|
def type(*attr)
|
data/lib/mappum/xml_transform.rb
CHANGED
@@ -178,12 +178,12 @@ module Mappum
|
|
178
178
|
def initialize(*args)
|
179
179
|
super(*args)
|
180
180
|
end
|
181
|
-
def get(object, field)
|
181
|
+
def get(object, field, parent_field=nil)
|
182
182
|
begin
|
183
|
-
super(object, field)
|
183
|
+
super(object, field, parent_field)
|
184
184
|
rescue NoMethodError
|
185
185
|
begin
|
186
|
-
super(object, XSD::CodeGen::GenSupport.safemethodname(field.to_s).to_sym)
|
186
|
+
super(object, XSD::CodeGen::GenSupport.safemethodname(field.name.to_s).to_sym, parent_field)
|
187
187
|
rescue NoMethodError
|
188
188
|
#for dynamic xml nil value == no methond
|
189
189
|
if object.kind_of?(SOAP::Mapping::Object)
|
data/mappum.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mappum}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jan Topi\305\204ski"]
|
12
|
-
s.date = %q{2009-11-
|
12
|
+
s.date = %q{2009-11-13}
|
13
13
|
s.default_executable = %q{mapserver.rb}
|
14
14
|
s.description = %q{}
|
15
15
|
s.email = %q{jtopinski@chatka.org}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mappum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Jan Topi\xC5\x84ski"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-13 00:00:00 +01:00
|
13
13
|
default_executable: mapserver.rb
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|