xmlcodec 0.0.5 → 0.1.0
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/Rakefile +10 -5
- data/lib/{XMLElement.rb → element.rb} +56 -29
- data/lib/{XMLStreamObjectParser.rb → stream_object_parser.rb} +3 -3
- data/lib/{XMLStreamParser.rb → stream_parser.rb} +0 -5
- data/lib/{XMLSubElements.rb → subelements.rb} +13 -18
- data/lib/xmlcodec.rb +5 -4
- data/test/{TestXMLElement.rb → element_test.rb} +76 -3
- data/test/multi_format_test.rb +68 -0
- data/test/{TestPartialExport.rb → partial_export_test.rb} +34 -36
- data/test/simple_objects.rb +21 -8
- data/test/{TestXMLStreamObjectParser.rb → stream_object_parser_test.rb} +10 -12
- data/test/{TestXMLStreamParser.rb → stream_parser_test.rb} +4 -5
- data/test/subelements_test.rb +33 -0
- data/test/test_helper.rb +11 -0
- data/test/{TestXMLUtils.rb → utils_test.rb} +20 -4
- metadata +14 -11
data/Rakefile
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
PKG_NAME = 'xmlcodec'
|
2
|
-
PKG_VERSION = '0.0
|
2
|
+
PKG_VERSION = '0.1.0'
|
3
3
|
|
4
4
|
require 'rake'
|
5
5
|
require 'rake/testtask'
|
6
6
|
require 'rake/rdoctask'
|
7
7
|
require 'rake/gempackagetask'
|
8
|
+
require 'rcov/rcovtask'
|
8
9
|
require 'rubygems'
|
9
10
|
|
10
11
|
task :default => ['test']
|
@@ -46,10 +47,7 @@ Rake::GemPackageTask.new(spec) do |pkg|
|
|
46
47
|
end
|
47
48
|
|
48
49
|
Rake::TestTask.new do |t|
|
49
|
-
t.
|
50
|
-
t.test_files = FileList['test/Test*.rb']
|
51
|
-
t.libs = ['../lib','..']
|
52
|
-
t.ruby_opts = ['-xtest']
|
50
|
+
t.test_files = FileList['test/*_test.rb']
|
53
51
|
t.verbose = true
|
54
52
|
end
|
55
53
|
|
@@ -74,6 +72,13 @@ task :stats do
|
|
74
72
|
puts "Code to test ratio: 1:%.2f" % ratio
|
75
73
|
end
|
76
74
|
|
75
|
+
Rcov::RcovTask.new do |t|
|
76
|
+
t.libs << "test"
|
77
|
+
t.test_files = FileList['test/*_test.rb']
|
78
|
+
t.output_dir = 'test/coverage'
|
79
|
+
t.verbose = true
|
80
|
+
end
|
81
|
+
|
77
82
|
def count_lines(files)
|
78
83
|
code = 0
|
79
84
|
comments = 0
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'XMLStreamObjectParser'
|
2
|
-
require 'XMLSubElements'
|
3
|
-
|
4
1
|
module XMLCodec
|
2
|
+
class ElementClassNotFound < RuntimeError
|
3
|
+
end
|
4
|
+
|
5
5
|
# This class should be inherited from to create classes that are able to
|
6
6
|
# import and export XML elements and their children. It provides three main
|
7
7
|
# functions: xmlattr, xmlsubel and xmlsubel_mult.
|
@@ -61,8 +61,7 @@ module XMLCodec
|
|
61
61
|
attr_reader name
|
62
62
|
define_method((name.to_s+"=").to_sym) { |value|
|
63
63
|
if value.is_a? String or value.is_a? Fixnum
|
64
|
-
|
65
|
-
value = elclass.new(value)
|
64
|
+
value = self.class.get_element_class(name).new(value)
|
66
65
|
end
|
67
66
|
value.__parent = self if value
|
68
67
|
instance_variable_set "@#{name}", value
|
@@ -182,6 +181,18 @@ module XMLCodec
|
|
182
181
|
end
|
183
182
|
@subelements
|
184
183
|
}
|
184
|
+
define_method('<<') {|value|
|
185
|
+
subelements << value
|
186
|
+
}
|
187
|
+
define_method(:find_first_named) {|name|
|
188
|
+
subelements.find_first_named(name)
|
189
|
+
}
|
190
|
+
define_method('[]') {|name|
|
191
|
+
subelements.find_first_named(name)
|
192
|
+
}
|
193
|
+
define_method(:find_all_named) {|name|
|
194
|
+
subelements.find_all_named(name)
|
195
|
+
}
|
185
196
|
define_method(:has_subelements?) {true}
|
186
197
|
end
|
187
198
|
|
@@ -191,8 +202,15 @@ module XMLCodec
|
|
191
202
|
attr_accessor name
|
192
203
|
end
|
193
204
|
|
194
|
-
#
|
195
|
-
|
205
|
+
# Defines a new xml format (like XHTML or DocBook). This should be used in
|
206
|
+
# a class that's the super class of all the elements of a format
|
207
|
+
def self.xmlformat(name=nil)
|
208
|
+
class_variable_set('@@elclasses', {})
|
209
|
+
end
|
210
|
+
|
211
|
+
def self.elclasses
|
212
|
+
class_variable_get('@@elclasses')
|
213
|
+
end
|
196
214
|
|
197
215
|
# Sets the element name for the element
|
198
216
|
def self.elname(name)
|
@@ -202,10 +220,10 @@ module XMLCodec
|
|
202
220
|
# Sets several element names for the element
|
203
221
|
def self.elnames(*names)
|
204
222
|
define_method(:elname){names[0].to_sym}
|
205
|
-
|
223
|
+
|
206
224
|
eln = get_elnames
|
207
225
|
names.each {|n| eln << n}
|
208
|
-
names.each {|n|
|
226
|
+
names.each {|n| elclasses[n.to_sym] = self}
|
209
227
|
end
|
210
228
|
|
211
229
|
# Returns the list of element names for the element
|
@@ -218,7 +236,11 @@ module XMLCodec
|
|
218
236
|
# be used for elements that contain only text and no subelements
|
219
237
|
def self.elwithvalue
|
220
238
|
define_method(:hasvalue?){true}
|
221
|
-
|
239
|
+
self.class_eval do
|
240
|
+
def initialize(value=nil)
|
241
|
+
@value = value
|
242
|
+
end
|
243
|
+
end
|
222
244
|
attr_accessor :value
|
223
245
|
end
|
224
246
|
|
@@ -247,17 +269,20 @@ module XMLCodec
|
|
247
269
|
end
|
248
270
|
|
249
271
|
# Which level of indentation are we in?
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
272
|
+
#
|
273
|
+
# This is currently disabled until I get around to implementing proper and
|
274
|
+
# tested indent support.
|
275
|
+
#def indent_level
|
276
|
+
# if not self.instance_variables.index '@indent_level'
|
277
|
+
# curr = self
|
278
|
+
# level = 0
|
279
|
+
# while curr = curr.__parent
|
280
|
+
# level +=1
|
281
|
+
# end
|
282
|
+
# @indent_level = level
|
283
|
+
# end
|
284
|
+
# @indent_level
|
285
|
+
#end
|
261
286
|
|
262
287
|
# Iterate all of the subelements
|
263
288
|
# We copy everything into an array and iterate that because #each doesn't
|
@@ -303,23 +328,25 @@ module XMLCodec
|
|
303
328
|
# with the whitespace that should precede every line. Extra levels of
|
304
329
|
# indentation can be passed so that a caller can calculate the whitespace
|
305
330
|
# to indent an element X levels deeper than this one.
|
306
|
-
|
307
|
-
|
308
|
-
|
331
|
+
#
|
332
|
+
# This is currently disabled until I get around to implementing proper and
|
333
|
+
# tested indent support.
|
334
|
+
#def indentation(extra=0)
|
335
|
+
# INDENT_STR*(indent_level+extra)
|
336
|
+
#end
|
309
337
|
|
310
338
|
# Gets the class for a certain element name.
|
311
339
|
def self.get_element_class(name)
|
312
|
-
cl =
|
340
|
+
cl = elclasses[name.to_sym]
|
313
341
|
if not cl
|
314
|
-
raise "No class defined for element type: '" + name.to_s + "'"
|
342
|
+
raise ElementClassNotFound, "No class defined for element type: '" + name.to_s + "'"
|
315
343
|
end
|
316
344
|
cl
|
317
345
|
end
|
318
346
|
|
319
347
|
# Gets the possible element names for a certain element.
|
320
348
|
def self.get_element_names(name)
|
321
|
-
|
322
|
-
[name.to_s]+cl.get_elnames
|
349
|
+
get_element_class(name).get_elnames
|
323
350
|
end
|
324
351
|
|
325
352
|
# Method that checks if a given class has subelements. This is usually only
|
@@ -378,7 +405,7 @@ module XMLCodec
|
|
378
405
|
# Import the XML directly from the text. This call receives the text and the
|
379
406
|
# classes that should be used to import the subelements.
|
380
407
|
def self.import_xml_text(text)
|
381
|
-
parser = XMLStreamObjectParser.new(
|
408
|
+
parser = XMLStreamObjectParser.new(self)
|
382
409
|
parser.parse(text)
|
383
410
|
parser.top_element
|
384
411
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require "rexml/document"
|
2
|
-
require "XMLUtils"
|
3
2
|
|
4
3
|
module XMLCodec
|
5
4
|
# This class is used internally by the parser to store the information about
|
@@ -62,7 +61,8 @@ module XMLCodec
|
|
62
61
|
# XMLSOParserElement#consume.
|
63
62
|
class XMLStreamObjectParser
|
64
63
|
# Create a new parser with a listener.
|
65
|
-
def initialize(listener=nil)
|
64
|
+
def initialize(base_element, listener=nil)
|
65
|
+
@base_element = base_element
|
66
66
|
@listener = listener
|
67
67
|
@children = Hash.new([])
|
68
68
|
@currel = 0
|
@@ -77,7 +77,7 @@ module XMLCodec
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def get_elclass(name)
|
80
|
-
|
80
|
+
@base_element.get_element_class(name)
|
81
81
|
end
|
82
82
|
|
83
83
|
def curr_element
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require "rexml/document"
|
2
|
-
require "XMLUtils"
|
3
2
|
|
4
3
|
module XMLUtils
|
5
4
|
class XMLSParserContents
|
@@ -15,10 +14,6 @@ module XMLUtils
|
|
15
14
|
add(content)
|
16
15
|
end
|
17
16
|
|
18
|
-
def array_from(start)
|
19
|
-
@contents[start..-1]
|
20
|
-
end
|
21
|
-
|
22
17
|
def text_from(start)
|
23
18
|
@contents[start..-1].join
|
24
19
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'XMLUtils'
|
2
|
-
|
3
1
|
module XMLCodec
|
4
2
|
# A simple element that has only text inside. This is used inside
|
5
3
|
# XMLSubElements to be able to directly add strings to it and have them be
|
@@ -38,6 +36,10 @@ module XMLCodec
|
|
38
36
|
start_partial_export(file)
|
39
37
|
end_partial_export(file)
|
40
38
|
end
|
39
|
+
|
40
|
+
def elname
|
41
|
+
'__TEXT__'
|
42
|
+
end
|
41
43
|
end
|
42
44
|
|
43
45
|
# This is the container class used to hold the elements for the xmlsubelements
|
@@ -51,13 +53,17 @@ module XMLCodec
|
|
51
53
|
@parent = parent
|
52
54
|
end
|
53
55
|
|
54
|
-
|
55
|
-
#
|
56
|
-
def
|
57
|
-
|
56
|
+
public
|
57
|
+
# Returns the first element in the collection with the given element name
|
58
|
+
def find_first_named(name)
|
59
|
+
self.find {|el| el.elname.to_s == name.to_s}
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns the elements in the collection with the given element name
|
63
|
+
def find_all_named(name)
|
64
|
+
self.find_all {|el| el.elname.to_s == name.to_s}
|
58
65
|
end
|
59
66
|
|
60
|
-
public
|
61
67
|
# Adds a value to the collection. The value may be either a String or a
|
62
68
|
# descendant of XMLElement. If it's a string it's converted into a
|
63
69
|
# XMLTextElement
|
@@ -84,17 +90,6 @@ module XMLCodec
|
|
84
90
|
@elements.each{|e| e.create_xml(parent)}
|
85
91
|
end
|
86
92
|
|
87
|
-
# Import the XML of all the elements
|
88
|
-
def import_xml(xmlelements)
|
89
|
-
xmlelements.each do |xmlel|
|
90
|
-
if xmlel.kind_of? REXML::Text
|
91
|
-
self << xmlel.to_s
|
92
|
-
else
|
93
|
-
self << elclass(xmlel.name.to_sym).import_xml(xmlel)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
93
|
# Iterate all the values in the collection
|
99
94
|
def each
|
100
95
|
@elements.dup.each {|e| yield e}
|
data/lib/xmlcodec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
require '
|
1
|
+
require File.dirname(__FILE__) + '/XMLUtils'
|
2
|
+
require File.dirname(__FILE__) + '/element'
|
3
|
+
require File.dirname(__FILE__) + '/subelements'
|
4
|
+
require File.dirname(__FILE__) + '/stream_object_parser'
|
5
|
+
require File.dirname(__FILE__) + '/stream_parser'
|
@@ -1,7 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
require 'xmlcodec'
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
3
2
|
require 'rexml/document'
|
4
|
-
require 'simple_objects'
|
5
3
|
|
6
4
|
class TestXMLElement < Test::Unit::TestCase
|
7
5
|
def test_xmlsubel
|
@@ -83,6 +81,50 @@ class TestXMLElement < Test::Unit::TestCase
|
|
83
81
|
assert_equal value, el.subelements[0].value
|
84
82
|
end
|
85
83
|
|
84
|
+
# Test using "somelement << addsomething" instead of
|
85
|
+
# "somelement.subelements << addsomething"
|
86
|
+
def test_xmlsubelements_direct
|
87
|
+
value = 'test'
|
88
|
+
el = SubelElement.new
|
89
|
+
sel = SimpleElement.new(value)
|
90
|
+
|
91
|
+
el << sel
|
92
|
+
assert_equal(sel, el.subelements[0])
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_find_first
|
96
|
+
value = 'test'
|
97
|
+
el = SubelElement.new
|
98
|
+
sel = SimpleElement.new(value)
|
99
|
+
|
100
|
+
el << sel
|
101
|
+
assert_equal(sel, el.find_first_named('abc'))
|
102
|
+
assert_equal(sel, el['abc'])
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_find_all
|
106
|
+
value = 'test'
|
107
|
+
el = SubelElement.new
|
108
|
+
sel = SimpleElement.new(value)
|
109
|
+
sel2 = SimpleElement.new(value)
|
110
|
+
|
111
|
+
el << sel
|
112
|
+
el << sel2
|
113
|
+
assert_equal([sel,sel2], el.find_all_named('abc'))
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_find_all_with_texts
|
117
|
+
value = 'test'
|
118
|
+
el = SubelElement.new
|
119
|
+
sel = SimpleElement.new(value)
|
120
|
+
sel2 = SimpleElement.new(value)
|
121
|
+
|
122
|
+
el << sel
|
123
|
+
el << 'some text'
|
124
|
+
el << sel2
|
125
|
+
assert_equal([sel,sel2], el.find_all_named('abc'))
|
126
|
+
end
|
127
|
+
|
86
128
|
def test_xmlsubel_mult
|
87
129
|
value1 = 'test'
|
88
130
|
value2 = 'test2'
|
@@ -174,4 +216,35 @@ class TestXMLElement < Test::Unit::TestCase
|
|
174
216
|
assert_equal 0, el.subelements.size
|
175
217
|
assert_nil el.subelements[0]
|
176
218
|
end
|
219
|
+
|
220
|
+
def test_elwithvalue_methods
|
221
|
+
v = 'Some Value'
|
222
|
+
|
223
|
+
el = ValueElement.new
|
224
|
+
el.value = v
|
225
|
+
assert_equal v, el.value
|
226
|
+
|
227
|
+
el = ValueElement.new(v)
|
228
|
+
assert_equal v, el.value
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_auto_conversion_from_string
|
232
|
+
v = 'Some Value'
|
233
|
+
vparent = ValueParent.new
|
234
|
+
vparent.valueelement = v
|
235
|
+
assert_kind_of ValueElement, vparent.valueelement
|
236
|
+
assert_equal vparent.valueelement.value, v
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_get_element_class
|
240
|
+
assert_equal SimpleElement, BaseFormat.get_element_class('abc')
|
241
|
+
assert_equal SimpleElement, BaseFormat.get_element_class(:abc)
|
242
|
+
assert_raise ElementClassNotFound do
|
243
|
+
BaseFormat.get_element_class(:nosuchclass)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_get_element_names
|
248
|
+
assert_equal ['abc'], BaseFormat.get_element_names('abc')
|
249
|
+
end
|
177
250
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
require 'rexml/document'
|
3
|
+
|
4
|
+
class FirstFormat < XMLCodec::XMLElement
|
5
|
+
xmlformat 'First Format'
|
6
|
+
end
|
7
|
+
|
8
|
+
class FirstRoot < FirstFormat
|
9
|
+
elname "root"
|
10
|
+
xmlsubel :child
|
11
|
+
end
|
12
|
+
|
13
|
+
class FirstChild < FirstFormat
|
14
|
+
elname "child"
|
15
|
+
xmlattr :value
|
16
|
+
end
|
17
|
+
|
18
|
+
class SecondFormat < XMLCodec::XMLElement
|
19
|
+
xmlformat 'Second Format'
|
20
|
+
end
|
21
|
+
|
22
|
+
class SecondRoot < SecondFormat
|
23
|
+
elname "root"
|
24
|
+
xmlsubel :child
|
25
|
+
xmlsubel :child2
|
26
|
+
end
|
27
|
+
|
28
|
+
class SecondChild < SecondFormat
|
29
|
+
elname "child"
|
30
|
+
elwithvalue
|
31
|
+
end
|
32
|
+
|
33
|
+
class SecondChild2 < SecondChild
|
34
|
+
elname "child2"
|
35
|
+
xmlattr :value2
|
36
|
+
end
|
37
|
+
|
38
|
+
# Test what happens when we define two different XML formats with xmlcodec that
|
39
|
+
# have clashing element names
|
40
|
+
class TestMultiFormat < Test::Unit::TestCase
|
41
|
+
def test_import_first
|
42
|
+
value = 'somevalue'
|
43
|
+
text = '<root><child value="'+value+'"></child></root>'
|
44
|
+
root = FirstFormat.import_xml_text(text)
|
45
|
+
assert_kind_of(FirstRoot, root)
|
46
|
+
assert_kind_of(FirstChild, root.child)
|
47
|
+
assert_equal value, root.child.value
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_import_second
|
51
|
+
value = 'somevalue'
|
52
|
+
text = '<root><child>'+value+'</child></root>'
|
53
|
+
root = SecondFormat.import_xml_text(text)
|
54
|
+
assert_kind_of(SecondRoot, root)
|
55
|
+
assert_kind_of(SecondChild, root.child)
|
56
|
+
assert_equal value, root.child.value
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_double_inheritance
|
60
|
+
value = 'somevalue'
|
61
|
+
text = '<root><child2 value2="'+value+'">'+value+'</child2></root>'
|
62
|
+
root = SecondFormat.import_xml_text(text)
|
63
|
+
assert_kind_of(SecondRoot, root)
|
64
|
+
assert_kind_of(SecondChild2, root.child2)
|
65
|
+
assert_equal value, root.child2.value
|
66
|
+
assert_equal value, root.child2.value2
|
67
|
+
end
|
68
|
+
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'XMLUtils'
|
3
|
-
require 'simple_objects'
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
4
2
|
|
5
3
|
class TestPartialExport < Test::Unit::TestCase
|
6
4
|
def validate_well_formed(filename)
|
@@ -12,23 +10,23 @@ class TestPartialExport < Test::Unit::TestCase
|
|
12
10
|
end
|
13
11
|
|
14
12
|
def test_simple
|
13
|
+
@filename = 'test_partial_export_simple.xml'
|
15
14
|
value = "somevalue"
|
16
|
-
filename = 'test_partial_export_simple.xml'
|
17
15
|
|
18
|
-
file = File.open(
|
16
|
+
file = File.open(filepath, "w")
|
19
17
|
sel = SimpleElement.new(value)
|
20
18
|
sel.partial_export(file)
|
21
19
|
file.close
|
22
20
|
|
23
|
-
validate_well_formed(
|
24
|
-
compare_xpath(value,
|
21
|
+
validate_well_formed(filepath)
|
22
|
+
compare_xpath(value, filepath, "/abc")
|
25
23
|
end
|
26
24
|
|
27
25
|
def test_double
|
28
26
|
value = 'somevalue'
|
29
|
-
filename = 'test_partial_export_double.xml'
|
27
|
+
@filename = 'test_partial_export_double.xml'
|
30
28
|
|
31
|
-
file = File.open(
|
29
|
+
file = File.open(filepath, "w")
|
32
30
|
sel = SimpleElement.new(value)
|
33
31
|
el = TestElement.new
|
34
32
|
el.abc = sel
|
@@ -37,15 +35,15 @@ class TestPartialExport < Test::Unit::TestCase
|
|
37
35
|
el.end_partial_export(file)
|
38
36
|
file.close
|
39
37
|
|
40
|
-
validate_well_formed(
|
41
|
-
compare_xpath(value,
|
38
|
+
validate_well_formed(filepath)
|
39
|
+
compare_xpath(value, filepath, "/subel/abc")
|
42
40
|
end
|
43
41
|
|
44
42
|
def test_triple
|
45
43
|
value = 'somevalue'
|
46
|
-
filename = 'test_partial_export_double.xml'
|
44
|
+
@filename = 'test_partial_export_double.xml'
|
47
45
|
|
48
|
-
file = File.open(
|
46
|
+
file = File.open(filepath, "w")
|
49
47
|
sel = SimpleElement.new(value)
|
50
48
|
el1 = TestElement.new
|
51
49
|
el2 = TestElement.new
|
@@ -56,30 +54,30 @@ class TestPartialExport < Test::Unit::TestCase
|
|
56
54
|
el1.end_partial_export(file)
|
57
55
|
file.close
|
58
56
|
|
59
|
-
validate_well_formed(
|
60
|
-
compare_xpath(value,
|
57
|
+
validate_well_formed(filepath)
|
58
|
+
compare_xpath(value, filepath, "/subel/subel/abc")
|
61
59
|
end
|
62
60
|
|
63
61
|
def test_attr
|
64
62
|
value = 'somevalue'
|
65
|
-
filename = 'test_partial_export_double.xml'
|
63
|
+
@filename = 'test_partial_export_double.xml'
|
66
64
|
|
67
|
-
file = File.open(
|
65
|
+
file = File.open(filepath, "w")
|
68
66
|
el = TestElement.new
|
69
67
|
el.someattr = value
|
70
68
|
|
71
69
|
el.partial_export(file)
|
72
70
|
file.close
|
73
71
|
|
74
|
-
compare_xpath(value,
|
72
|
+
compare_xpath(value, filepath, "/subel/@someattr")
|
75
73
|
end
|
76
74
|
|
77
75
|
def test_mult
|
78
76
|
value1 = 'somevalue1'
|
79
77
|
value2 = 'somevalue2'
|
80
|
-
filename = 'test_partial_export_mult.xml'
|
78
|
+
@filename = 'test_partial_export_mult.xml'
|
81
79
|
|
82
|
-
file = File.open(
|
80
|
+
file = File.open(filepath, "w")
|
83
81
|
sel1 = SimpleElement.new(value1)
|
84
82
|
sel2 = SimpleElement.new(value2)
|
85
83
|
|
@@ -93,17 +91,17 @@ class TestPartialExport < Test::Unit::TestCase
|
|
93
91
|
|
94
92
|
file.close
|
95
93
|
|
96
|
-
validate_well_formed(
|
97
|
-
compare_xpath(value1,
|
98
|
-
compare_xpath(value2,
|
94
|
+
validate_well_formed(filepath)
|
95
|
+
compare_xpath(value1, filepath, "/mult/abc[1]")
|
96
|
+
compare_xpath(value2, filepath, "/mult/abc[2]")
|
99
97
|
end
|
100
98
|
|
101
99
|
def test_subelements
|
102
100
|
value1 = 'somevalue1'
|
103
101
|
value2 = 'somevalue2'
|
104
|
-
filename = 'test_partial_export_subelements.xml'
|
102
|
+
@filename = 'test_partial_export_subelements.xml'
|
105
103
|
|
106
|
-
file = File.open(
|
104
|
+
file = File.open(filepath, "w")
|
107
105
|
sel1 = SimpleElement.new(value1)
|
108
106
|
sel2 = SimpleElement.new(value2)
|
109
107
|
|
@@ -117,17 +115,17 @@ class TestPartialExport < Test::Unit::TestCase
|
|
117
115
|
|
118
116
|
file.close
|
119
117
|
|
120
|
-
validate_well_formed(
|
121
|
-
compare_xpath(value1,
|
122
|
-
compare_xpath(value2,
|
118
|
+
validate_well_formed(filepath)
|
119
|
+
compare_xpath(value1, filepath, "/subels/abc[1]")
|
120
|
+
compare_xpath(value2, filepath, "/subels/abc[2]")
|
123
121
|
end
|
124
122
|
|
125
123
|
def test_subelements_multiple
|
126
124
|
value1 = 'somevalue1'
|
127
125
|
value2 = 'somevalue2'
|
128
|
-
filename = 'test_partial_export_subelements2.xml'
|
126
|
+
@filename = 'test_partial_export_subelements2.xml'
|
129
127
|
|
130
|
-
file = File.open(
|
128
|
+
file = File.open(filepath, "w")
|
131
129
|
sel1 = SimpleElement.new(value1)
|
132
130
|
sel2 = SimpleElement.new(value2)
|
133
131
|
|
@@ -138,14 +136,14 @@ class TestPartialExport < Test::Unit::TestCase
|
|
138
136
|
|
139
137
|
file.close
|
140
138
|
|
141
|
-
validate_well_formed(
|
142
|
-
compare_xpath(value1,
|
143
|
-
compare_xpath(value2,
|
139
|
+
validate_well_formed(filepath)
|
140
|
+
compare_xpath(value1, filepath, "/subels/abc[1]")
|
141
|
+
compare_xpath(value2, filepath, "/subels/abc[2]")
|
144
142
|
end
|
145
143
|
|
146
144
|
def test_recursive
|
147
|
-
filename = 'test_partial_export_recursive.xml'
|
148
|
-
file = File.open(
|
145
|
+
@filename = 'test_partial_export_recursive.xml'
|
146
|
+
file = File.open(filepath, "w")
|
149
147
|
|
150
148
|
value = 'somevalue'
|
151
149
|
|
@@ -167,6 +165,6 @@ class TestPartialExport < Test::Unit::TestCase
|
|
167
165
|
rec1.end_partial_export(file)
|
168
166
|
|
169
167
|
file.close
|
170
|
-
validate_well_formed(
|
168
|
+
validate_well_formed(filepath)
|
171
169
|
end
|
172
170
|
end
|
data/test/simple_objects.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
|
-
require 'XMLElement'
|
2
1
|
include XMLCodec
|
3
2
|
|
4
|
-
class
|
3
|
+
class BaseFormat < XMLElement
|
4
|
+
xmlformat 'Base Format'
|
5
|
+
end
|
6
|
+
|
7
|
+
class SimpleElement < BaseFormat
|
5
8
|
elwithvalue
|
6
9
|
elname 'abc'
|
7
10
|
end
|
8
11
|
|
9
|
-
class SimpleElement2 <
|
12
|
+
class SimpleElement2 < BaseFormat
|
10
13
|
elwithvalue
|
11
14
|
elname 'abc1'
|
12
15
|
end
|
13
16
|
|
14
|
-
class SimpleElementMultName <
|
17
|
+
class SimpleElementMultName < BaseFormat
|
15
18
|
elwithvalue
|
16
19
|
elnames 'abc2', 'abc3'
|
17
20
|
|
@@ -27,7 +30,7 @@ class SimpleElementMultName < XMLElement
|
|
27
30
|
end
|
28
31
|
end
|
29
32
|
|
30
|
-
class TestElement <
|
33
|
+
class TestElement < BaseFormat
|
31
34
|
elname 'subel'
|
32
35
|
xmlsubel :abc
|
33
36
|
xmlsubel :abc2
|
@@ -35,19 +38,29 @@ class TestElement < XMLElement
|
|
35
38
|
xmlattr :someattr
|
36
39
|
end
|
37
40
|
|
38
|
-
class SubelElement <
|
41
|
+
class SubelElement < BaseFormat
|
39
42
|
elname 'subels'
|
40
43
|
xmlsubelements
|
41
44
|
end
|
42
45
|
|
43
|
-
class SubelMultElement <
|
46
|
+
class SubelMultElement < BaseFormat
|
44
47
|
elname 'mult'
|
45
48
|
xmlsubel_mult :abc
|
46
49
|
xmlsubel_mult 'abc2' # Use a string and a symbol so that both are checked
|
47
50
|
end
|
48
51
|
|
49
|
-
class Recursive <
|
52
|
+
class Recursive < BaseFormat
|
50
53
|
elname 'recursive'
|
51
54
|
xmlsubel :abc
|
52
55
|
xmlsubel_mult :recursive
|
53
56
|
end
|
57
|
+
|
58
|
+
class ValueParent < BaseFormat
|
59
|
+
elname 'valueparent'
|
60
|
+
xmlsubel 'valueelement'
|
61
|
+
end
|
62
|
+
|
63
|
+
class ValueElement < BaseFormat
|
64
|
+
elwithvalue
|
65
|
+
elname 'valueelement'
|
66
|
+
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
require
|
2
|
-
require "XMLStreamObjectParser"
|
3
|
-
require 'simple_objects.rb'
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
4
2
|
|
5
3
|
include XMLCodec
|
6
4
|
|
@@ -44,7 +42,7 @@ class TestXMLStreamObjectParser < Test::Unit::TestCase
|
|
44
42
|
file = '<abc>'+value+'</abc>'
|
45
43
|
|
46
44
|
listener = MyStreamListener.new
|
47
|
-
parser = XMLStreamObjectParser.new(listener)
|
45
|
+
parser = XMLStreamObjectParser.new(BaseFormat, listener)
|
48
46
|
parser.parse(file)
|
49
47
|
el = listener.abc.get_object
|
50
48
|
assert_equal el.value, value
|
@@ -56,7 +54,7 @@ class TestXMLStreamObjectParser < Test::Unit::TestCase
|
|
56
54
|
file = '<subel someattr="'+attrvalue+'"><abc>'+value+'</abc></subel>'
|
57
55
|
|
58
56
|
listener = MyStreamListener.new
|
59
|
-
parser = XMLStreamObjectParser.new(listener)
|
57
|
+
parser = XMLStreamObjectParser.new(BaseFormat, listener)
|
60
58
|
parser.parse(file)
|
61
59
|
|
62
60
|
el = listener.abc.get_object
|
@@ -72,7 +70,7 @@ class TestXMLStreamObjectParser < Test::Unit::TestCase
|
|
72
70
|
file = '<mult><abc>'+value+'</abc></mult>'
|
73
71
|
|
74
72
|
listener = MyStreamListener.new
|
75
|
-
parser = XMLStreamObjectParser.new(listener)
|
73
|
+
parser = XMLStreamObjectParser.new(BaseFormat, listener)
|
76
74
|
parser.parse(file)
|
77
75
|
|
78
76
|
el = listener.abc.get_object
|
@@ -85,7 +83,7 @@ class TestXMLStreamObjectParser < Test::Unit::TestCase
|
|
85
83
|
file = '<subels><abc>'+value+'</abc></subels>'
|
86
84
|
|
87
85
|
listener = MyStreamListener.new
|
88
|
-
parser = XMLStreamObjectParser.new(listener)
|
86
|
+
parser = XMLStreamObjectParser.new(BaseFormat, listener)
|
89
87
|
parser.parse(file)
|
90
88
|
|
91
89
|
el = listener.abc.get_object
|
@@ -98,7 +96,7 @@ class TestXMLStreamObjectParser < Test::Unit::TestCase
|
|
98
96
|
file = '<subel><abc>'+value+'</abc></subel>'
|
99
97
|
|
100
98
|
listener = MyConsumingStreamListener.new
|
101
|
-
parser = XMLStreamObjectParser.new(listener)
|
99
|
+
parser = XMLStreamObjectParser.new(BaseFormat, listener)
|
102
100
|
parser.parse(file)
|
103
101
|
|
104
102
|
el = listener.abc.get_object
|
@@ -112,7 +110,7 @@ class TestXMLStreamObjectParser < Test::Unit::TestCase
|
|
112
110
|
file = '<subels><abc2>'+value1+'</abc2><abc3>'+value2+'</abc3></subels>'
|
113
111
|
|
114
112
|
listener = MyStreamListener.new
|
115
|
-
parser = XMLStreamObjectParser.new(listener)
|
113
|
+
parser = XMLStreamObjectParser.new(BaseFormat, listener)
|
116
114
|
parser.parse(file)
|
117
115
|
|
118
116
|
el = listener.subels.get_object
|
@@ -129,7 +127,7 @@ class TestXMLStreamObjectParser < Test::Unit::TestCase
|
|
129
127
|
file = '<mult><abc2>'+value1+'</abc2><abc3>'+value2+'</abc3></mult>'
|
130
128
|
|
131
129
|
listener = MyStreamListener.new
|
132
|
-
parser = XMLStreamObjectParser.new(listener)
|
130
|
+
parser = XMLStreamObjectParser.new(BaseFormat, listener)
|
133
131
|
parser.parse(file)
|
134
132
|
|
135
133
|
el = listener.mult.get_object
|
@@ -145,7 +143,7 @@ class TestXMLStreamObjectParser < Test::Unit::TestCase
|
|
145
143
|
file = '<subel><abc3>'+value+'</abc3></subel>'
|
146
144
|
|
147
145
|
listener = MyStreamListener.new
|
148
|
-
parser = XMLStreamObjectParser.new(listener)
|
146
|
+
parser = XMLStreamObjectParser.new(BaseFormat, listener)
|
149
147
|
parser.parse(file)
|
150
148
|
|
151
149
|
el = listener.subel.get_object
|
@@ -159,7 +157,7 @@ class TestXMLStreamObjectParser < Test::Unit::TestCase
|
|
159
157
|
file = '<subel><abc>'+value+'</abc></subel>'
|
160
158
|
|
161
159
|
listener = MyStreamListener.new
|
162
|
-
parser = XMLStreamObjectParser.new(listener)
|
160
|
+
parser = XMLStreamObjectParser.new(BaseFormat, listener)
|
163
161
|
parser.parse(file)
|
164
162
|
|
165
163
|
el1 = listener.subel
|
@@ -1,12 +1,9 @@
|
|
1
|
-
|
2
|
-
$-w = true
|
3
|
-
|
4
|
-
require 'test/unit'
|
5
|
-
require 'XMLStreamParser'
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
6
2
|
|
7
3
|
class MyXMLStreamListener
|
8
4
|
attr_reader :def_id, :def_parent_id
|
9
5
|
attr_reader :abc_id, :abc_parent_id
|
6
|
+
attr_reader :abc_content
|
10
7
|
|
11
8
|
def el_def(el)
|
12
9
|
@def_id, = el.element_id
|
@@ -17,6 +14,7 @@ class MyXMLStreamListener
|
|
17
14
|
def el_abc(el)
|
18
15
|
@abc_id, = el.element_id
|
19
16
|
@abc_parent_id = el.parent_id
|
17
|
+
@abc_content = el.content
|
20
18
|
el.consume
|
21
19
|
end
|
22
20
|
end
|
@@ -42,6 +40,7 @@ class TestXMLStreamParser < Test::Unit::TestCase
|
|
42
40
|
assert_equal(listener.abc_id, listener.def_parent_id)
|
43
41
|
assert_equal(0, listener.abc_parent_id)
|
44
42
|
assert_equal(1, listener.abc_id)
|
43
|
+
assert_equal(@doc_no_def, listener.abc_content)
|
45
44
|
assert(listener.def_id > listener.def_parent_id)
|
46
45
|
end
|
47
46
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
require 'stringio'
|
3
|
+
require 'rexml/document'
|
4
|
+
class TestXMLTextElement < Test::Unit::TestCase
|
5
|
+
def test_base
|
6
|
+
value = 'Some Value'
|
7
|
+
el = XMLTextElement.new value
|
8
|
+
assert_equal value, el.to_s
|
9
|
+
assert_equal value, el.xml_text
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_partial_export
|
13
|
+
io = StringIO.new
|
14
|
+
value = 'Some Value'
|
15
|
+
el = XMLTextElement.new value
|
16
|
+
el.partial_export(io)
|
17
|
+
io.pos = 0
|
18
|
+
assert_equal value, io.read
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_elname
|
22
|
+
el = XMLTextElement.new 'abc'
|
23
|
+
assert_equal '__TEXT__', el.elname
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_create_xml
|
27
|
+
xmlel = REXML::Element.new 'abc'
|
28
|
+
value = 'Some Value'
|
29
|
+
el = XMLTextElement.new value
|
30
|
+
el.create_xml(xmlel)
|
31
|
+
assert_equal '<abc>'+value+'</abc>', xmlel.to_s
|
32
|
+
end
|
33
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -1,7 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
require 'XMLUtils'
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
require 'tmpdir'
|
5
3
|
|
6
4
|
class TestXMLUtils < Test::Unit::TestCase
|
7
5
|
def test_create_open_tag
|
@@ -48,4 +46,22 @@ class TestXMLUtils < Test::Unit::TestCase
|
|
48
46
|
assert_equal result, XMLUtils::get_xpath(path, StringIO.new(xml), opts)
|
49
47
|
assert_equal result, XMLUtils::get_xpath(path, REXML::Document.new(xml), opts)
|
50
48
|
end
|
49
|
+
|
50
|
+
def test_count_elements
|
51
|
+
text = '<root><abc/><abc/></root>'
|
52
|
+
filename = File.join(Dir::tmpdir, 'test_count_elements.xml')
|
53
|
+
f = File.open(filename, 'w')
|
54
|
+
f << text
|
55
|
+
f.close
|
56
|
+
assert_equal 2, XMLUtils::count_elements('//abc', filename)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_element_exists
|
60
|
+
text = '<root><abc/><abc/></root>'
|
61
|
+
filename = File.join(Dir::tmpdir, 'test_element_exists.xml')
|
62
|
+
f = File.open(filename, 'w')
|
63
|
+
f << text
|
64
|
+
f.close
|
65
|
+
assert XMLUtils::element_exists('//abc', filename)
|
66
|
+
end
|
51
67
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: xmlcodec
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0
|
7
|
-
date: 2006-07-
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2006-07-27 00:00:00 +01:00
|
8
8
|
summary: Generic Importer/Exporter of XML formats
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -29,17 +29,20 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- "Pedro C\xC3\xB4rte-Real"
|
31
31
|
files:
|
32
|
-
- test/
|
33
|
-
- test/
|
34
|
-
- test/
|
35
|
-
- test/
|
36
|
-
- test/
|
32
|
+
- test/multi_format_test.rb
|
33
|
+
- test/utils_test.rb
|
34
|
+
- test/stream_parser_test.rb
|
35
|
+
- test/element_test.rb
|
36
|
+
- test/partial_export_test.rb
|
37
37
|
- test/simple_objects.rb
|
38
|
-
-
|
39
|
-
-
|
40
|
-
-
|
41
|
-
- lib/
|
38
|
+
- test/stream_object_parser_test.rb
|
39
|
+
- test/test_helper.rb
|
40
|
+
- test/subelements_test.rb
|
41
|
+
- lib/stream_parser.rb
|
42
42
|
- lib/XMLUtils.rb
|
43
|
+
- lib/subelements.rb
|
44
|
+
- lib/element.rb
|
45
|
+
- lib/stream_object_parser.rb
|
43
46
|
- lib/xmlcodec.rb
|
44
47
|
- README
|
45
48
|
- LICENSE
|