astro-sax-machine 0.0.19 → 0.0.20
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/lib/sax-machine.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
|
3
1
|
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
|
4
2
|
|
3
|
+
require "cgi"
|
4
|
+
|
5
5
|
require "sax-machine/sax_document"
|
6
6
|
require "sax-machine/sax_handler"
|
7
7
|
require "sax-machine/sax_config"
|
8
8
|
|
9
9
|
module SAXMachine
|
10
|
-
VERSION = "0.0.
|
11
|
-
end
|
10
|
+
VERSION = "0.0.20"
|
11
|
+
end
|
@@ -15,13 +15,13 @@ module SAXMachine
|
|
15
15
|
else nil
|
16
16
|
end
|
17
17
|
@default_xmlns = options[:default_xmlns]
|
18
|
-
if @default_xmlns && !@xmlns.include?('')
|
18
|
+
if @default_xmlns && @xmlns && !@xmlns.include?('')
|
19
19
|
@xmlns << ''
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def handler(nsstack)
|
24
|
-
if nsstack.nil? || nsstack[''] == ''
|
24
|
+
if @default_xmlns && (nsstack.nil? || nsstack[''] == '')
|
25
25
|
nsstack = NSStack.new(nsstack, nsstack)
|
26
26
|
nsstack[''] = @default_xmlns
|
27
27
|
end
|
@@ -45,7 +45,7 @@ module SAXMachine
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def end_element(name)
|
48
|
-
if parsing_collection? && @collection_config.name == name
|
48
|
+
if parsing_collection? && @collection_config.name == name.split(':').last
|
49
49
|
@collection_handler.end_element(name)
|
50
50
|
@object.send(@collection_config.accessor) << @collection_handler.object
|
51
51
|
reset_current_collection
|
@@ -109,13 +109,14 @@ module SAXMachine
|
|
109
109
|
def self.decode_xml(str)
|
110
110
|
return str.map &method(:decode_xml) if str.kind_of?(Array)
|
111
111
|
|
112
|
-
entities = {
|
113
|
-
|
114
|
-
|
115
|
-
}
|
116
|
-
entities.keys.inject(str) { |string, key|
|
117
|
-
|
118
|
-
}
|
112
|
+
# entities = {
|
113
|
+
# '#38' => '&',
|
114
|
+
# '#13' => "\r",
|
115
|
+
# }
|
116
|
+
# entities.keys.inject(str) { |string, key|
|
117
|
+
# string.gsub(/&#{key};/, entities[key])
|
118
|
+
# }
|
119
|
+
CGI.unescapeHTML(str)
|
119
120
|
end
|
120
121
|
|
121
122
|
end
|
@@ -138,7 +138,7 @@ describe "SAXMachine" do
|
|
138
138
|
|
139
139
|
it "should escape correctly the ampersand" do
|
140
140
|
document = @klass.parse("<link href='http://api.flickr.com/services/feeds/photos_public.gne?id=49724566@N00&lang=en-us&format=atom' foo='bar'>asdf</link>")
|
141
|
-
document.link.should == "http://api.flickr.com/services/feeds/photos_public.gne?id=49724566@N00&
|
141
|
+
document.link.should == "http://api.flickr.com/services/feeds/photos_public.gne?id=49724566@N00&lang=en-us&format=atom"
|
142
142
|
end
|
143
143
|
|
144
144
|
it "should save the value of a matching element" do
|
@@ -344,7 +344,7 @@ describe "SAXMachine" do
|
|
344
344
|
end
|
345
345
|
|
346
346
|
context "when passing a default namespace" do
|
347
|
-
before :
|
347
|
+
before :all do
|
348
348
|
@xmlns = 'urn:test'
|
349
349
|
class Inner
|
350
350
|
include SAXMachine
|
@@ -369,11 +369,55 @@ describe "SAXMachine" do
|
|
369
369
|
end
|
370
370
|
|
371
371
|
end
|
372
|
+
|
373
|
+
describe "when desiring sax events" do
|
374
|
+
XHTML_XMLNS = "http://www.w3.org/1999/xhtml"
|
375
|
+
|
376
|
+
before :all do
|
377
|
+
@klass = Class.new do
|
378
|
+
include SAXMachine
|
379
|
+
elements :body, :events => true
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
it "should parse a simple child" do
|
384
|
+
document = @klass.parse("<body><p/></body>")
|
385
|
+
document.body.should == [[:start_element, "", "p", []],
|
386
|
+
[:end_element, "", "p"]]
|
387
|
+
end
|
388
|
+
it "should parse a simple child with text" do
|
389
|
+
document = @klass.parse("<body><p>Hello</p></body>")
|
390
|
+
document.body.should == [[:start_element, "", "p", []],
|
391
|
+
[:chars, "Hello"],
|
392
|
+
[:end_element, "", "p"]]
|
393
|
+
end
|
394
|
+
it "should parse nested children" do
|
395
|
+
document = @klass.parse("<body><p><span/></p></body>")
|
396
|
+
document.body.should == [[:start_element, "", "p", []],
|
397
|
+
[:start_element, "", "span", []],
|
398
|
+
[:end_element, "", "span"],
|
399
|
+
[:end_element, "", "p"]]
|
400
|
+
end
|
401
|
+
it "should parse multiple children" do
|
402
|
+
document = @klass.parse("<body><p>Hello</p><p>World</p></body>")
|
403
|
+
document.body.should == [[:start_element, "", "p", []],
|
404
|
+
[:chars, "Hello"],
|
405
|
+
[:end_element, "", "p"],
|
406
|
+
[:start_element, "", "p", []],
|
407
|
+
[:chars, "World"],
|
408
|
+
[:end_element, "", "p"]]
|
409
|
+
end
|
410
|
+
it "should pass namespaces" do
|
411
|
+
document = @klass.parse("<body xmlns='#{XHTML_XMLNS}'><p/></body>")
|
412
|
+
document.body.should == [[:start_element, XHTML_XMLNS, "p", []],
|
413
|
+
[:end_element, XHTML_XMLNS, "p"]]
|
414
|
+
end
|
415
|
+
end
|
372
416
|
end
|
373
417
|
|
374
418
|
describe "elements" do
|
375
419
|
describe "when parsing multiple elements" do
|
376
|
-
before :
|
420
|
+
before :all do
|
377
421
|
@klass = Class.new do
|
378
422
|
include SAXMachine
|
379
423
|
elements :entry, :as => :entries
|
@@ -542,37 +586,71 @@ eoxml
|
|
542
586
|
@document.link.should == 'http://feeds.delicious.com/v2/rss/tag/pubsubhubbub?count=15'
|
543
587
|
end
|
544
588
|
end
|
589
|
+
end
|
590
|
+
|
591
|
+
describe "yet another full example" do
|
592
|
+
|
545
593
|
context "when parsing a Twitter example" do
|
546
594
|
before :all do
|
547
|
-
|
595
|
+
|
596
|
+
RSS_XMLNS = ['http://purl.org/rss/1.0/', '']
|
597
|
+
|
598
|
+
ATOM_XMLNS = 'http://www.w3.org/2005/Atom' unless defined? ATOM_XMLNS
|
599
|
+
class Link
|
600
|
+
include SAXMachine
|
601
|
+
end
|
602
|
+
|
603
|
+
class Entry
|
604
|
+
include SAXMachine
|
605
|
+
element :title, :xmlns => RSS_XMLNS
|
606
|
+
element :link, :xmlns => RSS_XMLNS, :as => :entry_link
|
607
|
+
element :title, :xmlns => ATOM_XMLNS, :as => :title
|
608
|
+
elements :link, :xmlns => ATOM_XMLNS, :as => :links, :class => Link
|
609
|
+
end
|
610
|
+
|
611
|
+
class Feed
|
612
|
+
include SAXMachine
|
613
|
+
element :title, :xmlns => RSS_XMLNS, :as => :title
|
614
|
+
element :link, :xmlns => RSS_XMLNS, :as => :feed_link
|
615
|
+
elements :item, :xmlns => RSS_XMLNS, :as => :entries, :class => Entry
|
616
|
+
element :title, :xmlns => ATOM_XMLNS, :as => :title
|
617
|
+
elements :link, :xmlns => ATOM_XMLNS, :as => :links, :class => Link
|
618
|
+
end
|
619
|
+
|
620
|
+
@document = Feed.parse(<<-eoxml)
|
548
621
|
<?xml version="1.0" encoding="UTF-8"?>
|
549
|
-
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
</
|
622
|
+
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
623
|
+
<channel>
|
624
|
+
<atom:link type="application/rss+xml" rel="self" href="http://twitter.com/statuses/user_timeline/5381582.rss"/>
|
625
|
+
<title>Twitter / julien51</title>
|
626
|
+
<link>http://twitter.com/julien51</link>
|
627
|
+
<description>Twitter updates from julien / julien51.</description>
|
628
|
+
<language>en-us</language>
|
629
|
+
<ttl>40</ttl>
|
630
|
+
<item>
|
631
|
+
<title>julien51: @github : I get an error when trying to build one of my gems (julien51-sax-machine), it seems related to another gem's gemspec.</title>
|
632
|
+
<description>julien51: @github : I get an error when trying to build one of my gems (julien51-sax-machine), it seems related to another gem's gemspec.</description>
|
633
|
+
<pubDate>Thu, 30 Jul 2009 01:00:30 +0000</pubDate>
|
634
|
+
<guid>http://twitter.com/julien51/statuses/2920716033</guid>
|
635
|
+
<link>http://twitter.com/julien51/statuses/2920716033</link>
|
636
|
+
</item>
|
637
|
+
<item>
|
638
|
+
<title>julien51: Hum, San Francisco's summer are delightful. http://bit.ly/VeXt4</title>
|
639
|
+
<description>julien51: Hum, San Francisco's summer are delightful. http://bit.ly/VeXt4</description>
|
640
|
+
<pubDate>Wed, 29 Jul 2009 23:07:32 +0000</pubDate>
|
641
|
+
<guid>http://twitter.com/julien51/statuses/2918869948</guid>
|
642
|
+
<link>http://twitter.com/julien51/statuses/2918869948</link>
|
643
|
+
</item>
|
644
|
+
</channel>
|
645
|
+
</rss>
|
566
646
|
eoxml
|
567
647
|
end
|
568
648
|
it "should parse the title" do
|
569
649
|
@document.title.should == 'Twitter / julien51'
|
570
650
|
end
|
571
|
-
|
572
|
-
@document.link.should == 'http://twitter.com/statuses/user_timeline/5381582.rss'
|
573
|
-
end
|
651
|
+
|
574
652
|
it "should find an entry" do
|
575
|
-
@document.entries.length.should ==
|
653
|
+
@document.entries.length.should == 2
|
576
654
|
end
|
577
655
|
end
|
578
656
|
end
|
metadata
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: astro-sax-machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Dix
|
8
|
+
- astro
|
9
|
+
- julien51
|
10
|
+
- superfeedr
|
8
11
|
autorequire:
|
9
12
|
bindir: bin
|
10
13
|
cert_chain: []
|