xml-smart 0.3.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/AUTHORS +4 -0
- data/COPYING +504 -0
- data/README.rdoc +55 -0
- data/Rakefile +15 -0
- data/example/EXAMPLE.xml +18 -0
- data/example/xpath_visual.rb +54 -0
- data/lib/xml/XSDtoRNG.xsl +448 -0
- data/lib/xml/smart.rb +177 -0
- data/lib/xml/smart_dom.rb +118 -0
- data/lib/xml/smart_domattribute.rb +34 -0
- data/lib/xml/smart_domattributeset.rb +62 -0
- data/lib/xml/smart_domelement.rb +213 -0
- data/lib/xml/smart_domnamespace.rb +32 -0
- data/lib/xml/smart_domnamespaceset.rb +125 -0
- data/lib/xml/smart_domnodeset.rb +59 -0
- data/lib/xml/smart_domother.rb +16 -0
- data/lib/xml/smart_domtext.rb +25 -0
- data/lib/xml/smart_qname.rb +34 -0
- data/test/1.xml +1 -0
- data/test/2.xml +1 -0
- data/test/3.xml +1 -0
- data/test/EXAMPLE-NS.xml +18 -0
- data/test/EXAMPLE-NSE.xml +18 -0
- data/test/EXAMPLE.str.xml +6 -0
- data/test/EXAMPLE.str.xml.test +6 -0
- data/test/EXAMPLE.tmp.xml +4 -0
- data/test/EXAMPLE.tmp.xml.test +4 -0
- data/test/EXAMPLE.xml +17 -0
- data/test/HELLO-MORE.xml +1 -0
- data/test/HELLO.rng +9 -0
- data/test/HELLO.xml +8 -0
- data/test/HELLO.xsd +16 -0
- data/test/XSL_BASE.xml +17 -0
- data/test/XSL_BASE.xml.test +16 -0
- data/test/XSL_DOCUMENT.xml +48 -0
- data/test/concurrent.xml +1 -0
- data/test/smartrunner.rb +25 -0
- data/test/tc_add.rb +21 -0
- data/test/tc_basic.rb +108 -0
- data/test/tc_concurrent.rb +73 -0
- data/test/tc_copy.rb +41 -0
- data/test/tc_create.rb +32 -0
- data/test/tc_delete.rb +52 -0
- data/test/tc_move_elements.rb +24 -0
- data/test/tc_namespace_default.rb +70 -0
- data/test/tc_namespace_detailed.rb +44 -0
- data/test/tc_namespace_find.rb +22 -0
- data/test/tc_nested.rb +26 -0
- data/test/tc_qname.rb +30 -0
- data/test/tc_relaxng.rb +30 -0
- data/test/tc_set_or_replace.rb +57 -0
- data/test/tc_sort.rb +18 -0
- data/test/tc_string.rb +41 -0
- data/test/tc_todoc.rb +27 -0
- data/test/tc_write.rb +19 -0
- data/test/tc_xinclude.rb +26 -0
- data/test/tc_xmlschema.rb +30 -0
- data/test/tc_xpath.rb +16 -0
- data/test/tc_xpath_attrs.rb +24 -0
- data/test/tc_xpath_functions.rb +12 -0
- data/test/tc_xpath_root.rb +23 -0
- data/test/tc_xsl.rb +22 -0
- data/xml-smart.gemspec +26 -0
- metadata +201 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestNamespaceDefault < MiniTest::Unit::TestCase
|
7
|
+
def test_namespace_default
|
8
|
+
# No closure, so changes are temporary
|
9
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml")
|
10
|
+
assert(doc.register_namespace('x','http://schemas.xmlsoap.org/wsdl/soap/') == true)
|
11
|
+
assert(doc.register_namespace('y','aaaa') == false)
|
12
|
+
assert(doc.unregister_namespace('soap') == false)
|
13
|
+
|
14
|
+
assert(doc.namespaces.length == 2)
|
15
|
+
assert(doc.namespaces.key? 'soap')
|
16
|
+
assert(doc.namespaces.key? 'x')
|
17
|
+
|
18
|
+
# add an element hallo to root
|
19
|
+
nsnode = doc.root.add("hallo")
|
20
|
+
|
21
|
+
success = true
|
22
|
+
nsnode.add('aaa:test') rescue success = false
|
23
|
+
assert(!success)
|
24
|
+
|
25
|
+
assert(nsnode.dump == "<hallo/>")
|
26
|
+
assert(!nsnode.namespace?)
|
27
|
+
|
28
|
+
success = true
|
29
|
+
n = nsnode.add('x:test') rescue success = false
|
30
|
+
assert(success)
|
31
|
+
|
32
|
+
assert(nsnode.dump == "<hallo>\n <soap:test/>\n</hallo>")
|
33
|
+
|
34
|
+
assert(nsnode.qname.name == "hallo")
|
35
|
+
assert(nsnode.qname.to_s == "hallo")
|
36
|
+
assert(nsnode.qname.prefix == nil)
|
37
|
+
assert(nsnode.qname.href == nil)
|
38
|
+
assert(nsnode.namespace? == false)
|
39
|
+
assert(nsnode.namespace == nil)
|
40
|
+
|
41
|
+
assert(n.qname.name == "test")
|
42
|
+
assert(n.qname.to_s == "soap:test")
|
43
|
+
assert(n.qname.prefix == "soap")
|
44
|
+
assert(n.qname.href == "http://schemas.xmlsoap.org/wsdl/soap/")
|
45
|
+
assert(n.namespace? == true)
|
46
|
+
assert(n.namespace.instance_of?(XML::Smart::Dom::Namespace) == true)
|
47
|
+
assert(n.namespace.prefix == "soap")
|
48
|
+
assert(n.namespace.href == "http://schemas.xmlsoap.org/wsdl/soap/")
|
49
|
+
|
50
|
+
# add a namespace to the element
|
51
|
+
nsnode.namespaces.add("test","http://heise1")
|
52
|
+
nsnode.namespaces.add("aaa","http://heise2")
|
53
|
+
nsnode.namespaces.add(nil,"http://heise")
|
54
|
+
nsnode.namespaces[nil] = "http://heiser"
|
55
|
+
|
56
|
+
assert(nsnode.namespaces[nil].prefix == 'xmlns')
|
57
|
+
assert(nsnode.namespaces[nil].href == "http://heiser")
|
58
|
+
assert(nsnode.namespaces['xmlns'].href == "http://heiser")
|
59
|
+
assert(nsnode.namespaces['aaa'].href == "http://heise2")
|
60
|
+
assert(nsnode.namespaces['test'].href == "http://heise1")
|
61
|
+
|
62
|
+
assert(doc.namespaces.length == 5)
|
63
|
+
nsnode.namespaces.delete_at('aaa')
|
64
|
+
assert(nsnode.namespaces['aaa'].nil?)
|
65
|
+
|
66
|
+
assert(doc.namespaces.length == 4)
|
67
|
+
nsnode.namespaces.delete_all!
|
68
|
+
assert(doc.namespaces.length == 2)
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestNamespaceDetailes < MiniTest::Unit::TestCase
|
7
|
+
def test_namespace_detailed
|
8
|
+
# No closure, so changes are temporary
|
9
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml")
|
10
|
+
|
11
|
+
# add an element hallo to root
|
12
|
+
nsnode = doc.root.add("hallo")
|
13
|
+
|
14
|
+
assert(nsnode.dump == "<hallo/>")
|
15
|
+
|
16
|
+
# add a namespace to the element
|
17
|
+
ns = nsnode.namespaces.add("test","http://heise")
|
18
|
+
|
19
|
+
# has the element a namespace? - No
|
20
|
+
assert(!nsnode.namespace?)
|
21
|
+
|
22
|
+
# set one
|
23
|
+
nsnode.namespace = ns
|
24
|
+
|
25
|
+
# has the element a namespace? - Yes
|
26
|
+
assert(nsnode.namespace?)
|
27
|
+
|
28
|
+
# inspect the namespace + print (to_s)
|
29
|
+
assert(ns.prefix == 'test')
|
30
|
+
assert(ns.href == 'http://heise')
|
31
|
+
|
32
|
+
# add a node, a namespace, then add the namespace to the element (via a string)
|
33
|
+
nsnode = doc.root.add("hallo")
|
34
|
+
nsnode.namespaces["sulu"] = "http://slashdot"
|
35
|
+
assert(nsnode.namespaces["soap"].nil?)
|
36
|
+
assert(nsnode.namespaces["sulu"].prefix == 'sulu')
|
37
|
+
|
38
|
+
nsnode.namespace = "sulu"
|
39
|
+
assert(nsnode.namespaces["sulu"].prefix == 'sulu')
|
40
|
+
|
41
|
+
nsnode.namespace = "http://slashdot"
|
42
|
+
assert(nsnode.namespaces["sulu"].prefix == 'sulu')
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestNamespaceFind < MiniTest::Unit::TestCase
|
7
|
+
def test_namespace_find
|
8
|
+
# No closure, so changes are temporary
|
9
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml")
|
10
|
+
|
11
|
+
# add a node with namespace
|
12
|
+
nsnode = doc.root.add("hallo")
|
13
|
+
nsnode.namespaces.add("test","http://heise")
|
14
|
+
nsnode.add("test:entry")
|
15
|
+
|
16
|
+
# find node
|
17
|
+
assert(doc.find("//test:entry").empty? == false)
|
18
|
+
|
19
|
+
doc.register_namespace("t","http://heise")
|
20
|
+
assert(nsnode.find("t:entry").empty? == false)
|
21
|
+
end
|
22
|
+
end
|
data/test/tc_nested.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'time'
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
5
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
6
|
+
|
7
|
+
class TestNested < MiniTest::Unit::TestCase
|
8
|
+
def test_nested
|
9
|
+
nums = 5000
|
10
|
+
soc = XML::Smart.string("<?xml version='1.0'?><root><node id='1'><text>I am a text</text></node><node id='2'/></root>")
|
11
|
+
# Watch the power
|
12
|
+
start_timing "Nested (#{nums} times)"
|
13
|
+
1.upto(nums) { |i|
|
14
|
+
# create a XML document and copy the elements for each node to a file
|
15
|
+
soc.find("/root/node").each do |ele|
|
16
|
+
ts = ele.find('text')
|
17
|
+
if ts.any?
|
18
|
+
a = ts.first.to_doc
|
19
|
+
end
|
20
|
+
end
|
21
|
+
ts = soc.find("/root/node").first
|
22
|
+
ts.add('text','Haller')
|
23
|
+
}
|
24
|
+
end_timing
|
25
|
+
end
|
26
|
+
end
|
data/test/tc_qname.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestQname < MiniTest::Unit::TestCase
|
7
|
+
def test_qname
|
8
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml")
|
9
|
+
doc.register_namespace("s","http://schemas.xmlsoap.org/wsdl/soap/")
|
10
|
+
|
11
|
+
node = doc.root.find("/test/s:hallo").first
|
12
|
+
assert(!node.nil?)
|
13
|
+
assert(node.qname == "hallo")
|
14
|
+
assert(node.qname.name == 'hallo')
|
15
|
+
assert(node.qname.prefix == 'soap')
|
16
|
+
assert(node.namespace.instance_of? XML::Smart::Dom::Namespace)
|
17
|
+
assert(node.qname.to_s == 'soap:hallo')
|
18
|
+
assert(node.qname.instance_of? XML::Smart::QName)
|
19
|
+
|
20
|
+
node = doc.root.find("/test").first
|
21
|
+
assert(node.qname.to_s == 'test')
|
22
|
+
|
23
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE-NS.xml")
|
24
|
+
|
25
|
+
node = doc.root.find("/xmlns0:test").first
|
26
|
+
assert(!node.nil?)
|
27
|
+
assert(node.qname == "test")
|
28
|
+
assert(node.qname.to_s == "test")
|
29
|
+
end
|
30
|
+
end
|
data/test/tc_relaxng.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestRelaxng < MiniTest::Unit::TestCase
|
7
|
+
def test_relaxng
|
8
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/HELLO.xml")
|
9
|
+
doc.xinclude!
|
10
|
+
xsd = XML::Smart.open(::File.dirname(__FILE__) + "/HELLO.rng")
|
11
|
+
|
12
|
+
nums = 10000
|
13
|
+
# Watch the power
|
14
|
+
start_timing "RelaxNG #validate_against (#{nums} times)"
|
15
|
+
nums.times do
|
16
|
+
doc.validate_against(xsd)
|
17
|
+
end
|
18
|
+
assert(doc.validate_against(xsd) == true)
|
19
|
+
end_timing
|
20
|
+
|
21
|
+
doc.find('/hellos/hello[3]').each do |h|
|
22
|
+
h.qname.name = 'test'
|
23
|
+
end
|
24
|
+
assert(!doc.validate_against(xsd))
|
25
|
+
|
26
|
+
doc.validate_against(xsd) do |err|
|
27
|
+
assert("#{err.file} line #{err.line}: #{err.to_s}" =~ /HELLO.xml line 4: Did not expect element test there/)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'time'
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
5
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
6
|
+
|
7
|
+
class TestSetOrReplace < MiniTest::Unit::TestCase
|
8
|
+
def test_set_or_replace
|
9
|
+
nums = 1000
|
10
|
+
|
11
|
+
start_timing "#replace_by, #root= (#{nums} times)"
|
12
|
+
1.upto(nums) { |i|
|
13
|
+
# create a XML document and copy the elements for each node to a file
|
14
|
+
soc = XML::Smart.string("<?xml version='1.0'?><root><node id='1'><text>I am a text</text></node><node id='2'/></root>")
|
15
|
+
soc.root.find("/root/node").each { |ele|
|
16
|
+
cdoc = XML::Smart.open(::File.dirname(__FILE__) + "/#{ele.attributes["id"]}.xml")
|
17
|
+
cdoc.root.replace_by(ele)
|
18
|
+
}
|
19
|
+
|
20
|
+
# create a XML document and copy the elements for each node to a file
|
21
|
+
soc = XML::Smart.string("<?xml version='1.0'?><root><node id='1'><text>I am a text</text></node><node id='2'/></root>")
|
22
|
+
soc.root.find("/root/node").each { |ele|
|
23
|
+
cdoc = XML::Smart.open(::File.dirname(__FILE__) + "/#{ele.attributes["id"]}.xml")
|
24
|
+
cdoc.root = ele
|
25
|
+
}
|
26
|
+
|
27
|
+
# create a file and copy a newly created XML document to it
|
28
|
+
cdoc = XML::Smart.open(::File.dirname(__FILE__) + "/3.xml")
|
29
|
+
cdoc.root = XML::Smart.string("<root><node id='1'><text>I am a text</text></node><node id='#{i}'/></root>").root
|
30
|
+
}
|
31
|
+
end_timing
|
32
|
+
|
33
|
+
soc = XML::Smart.string("<?xml version='1.0'?><root><node id='1'><text>I am a text</text></node><node id='2'/></root>")
|
34
|
+
eles = soc.root.find("/root/node")
|
35
|
+
|
36
|
+
cdoc = XML::Smart.open(::File.dirname(__FILE__) + "/#{eles[0].attributes["id"]}.xml")
|
37
|
+
cdoc.root.replace_by(eles[0])
|
38
|
+
assert(cdoc.root.dump == "<node id=\"1\">\n <text>I am a text</text>\n</node>")
|
39
|
+
|
40
|
+
cdoc = XML::Smart.open(::File.dirname(__FILE__) + "/#{eles[1].attributes["id"]}.xml")
|
41
|
+
cdoc.root.replace_by(eles[1])
|
42
|
+
assert(cdoc.root.dump == "<node id=\"2\"/>")
|
43
|
+
|
44
|
+
cdoc = XML::Smart.open(::File.dirname(__FILE__) + "/#{eles[0].attributes["id"]}.xml")
|
45
|
+
cdoc.root = eles[0]
|
46
|
+
assert(cdoc.root.dump == "<node id=\"1\">\n <text>I am a text</text>\n</node>")
|
47
|
+
|
48
|
+
cdoc = XML::Smart.open(::File.dirname(__FILE__) + "/#{eles[1].attributes["id"]}.xml")
|
49
|
+
cdoc.root = eles[1]
|
50
|
+
assert(cdoc.root.dump == "<node id=\"2\"/>")
|
51
|
+
|
52
|
+
# create a file and copy a newly created XML document to it
|
53
|
+
cdoc = XML::Smart.open(::File.dirname(__FILE__) + "/3.xml")
|
54
|
+
cdoc.root = XML::Smart.string("<root><node id='1'><text>I am a text</text></node><node id='x'/></root>").root
|
55
|
+
cdoc.root.dump == "<root>\n <node id=\"1\">\n <text>I am a text</text>\n </node>\n <node id=\"x\"/>\n</root>"
|
56
|
+
end
|
57
|
+
end
|
data/test/tc_sort.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'rubygems'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
5
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
6
|
+
|
7
|
+
class TestSort < MiniTest::Unit::TestCase
|
8
|
+
def test_sort
|
9
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml")
|
10
|
+
nodes = doc.find("//names/name[@team>0]").sort{|a,b| a.to_s <=> b.to_s}
|
11
|
+
|
12
|
+
assert(nodes[0].text == 'Egon')
|
13
|
+
assert(nodes[1].text == 'Jürgen')
|
14
|
+
assert(nodes[2].text == 'Kathrin ')
|
15
|
+
assert(nodes[3].text == 'Michel')
|
16
|
+
assert(nodes[4].text == 'Raphi')
|
17
|
+
end
|
18
|
+
end
|
data/test/tc_string.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'rubygems'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
5
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
6
|
+
|
7
|
+
class TestString < MiniTest::Unit::TestCase
|
8
|
+
def test_String
|
9
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml")
|
10
|
+
|
11
|
+
# create a string
|
12
|
+
xmldoc = "<?xml version='1.0'?>\n"
|
13
|
+
xmldoc << "<contributors>
|
14
|
+
<guy id='1' nick='eTM'>Jürgen</guy>
|
15
|
+
<guy id='2' nick='chris2'>Christian</guy>
|
16
|
+
<guy id='3'>Emanuel</guy>
|
17
|
+
<guy id='4'>41</guy>\n"
|
18
|
+
xmldoc << "</contributors>"
|
19
|
+
|
20
|
+
# parse it
|
21
|
+
doc = XML::Smart.string(xmldoc)
|
22
|
+
|
23
|
+
# output all guys with a nickname (the ü is a UTF-8 character in the output)
|
24
|
+
# cause (always) everything that is returned is UTF-8
|
25
|
+
nodes = doc.root.find("/contributors/guy[@nick]")
|
26
|
+
assert("#{nodes[0]} (#{nodes[0].attributes.include?("nick")})" == "Jürgen (true)")
|
27
|
+
assert("#{nodes[0]} (#{nodes[0].attributes["nick"]})" == "Jürgen (eTM)")
|
28
|
+
assert("#{nodes[1]} (#{nodes[1].attributes.include?("nick")})" == "Christian (true)")
|
29
|
+
assert("#{nodes[1]} (#{nodes[1].attributes["nick"]})" == "Christian (chris2)")
|
30
|
+
assert(nodes[2].nil?)
|
31
|
+
|
32
|
+
# query arthur dent
|
33
|
+
assert((doc.root.find("/contributors/guy[@id='4']").first.to_i + 1) == 42)
|
34
|
+
|
35
|
+
# write to a file
|
36
|
+
File.unlink(::File.dirname(__FILE__) + "/EXAMPLE.str.xml") rescue nil
|
37
|
+
File.open(::File.dirname(__FILE__) + "/EXAMPLE.str.xml",File::WRONLY|File::CREAT|File::TRUNC) { |f| doc.save_as f }
|
38
|
+
|
39
|
+
assert(XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.str.xml").root.to_s == XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.str.xml.test").root.to_s)
|
40
|
+
end
|
41
|
+
end
|
data/test/tc_todoc.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestToDoc < MiniTest::Unit::TestCase
|
7
|
+
def test_todoc
|
8
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE-NS.xml")
|
9
|
+
doc.root.children[0].add('soap:haller')
|
10
|
+
doc.register_namespace :d, 'http://example.org'
|
11
|
+
|
12
|
+
nums = 10000
|
13
|
+
|
14
|
+
assert(doc.find("/d:test/d:names").first.to_doc.root.namespaces.length == 2)
|
15
|
+
assert(doc.find("/d:test/d:names/d:name[2]").first.to_doc.root.namespaces.length == 1)
|
16
|
+
assert(doc.find("/d:test").first.to_doc.root.namespaces.length == 2)
|
17
|
+
|
18
|
+
# Watch the power
|
19
|
+
start_timing "#to_doc (#{nums} times)"
|
20
|
+
nums.times do
|
21
|
+
doc.find("/d:test/d:names/d:name[2]").first.to_doc
|
22
|
+
end
|
23
|
+
end_timing
|
24
|
+
|
25
|
+
assert(doc.find("/d:test/d:names/d:name[2]").first.to_doc.root.dump == '<name xmlns="http://example.org" team="1">Jürgen</name>')
|
26
|
+
end
|
27
|
+
end
|
data/test/tc_write.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestWrite < MiniTest::Unit::TestCase
|
7
|
+
def test_write
|
8
|
+
tim = Time.now
|
9
|
+
|
10
|
+
# When a closure is used, then the changes are written back to the disk
|
11
|
+
XML::Smart.modify(::File.dirname(__FILE__) + "/EXAMPLE.xml") do |doc|
|
12
|
+
node = doc.root.find("/test/names/name")[0]
|
13
|
+
node.text = tim
|
14
|
+
end
|
15
|
+
|
16
|
+
# Print the document
|
17
|
+
assert(XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml").find("string(/test/names/name)") == tim.to_s)
|
18
|
+
end
|
19
|
+
end
|
data/test/tc_xinclude.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'pp'
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
5
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
6
|
+
|
7
|
+
class TestXinclude < MiniTest::Unit::TestCase
|
8
|
+
def test_xinclude
|
9
|
+
nums = 10000
|
10
|
+
|
11
|
+
# Watch the power
|
12
|
+
start_timing "#xinclude! (#{nums} times)"
|
13
|
+
nums.times do
|
14
|
+
doc = XML::Smart.open_unprotected(::File.dirname(__FILE__) + "/HELLO.xml")
|
15
|
+
doc.xinclude!
|
16
|
+
end
|
17
|
+
end_timing
|
18
|
+
|
19
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/HELLO.xml")
|
20
|
+
doc.xinclude!
|
21
|
+
|
22
|
+
stuff = doc.find('/hellos/*')
|
23
|
+
assert(stuff[4].text == "hello me")
|
24
|
+
assert(stuff[5].text == "hello curucamp")
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestXmlSchema < MiniTest::Unit::TestCase
|
7
|
+
def test_xmlschema
|
8
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/HELLO.xml")
|
9
|
+
doc.xinclude!
|
10
|
+
xsd = XML::Smart.open(::File.dirname(__FILE__) + "/HELLO.xsd")
|
11
|
+
|
12
|
+
nums = 500
|
13
|
+
# Watch the power
|
14
|
+
start_timing "XML Schema #validate_against (#{nums} times)"
|
15
|
+
nums.times do
|
16
|
+
doc.validate_against(xsd)
|
17
|
+
end
|
18
|
+
assert(doc.validate_against(xsd) == true)
|
19
|
+
end_timing
|
20
|
+
|
21
|
+
doc.find('/hellos/hello[3]').each do |h|
|
22
|
+
h.qname.name = 'test'
|
23
|
+
end
|
24
|
+
assert(!doc.validate_against(xsd))
|
25
|
+
|
26
|
+
doc.validate_against(xsd) do |err|
|
27
|
+
assert("#{err.file} line #{err.line}: #{err.to_s}" =~ /HELLO.xml line 4: Did not expect element test there/)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/test/tc_xpath.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestXpath < MiniTest::Unit::TestCase
|
7
|
+
def test_xpath
|
8
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE-NS.xml")
|
9
|
+
doc.register_namespace 'des', 'http://example.org'
|
10
|
+
doc.register_namespace 'ex', 'http://example1.org'
|
11
|
+
|
12
|
+
assert(doc.find('//des:names').length == 1)
|
13
|
+
nodesA = doc.root.find("des:names")
|
14
|
+
assert(nodesA.length == 1)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestXpathAttrs < MiniTest::Unit::TestCase
|
7
|
+
def test_xpath_attrs
|
8
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml")
|
9
|
+
node = doc.root.find("/test/names/name[2]/@team").first
|
10
|
+
|
11
|
+
assert(node.qname == "team")
|
12
|
+
|
13
|
+
# print attribute name and value
|
14
|
+
assert(node.qname + "=" + node.value == 'team=1')
|
15
|
+
assert(node.qname + "=" + node.to_s == 'team=1')
|
16
|
+
|
17
|
+
# set the value of the attribute
|
18
|
+
node.value = "Value"
|
19
|
+
assert(node.value == 'Value')
|
20
|
+
|
21
|
+
doc.root.find("/test/names/name[2]/@team").first.value = "Hi all"
|
22
|
+
assert(doc.root.find("/test/names/name[2]/@team").first.value == 'Hi all')
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestXpathFunctions < MiniTest::Unit::TestCase
|
7
|
+
def test_xpath_functions
|
8
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml")
|
9
|
+
assert(doc.root.find("count(/test/names/name)") == 6.0)
|
10
|
+
assert(doc.root.find("string(/test/names/name/@team)") == '0')
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestXpathRoot < MiniTest::Unit::TestCase
|
7
|
+
def test_xpath_root
|
8
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/EXAMPLE.xml")
|
9
|
+
nodes = doc.find("//*/text()")
|
10
|
+
assert(nodes[0].path == "/test/names/name[1]/text()")
|
11
|
+
assert(nodes[1].path == "/test/names/name[2]/text()")
|
12
|
+
assert(nodes[2].path == "/test/names/name[3]/text()")
|
13
|
+
assert(nodes[3].path == "/test/names/name[4]/text()")
|
14
|
+
assert(nodes[4].path == "/test/names/name[5]/text()")
|
15
|
+
assert(nodes[5].path == "/test/names/name[5]/b/text()")
|
16
|
+
assert(nodes[6].path == "/test/names/name[6]/text()")
|
17
|
+
assert(nodes[7].path == "/test/names/test_node/text()[1]")
|
18
|
+
assert(nodes[8].path == "/test/names/test_node/text()[2]")
|
19
|
+
assert(nodes[9].path == "/test/names/test_node/text()[3]")
|
20
|
+
assert(nodes[10].path == "/test/colors/blue/text()")
|
21
|
+
assert(nodes[11].nil?)
|
22
|
+
end
|
23
|
+
end
|
data/test/tc_xsl.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require File.expand_path(::File.dirname(__FILE__) + '/../lib/xml/smart')
|
4
|
+
require File.expand_path(::File.dirname(__FILE__) + '/smartrunner.rb')
|
5
|
+
|
6
|
+
class TestXSL < MiniTest::Unit::TestCase
|
7
|
+
def test_xsl
|
8
|
+
doc = XML::Smart.open(::File.dirname(__FILE__) + "/XSL_BASE.xml")
|
9
|
+
style = XML::Smart.open(::File.dirname(__FILE__) + "/XSL_DOCUMENT.xml")
|
10
|
+
|
11
|
+
nums = 1000
|
12
|
+
|
13
|
+
# Watch the power
|
14
|
+
start_timing "#transform_with (#{nums} times)"
|
15
|
+
nums.times do
|
16
|
+
doc.transform_with(style)
|
17
|
+
end
|
18
|
+
end_timing
|
19
|
+
|
20
|
+
assert(doc.root.to_s == XML::Smart.open(::File.dirname(__FILE__) + "/XSL_BASE.xml.test").root.to_s)
|
21
|
+
end
|
22
|
+
end
|
data/xml-smart.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "xml-smart"
|
3
|
+
s.version = "0.3.0"
|
4
|
+
s.platform = Gem::Platform::RUBY
|
5
|
+
s.summary = "An xml library that doesn't suck - since 2004."
|
6
|
+
|
7
|
+
s.description = <<-EOF
|
8
|
+
Write useful stuff.
|
9
|
+
|
10
|
+
Also see http://www.wst.univie.ac.at/~mangler/xml-smart/.
|
11
|
+
EOF
|
12
|
+
|
13
|
+
s.files = Dir['{lib/**/*,example/**/*}'] + %w(COPYING Rakefile xml-smart.gemspec README.rdoc AUTHORS)
|
14
|
+
s.require_path = 'lib'
|
15
|
+
s.extra_rdoc_files = ['README.rdoc']
|
16
|
+
s.test_files = Dir['test/tc_*.rb','test/*.xml','test/*.rng','test/*.xsd','test/*.test','test/smartrunner.rb']
|
17
|
+
|
18
|
+
s.authors = ['Juergen eTM Mangler']
|
19
|
+
s.email = 'juergen.mangler@gmail.com'
|
20
|
+
s.homepage = 'http://www.wst.univie.ac.at/~mangler/xml-smart/'
|
21
|
+
|
22
|
+
s.add_runtime_dependency 'nokogiri'
|
23
|
+
s.add_runtime_dependency 'lockfile'
|
24
|
+
s.add_runtime_dependency 'term-ansicolor'
|
25
|
+
s.add_runtime_dependency 'minitest'
|
26
|
+
end
|