rsxml 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/rsxml.rb +25 -8
- data/spec/rsxml_spec.rb +27 -1
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.4
|
data/lib/rsxml.rb
CHANGED
@@ -4,15 +4,24 @@ require 'builder'
|
|
4
4
|
module Rsxml
|
5
5
|
module_function
|
6
6
|
|
7
|
+
def check_opts(constraints, opts)
|
8
|
+
(opts||{}).each do |k,v|
|
9
|
+
raise "opt not permitted: #{k}" if !constraints.has_key?(k)
|
10
|
+
constraint = constraints[k]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
7
14
|
# convert an Rsxml s-expression representation of an XML document to XML
|
8
15
|
# Rsxml.to_xml(["Foo", {"foofoo"=>"10"}, ["Bar", "barbar"] ["Baz"]])
|
9
16
|
# => '<Foo foofoo="10"><Bar>barbar</Bar><Baz></Baz></Foo>'
|
10
|
-
def to_xml(rsxml)
|
17
|
+
def to_xml(rsxml, &transformer)
|
11
18
|
xml = Builder::XmlMarkup.new
|
12
|
-
Sexp.write_xml(xml, rsxml)
|
19
|
+
Sexp.write_xml(xml, rsxml, &transformer)
|
13
20
|
xml.target!
|
14
21
|
end
|
15
22
|
|
23
|
+
TO_RSXML_OPTS = {:ns=>nil}
|
24
|
+
|
16
25
|
# convert an XML string to an Rsxml s-expression representation
|
17
26
|
# Rsxml.to_rsxml('<Foo foofoo="10"><Bar>barbar</Bar><Baz></Baz></Foo>')
|
18
27
|
# => ["Foo", {"foofoo"=>"10"}, ["Bar", "barbar"], ["Baz"]]
|
@@ -23,8 +32,9 @@ module Rsxml
|
|
23
32
|
# fragment = '<foo:Foo foo:foofoo="10"><Bar>barbar</Bar><Baz></Baz></Foo>'
|
24
33
|
# Rsxml.to_rsxml(fragment, {"foo"=>"http://foo.com/foo", ""=>"http://baz.com/baz"})
|
25
34
|
# => ["foo:Foo", {"foo:foofoo"=>"10", "xmlns:foo"=>"http://foo.com/foo", "xmlns"=>"http://baz.com/baz"}, ["Bar", "barbar"], ["Baz"]]
|
26
|
-
def to_rsxml(doc,
|
27
|
-
|
35
|
+
def to_rsxml(doc, opts={})
|
36
|
+
check_opts(TO_RSXML_OPTS, opts)
|
37
|
+
doc = Xml.wrap_fragment(doc, opts[:ns])
|
28
38
|
root = Xml.unwrap_fragment(Nokogiri::XML(doc).children.first)
|
29
39
|
Xml.read_xml(root, [])
|
30
40
|
end
|
@@ -40,13 +50,20 @@ module Rsxml
|
|
40
50
|
module Sexp
|
41
51
|
module_function
|
42
52
|
|
43
|
-
def write_xml(xml, sexp)
|
53
|
+
def write_xml(xml, sexp, path="", &transformer)
|
44
54
|
tag, attrs, children = decompose_sexp(sexp)
|
45
55
|
|
46
|
-
|
47
|
-
|
56
|
+
if transformer
|
57
|
+
txtag, txattrs = transformer.call(tag, attrs, path)
|
58
|
+
else
|
59
|
+
txtag, txattrs = [tag, attrs]
|
60
|
+
end
|
61
|
+
|
62
|
+
cp = [path, tag].join("/")
|
63
|
+
xml.__send__(txtag, txattrs) do
|
64
|
+
children.each_with_index do |child, i|
|
48
65
|
if child.is_a?(Array)
|
49
|
-
write_xml(xml, child)
|
66
|
+
write_xml(xml, child, "#{cp}[#{i}]", &transformer)
|
50
67
|
else
|
51
68
|
xml << child
|
52
69
|
end
|
data/spec/rsxml_spec.rb
CHANGED
@@ -67,6 +67,32 @@ describe Rsxml do
|
|
67
67
|
r.attributes["baz"].namespace.href.should == "http://foo.com/foo"
|
68
68
|
r.attributes["baz"].namespace.prefix.should == "foo"
|
69
69
|
end
|
70
|
+
|
71
|
+
it "should transform a single tag if a transformer is supplied" do
|
72
|
+
xml = Rsxml.to_xml([:foo]) do |tag,attrs,path|
|
73
|
+
path.should == ""
|
74
|
+
[tag.upcase, attrs]
|
75
|
+
end.should ==
|
76
|
+
"<FOO></FOO>"
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should transform nested tags if a transformer is supplied" do
|
80
|
+
txs = {"/foo"=>"Blub", "/foo[0]/bar"=>"Wub"}
|
81
|
+
xml = Rsxml.to_xml([:foo, [:bar]]) do |tag,attrs,path|
|
82
|
+
$stderr << [tag, attrs, path].inspect
|
83
|
+
[txs[[path, tag].join("/")], attrs]
|
84
|
+
end.should ==
|
85
|
+
"<Blub><Wub></Wub></Blub>"
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should transform a tag with attributes if a transformer is supplied" do
|
89
|
+
xml = Rsxml.to_xml([:foo, {:bar=>"bar"}]) do |tag,attrs,path|
|
90
|
+
path.should == ""
|
91
|
+
[tag.upcase, Hash[*attrs.map{|k,v| [k.to_s.upcase,v]}.flatten]]
|
92
|
+
end.should ==
|
93
|
+
'<FOO BAR="bar"></FOO>'
|
94
|
+
|
95
|
+
end
|
70
96
|
end
|
71
97
|
|
72
98
|
describe "to_rsxml" do
|
@@ -105,7 +131,7 @@ describe Rsxml do
|
|
105
131
|
xml = Rsxml.to_xml(["foo:foofoo", {"foo:bar"=>"1", "foo:baz"=>"baz"}])
|
106
132
|
|
107
133
|
org_with_ns = ["foo:foofoo", {"foo:bar"=>"1", "foo:baz"=>"baz", "xmlns"=>"http://baz.com/baz", "xmlns:foo"=>"http://foo.com/foo"}]
|
108
|
-
rsxml = Rsxml.to_rsxml(xml, {:foo=>"http://foo.com/foo", ""=>"http://baz.com/baz"})
|
134
|
+
rsxml = Rsxml.to_rsxml(xml, :ns=>{:foo=>"http://foo.com/foo", ""=>"http://baz.com/baz"})
|
109
135
|
|
110
136
|
rsxml.should == org_with_ns
|
111
137
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsxml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 4
|
10
|
+
version: 0.1.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Trampoline Systems Ltd
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-05-
|
18
|
+
date: 2011-05-05 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|