ratom-nokogiri 0.10.0 → 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +2 -2
- data/lib/atom.rb +102 -97
- data/lib/atom/version.rb +1 -1
- data/lib/atom/xml/parser.rb +8 -4
- data/spec/atom_spec.rb +5 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c1f4562fd7cda57a9717866ced5a5172cd4f9b5
|
4
|
+
data.tar.gz: e770cfb1f30500c7d878ab2d2cb1d9be3bca14e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9955c94696fda7c38f0d41842806fe616409e8f47f0a0f3af2c3cb968e5b2d4b8b5c9807650e3b65ad3212035d5182231066e3f4a2e6ceb09151b5fec9bc560f
|
7
|
+
data.tar.gz: d7c33576255d45aca2d6357d1989d5cae029b8145513a458af122ac2a5072471699db012677e56a5e9503e003dfdd21f0fd4c7406c0dea0465b658977a129c2e
|
data/README.rdoc
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
rAtom is a library for working with the Atom Syndication Format and
|
4
4
|
the Atom Publishing Protocol (APP).
|
5
5
|
|
6
|
-
* Built using
|
7
|
-
* Uses the
|
6
|
+
* Built using nokogiri so it is _much_ faster than a REXML based library.
|
7
|
+
* Uses the nokogiri reader parser so it has much lighter memory usage.
|
8
8
|
* Supports {RFC 5005}[http://www.ietf.org/rfc/rfc5005.txt] for feed pagination.
|
9
9
|
|
10
10
|
rAtom was originally built to support the communication between a number of applications
|
data/lib/atom.rb
CHANGED
@@ -17,10 +17,10 @@ module Atom # :nodoc:
|
|
17
17
|
module Pub
|
18
18
|
NAMESPACE = 'http://www.w3.org/2007/app'
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
# Raised when a Serialization Error occurs.
|
22
22
|
class SerializationError < StandardError; end
|
23
|
-
|
23
|
+
|
24
24
|
# Provides support for reading and writing simple extensions as defined by the Atom Syndication Format.
|
25
25
|
#
|
26
26
|
# A Simple extension is an element from a non-atom namespace that has no attributes and only contains
|
@@ -60,7 +60,7 @@ module Atom # :nodoc:
|
|
60
60
|
key = "{#{namespace},#{localname}}"
|
61
61
|
@simple_extensions[key] ||= ValueProxy.new
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
class ValueProxy < DelegateClass(Array)
|
65
65
|
attr_accessor :as_attribute
|
66
66
|
def initialize
|
@@ -69,7 +69,7 @@ module Atom # :nodoc:
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
# Represents a Generator as defined by the Atom Syndication Format specification.
|
74
74
|
#
|
75
75
|
# The generator identifies an agent or engine used to a produce a feed.
|
@@ -77,10 +77,10 @@ module Atom # :nodoc:
|
|
77
77
|
# See also http://www.atomenabled.org/developers/syndication/atom-format-spec.php#element.generator
|
78
78
|
class Generator
|
79
79
|
include Xml::Parseable
|
80
|
-
|
80
|
+
|
81
81
|
attr_accessor :name
|
82
82
|
attribute :uri, :version
|
83
|
-
|
83
|
+
|
84
84
|
# Initialize a new Generator.
|
85
85
|
#
|
86
86
|
# +xml+:: An XML::Reader object.
|
@@ -97,10 +97,10 @@ module Atom # :nodoc:
|
|
97
97
|
else
|
98
98
|
raise ArgumentError, "Got #{o.class} but expected a Hash or XML::Reader"
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
yield(self) if block_given?
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
def to_xml(builder = nil, name = 'generator', namespace = nil, namespace_handler = nil)
|
105
105
|
builder ||= Nokogiri::XML::Builder.new
|
106
106
|
attrs = {}
|
@@ -111,15 +111,15 @@ module Atom # :nodoc:
|
|
111
111
|
builder.doc.root
|
112
112
|
end
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
# Represents a Category as defined by the Atom Syndication Format specification.
|
116
116
|
#
|
117
|
-
#
|
117
|
+
#
|
118
118
|
class Category
|
119
119
|
include Atom::Xml::Parseable
|
120
120
|
include SimpleExtensions
|
121
121
|
attribute :label, :scheme, :term
|
122
|
-
|
122
|
+
|
123
123
|
def initialize(o = {})
|
124
124
|
case o
|
125
125
|
when Nokogiri::XML::Reader
|
@@ -131,11 +131,11 @@ module Atom # :nodoc:
|
|
131
131
|
else
|
132
132
|
raise ArgumentError, "Got #{o.class} but expected a Hash or XML::Reader"
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
yield(self) if block_given?
|
136
136
|
end
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
# Represents a Person as defined by the Atom Syndication Format specification.
|
140
140
|
#
|
141
141
|
# A Person is used for all author and contributor attributes.
|
@@ -145,7 +145,7 @@ module Atom # :nodoc:
|
|
145
145
|
class Person
|
146
146
|
include Xml::Parseable
|
147
147
|
element :name, :uri, :email
|
148
|
-
|
148
|
+
|
149
149
|
# Initialize a new person.
|
150
150
|
#
|
151
151
|
# +o+:: An XML::Reader object or a hash. Valid hash keys are +:name+, +:uri+ and +:email+.
|
@@ -161,15 +161,15 @@ module Atom # :nodoc:
|
|
161
161
|
else
|
162
162
|
raise ArgumentError, "Got #{o.class} but expected a Hash or XML::Reader"
|
163
163
|
end
|
164
|
-
|
164
|
+
|
165
165
|
yield(self) if block_given?
|
166
166
|
end
|
167
|
-
|
167
|
+
|
168
168
|
def inspect
|
169
169
|
"<Atom::Person name:'#{name}' uri:'#{uri}' email:'#{email}"
|
170
170
|
end
|
171
171
|
end
|
172
|
-
|
172
|
+
|
173
173
|
class Content # :nodoc:
|
174
174
|
def self.parse(xml)
|
175
175
|
if xml.attributes['src'] && !xml.attributes['src'].empty?
|
@@ -179,7 +179,7 @@ module Atom # :nodoc:
|
|
179
179
|
parser.new(xml)
|
180
180
|
end
|
181
181
|
end
|
182
|
-
|
182
|
+
|
183
183
|
# This is the base class for all content within an atom document.
|
184
184
|
#
|
185
185
|
# Content can be Text, Html or Xhtml.
|
@@ -187,15 +187,15 @@ module Atom # :nodoc:
|
|
187
187
|
# A Content object can be treated as a String with type and xml_lang
|
188
188
|
# attributes.
|
189
189
|
#
|
190
|
-
# For a thorough discussion of atom content see
|
190
|
+
# For a thorough discussion of atom content see
|
191
191
|
# http://www.atomenabled.org/developers/syndication/atom-format-spec.php#element.content
|
192
192
|
class Base < DelegateClass(String)
|
193
193
|
include Xml::Parseable
|
194
|
-
|
194
|
+
|
195
195
|
def initialize(c)
|
196
196
|
__setobj__(c)
|
197
197
|
end
|
198
|
-
|
198
|
+
|
199
199
|
def ==(o)
|
200
200
|
if o.is_a?(self.class)
|
201
201
|
self.type == o.type &&
|
@@ -205,15 +205,15 @@ module Atom # :nodoc:
|
|
205
205
|
self.to_s == o
|
206
206
|
end
|
207
207
|
end
|
208
|
-
|
208
|
+
|
209
209
|
protected
|
210
210
|
def set_content(c) # :nodoc:
|
211
211
|
__setobj__(c)
|
212
212
|
end
|
213
213
|
end
|
214
|
-
|
214
|
+
|
215
215
|
# External content reference within an Atom document.
|
216
|
-
class External < Base
|
216
|
+
class External < Base
|
217
217
|
attribute :type, :src
|
218
218
|
|
219
219
|
# this one only works with XML::Reader instances, no strings, since the
|
@@ -223,7 +223,7 @@ module Atom # :nodoc:
|
|
223
223
|
super("")
|
224
224
|
parse(o, :once => true)
|
225
225
|
end
|
226
|
-
|
226
|
+
|
227
227
|
def to_xml(builder = nil , name = 'content', namespace = nil, namespace_handler = nil)
|
228
228
|
builder ||= Nokogiri::XML::Builder.new
|
229
229
|
namespace_handler.prefix(builder, Atom::NAMESPACE) if namespace_handler
|
@@ -234,9 +234,9 @@ module Atom # :nodoc:
|
|
234
234
|
builder.doc.root
|
235
235
|
end
|
236
236
|
end
|
237
|
-
|
237
|
+
|
238
238
|
# Text content within an Atom document.
|
239
|
-
class Text < Base
|
239
|
+
class Text < Base
|
240
240
|
attribute :type, :'xml:lang'
|
241
241
|
def initialize(o)
|
242
242
|
case o
|
@@ -248,18 +248,18 @@ module Atom # :nodoc:
|
|
248
248
|
parse(o, :once => true)
|
249
249
|
else
|
250
250
|
raise ArgumentError, "Got #{o} which isn't a String or XML::Reader"
|
251
|
-
end
|
251
|
+
end
|
252
252
|
end
|
253
|
-
|
253
|
+
|
254
254
|
def to_xml(builder = nil, name = 'content', namespace = nil, namespace_handler = nil)
|
255
255
|
namespace_handler.prefix(builder, Atom::NAMESPACE) if namespace_handler
|
256
256
|
builder.send("#{name}_", self.to_s)
|
257
257
|
builder.doc.root
|
258
258
|
end
|
259
259
|
end
|
260
|
-
|
260
|
+
|
261
261
|
# Html content within an Atom document.
|
262
|
-
class Html < Base
|
262
|
+
class Html < Base
|
263
263
|
attribute :type, :'xml:lang'
|
264
264
|
# Creates a new Content::Html.
|
265
265
|
#
|
@@ -275,9 +275,9 @@ module Atom # :nodoc:
|
|
275
275
|
@type = 'html'
|
276
276
|
else
|
277
277
|
raise ArgumentError, "Got #{o} which isn't a String or XML::Reader"
|
278
|
-
end
|
278
|
+
end
|
279
279
|
end
|
280
|
-
|
280
|
+
|
281
281
|
def to_xml(builder = nil, name = 'content', namespace = nil, namespace_handler = nil) # :nodoc:
|
282
282
|
builder ||= Nokogiri::XML::Builder.new
|
283
283
|
# Reject content that isn't UTF-8. If we don't check libxml just
|
@@ -300,19 +300,19 @@ module Atom # :nodoc:
|
|
300
300
|
end
|
301
301
|
end
|
302
302
|
end
|
303
|
-
|
303
|
+
|
304
304
|
# XHTML content within an Atom document.
|
305
305
|
class Xhtml < Base
|
306
|
-
XHTML = 'http://www.w3.org/1999/xhtml'
|
306
|
+
XHTML = 'http://www.w3.org/1999/xhtml'
|
307
307
|
attribute :type, :'xml:lang'
|
308
|
-
|
308
|
+
|
309
309
|
def initialize(o)
|
310
310
|
case o
|
311
311
|
when String
|
312
312
|
super(o)
|
313
313
|
@type = "xhtml"
|
314
314
|
when Nokogiri::XML::Reader
|
315
|
-
super("")
|
315
|
+
super("")
|
316
316
|
xml = o
|
317
317
|
parse(xml, :once => true)
|
318
318
|
starting_depth = xml.depth
|
@@ -320,7 +320,7 @@ module Atom # :nodoc:
|
|
320
320
|
# Get the next element - should be a div according to the atom spec
|
321
321
|
while xml.read && xml.node_type != Nokogiri::XML::Reader::TYPE_ELEMENT; end
|
322
322
|
|
323
|
-
if xml.local_name == 'div' && xml.namespace_uri == XHTML
|
323
|
+
if xml.local_name == 'div' && xml.namespace_uri == XHTML
|
324
324
|
set_content(xml.inner_xml.strip.gsub(/\s+/, ' '))
|
325
325
|
else
|
326
326
|
set_content(xml.outer_xml)
|
@@ -329,10 +329,10 @@ module Atom # :nodoc:
|
|
329
329
|
# get back to the end of the element we were created with
|
330
330
|
while xml.read == 1 && xml.depth > starting_depth; end
|
331
331
|
else
|
332
|
-
raise ArgumentError, "Got #{o} which isn't a String or XML::Reader"
|
332
|
+
raise ArgumentError, "Got #{o} which isn't a String or XML::Reader"
|
333
333
|
end
|
334
334
|
end
|
335
|
-
|
335
|
+
|
336
336
|
def to_xml(builder = nil, name = 'content', namespace = nil, namespace_handler = nil)
|
337
337
|
builder ||= Nokogiri::XML::Builder.new
|
338
338
|
namespace_handler.prefix(builder, Atom::NAMESPACE) if namespace_handler
|
@@ -350,7 +350,7 @@ module Atom # :nodoc:
|
|
350
350
|
|
351
351
|
PARSERS = {'html' => Html, 'xhtml' => Xhtml}
|
352
352
|
end
|
353
|
-
|
353
|
+
|
354
354
|
# Represents a Source as defined by the Atom Syndication Format specification.
|
355
355
|
#
|
356
356
|
# See also http://www.atomenabled.org/developers/syndication/atom-format-spec.php#element.source
|
@@ -358,13 +358,13 @@ module Atom # :nodoc:
|
|
358
358
|
extend Forwardable
|
359
359
|
def_delegators :@links, :alternate, :self, :alternates, :enclosures
|
360
360
|
include Xml::Parseable
|
361
|
-
|
361
|
+
|
362
362
|
element :id
|
363
363
|
element :updated, :class => Time, :content_only => true
|
364
364
|
element :title, :subtitle, :class => Content
|
365
365
|
elements :authors, :contributors, :class => Person
|
366
366
|
elements :links
|
367
|
-
|
367
|
+
|
368
368
|
def initialize(o = {})
|
369
369
|
@authors, @contributors, @links = [], [], Links.new
|
370
370
|
|
@@ -383,18 +383,18 @@ module Atom # :nodoc:
|
|
383
383
|
else
|
384
384
|
raise ArgumentError, "Got #{o.class} but expected a Hash or XML::Reader"
|
385
385
|
end
|
386
|
-
|
387
|
-
yield(self) if block_given?
|
386
|
+
|
387
|
+
yield(self) if block_given?
|
388
388
|
end
|
389
389
|
end
|
390
|
-
|
390
|
+
|
391
391
|
# Represents a Feed as defined by the Atom Syndication Format specification.
|
392
392
|
#
|
393
393
|
# A feed is the top level element in an atom document. It is a container for feed level
|
394
394
|
# metadata and for each entry in the feed.
|
395
395
|
#
|
396
396
|
# This supports pagination as defined in RFC 5005, see http://www.ietf.org/rfc/rfc5005.txt
|
397
|
-
#
|
397
|
+
#
|
398
398
|
# == Parsing
|
399
399
|
#
|
400
400
|
# A feed can be parsed using the Feed.load_feed method. This method accepts a String containing
|
@@ -405,7 +405,7 @@ module Atom # :nodoc:
|
|
405
405
|
#
|
406
406
|
# # Using a URL
|
407
407
|
# feed = Feed.load_feed(URI.parse("http://example.org/afeed.atom"))
|
408
|
-
#
|
408
|
+
#
|
409
409
|
# == Encoding
|
410
410
|
#
|
411
411
|
# A feed can be converted to XML using, the to_xml method that returns a valid atom document in a String.
|
@@ -435,8 +435,8 @@ module Atom # :nodoc:
|
|
435
435
|
extend Forwardable
|
436
436
|
def_delegators :@links, :alternate, :self, :via, :first_page, :last_page, :next_page, :prev_page
|
437
437
|
|
438
|
-
loadable!
|
439
|
-
|
438
|
+
loadable!
|
439
|
+
|
440
440
|
namespace Atom::NAMESPACE
|
441
441
|
element :id, :rights
|
442
442
|
element :generator, :class => Generator
|
@@ -446,7 +446,12 @@ module Atom # :nodoc:
|
|
446
446
|
elements :authors, :contributors, :class => Person
|
447
447
|
elements :categories
|
448
448
|
elements :entries
|
449
|
-
|
449
|
+
|
450
|
+
# to_xml as a document, not just a root node
|
451
|
+
def document?
|
452
|
+
true
|
453
|
+
end
|
454
|
+
|
450
455
|
# Initialize a Feed.
|
451
456
|
#
|
452
457
|
# This will also yield itself, so a feed can be constructed like this:
|
@@ -454,12 +459,12 @@ module Atom # :nodoc:
|
|
454
459
|
# feed = Feed.new do |feed|
|
455
460
|
# feed.title = "My Cool feed"
|
456
461
|
# end
|
457
|
-
#
|
462
|
+
#
|
458
463
|
# +o+:: An XML Reader or a Hash of attributes.
|
459
464
|
#
|
460
465
|
def initialize(o = {})
|
461
466
|
@links, @entries, @authors, @contributors, @categories = Links.new, [], [], [], []
|
462
|
-
|
467
|
+
|
463
468
|
case o
|
464
469
|
when Nokogiri::XML::Reader
|
465
470
|
if next_node_is?(o, 'feed', Atom::NAMESPACE)
|
@@ -475,27 +480,27 @@ module Atom # :nodoc:
|
|
475
480
|
else
|
476
481
|
raise ArgumentError, "Got #{o.class} but expected a Hash or XML::Reader"
|
477
482
|
end
|
478
|
-
|
483
|
+
|
479
484
|
yield(self) if block_given?
|
480
485
|
end
|
481
|
-
|
486
|
+
|
482
487
|
# Return true if this is the first feed in a paginated set.
|
483
488
|
def first?
|
484
489
|
links.self == links.first_page
|
485
|
-
end
|
486
|
-
|
490
|
+
end
|
491
|
+
|
487
492
|
# Returns true if this is the last feed in a paginated set.
|
488
493
|
def last?
|
489
494
|
links.self == links.last_page
|
490
495
|
end
|
491
|
-
|
496
|
+
|
492
497
|
# Reloads the feed by fetching the self uri.
|
493
498
|
def reload!(opts = {})
|
494
499
|
if links.self
|
495
500
|
Feed.load_feed(URI.parse(links.self.href), opts)
|
496
501
|
end
|
497
502
|
end
|
498
|
-
|
503
|
+
|
499
504
|
# Iterates over each entry in the feed.
|
500
505
|
#
|
501
506
|
# ==== Options
|
@@ -509,7 +514,7 @@ module Atom # :nodoc:
|
|
509
514
|
if options[:paginate]
|
510
515
|
since_reached = false
|
511
516
|
feed = self
|
512
|
-
loop do
|
517
|
+
loop do
|
513
518
|
feed.entries.each do |entry|
|
514
519
|
if options[:since] && entry.updated && options[:since] > entry.updated
|
515
520
|
since_reached = true
|
@@ -518,7 +523,7 @@ module Atom # :nodoc:
|
|
518
523
|
block.call(entry)
|
519
524
|
end
|
520
525
|
end
|
521
|
-
|
526
|
+
|
522
527
|
if since_reached || feed.next_page.nil?
|
523
528
|
break
|
524
529
|
else feed.next_page
|
@@ -528,9 +533,9 @@ module Atom # :nodoc:
|
|
528
533
|
else
|
529
534
|
self.entries.each(&block)
|
530
535
|
end
|
531
|
-
end
|
536
|
+
end
|
532
537
|
end
|
533
|
-
|
538
|
+
|
534
539
|
# Represents an Entry as defined by the Atom Syndication Format specification.
|
535
540
|
#
|
536
541
|
# An Entry represents an individual entry within a Feed.
|
@@ -545,9 +550,9 @@ module Atom # :nodoc:
|
|
545
550
|
#
|
546
551
|
# # Using a URL
|
547
552
|
# Entry = Entry.load_entry(URI.parse("http://example.org/afeedentry.atom"))
|
548
|
-
#
|
553
|
+
#
|
549
554
|
# The document must contain a stand alone entry element as described in the Atom Syndication Format.
|
550
|
-
#
|
555
|
+
#
|
551
556
|
# == Encoding
|
552
557
|
#
|
553
558
|
# A Entry can be converted to XML using, the to_xml method that returns a valid atom entry document in a String.
|
@@ -578,7 +583,7 @@ module Atom # :nodoc:
|
|
578
583
|
include SimpleExtensions
|
579
584
|
extend Forwardable
|
580
585
|
def_delegators :@links, :alternate, :self, :alternates, :enclosures, :edit_link, :via
|
581
|
-
|
586
|
+
|
582
587
|
loadable!
|
583
588
|
namespace Atom::NAMESPACE
|
584
589
|
element :title, :id, :summary
|
@@ -588,7 +593,7 @@ module Atom # :nodoc:
|
|
588
593
|
elements :authors, :contributors, :class => Person
|
589
594
|
elements :categories, :class => Category
|
590
595
|
element :content, :class => Content
|
591
|
-
|
596
|
+
|
592
597
|
# Initialize an Entry.
|
593
598
|
#
|
594
599
|
# This will also yield itself, so an Entry can be constructed like this:
|
@@ -596,7 +601,7 @@ module Atom # :nodoc:
|
|
596
601
|
# entry = Entry.new do |entry|
|
597
602
|
# entry.title = "My Cool entry"
|
598
603
|
# end
|
599
|
-
#
|
604
|
+
#
|
600
605
|
# +o+:: An XML Reader or a Hash of attributes.
|
601
606
|
#
|
602
607
|
def initialize(o = {})
|
@@ -604,7 +609,7 @@ module Atom # :nodoc:
|
|
604
609
|
@authors = []
|
605
610
|
@contributors = []
|
606
611
|
@categories = []
|
607
|
-
|
612
|
+
|
608
613
|
case o
|
609
614
|
when Nokogiri::XML::Reader
|
610
615
|
if current_node_is?(o, 'entry', Atom::NAMESPACE) || next_node_is?(o, 'entry', Atom::NAMESPACE)
|
@@ -622,8 +627,8 @@ module Atom # :nodoc:
|
|
622
627
|
end
|
623
628
|
|
624
629
|
yield(self) if block_given?
|
625
|
-
end
|
626
|
-
|
630
|
+
end
|
631
|
+
|
627
632
|
# Reload the Entry by fetching the self link.
|
628
633
|
def reload!(opts = {})
|
629
634
|
if links.self
|
@@ -637,77 +642,77 @@ module Atom # :nodoc:
|
|
637
642
|
# Some additional methods to get specific types of links are provided.
|
638
643
|
#
|
639
644
|
# == References
|
640
|
-
#
|
645
|
+
#
|
641
646
|
# See also http://www.atomenabled.org/developers/syndication/atom-format-spec.php#element.link
|
642
647
|
# for details on link selection and link attributes.
|
643
648
|
#
|
644
649
|
class Links < DelegateClass(Array)
|
645
650
|
include Enumerable
|
646
|
-
|
651
|
+
|
647
652
|
# Initialize an empty Links array.
|
648
653
|
def initialize
|
649
654
|
super([])
|
650
655
|
end
|
651
|
-
|
656
|
+
|
652
657
|
# Get the alternate.
|
653
658
|
#
|
654
659
|
# Returns the first link with rel == 'alternate' that matches the given type.
|
655
660
|
def alternate(type = nil)
|
656
|
-
detect { |link|
|
657
|
-
(link.rel.nil? || link.rel == Link::Rel::ALTERNATE) && (type.nil? || type == link.type) && (link.hreflang.nil?)
|
658
|
-
} || detect { |link|
|
659
|
-
(link.rel.nil? || link.rel == Link::Rel::ALTERNATE) && (type.nil? || type == link.type)
|
661
|
+
detect { |link|
|
662
|
+
(link.rel.nil? || link.rel == Link::Rel::ALTERNATE) && (type.nil? || type == link.type) && (link.hreflang.nil?)
|
663
|
+
} || detect { |link|
|
664
|
+
(link.rel.nil? || link.rel == Link::Rel::ALTERNATE) && (type.nil? || type == link.type)
|
660
665
|
}
|
661
666
|
end
|
662
|
-
|
667
|
+
|
663
668
|
# Get all alternates.
|
664
669
|
def alternates
|
665
670
|
select { |link| link.rel.nil? || link.rel == Link::Rel::ALTERNATE }
|
666
671
|
end
|
667
|
-
|
672
|
+
|
668
673
|
# Gets the self link.
|
669
674
|
def self
|
670
675
|
detect { |link| link.rel == Link::Rel::SELF }
|
671
676
|
end
|
672
|
-
|
677
|
+
|
673
678
|
# Gets the via link.
|
674
679
|
def via
|
675
680
|
detect { |link| link.rel == Link::Rel::VIA }
|
676
681
|
end
|
677
|
-
|
682
|
+
|
678
683
|
# Gets all links with rel == 'enclosure'
|
679
684
|
def enclosures
|
680
685
|
select { |link| link.rel == Link::Rel::ENCLOSURE }
|
681
686
|
end
|
682
|
-
|
687
|
+
|
683
688
|
# Gets the link with rel == 'first'.
|
684
689
|
#
|
685
690
|
# This is defined as the first page in a pagination set.
|
686
691
|
def first_page
|
687
692
|
detect { |link| link.rel == Link::Rel::FIRST }
|
688
693
|
end
|
689
|
-
|
694
|
+
|
690
695
|
# Gets the link with rel == 'last'.
|
691
696
|
#
|
692
697
|
# This is defined as the last page in a pagination set.
|
693
698
|
def last_page
|
694
699
|
detect { |link| link.rel == Link::Rel::LAST }
|
695
700
|
end
|
696
|
-
|
701
|
+
|
697
702
|
# Gets the link with rel == 'next'.
|
698
703
|
#
|
699
704
|
# This is defined as the next page in a pagination set.
|
700
705
|
def next_page
|
701
706
|
detect { |link| link.rel == Link::Rel::NEXT }
|
702
707
|
end
|
703
|
-
|
708
|
+
|
704
709
|
# Gets the link with rel == 'prev'.
|
705
710
|
#
|
706
711
|
# This is defined as the previous page in a pagination set.
|
707
712
|
def prev_page
|
708
713
|
detect { |link| link.rel == Link::Rel::PREVIOUS }
|
709
714
|
end
|
710
|
-
|
715
|
+
|
711
716
|
# Gets the edit link.
|
712
717
|
#
|
713
718
|
# This is the link which can be used for posting updates to an item using the Atom Publishing Protocol.
|
@@ -716,7 +721,7 @@ module Atom # :nodoc:
|
|
716
721
|
detect { |link| link.rel == 'edit' }
|
717
722
|
end
|
718
723
|
end
|
719
|
-
|
724
|
+
|
720
725
|
# Represents a link in an Atom document.
|
721
726
|
#
|
722
727
|
# A link defines a reference from an Atom document to a web resource.
|
@@ -735,12 +740,12 @@ module Atom # :nodoc:
|
|
735
740
|
LAST = 'last'
|
736
741
|
PREVIOUS = 'prev'
|
737
742
|
NEXT = 'next'
|
738
|
-
end
|
739
|
-
|
743
|
+
end
|
744
|
+
|
740
745
|
include Xml::Parseable
|
741
746
|
attribute :rel, :type, :length, :hreflang, :title
|
742
747
|
uri_attribute :href
|
743
|
-
|
748
|
+
|
744
749
|
# Create a link.
|
745
750
|
#
|
746
751
|
# +o+:: An XML::Reader containing a link element or a Hash of attributes.
|
@@ -759,22 +764,22 @@ module Atom # :nodoc:
|
|
759
764
|
end
|
760
765
|
else
|
761
766
|
raise ArgumentError, "Don't know how to handle #{o}"
|
762
|
-
end
|
767
|
+
end
|
763
768
|
end
|
764
|
-
|
769
|
+
|
765
770
|
remove_method :length=
|
766
771
|
def length=(v)
|
767
772
|
@length = v.to_i
|
768
773
|
end
|
769
|
-
|
774
|
+
|
770
775
|
def to_s
|
771
776
|
self.href
|
772
777
|
end
|
773
|
-
|
778
|
+
|
774
779
|
def ==(o)
|
775
780
|
o.respond_to?(:href) && o.href == self.href
|
776
781
|
end
|
777
|
-
|
782
|
+
|
778
783
|
# This will fetch the URL referenced by the link.
|
779
784
|
#
|
780
785
|
# If the URL contains a valid feed, a Feed will be returned, otherwise,
|
@@ -789,7 +794,7 @@ module Atom # :nodoc:
|
|
789
794
|
Net::HTTP.get_response(URI.parse(self.href)).body
|
790
795
|
end
|
791
796
|
end
|
792
|
-
|
797
|
+
|
793
798
|
def inspect
|
794
799
|
"<Atom::Link href:'#{href}' type:'#{type}'>"
|
795
800
|
end
|
data/lib/atom/version.rb
CHANGED
data/lib/atom/xml/parser.rb
CHANGED
@@ -175,9 +175,13 @@ module Atom
|
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
178
|
+
def document?
|
179
|
+
false
|
180
|
+
end
|
181
|
+
|
178
182
|
def to_xml(builder = nil, root_name = self.class.name.demodulize.downcase, namespace = nil, namespace_handler = nil)
|
179
183
|
orig_builder = builder
|
180
|
-
builder ||= Nokogiri::XML::Builder.new
|
184
|
+
builder ||= Nokogiri::XML::Builder.new(:encoding => 'utf-8')
|
181
185
|
|
182
186
|
namespaces = {}
|
183
187
|
namespaces['xmlns'] = self.class.namespace if !orig_builder && self.class.respond_to?(:namespace) && self.class.namespace
|
@@ -214,7 +218,7 @@ module Atom
|
|
214
218
|
end
|
215
219
|
end
|
216
220
|
end
|
217
|
-
|
221
|
+
|
218
222
|
(self.class.attributes + self.class.uri_attributes).each do |attribute|
|
219
223
|
if value = self.send(accessor_name(attribute))
|
220
224
|
if value != 0
|
@@ -243,8 +247,8 @@ module Atom
|
|
243
247
|
attributes.each do |k,v|
|
244
248
|
node[k] = v
|
245
249
|
end
|
246
|
-
|
247
|
-
builder.doc.root
|
250
|
+
|
251
|
+
document? ? builder.doc : builder.doc.root
|
248
252
|
end
|
249
253
|
|
250
254
|
module DeclarationMethods # :nodoc:
|
data/spec/atom_spec.rb
CHANGED
@@ -193,6 +193,10 @@ describe Atom do
|
|
193
193
|
@feed = Atom::Feed.load_feed(File.open('spec/fixtures/complex_single_entry.atom'))
|
194
194
|
end
|
195
195
|
|
196
|
+
it "should include an xml declaration" do
|
197
|
+
@feed.to_xml.to_s.should(match %r{<\?xml version="1.0" encoding="utf-8"\?>})
|
198
|
+
end
|
199
|
+
|
196
200
|
describe Atom::Feed do
|
197
201
|
it "should have a title" do
|
198
202
|
@feed.title.should == 'dive into mark'
|
@@ -1296,7 +1300,7 @@ describe Atom do
|
|
1296
1300
|
entry.content = Atom::Content::Html.new("Žižek is utf8")
|
1297
1301
|
end.to_xml.to_s
|
1298
1302
|
|
1299
|
-
xml.should match(
|
1303
|
+
xml.should match(/Žižek/)
|
1300
1304
|
end
|
1301
1305
|
end
|
1302
1306
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ratom-nokogiri
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peerworks
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-08-
|
13
|
+
date: 2015-08-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: nokogiri
|