astro-sax-machine 0.0.15 → 0.0.16
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.
@@ -8,16 +8,25 @@ module SAXMachine
|
|
8
8
|
@name = name.to_s
|
9
9
|
@class = options[:class]
|
10
10
|
@as = options[:as].to_s
|
11
|
+
@xmlns = case options[:xmlns]
|
12
|
+
when Array then options[:xmlns]
|
13
|
+
when String then [options[:xmlns]]
|
14
|
+
else nil
|
15
|
+
end
|
11
16
|
end
|
12
17
|
|
13
|
-
def handler
|
14
|
-
SAXHandler.new(@class.new)
|
18
|
+
def handler(nsstack)
|
19
|
+
SAXHandler.new(@class.new, nsstack)
|
15
20
|
end
|
16
21
|
|
17
22
|
def accessor
|
18
23
|
as
|
19
24
|
end
|
20
25
|
|
26
|
+
def xmlns_match?(ns)
|
27
|
+
@xmlns.nil? || @xmlns.include?(ns)
|
28
|
+
end
|
29
|
+
|
21
30
|
protected
|
22
31
|
|
23
32
|
def as
|
@@ -30,4 +39,4 @@ module SAXMachine
|
|
30
39
|
end
|
31
40
|
|
32
41
|
end
|
33
|
-
end
|
42
|
+
end
|
@@ -18,11 +18,19 @@ module SAXMachine
|
|
18
18
|
@collection_elements << CollectionConfig.new(name, options)
|
19
19
|
end
|
20
20
|
|
21
|
-
def collection_config(name)
|
22
|
-
|
21
|
+
def collection_config(name, nsstack)
|
22
|
+
prefix, name = name.split(':', 2)
|
23
|
+
prefix, name = nil, prefix unless name # No prefix
|
24
|
+
namespace = nsstack[prefix]
|
25
|
+
|
26
|
+
@collection_elements.detect { |ce|
|
27
|
+
ce.name.to_s == name.to_s &&
|
28
|
+
ce.xmlns_match?(namespace)
|
29
|
+
}
|
23
30
|
end
|
24
31
|
|
25
32
|
def element_configs_for_attribute(name, attrs)
|
33
|
+
name = name.split(':', 2).last
|
26
34
|
@top_level_elements.select do |element_config|
|
27
35
|
element_config.name == name &&
|
28
36
|
element_config.has_value_and_attrs_match?(attrs)
|
@@ -5,9 +5,9 @@ module SAXMachine
|
|
5
5
|
class SAXHandler < Nokogiri::XML::SAX::Document
|
6
6
|
attr_reader :object
|
7
7
|
|
8
|
-
def initialize(object)
|
8
|
+
def initialize(object, nsstack=nil)
|
9
9
|
@object = object
|
10
|
-
@nsstack =
|
10
|
+
@nsstack = nsstack || NSStack.new
|
11
11
|
end
|
12
12
|
|
13
13
|
def characters(string)
|
@@ -23,7 +23,7 @@ module SAXMachine
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def start_element(name, attrs = [])
|
26
|
-
|
26
|
+
|
27
27
|
@name = name
|
28
28
|
@attrs = attrs.map { |a| SAXHandler.decode_xml(a) }
|
29
29
|
@nsstack = NSStack.new(@nsstack, @attrs)
|
@@ -31,8 +31,8 @@ module SAXMachine
|
|
31
31
|
if parsing_collection?
|
32
32
|
@collection_handler.start_element(@name, @attrs)
|
33
33
|
|
34
|
-
elsif @collection_config = sax_config.collection_config(@name)
|
35
|
-
@collection_handler = @collection_config.handler
|
34
|
+
elsif @collection_config = sax_config.collection_config(@name, @nsstack)
|
35
|
+
@collection_handler = @collection_config.handler(@nsstack)
|
36
36
|
@collection_handler.start_element(@name, @attrs)
|
37
37
|
|
38
38
|
elsif (element_configs = sax_config.element_configs_for_attribute(@name, @attrs)).any?
|
@@ -46,6 +46,7 @@ module SAXMachine
|
|
46
46
|
|
47
47
|
def end_element(name)
|
48
48
|
if parsing_collection? && @collection_config.name == name
|
49
|
+
@collection_handler.end_element(name)
|
49
50
|
@object.send(@collection_config.accessor) << @collection_handler.object
|
50
51
|
reset_current_collection
|
51
52
|
|
@@ -326,6 +326,11 @@ describe "SAXMachine" do
|
|
326
326
|
document = @klass.parse("<x:b>hello</x:b>")
|
327
327
|
document.b.should == 'hello'
|
328
328
|
end
|
329
|
+
|
330
|
+
it "should get the namespaced element even it's not first" do
|
331
|
+
document = @klass.parse("<root xmlns:a='urn:test'><a>foo</a><a>foo</a><a:a>bar</a:a></root>")
|
332
|
+
document.a.should == 'bar'
|
333
|
+
end
|
329
334
|
end
|
330
335
|
|
331
336
|
end
|
@@ -410,13 +415,16 @@ describe "SAXMachine" do
|
|
410
415
|
end
|
411
416
|
|
412
417
|
describe "full example" do
|
418
|
+
XMLNS_ATOM = "http://www.w3.org/2005/Atom"
|
419
|
+
XMLNS_FEEDBURNER = "http://rssnamespace.org/feedburner/ext/1.0"
|
420
|
+
|
413
421
|
before :each do
|
414
422
|
@xml = File.read('spec/sax-machine/atom.xml')
|
415
423
|
class AtomEntry
|
416
424
|
include SAXMachine
|
417
425
|
element :title
|
418
426
|
element :name, :as => :author
|
419
|
-
element
|
427
|
+
element :origLink, :as => :orig_link, :xmlns => XMLNS_FEEDBURNER
|
420
428
|
element :summary
|
421
429
|
element :content
|
422
430
|
element :published
|
@@ -427,7 +435,7 @@ describe "SAXMachine" do
|
|
427
435
|
element :title
|
428
436
|
element :link, :value => :href, :as => :url, :with => {:type => "text/html"}
|
429
437
|
element :link, :value => :href, :as => :feed_url, :with => {:type => "application/atom+xml"}
|
430
|
-
elements :entry, :as => :entries, :class => AtomEntry
|
438
|
+
elements :entry, :as => :entries, :class => AtomEntry, :xmlns => XMLNS_ATOM
|
431
439
|
end
|
432
440
|
end # before
|
433
441
|
|
@@ -435,5 +443,15 @@ describe "SAXMachine" do
|
|
435
443
|
f = Atom.parse(@xml)
|
436
444
|
f.url.should == "http://www.pauldix.net/"
|
437
445
|
end
|
446
|
+
|
447
|
+
it "should parse all entries" do
|
448
|
+
f = Atom.parse(@xml)
|
449
|
+
f.entries.length.should == 5
|
450
|
+
end
|
451
|
+
|
452
|
+
it "should parse the feedburner:origLink" do
|
453
|
+
f = Atom.parse(@xml)
|
454
|
+
f.entries[0].orig_link.should == 'http://www.pauldix.net/2008/09/marshal-data-to.html'
|
455
|
+
end
|
438
456
|
end
|
439
457
|
end
|