XMLROCS 0.0.1
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/LICENSE +28 -0
- data/README +207 -0
- data/TODO +15 -0
- data/lib/xmlrocs.rb +327 -0
- data/test/fixtures/album.xml +62 -0
- data/test/fixtures/friends.xml +73 -0
- data/test/fixtures/misc.xml +30 -0
- data/test/fixtures/tags.xml +288 -0
- data/test/fixtures/toptags.xml +252 -0
- data/test/fixtures/weeklyalbums.xml +363 -0
- data/test/fixtures/weeklyartists.xml +325 -0
- data/test/fixtures/weeklychartlist.xml +150 -0
- data/test/fixtures/weeklytracks.xml +531 -0
- data/test/test_helper.rb +13 -0
- data/test/test_xmlrocs.rb +300 -0
- metadata +59 -0
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require "xmlrocs"
|
|
2
|
+
require "test/unit"
|
|
3
|
+
|
|
4
|
+
class TestHelper
|
|
5
|
+
def self.build_xml(limit)
|
|
6
|
+
return "" if limit <= 0
|
|
7
|
+
xmltext = "<X>"
|
|
8
|
+
('a'..'z').to_a.each_with_index do |x,i|
|
|
9
|
+
xmltext += "<#{x} id=\"#{i}\">" + build_xml(limit - 1) + "</#{x}>"
|
|
10
|
+
end
|
|
11
|
+
xmltext += "</X>"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
require "test/test_helper"
|
|
2
|
+
require "rexml/document"
|
|
3
|
+
require "rexml/xpath"
|
|
4
|
+
require "enumerator"
|
|
5
|
+
|
|
6
|
+
class Symbol
|
|
7
|
+
include Comparable
|
|
8
|
+
|
|
9
|
+
def to_proc
|
|
10
|
+
Proc.new { |*args| args.shift.__send__(self, *args) }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def <=>(other)
|
|
14
|
+
self.to_s <=> other.to_s
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class TestXMLROCS < Test::Unit::TestCase
|
|
19
|
+
FIXTURE_PATH = "test/fixtures"
|
|
20
|
+
include XMLROCS
|
|
21
|
+
|
|
22
|
+
def setup
|
|
23
|
+
@xmlfiles = Dir.open(FIXTURE_PATH).select { |e| e =~ /\.xml/ }.map { |e| e.sub(".xml", "") }
|
|
24
|
+
generate_instance_variables(@xmlfiles)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def generate_instance_variables(xmlfiles)
|
|
28
|
+
xmlfiles.each do |xmlfile|
|
|
29
|
+
instance_variable_set("@#{xmlfile}", XMLNode.new(:text => load_fixture(xmlfile)))
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def load_fixture(name)
|
|
34
|
+
File.new("#{FIXTURE_PATH}/#{name}.xml", "r").read
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def with_xmlobjs
|
|
38
|
+
@xmlfiles.map do |name|
|
|
39
|
+
text = load_fixture(name)
|
|
40
|
+
yield(XMLNode.new(:text => text), text)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def with_xmlobjs_traverse
|
|
45
|
+
with_xmlobjs do |xmlobj,text|
|
|
46
|
+
xmlobj.each do |x|
|
|
47
|
+
yield(x,xmlobj,text)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def with_xmlobjs_cons(cons = 1)
|
|
53
|
+
@xmlfiles.map { |filename| XMLNode.new(:text => load_fixture(filename)) }.each_cons(cons) { |objects| yield(objects) }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_invalid_xmls
|
|
57
|
+
assert_raise(ArgumentError) { XMLNode.new(:text => "") }
|
|
58
|
+
assert_raise(ArgumentError) { XMLNode.new(:text => "sdfjgkjhfgskdljfhg") }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_new_with_text
|
|
62
|
+
with_xmlobjs { |xmlobj,text| assert_equal(xmlobj, XMLNode.new(:text => text)) }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_comparable
|
|
66
|
+
with_xmlobjs { |xmlobj,text| assert_equal(xmlobj, xmlobj) }
|
|
67
|
+
with_xmlobjs_cons(2) { |(e,g)| assert_not_equal(e, g) }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_attributes_and_children_present
|
|
71
|
+
with_xmlobjs do |xmlobj,text|
|
|
72
|
+
xmlobj.each do |x|
|
|
73
|
+
assert_respond_to(x, :attributes)
|
|
74
|
+
assert_respond_to(x, :children)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_parent_relationship
|
|
80
|
+
with_xmlobjs do |xmlobj,text|
|
|
81
|
+
assert_nil(xmlobj.parent)
|
|
82
|
+
assert_test_parent_relationship(xmlobj)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def assert_test_parent_relationship(parent)
|
|
87
|
+
parent.children.each do |name, obj|
|
|
88
|
+
obj.each do |sibling|
|
|
89
|
+
assert_equal(parent, sibling.parent)
|
|
90
|
+
assert_test_parent_relationship(sibling)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_transform_to_xml_text
|
|
96
|
+
with_xmlobjs_traverse do |node,xmlobj,text|
|
|
97
|
+
assert_equal(node, XMLNode.new(:text => node.to_xml), "'#{node.to_s}' != '#{XMLNode.new(:text => node.to_xml).to_s}'")
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_add_attribute
|
|
102
|
+
with_xmlobjs_traverse do |node,xmlobj,text|
|
|
103
|
+
next if node[:attribute_symbol]
|
|
104
|
+
assert_nil(node[:attribute_symbol])
|
|
105
|
+
node[:attribute_symbol] = "foo"
|
|
106
|
+
assert_equal("foo", node[:attribute_symbol])
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def test_delete_attribute
|
|
111
|
+
with_xmlobjs_traverse do |node,xmlobj,text|
|
|
112
|
+
next unless (a = node.attributes.keys.first)
|
|
113
|
+
assert_not_nil(node[a])
|
|
114
|
+
node.delete_attribute!(a)
|
|
115
|
+
assert_nil(node[a])
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def test_add_child
|
|
120
|
+
with_xmlobjs_traverse do |node,xmlobj,text|
|
|
121
|
+
node << @friends
|
|
122
|
+
assert_equal(@friends, node.friends)
|
|
123
|
+
assert_not_nil(node.children[:friends])
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def test_child_from_plaintext
|
|
128
|
+
xml = '<a>foo</a>'
|
|
129
|
+
with_xmlobjs_traverse do |node,xmlobj,text|
|
|
130
|
+
node << xml
|
|
131
|
+
assert_equal(XMLROCS::XMLNode.new(:text => xml), node.a)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def test_remove_child
|
|
136
|
+
with_xmlobjs_traverse do |node,xmlobj,text|
|
|
137
|
+
node << @friends
|
|
138
|
+
node >> :friends
|
|
139
|
+
assert(!node.respond_to?(:friends))
|
|
140
|
+
assert_nil(node.children[:friends])
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def test_remove_child_with_closure
|
|
145
|
+
o = XMLROCS::XMLNode.new :text => '<a><b id="1"></b><b id="2"></b><b id="3"></b></a>'
|
|
146
|
+
o.>>(:b) { |child| child[:id] == "1" }
|
|
147
|
+
assert(o.b.all? { |x| x[:id] != "1" })
|
|
148
|
+
o.>> { |child| child[:id] == "3" }
|
|
149
|
+
assert(o.b.all? { |x| x[:id] != "3" })
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def test_xmlnames_present
|
|
153
|
+
with_xmlobjs_traverse { |node,xmlobj,text| assert_not_nil(node.xmlname) }
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test_leafs
|
|
157
|
+
leaf_names = [ :reach, :url, :releasedate, :small, :medium, :large, :mbid ]
|
|
158
|
+
found = {}
|
|
159
|
+
@album.leafs.map { |leaf| leaf.xmlname }.each do |name|
|
|
160
|
+
assert(leaf_names.include?(name))
|
|
161
|
+
found[name] = 1
|
|
162
|
+
end
|
|
163
|
+
leaf_names.each { |name| assert(found.has_key?(name), name) }
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def test_all
|
|
167
|
+
with_xmlobjs do |xmlobj,text|
|
|
168
|
+
all_node_names = xmlobj.all.map(&:xmlname)
|
|
169
|
+
got = assert_children_names_in(xmlobj, all_node_names)
|
|
170
|
+
assert_equal(all_node_names.uniq.sort, got.uniq.sort)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def assert_children_names_in(xmlobj, names)
|
|
175
|
+
xmlobj.children.inject([xmlobj.xmlname]) do |got,(name,value)|
|
|
176
|
+
assert(names.include?(name))
|
|
177
|
+
got += [ name ] + value.map { |child| assert_children_names_in(child, names) }.flatten
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def test_dup
|
|
182
|
+
with_xmlobjs { |xmlobj,text| xmlobj.each { |x| assert_equal(x, x.dup) } }
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def test_set_text
|
|
186
|
+
with_xmlobjs_traverse do |node,xmlobj,text|
|
|
187
|
+
node.set_text("foo")
|
|
188
|
+
assert_equal("foo", node)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def test_mappers
|
|
193
|
+
with_xmlobjs do |xmlobj,text|
|
|
194
|
+
xmlobj.map { |x| x.set_text("arbitrary_string_123"); x }.each do |node|
|
|
195
|
+
assert_equal("arbitrary_string_123", node)
|
|
196
|
+
end
|
|
197
|
+
xmlobj.each { |node| assert_not_equal("arbitrary_string_123", node) }
|
|
198
|
+
xmlobj.map! { |x| x.set_text("bar"); x }
|
|
199
|
+
xmlobj.each { |node| assert_equal("bar", node) }
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def test_injecters
|
|
204
|
+
with_xmlobjs do |xmlobj,text|
|
|
205
|
+
xmlobj.each { |x| assert_equal(x.all.length, x.inject(0) { |cur,x| cur + 1 }) }
|
|
206
|
+
xmlobj.each { |x| assert_equal(x.all.map(&:xmlname).uniq.sort,
|
|
207
|
+
x.inject([]) { |cur,x| cur << x.xmlname }.uniq.sort) }
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def test_string_comparison
|
|
212
|
+
with_xmlobjs do |xmlobj,text|
|
|
213
|
+
assert(xmlobj.inject(true) { |cur,x| cur && x == x.to_s && x.to_s == x })
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def test_nil_node
|
|
218
|
+
assert_nothing_thrown { node = XMLROCS::XMLNode.new(:nil => true) }
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def test_single_album
|
|
222
|
+
[ :reach, :releasedate, :mbid, :tracks ].each { |e| assert(@album.single?(e)) }
|
|
223
|
+
[ :small, :medium, :large ].each { |e| assert(@album.coverart.single?(e)) }
|
|
224
|
+
assert(!@album.tracks.single?(:track))
|
|
225
|
+
|
|
226
|
+
assert_equal("Metallica", @album[:artist])
|
|
227
|
+
assert_equal("Metallica", @album[:title])
|
|
228
|
+
assert_equal("195627", @album.reach)
|
|
229
|
+
assert_equal("29 Aug 1991, 00:00", @album.releasedate)
|
|
230
|
+
assert_equal("http://cdn.last.fm/coverart/130x130/1411800.jpg", @album.coverart.small)
|
|
231
|
+
assert_equal("http://cdn.last.fm/coverart/130x130/1411800.jpg", @album.coverart.medium)
|
|
232
|
+
assert_equal("http://cdn.last.fm/coverart/130x130/1411800.jpg", @album.coverart.large)
|
|
233
|
+
assert_equal("3750d9e2-59f5-471d-8916-463433069bd1", @album.mbid)
|
|
234
|
+
assert_equal("Enter Sandman", @album.tracks.track!.first[:title])
|
|
235
|
+
assert_equal("217037", @album.tracks.track!.first.reach)
|
|
236
|
+
assert_equal("http://www.last.fm/music/Metallica/_/Enter+Sandman", @album.tracks.track!.first.url)
|
|
237
|
+
assert_equal("The Unforgiven", @album.tracks.track![3][:title])
|
|
238
|
+
assert_equal("148058", @album.tracks.track![3].reach)
|
|
239
|
+
assert_equal("http://www.last.fm/music/Metallica/_/The+Unforgiven", @album.tracks.track![3].url)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def test_artists
|
|
243
|
+
assert(!@weeklyartists.single?(:artist))
|
|
244
|
+
assert_equal([:user, :from, :to].sort, @weeklyartists.attributes.keys.sort)
|
|
245
|
+
assert_equal([:artist], @weeklyartists.children.keys)
|
|
246
|
+
|
|
247
|
+
assert_equal("RJ", @weeklyartists[:user])
|
|
248
|
+
assert_equal("1114965332", @weeklyartists[:from])
|
|
249
|
+
assert_equal("1115570132", @weeklyartists[:to])
|
|
250
|
+
|
|
251
|
+
@weeklyartists.artist!.each do |e|
|
|
252
|
+
assert_not_nil(e.name)
|
|
253
|
+
assert_not_nil(e.chartposition)
|
|
254
|
+
assert_not_nil(e.playcount)
|
|
255
|
+
assert_not_nil(e.url)
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def test_albums_tracks
|
|
260
|
+
assert_equal("1114965332", @weeklytracks[:from])
|
|
261
|
+
assert_equal("1114965332", @weeklyalbums[:from])
|
|
262
|
+
assert_equal("1115570132", @weeklytracks[:to])
|
|
263
|
+
assert_equal("1115570132", @weeklyalbums[:to])
|
|
264
|
+
assert_equal("RJ", @weeklytracks[:user])
|
|
265
|
+
assert_equal("RJ", @weeklyalbums[:user])
|
|
266
|
+
(@weeklytracks.track! + @weeklyalbums.album!).each do |e|
|
|
267
|
+
[ :artist, :name, :chartposition, :playcount, :url ].each { |s| assert(e.single?(s)) }
|
|
268
|
+
assert_not_nil(e.artist)
|
|
269
|
+
assert_not_nil(e.name)
|
|
270
|
+
assert_not_nil(e.chartposition)
|
|
271
|
+
assert_not_nil(e.playcount)
|
|
272
|
+
assert_not_nil(e.url)
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def test_chart
|
|
277
|
+
assert_equal("RJ", @weeklychartlist[:user])
|
|
278
|
+
@weeklychartlist.chart!.each { |e| [ :from, :to ].each { |s| assert_not_nil(e[s]) } }
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def test_name
|
|
282
|
+
assert_equal(:weeklyartistchart, @weeklyartists.xmlname)
|
|
283
|
+
assert_equal(:weeklytrackchart, @weeklytracks.xmlname)
|
|
284
|
+
assert_equal(:weeklyalbumchart, @weeklyalbums.xmlname)
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def test_against_rexml
|
|
288
|
+
xmltext = TestHelper.build_xml(2)
|
|
289
|
+
rexml = REXML::Document.new(xmltext)
|
|
290
|
+
xmlroc = XMLROCS::XMLNode.new(:text => xmltext)
|
|
291
|
+
|
|
292
|
+
rexml_cnt = REXML::XPath.match(rexml, "//[@id < 3]").length
|
|
293
|
+
xmlrocs_cnt = xmlroc.select { |x| x[:id] && x[:id].to_i < 3 }.length
|
|
294
|
+
assert_equal(rexml_cnt, xmlrocs_cnt)
|
|
295
|
+
|
|
296
|
+
rexml_cnt = REXML::XPath.match(rexml, "//").length
|
|
297
|
+
xmlrocs_cnt = xmlroc.all.length
|
|
298
|
+
assert_equal(rexml_cnt - 1, xmlrocs_cnt)
|
|
299
|
+
end
|
|
300
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
rubygems_version: 0.9.4
|
|
3
|
+
specification_version: 1
|
|
4
|
+
name: XMLROCS
|
|
5
|
+
version: !ruby/object:Gem::Version
|
|
6
|
+
version: 0.0.1
|
|
7
|
+
date: 2008-02-24 00:00:00 +01:00
|
|
8
|
+
summary: Map XML Data into Ruby objects
|
|
9
|
+
require_paths:
|
|
10
|
+
- lib
|
|
11
|
+
email: ameingast@gmail.com
|
|
12
|
+
homepage: http://yomi.at/
|
|
13
|
+
rubyforge_project:
|
|
14
|
+
description:
|
|
15
|
+
autorequire: name
|
|
16
|
+
default_executable:
|
|
17
|
+
bindir: bin
|
|
18
|
+
has_rdoc: true
|
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
20
|
+
requirements:
|
|
21
|
+
- - ">"
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: 0.0.0
|
|
24
|
+
version:
|
|
25
|
+
platform: ruby
|
|
26
|
+
signing_key:
|
|
27
|
+
cert_chain:
|
|
28
|
+
post_install_message:
|
|
29
|
+
authors:
|
|
30
|
+
- Andreas Meingast
|
|
31
|
+
files:
|
|
32
|
+
- lib/xmlrocs.rb
|
|
33
|
+
- LICENSE
|
|
34
|
+
- TODO
|
|
35
|
+
- README
|
|
36
|
+
test_files:
|
|
37
|
+
- test/test_helper.rb
|
|
38
|
+
- test/test_xmlrocs.rb
|
|
39
|
+
- test/fixtures/album.xml
|
|
40
|
+
- test/fixtures/friends.xml
|
|
41
|
+
- test/fixtures/misc.xml
|
|
42
|
+
- test/fixtures/tags.xml
|
|
43
|
+
- test/fixtures/toptags.xml
|
|
44
|
+
- test/fixtures/weeklyalbums.xml
|
|
45
|
+
- test/fixtures/weeklyartists.xml
|
|
46
|
+
- test/fixtures/weeklychartlist.xml
|
|
47
|
+
- test/fixtures/weeklytracks.xml
|
|
48
|
+
rdoc_options: []
|
|
49
|
+
|
|
50
|
+
extra_rdoc_files:
|
|
51
|
+
- README
|
|
52
|
+
executables: []
|
|
53
|
+
|
|
54
|
+
extensions: []
|
|
55
|
+
|
|
56
|
+
requirements: []
|
|
57
|
+
|
|
58
|
+
dependencies: []
|
|
59
|
+
|