raxb 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/raxb.rb +41 -15
- data/tests/test.rb +54 -15
- metadata +2 -2
data/lib/raxb.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rexml/element'
|
|
3
3
|
|
4
4
|
module RAXB
|
5
5
|
|
6
|
-
# This function is used to create a RAXB object from a source
|
6
|
+
# This function is used to create a RAXB object from a source document (either
|
7
7
|
# REXML::Document, or anything accepted by the REXML::Document constructor).
|
8
8
|
def unmarshal(source)
|
9
9
|
if source.kind_of? REXML::Element
|
@@ -19,10 +19,15 @@ module RAXB
|
|
19
19
|
|
20
20
|
class ElementList < Array
|
21
21
|
def initialize(parent, name)
|
22
|
+
super()
|
22
23
|
@parent = parent
|
23
24
|
@name = name
|
24
25
|
end
|
25
26
|
|
27
|
+
def <<(element)
|
28
|
+
self[0] << element
|
29
|
+
end
|
30
|
+
|
26
31
|
def [](i)
|
27
32
|
if i == size
|
28
33
|
if i == 1 and !at(0).exists?
|
@@ -44,20 +49,20 @@ module RAXB
|
|
44
49
|
rexml = element.to_rexml.dup
|
45
50
|
@parent.to_rexml.elements[i+1] = rexml
|
46
51
|
fill Element.new(rexml, @parent, true), i, 1
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
push
|
51
|
-
return e
|
52
|
+
# QUESTION should this be included?
|
53
|
+
# elsif i = size
|
54
|
+
# @parent.__attach__ element.to_rexml
|
55
|
+
# push(element)
|
52
56
|
else
|
53
57
|
raise "Index out of bounds: (#{i}) when size=#{size}"
|
54
58
|
end
|
55
59
|
end
|
56
|
-
|
60
|
+
|
57
61
|
def method_missing( name, *args )
|
58
62
|
name = name.to_s
|
59
63
|
self[0].send( name, *args )
|
60
64
|
end
|
65
|
+
|
61
66
|
end
|
62
67
|
|
63
68
|
class Element
|
@@ -79,7 +84,10 @@ module RAXB
|
|
79
84
|
return @rexml
|
80
85
|
end
|
81
86
|
|
82
|
-
def get_elements(name)
|
87
|
+
def get_elements(name)
|
88
|
+
# TODO have the namespace carry through if it is provided... unless false
|
89
|
+
# is specified as the second param
|
90
|
+
|
83
91
|
out = __create_new_list__ name
|
84
92
|
@rexml.each_element( name ) do |elem|
|
85
93
|
out.push( __wrap__( elem ) )
|
@@ -89,7 +97,7 @@ module RAXB
|
|
89
97
|
|
90
98
|
def get_attribute(name)
|
91
99
|
return @rexml.attributes[ name ].to_s
|
92
|
-
end
|
100
|
+
end
|
93
101
|
|
94
102
|
def text
|
95
103
|
return @rexml.text
|
@@ -97,6 +105,10 @@ module RAXB
|
|
97
105
|
|
98
106
|
def text=(t)
|
99
107
|
@rexml.text=t
|
108
|
+
create!
|
109
|
+
end
|
110
|
+
|
111
|
+
def create!
|
100
112
|
if @parent and !@attached
|
101
113
|
@parent.__attach__ @rexml
|
102
114
|
@attached = true
|
@@ -109,10 +121,12 @@ module RAXB
|
|
109
121
|
|
110
122
|
def __attach__(element)
|
111
123
|
@rexml.add element
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
124
|
+
create!
|
125
|
+
end
|
126
|
+
|
127
|
+
def <<(element)
|
128
|
+
@rexml.add_element element.to_rexml
|
129
|
+
create!
|
116
130
|
end
|
117
131
|
|
118
132
|
def method_missing(name,*args, &block)
|
@@ -120,14 +134,17 @@ module RAXB
|
|
120
134
|
if name.gsub!(/=$/,"")
|
121
135
|
if name.gsub!( ATTRIBUTE_RE, "" )
|
122
136
|
@rexml.attributes[name] = args[0]
|
137
|
+
create!
|
123
138
|
else
|
124
|
-
|
125
|
-
elems
|
139
|
+
raise 'Element setting is not supported yet'
|
140
|
+
# elems = self.send(name)
|
141
|
+
# elems[0] = args[0]
|
126
142
|
end
|
127
143
|
else
|
128
144
|
if name.gsub!( ATTRIBUTE_RE, "" )
|
129
145
|
return get_attribute(name)
|
130
146
|
else
|
147
|
+
name = "#{args[0]}:#{name}" if args[0]
|
131
148
|
elems = get_elements(name)
|
132
149
|
if elems.empty?
|
133
150
|
e = REXML::Element.new(name)
|
@@ -142,6 +159,15 @@ module RAXB
|
|
142
159
|
return @rexml.to_s
|
143
160
|
end
|
144
161
|
|
162
|
+
# QUESTION do we need these
|
163
|
+
# def dup
|
164
|
+
# return __wrap__(@rexml.dup, false)
|
165
|
+
# end
|
166
|
+
#
|
167
|
+
# def clone
|
168
|
+
# return __wrap__(@rexml.clone, false)
|
169
|
+
# end
|
170
|
+
|
145
171
|
private
|
146
172
|
def __create_new_list__(name)
|
147
173
|
ElementList.new self, name
|
data/tests/test.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '../lib/')
|
2
|
+
|
3
|
+
require 'rubygems'
|
1
4
|
require 'raxb'
|
2
5
|
require 'test/unit'
|
3
6
|
|
@@ -18,15 +21,16 @@ class SimpleTest < Test::Unit::TestCase
|
|
18
21
|
assert_equal test1.to_s, test2.to_s
|
19
22
|
end
|
20
23
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
assert_equal test2.
|
29
|
-
|
24
|
+
# TODO? element setting
|
25
|
+
# def test_1
|
26
|
+
# test1 = unmarshal('<test><foo><bar>hello</bar></foo></test>')
|
27
|
+
# test2 = unmarshal("<test><etc></etc></test>")
|
28
|
+
#
|
29
|
+
# test2.etc = test1.foo
|
30
|
+
#
|
31
|
+
# assert_equal test1.to_s, test2.to_s
|
32
|
+
# assert_equal test2.etc.exists?, false
|
33
|
+
# end
|
30
34
|
|
31
35
|
def test_2
|
32
36
|
test1 = unmarshal('<test><foo>hello</foo><foo>bonjour</foo></test>')
|
@@ -36,25 +40,25 @@ class SimpleTest < Test::Unit::TestCase
|
|
36
40
|
|
37
41
|
assert_equal test1.foo[0].text, 'hello'
|
38
42
|
assert_equal test1.foo[1].text, 'hola'
|
39
|
-
assert_equal test1.foo[2].exists
|
43
|
+
assert_equal false, test1.foo[2].exists?
|
40
44
|
assert_equal test2.foo.text, 'hola'
|
41
45
|
end
|
42
46
|
|
43
47
|
def test_3
|
44
|
-
|
48
|
+
s = '<test><foo><bar>hello</bar></foo></test>'
|
49
|
+
test1 = unmarshal(s)
|
45
50
|
test2 = unmarshal("<test></test>")
|
46
51
|
|
47
|
-
test2
|
52
|
+
test2 << test1.foo
|
48
53
|
|
49
|
-
assert_equal
|
50
|
-
assert_equal test2.etc.exists?, false
|
54
|
+
assert_equal s, test2.to_s
|
51
55
|
end
|
52
56
|
|
53
57
|
def test_4
|
54
58
|
test = unmarshal('<test><foo><bar>hello</bar></foo></test>')
|
55
59
|
test.foo._taxi = 'cab'
|
56
60
|
|
57
|
-
assert_equal test.foo._taxi
|
61
|
+
assert_equal 'cab', test.foo._taxi
|
58
62
|
end
|
59
63
|
|
60
64
|
def test_5
|
@@ -69,4 +73,39 @@ class SimpleTest < Test::Unit::TestCase
|
|
69
73
|
|
70
74
|
assert_equal rexml.to_s, rexml2.to_s
|
71
75
|
end
|
76
|
+
|
77
|
+
def test_6
|
78
|
+
test = create "test"
|
79
|
+
|
80
|
+
test.foo.text = 'hello'
|
81
|
+
|
82
|
+
a = create "foo"
|
83
|
+
a.text = 'hola'
|
84
|
+
|
85
|
+
test << a
|
86
|
+
|
87
|
+
assert_equal 'hello', test.foo[0].text
|
88
|
+
assert_equal 'hola', test.foo[1].text
|
89
|
+
assert_equal false, test.foo[2].exists?
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_7
|
93
|
+
test = create "test"
|
94
|
+
|
95
|
+
test.foo._bar = 'hello'
|
96
|
+
|
97
|
+
assert test.foo.exists?
|
98
|
+
assert_equal 'hello', test.foo._bar
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_8
|
102
|
+
ja = Element.new('JobAnnouncement')
|
103
|
+
jaDutyLocation = Element.new('DutyLocation')
|
104
|
+
jaDutyLocation.Location.text = 'hello'
|
105
|
+
ja.DutyLocations << jaDutyLocation
|
106
|
+
|
107
|
+
assert ja.DutyLocations.exists?
|
108
|
+
assert ja.DutyLocations.DutyLocation.exists?
|
109
|
+
assert_equal 'hello', ja.DutyLocations.DutyLocation.Location.text
|
110
|
+
end
|
72
111
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: raxb
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "0.
|
7
|
-
date: 2008-
|
6
|
+
version: "0.2"
|
7
|
+
date: 2008-06-16 00:00:00 -05:00
|
8
8
|
summary: Ruby API for XML Binding
|
9
9
|
require_paths:
|
10
10
|
- lib
|