ratom 0.7.2 → 0.8.0
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/History.txt +5 -0
- data/README.rdoc +1 -1
- data/lib/atom.rb +4 -8
- data/lib/atom/version.rb +1 -1
- data/ratom.gemspec +6 -5
- data/spec/atom_spec.rb +316 -263
- data/spec/conformance/atom.rng +600 -0
- data/spec/fixtures/entry_with_custom_content_type.atom +10 -0
- metadata +55 -15
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -227,7 +227,7 @@ defined like this:
|
|
227
227
|
|
228
228
|
We can tell rAtom about our custom namespace and custom class using the following method calls:
|
229
229
|
|
230
|
-
Atom::
|
230
|
+
Atom::Entry.add_extension_namespace :custom, "http://custom.namespace"
|
231
231
|
Atom::Entry.elements "custom:property", :class => Custom::Property
|
232
232
|
|
233
233
|
The first method call registers an alias for the "http://custom.namespace" namespace and the second method call
|
data/lib/atom.rb
CHANGED
@@ -173,14 +173,8 @@ module Atom # :nodoc:
|
|
173
173
|
if xml['src'] && !xml['src'].empty?
|
174
174
|
External.new(xml)
|
175
175
|
else
|
176
|
-
|
177
|
-
|
178
|
-
Xhtml.new(xml)
|
179
|
-
when "html"
|
180
|
-
Html.new(xml)
|
181
|
-
else
|
182
|
-
Text.new(xml)
|
183
|
-
end
|
176
|
+
parser = PARSERS[xml['type']] || Text
|
177
|
+
parser.new(xml)
|
184
178
|
end
|
185
179
|
end
|
186
180
|
|
@@ -364,6 +358,8 @@ module Atom # :nodoc:
|
|
364
358
|
node
|
365
359
|
end
|
366
360
|
end
|
361
|
+
|
362
|
+
PARSERS = {'html' => Html, 'xhtml' => Xhtml}
|
367
363
|
end
|
368
364
|
|
369
365
|
# Represents a Source as defined by the Atom Syndication Format specification.
|
data/lib/atom/version.rb
CHANGED
data/ratom.gemspec
CHANGED
@@ -27,18 +27,19 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.specification_version = 3
|
28
28
|
|
29
29
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
30
|
-
s.add_runtime_dependency(%q<libxml-ruby>, ["~> 2.3
|
31
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.1
|
30
|
+
s.add_runtime_dependency(%q<libxml-ruby>, ["~> 2.3"])
|
31
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.1"])
|
32
32
|
s.add_development_dependency(%q<rspec>, ["~> 2.10.0"])
|
33
33
|
s.add_development_dependency(%q<rake>, ["~> 0.9.2"])
|
34
|
+
s.add_development_dependency(%q<nokogiri>, ["~> 1.5.6"])
|
34
35
|
else
|
35
|
-
s.add_dependency(%q<libxml-ruby>, ["~> 2.3
|
36
|
-
s.add_dependency(%q<bundler>, ["~> 1.1
|
36
|
+
s.add_dependency(%q<libxml-ruby>, ["~> 2.3"])
|
37
|
+
s.add_dependency(%q<bundler>, ["~> 1.1"])
|
37
38
|
s.add_dependency(%q<rspec>, ["~> 2.10.0"])
|
38
39
|
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
39
40
|
end
|
40
41
|
else
|
41
|
-
s.add_dependency(%q<libxml-ruby>, ["~> 2.
|
42
|
+
s.add_dependency(%q<libxml-ruby>, ["~> 2.6.0"])
|
42
43
|
s.add_dependency(%q<bundler>, ["~> 1.1.0"])
|
43
44
|
s.add_dependency(%q<rspec>, ["~> 2.10.0"])
|
44
45
|
s.add_dependency(%q<rake>, ["~> 0.9.2"])
|
data/spec/atom_spec.rb
CHANGED
@@ -43,101 +43,101 @@ shared_examples_for 'simple_single_entry.atom attributes' do
|
|
43
43
|
it "should have the correct href in the alternate" do
|
44
44
|
@feed.alternate.href.should == 'http://example.org/'
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
it "should have 1 author" do
|
48
48
|
@feed.should have(1).authors
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
it "should have 'John Doe' as the author's name" do
|
52
52
|
@feed.authors.first.name.should == "John Doe"
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
it "should parse title" do
|
56
56
|
@entry.title.should == 'Atom-Powered Robots Run Amok'
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
it "should have an alternate" do
|
60
60
|
@entry.alternate.should_not be_nil
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
it "should have an Atom::Link as the alternate" do
|
64
64
|
@entry.alternate.should be_an_instance_of(Atom::Link)
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
it "should have the correct href on the alternate" do
|
68
68
|
@entry.alternate.href.should == 'http://example.org/2003/12/13/atom03'
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
it "should parse id" do
|
72
72
|
@entry.id.should == 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a'
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
it "should parse updated" do
|
76
76
|
@entry.updated.should == Time.parse('2003-12-13T18:30:02Z')
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
it "should parse summary" do
|
80
80
|
@entry.summary.should == 'Some text.'
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
it "should parse content" do
|
84
84
|
@entry.content.should == 'This <em>is</em> html.'
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
it "should parse content type" do
|
88
88
|
@entry.content.type.should == 'html'
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
-
describe Atom do
|
92
|
+
describe Atom do
|
93
93
|
describe "Atom::Feed.load_feed" do
|
94
94
|
it "should accept an IO" do
|
95
95
|
lambda { Atom::Feed.load_feed(File.open('spec/fixtures/simple_single_entry.atom')) }.should_not raise_error
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
it "should raise ArgumentError with something other than IO or URI" do
|
99
99
|
lambda { Atom::Feed.load_feed(nil) }.should raise_error(ArgumentError)
|
100
100
|
end
|
101
|
-
|
101
|
+
|
102
102
|
it "should accept a String" do
|
103
103
|
Atom::Feed.load_feed(File.read('spec/fixtures/simple_single_entry.atom')).should be_an_instance_of(Atom::Feed)
|
104
104
|
end
|
105
|
-
|
105
|
+
|
106
106
|
it "should accept a URI" do
|
107
107
|
uri = URI.parse('http://example.com/feed.atom')
|
108
108
|
response = Net::HTTPSuccess.new(nil, nil, nil)
|
109
109
|
response.stub!(:body).and_return(File.read('spec/fixtures/simple_single_entry.atom'))
|
110
110
|
mock_http_get(uri, response)
|
111
|
-
|
111
|
+
|
112
112
|
Atom::Feed.load_feed(uri).should be_an_instance_of(Atom::Feed)
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
it "should accept a URI with query parameters" do
|
116
116
|
uri = URI.parse('http://example.com/feed.atom?page=2')
|
117
117
|
response = Net::HTTPSuccess.new(nil, nil, nil)
|
118
118
|
response.stub!(:body).and_return(File.read('spec/fixtures/simple_single_entry.atom'))
|
119
119
|
mock_http_get(uri, response)
|
120
|
-
|
120
|
+
|
121
121
|
Atom::Feed.load_feed(uri).should be_an_instance_of(Atom::Feed)
|
122
122
|
end
|
123
|
-
|
123
|
+
|
124
124
|
it "should raise ArgumentError with non-http uri" do
|
125
125
|
uri = URI.parse('file:/tmp')
|
126
126
|
lambda { Atom::Feed.load_feed(uri) }.should raise_error(ArgumentError)
|
127
127
|
end
|
128
|
-
|
128
|
+
|
129
129
|
it "should return an Atom::Feed" do
|
130
130
|
feed = Atom::Feed.load_feed(File.open('spec/fixtures/simple_single_entry.atom'))
|
131
131
|
feed.should be_an_instance_of(Atom::Feed)
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
it "should not raise an error with a String and basic-auth credentials" do
|
135
135
|
lambda { Atom::Feed.load_feed(File.read('spec/fixtures/simple_single_entry.atom'), :user => 'user', :pass => 'pass') }.should_not raise_error
|
136
136
|
end
|
137
|
-
|
137
|
+
|
138
138
|
it "should not raise an error with a URI with basic-auth credentials" do
|
139
139
|
uri = URI.parse('http://example.com/feed.atom')
|
140
|
-
|
140
|
+
|
141
141
|
response = Net::HTTPSuccess.new(nil, nil, nil)
|
142
142
|
response.stub!(:body).and_return(File.read('spec/fixtures/simple_single_entry.atom'))
|
143
143
|
mock_http_get(uri, response, 'user', 'pass')
|
@@ -145,123 +145,123 @@ describe Atom do
|
|
145
145
|
lambda { Atom::Feed.load_feed(uri, :user => 'user', :pass => 'pass') }.should_not raise_error
|
146
146
|
end
|
147
147
|
end
|
148
|
-
|
148
|
+
|
149
149
|
describe 'Atom::Entry.load_entry' do
|
150
150
|
it "should accept an IO" do
|
151
151
|
Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom')).should be_an_instance_of(Atom::Entry)
|
152
152
|
end
|
153
|
-
|
153
|
+
|
154
154
|
it "should accept a URI" do
|
155
155
|
uri = URI.parse('http://example.org/entry.atom')
|
156
156
|
response = Net::HTTPSuccess.new(nil, nil, nil)
|
157
|
-
response.stub!(:body).and_return(File.read('spec/fixtures/entry.atom'))
|
157
|
+
response.stub!(:body).and_return(File.read('spec/fixtures/entry.atom'))
|
158
158
|
mock_http_get(uri, response)
|
159
|
-
|
159
|
+
|
160
160
|
Atom::Entry.load_entry(uri).should be_an_instance_of(Atom::Entry)
|
161
161
|
end
|
162
|
-
|
162
|
+
|
163
163
|
it "should accept a String" do
|
164
164
|
Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom')).should be_an_instance_of(Atom::Entry)
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
it "should raise ArgumentError with something other than IO, String or URI" do
|
168
168
|
lambda { Atom::Entry.load_entry(nil) }.should raise_error(ArgumentError)
|
169
169
|
end
|
170
|
-
|
170
|
+
|
171
171
|
it "should raise ArgumentError with non-http uri" do
|
172
172
|
lambda { Atom::Entry.load_entry(URI.parse('file:/tmp')) }.should raise_error(ArgumentError)
|
173
173
|
end
|
174
174
|
end
|
175
|
-
|
175
|
+
|
176
176
|
describe 'SimpleSingleFeed' do
|
177
|
-
before(:all) do
|
177
|
+
before(:all) do
|
178
178
|
@feed = Atom::Feed.load_feed(File.open('spec/fixtures/simple_single_entry.atom'))
|
179
179
|
@entry = @feed.entries.first
|
180
180
|
end
|
181
|
-
|
181
|
+
|
182
182
|
it_should_behave_like "simple_single_entry.atom attributes"
|
183
183
|
end
|
184
|
-
|
184
|
+
|
185
185
|
describe 'FeedWithStyleSheet' do
|
186
186
|
it "should load without failure" do
|
187
187
|
lambda { feed = Atom::Feed.load_feed(File.open('spec/fixtures/with_stylesheet.atom')) }.should_not raise_error
|
188
188
|
end
|
189
189
|
end
|
190
|
-
|
190
|
+
|
191
191
|
describe 'ComplexFeed' do
|
192
192
|
before(:all) do
|
193
193
|
@feed = Atom::Feed.load_feed(File.open('spec/fixtures/complex_single_entry.atom'))
|
194
194
|
end
|
195
|
-
|
196
|
-
describe Atom::Feed do
|
195
|
+
|
196
|
+
describe Atom::Feed do
|
197
197
|
it "should have a title" do
|
198
198
|
@feed.title.should == 'dive into mark'
|
199
199
|
end
|
200
|
-
|
200
|
+
|
201
201
|
it "should have type on the title" do
|
202
202
|
@feed.title.type.should == 'text'
|
203
203
|
end
|
204
|
-
|
204
|
+
|
205
205
|
it "should have a subtitle" do
|
206
206
|
@feed.subtitle.should == 'A <em>lot</em> of effort went into making this effortless'
|
207
207
|
end
|
208
|
-
|
208
|
+
|
209
209
|
it "should have a type for the subtitle" do
|
210
210
|
@feed.subtitle.type.should == 'html'
|
211
211
|
end
|
212
|
-
|
212
|
+
|
213
213
|
it "should have an updated date" do
|
214
214
|
@feed.updated.should == Time.parse('2005-07-31T12:29:29Z')
|
215
215
|
end
|
216
|
-
|
216
|
+
|
217
217
|
it "should have an id" do
|
218
218
|
@feed.id.should == 'tag:example.org,2003:3'
|
219
219
|
end
|
220
|
-
|
220
|
+
|
221
221
|
it "should have 2 links" do
|
222
222
|
@feed.should have(2).links
|
223
223
|
end
|
224
|
-
|
224
|
+
|
225
225
|
it "should have an alternate link" do
|
226
226
|
@feed.alternate.should_not be_nil
|
227
227
|
end
|
228
|
-
|
228
|
+
|
229
229
|
it "should have the right url for the alternate" do
|
230
230
|
@feed.alternate.to_s.should == 'http://example.org/'
|
231
231
|
end
|
232
|
-
|
232
|
+
|
233
233
|
it "should have a self link" do
|
234
234
|
@feed.self.should_not be_nil
|
235
235
|
end
|
236
|
-
|
236
|
+
|
237
237
|
it "should have the right url for self" do
|
238
238
|
@feed.self.to_s.should == 'http://example.org/feed.atom'
|
239
239
|
end
|
240
|
-
|
240
|
+
|
241
241
|
it "should have rights" do
|
242
242
|
@feed.rights.should == 'Copyright (c) 2003, Mark Pilgrim'
|
243
243
|
end
|
244
|
-
|
244
|
+
|
245
245
|
it "should have a generator" do
|
246
246
|
@feed.generator.should_not be_nil
|
247
247
|
end
|
248
|
-
|
248
|
+
|
249
249
|
it "should have a generator uri" do
|
250
250
|
@feed.generator.uri.should == 'http://www.example.com/'
|
251
251
|
end
|
252
|
-
|
252
|
+
|
253
253
|
it "should have a generator version" do
|
254
254
|
@feed.generator.version.should == '1.0'
|
255
255
|
end
|
256
|
-
|
256
|
+
|
257
257
|
it "should have a generator name" do
|
258
258
|
@feed.generator.name.should == 'Example Toolkit'
|
259
259
|
end
|
260
|
-
|
260
|
+
|
261
261
|
it "should have an entry" do
|
262
262
|
@feed.should have(1).entries
|
263
263
|
end
|
264
|
-
|
264
|
+
|
265
265
|
it "should have a category" do
|
266
266
|
@feed.should have(1).categories
|
267
267
|
end
|
@@ -292,225 +292,225 @@ describe Atom do
|
|
292
292
|
before(:each) do
|
293
293
|
@entry = @feed.entries.first
|
294
294
|
end
|
295
|
-
|
295
|
+
|
296
296
|
it "should have a title" do
|
297
297
|
@entry.title.should == 'Atom draft-07 snapshot'
|
298
298
|
end
|
299
|
-
|
299
|
+
|
300
300
|
it "should have an id" do
|
301
301
|
@entry.id.should == 'tag:example.org,2003:3.2397'
|
302
302
|
end
|
303
|
-
|
303
|
+
|
304
304
|
it "should have an updated date" do
|
305
305
|
@entry.updated.should == Time.parse('2005-07-31T12:29:29Z')
|
306
306
|
end
|
307
|
-
|
307
|
+
|
308
308
|
it "should have a published date" do
|
309
309
|
@entry.published.should == Time.parse('2003-12-13T08:29:29-04:00')
|
310
310
|
end
|
311
|
-
|
311
|
+
|
312
312
|
it "should have an author" do
|
313
313
|
@entry.should have(1).authors
|
314
314
|
end
|
315
|
-
|
315
|
+
|
316
316
|
it "should have two links" do
|
317
317
|
@entry.should have(2).links
|
318
318
|
end
|
319
|
-
|
319
|
+
|
320
320
|
it "should have one alternate link" do
|
321
321
|
@entry.should have(1).alternates
|
322
322
|
end
|
323
|
-
|
323
|
+
|
324
324
|
it "should have one enclosure link" do
|
325
325
|
@entry.should have(1).enclosures
|
326
326
|
end
|
327
|
-
|
327
|
+
|
328
328
|
it "should have 2 contributors" do
|
329
329
|
@entry.should have(2).contributors
|
330
330
|
end
|
331
|
-
|
331
|
+
|
332
332
|
it "should have names for the contributors" do
|
333
333
|
@entry.contributors[0].name.should == 'Sam Ruby'
|
334
334
|
@entry.contributors[1].name.should == 'Joe Gregorio'
|
335
335
|
end
|
336
|
-
|
336
|
+
|
337
337
|
it "should have content" do
|
338
338
|
@entry.content.should_not be_nil
|
339
339
|
end
|
340
|
-
|
340
|
+
|
341
341
|
it "should have 2 categories" do
|
342
342
|
@entry.should have(2).categories
|
343
343
|
end
|
344
344
|
end
|
345
|
-
|
345
|
+
|
346
346
|
describe Atom::Category do
|
347
347
|
describe 'atom category' do
|
348
348
|
before(:each) do
|
349
349
|
@category = @feed.entries.first.categories.first
|
350
350
|
end
|
351
|
-
|
351
|
+
|
352
352
|
it "should have a term" do
|
353
353
|
@category.term.should == "atom"
|
354
354
|
end
|
355
|
-
|
355
|
+
|
356
356
|
it "should have a scheme" do
|
357
357
|
@category.scheme.should == "http://example.org"
|
358
358
|
end
|
359
|
-
|
359
|
+
|
360
360
|
it "should have a label" do
|
361
361
|
@category.label.should == "Atom"
|
362
362
|
end
|
363
363
|
end
|
364
|
-
|
364
|
+
|
365
365
|
describe 'draft category' do
|
366
366
|
before(:each) do
|
367
367
|
@category = @feed.entries.first.categories.last
|
368
368
|
end
|
369
|
-
|
369
|
+
|
370
370
|
it "should have a term" do
|
371
371
|
@category.term.should == "drafts"
|
372
372
|
end
|
373
|
-
|
373
|
+
|
374
374
|
it "should have a scheme" do
|
375
375
|
@category.scheme.should == "http://example2.org"
|
376
376
|
end
|
377
|
-
|
377
|
+
|
378
378
|
it "should have a label" do
|
379
379
|
@category.label.should == "Drafts"
|
380
380
|
end
|
381
381
|
end
|
382
382
|
end
|
383
|
-
|
383
|
+
|
384
384
|
describe Atom::Link do
|
385
|
-
describe 'alternate link' do
|
385
|
+
describe 'alternate link' do
|
386
386
|
before(:each) do
|
387
387
|
@entry = @feed.entries.first
|
388
388
|
@link = @entry.alternate
|
389
389
|
end
|
390
|
-
|
390
|
+
|
391
391
|
it "should have text/html type" do
|
392
392
|
@link.type.should == 'text/html'
|
393
393
|
end
|
394
|
-
|
394
|
+
|
395
395
|
it "should have alternate rel" do
|
396
396
|
@link.rel.should == 'alternate'
|
397
397
|
end
|
398
|
-
|
398
|
+
|
399
399
|
it "should have href 'http://example.org/2005/04/02/atom'" do
|
400
400
|
@link.href.should == 'http://example.org/2005/04/02/atom'
|
401
401
|
end
|
402
|
-
|
402
|
+
|
403
403
|
it "should have 'http://example.org/2005/04/02/atom' string representation" do
|
404
404
|
@link.to_s.should == 'http://example.org/2005/04/02/atom'
|
405
405
|
end
|
406
|
-
|
406
|
+
|
407
407
|
it "should have title 'Alternate link'" do
|
408
408
|
@link.title.should == "Alternate link"
|
409
409
|
end
|
410
410
|
end
|
411
|
-
|
411
|
+
|
412
412
|
describe 'enclosure link' do
|
413
413
|
before(:each) do
|
414
414
|
@entry = @feed.entries.first
|
415
415
|
@link = @entry.enclosures.first
|
416
416
|
end
|
417
|
-
|
417
|
+
|
418
418
|
it "should have audio/mpeg type" do
|
419
419
|
@link.type.should == 'audio/mpeg'
|
420
420
|
end
|
421
|
-
|
421
|
+
|
422
422
|
it "should have enclosure rel" do
|
423
423
|
@link.rel.should == 'enclosure'
|
424
424
|
end
|
425
|
-
|
425
|
+
|
426
426
|
it "should have length 1337" do
|
427
427
|
@link.length.should == 1337
|
428
428
|
end
|
429
|
-
|
429
|
+
|
430
430
|
it "should have href 'http://example.org/audio/ph34r_my_podcast.mp3'" do
|
431
431
|
@link.href.should == 'http://example.org/audio/ph34r_my_podcast.mp3'
|
432
432
|
end
|
433
|
-
|
433
|
+
|
434
434
|
it "should have 'http://example.org/audio/ph34r_my_podcast.mp3' string representation" do
|
435
435
|
@link.to_s.should == 'http://example.org/audio/ph34r_my_podcast.mp3'
|
436
436
|
end
|
437
437
|
end
|
438
438
|
end
|
439
|
-
|
439
|
+
|
440
440
|
describe Atom::Person do
|
441
441
|
before(:each) do
|
442
442
|
@entry = @feed.entries.first
|
443
443
|
@person = @entry.authors.first
|
444
444
|
end
|
445
|
-
|
445
|
+
|
446
446
|
it "should have a name" do
|
447
447
|
@person.name.should == 'Mark Pilgrim'
|
448
448
|
end
|
449
|
-
|
449
|
+
|
450
450
|
it "should have a uri" do
|
451
451
|
@person.uri.should == 'http://example.org/'
|
452
452
|
end
|
453
|
-
|
453
|
+
|
454
454
|
it "should have an email address" do
|
455
455
|
@person.email.should == 'f8dy@example.com'
|
456
456
|
end
|
457
457
|
end
|
458
|
-
|
458
|
+
|
459
459
|
describe Atom::Content do
|
460
|
-
before(:each) do
|
460
|
+
before(:each) do
|
461
461
|
@entry = @feed.entries.first
|
462
462
|
@content = @entry.content
|
463
463
|
end
|
464
|
-
|
464
|
+
|
465
465
|
it "should have 'xhtml' type" do
|
466
466
|
@content.type.should == 'xhtml'
|
467
467
|
end
|
468
|
-
|
468
|
+
|
469
469
|
it "should have 'en' language" do
|
470
470
|
@content.xml_lang.should == 'en'
|
471
471
|
end
|
472
|
-
|
472
|
+
|
473
473
|
it "should have the content as the string representation" do
|
474
474
|
@content.should == '<p xmlns="http://www.w3.org/1999/xhtml"><i>[Update: The Atom draft is finished.]</i></p>'
|
475
475
|
end
|
476
476
|
end
|
477
477
|
end
|
478
|
-
|
478
|
+
|
479
479
|
describe 'ConformanceTests' do
|
480
480
|
describe 'nondefaultnamespace.atom' do
|
481
481
|
before(:all) do
|
482
482
|
@feed = Atom::Feed.load_feed(File.open('spec/conformance/nondefaultnamespace.atom'))
|
483
483
|
end
|
484
|
-
|
484
|
+
|
485
485
|
it "should have a title" do
|
486
486
|
@feed.title.should == 'Non-default namespace test'
|
487
487
|
end
|
488
|
-
|
488
|
+
|
489
489
|
it "should have 1 entry" do
|
490
490
|
@feed.should have(1).entries
|
491
491
|
end
|
492
|
-
|
492
|
+
|
493
493
|
describe Atom::Entry do
|
494
|
-
before(:all) do
|
494
|
+
before(:all) do
|
495
495
|
@entry = @feed.entries.first
|
496
496
|
end
|
497
|
-
|
497
|
+
|
498
498
|
it "should have a title" do
|
499
499
|
@entry.title.should == 'If you can read the content of this entry, your aggregator works fine.'
|
500
500
|
end
|
501
|
-
|
501
|
+
|
502
502
|
it "should have content" do
|
503
503
|
@entry.content.should_not be_nil
|
504
504
|
end
|
505
|
-
|
505
|
+
|
506
506
|
it "should have 'xhtml' for the type of the content" do
|
507
507
|
@entry.content.type.should == 'xhtml'
|
508
508
|
end
|
509
|
-
|
509
|
+
|
510
510
|
it "should strip the outer div of the content" do
|
511
511
|
@entry.content.should_not match(/div/)
|
512
512
|
end
|
513
|
-
|
513
|
+
|
514
514
|
it "should keep inner xhtml of content" do
|
515
515
|
@entry.content.should == '<p xmlns="http://www.w3.org/1999/xhtml">For information, see:</p> ' +
|
516
516
|
'<ul xmlns="http://www.w3.org/1999/xhtml"> ' +
|
@@ -521,161 +521,161 @@ describe Atom do
|
|
521
521
|
end
|
522
522
|
end
|
523
523
|
end
|
524
|
-
|
524
|
+
|
525
525
|
describe 'unknown-namespace.atom' do
|
526
526
|
before(:all) do
|
527
527
|
@feed = Atom::Feed.load_feed(File.open('spec/conformance/unknown-namespace.atom'))
|
528
528
|
@entry = @feed.entries.first
|
529
529
|
@content = @entry.content
|
530
530
|
end
|
531
|
-
|
531
|
+
|
532
532
|
it "should have content" do
|
533
533
|
@content.should_not be_nil
|
534
534
|
end
|
535
|
-
|
535
|
+
|
536
536
|
it "should strip surrounding div" do
|
537
537
|
@content.should_not match(/div/)
|
538
538
|
end
|
539
|
-
|
539
|
+
|
540
540
|
it "should keep inner lists" do
|
541
541
|
@content.should match(/<h:ul/)
|
542
542
|
@content.should match(/<ul/)
|
543
543
|
end
|
544
|
-
|
544
|
+
|
545
545
|
it "should have xhtml type" do
|
546
546
|
@content.type.should == 'xhtml'
|
547
|
-
end
|
547
|
+
end
|
548
548
|
end
|
549
|
-
|
549
|
+
|
550
550
|
describe 'linktests.atom' do
|
551
551
|
before(:all) do
|
552
552
|
@feed = Atom::Feed.load_feed(File.open('spec/conformance/linktests.xml'))
|
553
553
|
@entries = @feed.entries
|
554
554
|
end
|
555
|
-
|
555
|
+
|
556
556
|
describe 'linktest1' do
|
557
557
|
before(:all) do
|
558
558
|
@entry = @entries[0]
|
559
559
|
end
|
560
|
-
|
560
|
+
|
561
561
|
it "should pick single alternate link without rel" do
|
562
562
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
|
563
563
|
end
|
564
564
|
end
|
565
|
-
|
565
|
+
|
566
566
|
describe 'linktest2' do
|
567
567
|
before(:all) do
|
568
568
|
@entry = @entries[1]
|
569
569
|
end
|
570
|
-
|
570
|
+
|
571
571
|
it "should be picky about case of alternate rel" do
|
572
572
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
|
573
573
|
end
|
574
|
-
|
574
|
+
|
575
575
|
it "should be picky when picking the alternate by type" do
|
576
576
|
@entry.alternate('text/plain').href.should == 'http://www.snellspace.com/public/linktests/alternate2'
|
577
577
|
end
|
578
578
|
end
|
579
|
-
|
579
|
+
|
580
580
|
describe 'linktest3' do
|
581
581
|
before(:all) do
|
582
582
|
@entry = @entries[2]
|
583
583
|
end
|
584
|
-
|
584
|
+
|
585
585
|
it "should parse all links" do
|
586
586
|
@entry.should have(5).links
|
587
587
|
end
|
588
|
-
|
588
|
+
|
589
589
|
it "should pick the alternate from a full list of core types" do
|
590
590
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
|
591
591
|
end
|
592
592
|
end
|
593
|
-
|
593
|
+
|
594
594
|
describe 'linktest4' do
|
595
595
|
before(:all) do
|
596
596
|
@entry = @entries[3]
|
597
597
|
end
|
598
|
-
|
598
|
+
|
599
599
|
it "should parse all links" do
|
600
600
|
@entry.should have(6).links
|
601
601
|
end
|
602
|
-
|
602
|
+
|
603
603
|
it "should pick the first alternate from a full list of core types with an extra alternate" do
|
604
604
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
|
605
605
|
end
|
606
|
-
|
606
|
+
|
607
607
|
it "should pick the alternate by type from a full list of core types with an extra alternate" do
|
608
608
|
@entry.alternate('text/plain').href.should == 'http://www.snellspace.com/public/linktests/alternate2'
|
609
609
|
end
|
610
610
|
end
|
611
|
-
|
611
|
+
|
612
612
|
describe 'linktest5' do
|
613
613
|
before(:all) do
|
614
614
|
@entry = @entries[4]
|
615
615
|
end
|
616
|
-
|
616
|
+
|
617
617
|
it "should parse all links" do
|
618
618
|
@entry.should have(2).links
|
619
619
|
end
|
620
|
-
|
620
|
+
|
621
621
|
it "should pick the alternate without choking on a non-core type" do
|
622
622
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
|
623
623
|
end
|
624
|
-
|
624
|
+
|
625
625
|
it "should include the non-core type in the list of links" do
|
626
626
|
@entry.links.map{|l| l.href }.should include('http://www.snellspace.com/public/linktests/license')
|
627
627
|
end
|
628
628
|
end
|
629
|
-
|
629
|
+
|
630
630
|
describe 'linktest6' do
|
631
631
|
before(:all) do
|
632
632
|
@entry = @entries[5]
|
633
633
|
end
|
634
|
-
|
634
|
+
|
635
635
|
it "should parse all links" do
|
636
636
|
@entry.should have(2).links
|
637
637
|
end
|
638
|
-
|
638
|
+
|
639
639
|
it "should pick the alternate without choking on a non-core type identified by a uri" do
|
640
640
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
|
641
641
|
end
|
642
|
-
|
642
|
+
|
643
643
|
it "should include the non-core type in the list of links identified by a uri" do
|
644
644
|
@entry.links.map{|l| l.href }.should include('http://www.snellspace.com/public/linktests/example')
|
645
645
|
end
|
646
646
|
end
|
647
|
-
|
647
|
+
|
648
648
|
describe 'linktest7' do
|
649
649
|
before(:all) do
|
650
650
|
@entry = @entries[6]
|
651
651
|
end
|
652
|
-
|
652
|
+
|
653
653
|
it "should parse all links" do
|
654
654
|
@entry.should have(2).links
|
655
655
|
end
|
656
|
-
|
656
|
+
|
657
657
|
it "should pick the alternate without choking on a non-core type" do
|
658
658
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
|
659
659
|
end
|
660
|
-
|
660
|
+
|
661
661
|
it "should include the non-core type in the list of links" do
|
662
662
|
@entry.links.map{|l| l.href }.should include('http://www.snellspace.com/public/linktests/license')
|
663
663
|
end
|
664
664
|
end
|
665
|
-
|
665
|
+
|
666
666
|
describe 'linktest8' do
|
667
667
|
before(:all) do
|
668
668
|
@entry = @entries[7]
|
669
669
|
end
|
670
|
-
|
670
|
+
|
671
671
|
it "should parse all links" do
|
672
672
|
@entry.should have(2).links
|
673
673
|
end
|
674
|
-
|
674
|
+
|
675
675
|
it "should pick the alternate without choking on a non-core type identified by a uri" do
|
676
676
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
|
677
677
|
end
|
678
|
-
|
678
|
+
|
679
679
|
it "should include the non-core type in the list of links identified by a uri" do
|
680
680
|
@entry.links.map{|l| l.href }.should include('http://www.snellspace.com/public/linktests/example')
|
681
681
|
end
|
@@ -685,143 +685,143 @@ describe Atom do
|
|
685
685
|
before(:all) do
|
686
686
|
@entry = @entries[8]
|
687
687
|
end
|
688
|
-
|
688
|
+
|
689
689
|
it "should parse all links" do
|
690
690
|
@entry.should have(3).links
|
691
691
|
end
|
692
|
-
|
692
|
+
|
693
693
|
it "should pick the alternate without hreflang" do
|
694
694
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
|
695
695
|
end
|
696
696
|
end
|
697
697
|
end
|
698
|
-
|
698
|
+
|
699
699
|
describe 'ordertest.atom' do
|
700
700
|
before(:all) do
|
701
701
|
@feed = Atom::Feed.load_feed(File.open('spec/conformance/ordertest.xml'))
|
702
702
|
end
|
703
|
-
|
703
|
+
|
704
704
|
it 'should have 9 entries' do
|
705
705
|
@feed.should have(9).entries
|
706
706
|
end
|
707
|
-
|
707
|
+
|
708
708
|
describe 'ordertest1' do
|
709
709
|
before(:each) do
|
710
710
|
@entry = @feed.entries[0]
|
711
711
|
end
|
712
|
-
|
712
|
+
|
713
713
|
it "should have the correct title" do
|
714
714
|
@entry.title.should == 'Simple order, nothing fancy'
|
715
715
|
end
|
716
716
|
end
|
717
|
-
|
717
|
+
|
718
718
|
describe 'ordertest2' do
|
719
719
|
before(:each) do
|
720
720
|
@entry = @feed.entries[1]
|
721
721
|
end
|
722
|
-
|
722
|
+
|
723
723
|
it "should have the correct title" do
|
724
724
|
@entry.title.should == 'Same as the first, only mixed up a bit'
|
725
725
|
end
|
726
726
|
end
|
727
|
-
|
728
|
-
describe "ordertest3" do
|
727
|
+
|
728
|
+
describe "ordertest3" do
|
729
729
|
before(:each) do
|
730
730
|
@entry = @feed.entries[2]
|
731
731
|
end
|
732
|
-
|
732
|
+
|
733
733
|
it "should have the correct title" do
|
734
734
|
@entry.title.should == 'Multiple alt link elements, which one does your reader show?'
|
735
735
|
end
|
736
|
-
|
736
|
+
|
737
737
|
it "should pick the first alternate" do
|
738
738
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
|
739
739
|
end
|
740
740
|
end
|
741
|
-
|
741
|
+
|
742
742
|
describe 'ordertest4' do
|
743
743
|
before(:each) do
|
744
744
|
@entry = @feed.entries[3]
|
745
745
|
end
|
746
|
-
|
746
|
+
|
747
747
|
it "should have the correct title" do
|
748
748
|
@entry.title.should == 'Multiple link elements, does your feed reader show the "alternate" correctly?'
|
749
749
|
end
|
750
|
-
|
750
|
+
|
751
751
|
it "should pick the right link" do
|
752
752
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
|
753
753
|
end
|
754
754
|
end
|
755
|
-
|
755
|
+
|
756
756
|
describe 'ordertest5' do
|
757
757
|
before(:each) do
|
758
758
|
@entry = @feed.entries[4]
|
759
759
|
end
|
760
|
-
|
760
|
+
|
761
761
|
it "should have a source" do
|
762
762
|
@entry.source.should_not be_nil
|
763
763
|
end
|
764
|
-
|
764
|
+
|
765
765
|
it "should have the correct title" do
|
766
766
|
@entry.title.should == 'Entry with a source first'
|
767
767
|
end
|
768
|
-
|
768
|
+
|
769
769
|
it "should have the correct updated" do
|
770
770
|
@entry.updated.should == Time.parse('2006-01-26T09:20:05Z')
|
771
771
|
end
|
772
|
-
|
772
|
+
|
773
773
|
it "should have the correct alt link" do
|
774
774
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
|
775
775
|
end
|
776
|
-
|
776
|
+
|
777
777
|
describe Atom::Source do
|
778
778
|
before(:each) do
|
779
779
|
@source = @entry.source
|
780
780
|
end
|
781
|
-
|
781
|
+
|
782
782
|
it "should have an id" do
|
783
783
|
@source.id.should == 'tag:example.org,2006:atom/conformance/element_order'
|
784
784
|
end
|
785
|
-
|
785
|
+
|
786
786
|
it "should have a title" do
|
787
787
|
@source.title.should == 'Order Matters'
|
788
788
|
end
|
789
|
-
|
789
|
+
|
790
790
|
it "should have a subtitle" do
|
791
791
|
@source.subtitle.should == 'Testing how feed readers handle the order of entry elements'
|
792
792
|
end
|
793
|
-
|
793
|
+
|
794
794
|
it "should have a updated" do
|
795
795
|
@source.updated.should == Time.parse('2006-01-26T09:16:00Z')
|
796
796
|
end
|
797
|
-
|
797
|
+
|
798
798
|
it "should have an author" do
|
799
799
|
@source.should have(1).authors
|
800
800
|
end
|
801
|
-
|
801
|
+
|
802
802
|
it "should have the right name for the author" do
|
803
803
|
@source.authors.first.name.should == 'James Snell'
|
804
804
|
end
|
805
|
-
|
805
|
+
|
806
806
|
it "should have 2 links" do
|
807
807
|
@source.should have(2).links
|
808
808
|
end
|
809
|
-
|
809
|
+
|
810
810
|
it "should have an alternate" do
|
811
811
|
@source.alternate.href.should == 'http://www.snellspace.com/wp/?p=255'
|
812
812
|
end
|
813
|
-
|
813
|
+
|
814
814
|
it "should have a self" do
|
815
815
|
@source.self.href.should == 'http://www.snellspace.com/public/ordertest.xml'
|
816
816
|
end
|
817
817
|
end
|
818
818
|
end
|
819
|
-
|
819
|
+
|
820
820
|
describe 'ordertest6' do
|
821
821
|
before(:each) do
|
822
822
|
@entry = @feed.entries[5]
|
823
823
|
end
|
824
|
-
|
824
|
+
|
825
825
|
it "should have a source" do
|
826
826
|
@entry.source.should_not be_nil
|
827
827
|
end
|
@@ -838,12 +838,12 @@ describe Atom do
|
|
838
838
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
|
839
839
|
end
|
840
840
|
end
|
841
|
-
|
841
|
+
|
842
842
|
describe 'ordetest7' do
|
843
843
|
before(:each) do
|
844
844
|
@entry = @feed.entries[6]
|
845
845
|
end
|
846
|
-
|
846
|
+
|
847
847
|
it "should have a source" do
|
848
848
|
@entry.source.should_not be_nil
|
849
849
|
end
|
@@ -860,166 +860,208 @@ describe Atom do
|
|
860
860
|
@entry.alternate.href.should == 'http://www.snellspace.com/public/alternate'
|
861
861
|
end
|
862
862
|
end
|
863
|
-
|
863
|
+
|
864
864
|
describe 'ordertest8' do
|
865
865
|
before(:each) do
|
866
866
|
@entry = @feed.entries[7]
|
867
867
|
end
|
868
|
-
|
868
|
+
|
869
869
|
it "should have the right title" do
|
870
870
|
@entry.title.should == 'Atom elements in an extension element'
|
871
871
|
end
|
872
|
-
|
872
|
+
|
873
873
|
it "should have right id" do
|
874
874
|
@entry.id.should == 'tag:example.org,2006:atom/conformance/element_order/8'
|
875
875
|
end
|
876
876
|
end
|
877
|
-
|
877
|
+
|
878
878
|
describe 'ordertest9' do
|
879
879
|
before(:each) do
|
880
880
|
@entry = @feed.entries[8]
|
881
881
|
end
|
882
|
-
|
882
|
+
|
883
883
|
it "should have the right title" do
|
884
884
|
@entry.title.should == 'Atom elements in an extension element'
|
885
885
|
end
|
886
|
-
|
886
|
+
|
887
887
|
it 'should have the right id' do
|
888
888
|
@entry.id.should == 'tag:example.org,2006:atom/conformance/element_order/9'
|
889
889
|
end
|
890
890
|
end
|
891
891
|
end
|
892
|
+
|
893
|
+
describe 'atom.rng' do
|
894
|
+
|
895
|
+
before(:all) do
|
896
|
+
require 'nokogiri'
|
897
|
+
rng_schema = File.expand_path("conformance/atom.rng",
|
898
|
+
File.dirname(__FILE__))
|
899
|
+
@schema = Nokogiri::XML::RelaxNG(File.open(rng_schema))
|
900
|
+
end
|
901
|
+
|
902
|
+
def validate_against_atom_rng
|
903
|
+
@schema.validate(Nokogiri::XML(subject.to_xml)).should be == []
|
904
|
+
end
|
905
|
+
|
906
|
+
subject do
|
907
|
+
Atom::Feed.new do |feed|
|
908
|
+
# Order is important
|
909
|
+
feed.id = "http://example.test/feed"
|
910
|
+
feed.updated = Time.now
|
911
|
+
feed.title = 'Test Feed'
|
912
|
+
# Add entries
|
913
|
+
feed.entries << Atom::Entry.new do |entry|
|
914
|
+
entry.id = "http://example.test/entry/1"
|
915
|
+
entry.updated = feed.updated
|
916
|
+
entry.title = 'Test Entry'
|
917
|
+
end
|
918
|
+
end
|
919
|
+
end
|
920
|
+
|
921
|
+
it 'should validate against a feed without extensions' do
|
922
|
+
validate_against_atom_rng
|
923
|
+
end
|
924
|
+
|
925
|
+
it 'should validate against a feed with simple extensions' do
|
926
|
+
pending 'Does not conform yet - see seangeo/ratom#21'
|
927
|
+
# Mark feed as complete
|
928
|
+
subject['http://purl.org/syndication/history/1.0', 'complete'] << ''
|
929
|
+
validate_against_atom_rng
|
930
|
+
end
|
931
|
+
|
932
|
+
end
|
933
|
+
|
892
934
|
end
|
893
|
-
|
935
|
+
|
894
936
|
describe 'pagination' do
|
895
937
|
describe 'first_paged_feed.atom' do
|
896
938
|
before(:all) do
|
897
939
|
@feed = Atom::Feed.load_feed(File.open('spec/paging/first_paged_feed.atom'))
|
898
940
|
end
|
899
|
-
|
941
|
+
|
900
942
|
it "should be first?" do
|
901
943
|
@feed.should be_first
|
902
944
|
end
|
903
|
-
|
945
|
+
|
904
946
|
it "should not be last?" do
|
905
947
|
@feed.should_not be_last
|
906
948
|
end
|
907
|
-
|
949
|
+
|
908
950
|
it "should have next" do
|
909
951
|
@feed.next_page.href.should == 'http://example.org/index.atom?page=2'
|
910
952
|
end
|
911
|
-
|
953
|
+
|
912
954
|
it "should not have prev" do
|
913
955
|
@feed.prev_page.should be_nil
|
914
956
|
end
|
915
|
-
|
957
|
+
|
916
958
|
it "should have last" do
|
917
959
|
@feed.last_page.href.should == 'http://example.org/index.atom?page=10'
|
918
960
|
end
|
919
|
-
|
961
|
+
|
920
962
|
it "should have first" do
|
921
963
|
@feed.first_page.href.should == 'http://example.org/index.atom'
|
922
964
|
end
|
923
965
|
end
|
924
|
-
|
966
|
+
|
925
967
|
describe 'middle_paged_feed.atom' do
|
926
968
|
before(:all) do
|
927
969
|
@feed = Atom::Feed.load_feed(File.open('spec/paging/middle_paged_feed.atom'))
|
928
970
|
end
|
929
|
-
|
971
|
+
|
930
972
|
it "should not be last?" do
|
931
973
|
@feed.should_not be_last
|
932
974
|
end
|
933
|
-
|
975
|
+
|
934
976
|
it "should not be first?" do
|
935
977
|
@feed.should_not be_first
|
936
978
|
end
|
937
|
-
|
979
|
+
|
938
980
|
it "should have next_page" do
|
939
981
|
@feed.next_page.href.should == 'http://example.org/index.atom?page=4'
|
940
982
|
end
|
941
|
-
|
983
|
+
|
942
984
|
it "should have prev_page" do
|
943
985
|
@feed.prev_page.href.should == 'http://example.org/index.atom?page=2'
|
944
986
|
end
|
945
|
-
|
987
|
+
|
946
988
|
it "should have last_page" do
|
947
989
|
@feed.last_page.href.should == 'http://example.org/index.atom?page=10'
|
948
990
|
end
|
949
|
-
|
991
|
+
|
950
992
|
it "should have first_page" do
|
951
993
|
@feed.first_page.href.should == 'http://example.org/index.atom'
|
952
994
|
end
|
953
995
|
end
|
954
|
-
|
996
|
+
|
955
997
|
describe 'last_paged_feed.atom' do
|
956
998
|
before(:all) do
|
957
999
|
@feed = Atom::Feed.load_feed(File.open('spec/paging/last_paged_feed.atom'))
|
958
1000
|
end
|
959
|
-
|
1001
|
+
|
960
1002
|
it "should not be first?" do
|
961
1003
|
@feed.should_not be_first
|
962
1004
|
end
|
963
|
-
|
1005
|
+
|
964
1006
|
it "should be last?" do
|
965
1007
|
@feed.should be_last
|
966
1008
|
end
|
967
|
-
|
1009
|
+
|
968
1010
|
it "should have prev_page" do
|
969
1011
|
@feed.prev_page.href.should == 'http://example.org/index.atom?page=9'
|
970
1012
|
end
|
971
|
-
|
1013
|
+
|
972
1014
|
it "should not have next_page" do
|
973
1015
|
@feed.next_page.should be_nil
|
974
1016
|
end
|
975
|
-
|
1017
|
+
|
976
1018
|
it "should have first_page" do
|
977
1019
|
@feed.first_page.href.should == 'http://example.org/index.atom'
|
978
1020
|
end
|
979
|
-
|
1021
|
+
|
980
1022
|
it "should have last_page" do
|
981
1023
|
@feed.last_page.href.should == 'http://example.org/index.atom?page=10'
|
982
1024
|
end
|
983
1025
|
end
|
984
|
-
|
1026
|
+
|
985
1027
|
describe 'pagination using each_entry' do
|
986
1028
|
before(:each) do
|
987
1029
|
@feed = Atom::Feed.load_feed(File.open('spec/paging/first_paged_feed.atom'))
|
988
1030
|
end
|
989
|
-
|
1031
|
+
|
990
1032
|
it "should paginate through each entry" do
|
991
1033
|
feed1 = Atom::Feed.load_feed(File.read('spec/paging/middle_paged_feed.atom'))
|
992
1034
|
feed2 = Atom::Feed.load_feed(File.read('spec/paging/last_paged_feed.atom'))
|
993
|
-
|
1035
|
+
|
994
1036
|
Atom::Feed.should_receive(:load_feed).
|
995
1037
|
with(URI.parse('http://example.org/index.atom?page=2'), an_instance_of(Hash)).
|
996
1038
|
and_return(feed1)
|
997
1039
|
Atom::Feed.should_receive(:load_feed).
|
998
1040
|
with(URI.parse('http://example.org/index.atom?page=4'), an_instance_of(Hash)).
|
999
1041
|
and_return(feed2)
|
1000
|
-
|
1042
|
+
|
1001
1043
|
entry_count = 0
|
1002
1044
|
@feed.each_entry(:paginate => true) do |entry|
|
1003
1045
|
entry_count += 1
|
1004
1046
|
end
|
1005
|
-
|
1047
|
+
|
1006
1048
|
entry_count.should == 3
|
1007
1049
|
end
|
1008
|
-
|
1050
|
+
|
1009
1051
|
it "should not paginate through each entry when paginate not true" do
|
1010
1052
|
entry_count = 0
|
1011
1053
|
@feed.each_entry do |entry|
|
1012
1054
|
entry_count += 1
|
1013
1055
|
end
|
1014
|
-
|
1056
|
+
|
1015
1057
|
entry_count.should == 1
|
1016
1058
|
end
|
1017
|
-
|
1059
|
+
|
1018
1060
|
it "should only paginate up to since" do
|
1019
1061
|
response1 = Net::HTTPSuccess.new(nil, nil, nil)
|
1020
1062
|
response1.stub!(:body).and_return(File.read('spec/paging/middle_paged_feed.atom'))
|
1021
1063
|
mock_http_get(URI.parse('http://example.org/index.atom?page=2'), response1)
|
1022
|
-
|
1064
|
+
|
1023
1065
|
entry_count = 0
|
1024
1066
|
@feed.each_entry(:paginate => true, :since => Time.parse('2003-11-19T18:30:02Z')) do |entry|
|
1025
1067
|
entry_count += 1
|
@@ -1028,51 +1070,51 @@ describe Atom do
|
|
1028
1070
|
entry_count.should == 1
|
1029
1071
|
end
|
1030
1072
|
end
|
1031
|
-
|
1073
|
+
|
1032
1074
|
describe "entry_with_simple_extensions.atom" do
|
1033
1075
|
before(:each) do
|
1034
1076
|
@feed = Atom::Feed.load_feed(File.open('spec/fixtures/entry_with_simple_extensions.atom'))
|
1035
1077
|
@entry = @feed.entries.first
|
1036
1078
|
end
|
1037
|
-
|
1079
|
+
|
1038
1080
|
it "should load simple extension for feed" do
|
1039
1081
|
@feed["http://example.org/example", 'simple1'].should == ['Simple1 Value']
|
1040
1082
|
end
|
1041
|
-
|
1083
|
+
|
1042
1084
|
it "should load empty simple extension for feed" do
|
1043
1085
|
@feed["http://example.org/example", 'simple-empty'].should == ['']
|
1044
1086
|
end
|
1045
|
-
|
1087
|
+
|
1046
1088
|
it "should load simple extension 1 for entry" do
|
1047
1089
|
@entry["http://example.org/example", 'simple1'].should == ['Simple1 Entry Value']
|
1048
1090
|
end
|
1049
|
-
|
1050
|
-
it "should load simple extension 2 for entry" do
|
1091
|
+
|
1092
|
+
it "should load simple extension 2 for entry" do
|
1051
1093
|
@entry["http://example.org/example", 'simple2'].should == ['Simple2', 'Simple2a']
|
1052
1094
|
end
|
1053
|
-
|
1095
|
+
|
1054
1096
|
it "should find a simple extension in another namespace" do
|
1055
1097
|
@entry["http://example2.org/example2", 'simple1'].should == ['Simple Entry Value (NS2)']
|
1056
1098
|
end
|
1057
|
-
|
1099
|
+
|
1058
1100
|
it "should load simple extension attribute on a category" do
|
1059
1101
|
@entry.categories.first["http://example.org/example", "attribute"].first.should == "extension"
|
1060
1102
|
end
|
1061
|
-
|
1103
|
+
|
1062
1104
|
it "should write a simple extension attribute as an attribute" do
|
1063
1105
|
@entry.categories.first.to_xml(true)['ns1:attribute'].should == 'extension'
|
1064
1106
|
end
|
1065
|
-
|
1107
|
+
|
1066
1108
|
it "should read an extension with the same local name as an Atom element" do
|
1067
1109
|
@feed['http://example.org/example', 'title'].should == ['Extension Title']
|
1068
1110
|
end
|
1069
|
-
|
1111
|
+
|
1070
1112
|
it "should find simple extension with dashes in the name" do
|
1071
1113
|
@entry["http://example.org/example", 'simple-with-dash'].should == ['Simple with dash Value']
|
1072
1114
|
end
|
1073
|
-
|
1115
|
+
|
1074
1116
|
it_should_behave_like 'simple_single_entry.atom attributes'
|
1075
|
-
|
1117
|
+
|
1076
1118
|
it "should load simple extension 3 xml for entry" do
|
1077
1119
|
@entry["http://example.org/example3", 'simple3'].should == ['<ContinuityOfCareRecord xmlns="urn:astm-org:CCR">Simple Entry Value (NS2)</ContinuityOfCareRecord>']
|
1078
1120
|
end
|
@@ -1101,7 +1143,7 @@ describe Atom do
|
|
1101
1143
|
end
|
1102
1144
|
end
|
1103
1145
|
end
|
1104
|
-
|
1146
|
+
|
1105
1147
|
describe 'writing simple extensions' do
|
1106
1148
|
it "should recode and re-read a simple extension element" do
|
1107
1149
|
entry = Atom::Entry.new do |entry|
|
@@ -1110,13 +1152,13 @@ describe Atom do
|
|
1110
1152
|
entry.updated = Time.now
|
1111
1153
|
entry['http://example.org', 'title'] << 'Example title'
|
1112
1154
|
end
|
1113
|
-
|
1155
|
+
|
1114
1156
|
entry2 = Atom::Entry.load_entry(entry.to_xml)
|
1115
1157
|
entry2['http://example.org', 'title'].should == ['Example title']
|
1116
1158
|
end
|
1117
1159
|
end
|
1118
1160
|
end
|
1119
|
-
|
1161
|
+
|
1120
1162
|
describe 'custom_extensions' do
|
1121
1163
|
before(:all) do
|
1122
1164
|
Atom::Entry.add_extension_namespace :ns_alias, "http://custom.namespace"
|
@@ -1124,20 +1166,31 @@ describe Atom do
|
|
1124
1166
|
Atom::Entry.elements "ns_alias:property-with-dash", :class => Atom::Extensions::Property
|
1125
1167
|
@entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry_with_custom_extensions.atom'))
|
1126
1168
|
end
|
1127
|
-
|
1169
|
+
|
1128
1170
|
it "should_load_custom_extensions_for_entry" do
|
1129
1171
|
@entry.ns_alias_property.should_not == []
|
1130
1172
|
end
|
1131
|
-
|
1173
|
+
|
1132
1174
|
it "should_load_2_custom_extensions_for_entry" do
|
1133
1175
|
@entry.ns_alias_property.size.should == 2
|
1134
1176
|
end
|
1135
|
-
|
1177
|
+
|
1136
1178
|
it "should load correct_data_for_custom_extensions_for_entry" do
|
1137
1179
|
@entry.ns_alias_property.map { |x| [x.name, x.value] }.should == [['foo', 'bar'], ['baz', 'bat']]
|
1138
1180
|
end
|
1139
1181
|
end
|
1140
|
-
|
1182
|
+
|
1183
|
+
describe 'custom content type extensions' do
|
1184
|
+
before(:all) do
|
1185
|
+
Atom::Content::PARSERS['custom-content-type/xml'] = Atom::Content::Xhtml
|
1186
|
+
@entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry_with_custom_content_type.atom'))
|
1187
|
+
end
|
1188
|
+
|
1189
|
+
it "should parse content by specified content parser" do
|
1190
|
+
@entry.content.should == '<changes xmlns="http://www.xxx.com/app"/>'
|
1191
|
+
end
|
1192
|
+
end
|
1193
|
+
|
1141
1194
|
describe 'single custom_extensions' do
|
1142
1195
|
before(:all) do
|
1143
1196
|
Atom::Entry.add_extension_namespace :custom, "http://single.custom.namespace"
|
@@ -1178,13 +1231,13 @@ describe Atom do
|
|
1178
1231
|
before(:each) do
|
1179
1232
|
@href = 'http://example.org/next'
|
1180
1233
|
@link = Atom::Link.new(:rel => 'next', :href => @href)
|
1181
|
-
end
|
1182
|
-
|
1234
|
+
end
|
1235
|
+
|
1183
1236
|
it "should fetch feed for fetch_next" do
|
1184
1237
|
Atom::Feed.should_receive(:load_feed).with(URI.parse(@href), an_instance_of(Hash))
|
1185
1238
|
@link.fetch
|
1186
1239
|
end
|
1187
|
-
|
1240
|
+
|
1188
1241
|
it "should fetch content when response is not xml" do
|
1189
1242
|
Atom::Feed.should_receive(:load_feed).and_raise(Atom::LoadError)
|
1190
1243
|
response = Net::HTTPSuccess.new(nil, nil, nil)
|
@@ -1193,39 +1246,39 @@ describe Atom do
|
|
1193
1246
|
@link.fetch.should == 'some text.'
|
1194
1247
|
end
|
1195
1248
|
end
|
1196
|
-
|
1249
|
+
|
1197
1250
|
describe Atom::Entry do
|
1198
1251
|
before(:all) do
|
1199
1252
|
@entry = Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom'))
|
1200
1253
|
end
|
1201
|
-
|
1254
|
+
|
1202
1255
|
it "should be == to itself" do
|
1203
1256
|
@entry.should == Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom'))
|
1204
1257
|
end
|
1205
|
-
|
1258
|
+
|
1206
1259
|
it "should be != if something changes" do
|
1207
1260
|
@other = Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom'))
|
1208
1261
|
@other.title = 'foo'
|
1209
1262
|
@entry.should_not == @other
|
1210
1263
|
end
|
1211
|
-
|
1264
|
+
|
1212
1265
|
it "should be != if content changes" do
|
1213
1266
|
@other = Atom::Entry.load_entry(File.read('spec/fixtures/entry.atom'))
|
1214
1267
|
@other.content.type = 'html'
|
1215
1268
|
@entry.should_not == @other
|
1216
1269
|
end
|
1217
|
-
|
1270
|
+
|
1218
1271
|
it "should output itself" do
|
1219
1272
|
other = Atom::Entry.load_entry(@entry.to_xml)
|
1220
1273
|
@entry.should == other
|
1221
1274
|
end
|
1222
|
-
|
1275
|
+
|
1223
1276
|
it "should properly escape titles" do
|
1224
1277
|
@entry.title = "Breaking Space"
|
1225
1278
|
other = Atom::Entry.load_entry(@entry.to_xml)
|
1226
1279
|
@entry.should == other
|
1227
1280
|
end
|
1228
|
-
|
1281
|
+
|
1229
1282
|
it "should raise error when to_xml'ing non-utf8 content" do
|
1230
1283
|
lambda {
|
1231
1284
|
puts(Atom::Entry.new do |entry|
|
@@ -1246,12 +1299,12 @@ describe Atom do
|
|
1246
1299
|
xml.should match(/Žižek/)
|
1247
1300
|
end
|
1248
1301
|
end
|
1249
|
-
|
1302
|
+
|
1250
1303
|
describe 'Atom::Feed initializer' do
|
1251
1304
|
it "should create an empty Feed" do
|
1252
1305
|
lambda { Atom::Feed.new }.should_not raise_error
|
1253
1306
|
end
|
1254
|
-
|
1307
|
+
|
1255
1308
|
it "should yield to a block" do
|
1256
1309
|
lambda do
|
1257
1310
|
Atom::Feed.new do |f|
|
@@ -1261,12 +1314,12 @@ describe Atom do
|
|
1261
1314
|
end.should throw_symbol(:yielded)
|
1262
1315
|
end
|
1263
1316
|
end
|
1264
|
-
|
1317
|
+
|
1265
1318
|
describe 'Atom::Entry initializer' do
|
1266
1319
|
it "should create an empty feed" do
|
1267
1320
|
lambda { Atom::Entry.new }.should_not raise_error
|
1268
1321
|
end
|
1269
|
-
|
1322
|
+
|
1270
1323
|
it "should yield to a block" do
|
1271
1324
|
lambda do
|
1272
1325
|
Atom::Entry.new do |f|
|
@@ -1276,13 +1329,13 @@ describe Atom do
|
|
1276
1329
|
end.should throw_symbol(:yielded)
|
1277
1330
|
end
|
1278
1331
|
end
|
1279
|
-
|
1332
|
+
|
1280
1333
|
describe Atom::Content::Html do
|
1281
1334
|
it "should escape ampersands in entities" do
|
1282
1335
|
Atom::Content::Html.new(" ").to_xml.to_s.should == "<content type=\"html\">&nbsp;</content>"
|
1283
1336
|
end
|
1284
1337
|
end
|
1285
|
-
|
1338
|
+
|
1286
1339
|
describe Atom::Content::Text do
|
1287
1340
|
it "should be createable from a string" do
|
1288
1341
|
txt = Atom::Content::Text.new("This is some text")
|
@@ -1290,20 +1343,20 @@ describe Atom do
|
|
1290
1343
|
txt.type.should == "text"
|
1291
1344
|
end
|
1292
1345
|
end
|
1293
|
-
|
1346
|
+
|
1294
1347
|
describe Atom::Content::Xhtml do
|
1295
1348
|
it "should be createable from a string" do
|
1296
1349
|
txt = Atom::Content::Xhtml.new("<p>This is some text</p>")
|
1297
1350
|
txt.should == "<p>This is some text</p>"
|
1298
1351
|
txt.type.should == "xhtml"
|
1299
1352
|
end
|
1300
|
-
|
1353
|
+
|
1301
1354
|
it "should be renderable to xml" do
|
1302
1355
|
txt = Atom::Content::Xhtml.new("<p>This is some text</p>")
|
1303
1356
|
txt.to_xml.should_not raise_error("TypeError")
|
1304
1357
|
end
|
1305
1358
|
end
|
1306
|
-
|
1359
|
+
|
1307
1360
|
describe Atom::Content::External do
|
1308
1361
|
before(:each) do
|
1309
1362
|
feed = nil
|
@@ -1325,39 +1378,39 @@ describe Atom do
|
|
1325
1378
|
xml['src'].should == 'http://example.org/pdfs/robots-run-amok.pdf'
|
1326
1379
|
end
|
1327
1380
|
end
|
1328
|
-
|
1381
|
+
|
1329
1382
|
describe 'Atom::Category initializer' do
|
1330
1383
|
it "should create a empty category" do
|
1331
1384
|
lambda { Atom::Category.new }.should_not raise_error
|
1332
1385
|
end
|
1333
|
-
|
1386
|
+
|
1334
1387
|
it "should create from a hash" do
|
1335
1388
|
category = Atom::Category.new(:term => 'term', :scheme => 'scheme', :label => 'label')
|
1336
1389
|
category.term.should == 'term'
|
1337
1390
|
category.scheme.should == 'scheme'
|
1338
1391
|
category.label.should == 'label'
|
1339
1392
|
end
|
1340
|
-
|
1393
|
+
|
1341
1394
|
it "should create from a block" do
|
1342
1395
|
category = Atom::Category.new do |cat|
|
1343
1396
|
cat.term = 'term'
|
1344
1397
|
end
|
1345
|
-
|
1398
|
+
|
1346
1399
|
category.term.should == 'term'
|
1347
1400
|
end
|
1348
1401
|
end
|
1349
|
-
|
1402
|
+
|
1350
1403
|
describe Atom::Source do
|
1351
1404
|
it "should create an empty source" do
|
1352
1405
|
lambda { Atom::Source.new }.should_not raise_error
|
1353
1406
|
end
|
1354
|
-
|
1407
|
+
|
1355
1408
|
it "should create from a hash" do
|
1356
1409
|
source = Atom::Source.new(:title => 'title', :id => 'sourceid')
|
1357
1410
|
source.title.should == 'title'
|
1358
1411
|
source.id.should == 'sourceid'
|
1359
1412
|
end
|
1360
|
-
|
1413
|
+
|
1361
1414
|
it "should create from a block" do
|
1362
1415
|
source = Atom::Source.new do |source|
|
1363
1416
|
source.title = 'title'
|
@@ -1365,20 +1418,20 @@ describe Atom do
|
|
1365
1418
|
end
|
1366
1419
|
source.title.should == 'title'
|
1367
1420
|
source.id.should == 'sourceid'
|
1368
|
-
end
|
1421
|
+
end
|
1369
1422
|
end
|
1370
|
-
|
1423
|
+
|
1371
1424
|
describe Atom::Generator do
|
1372
1425
|
it "should create an empty generator" do
|
1373
1426
|
lambda { Atom::Generator.new }.should_not raise_error
|
1374
1427
|
end
|
1375
|
-
|
1428
|
+
|
1376
1429
|
it "should create from a hash" do
|
1377
1430
|
generator = Atom::Generator.new(:name => 'generator', :uri => 'http://generator')
|
1378
1431
|
generator.name.should == 'generator'
|
1379
1432
|
generator.uri.should == 'http://generator'
|
1380
1433
|
end
|
1381
|
-
|
1434
|
+
|
1382
1435
|
it "should create from a block" do
|
1383
1436
|
generator = Atom::Generator.new do |generator|
|
1384
1437
|
generator.name = 'generator'
|
@@ -1387,10 +1440,10 @@ describe Atom do
|
|
1387
1440
|
generator.name.should == 'generator'
|
1388
1441
|
generator.uri.should == 'http://generator'
|
1389
1442
|
end
|
1390
|
-
|
1443
|
+
|
1391
1444
|
it "should output the name as the text of the generator element" do
|
1392
1445
|
generator = Atom::Generator.new({:name => "My Generator"})
|
1393
|
-
generator.to_xml(true).to_s.should == "<generator>My Generator</generator>"
|
1446
|
+
generator.to_xml(true).to_s.should == "<generator>My Generator</generator>"
|
1394
1447
|
end
|
1395
1448
|
end
|
1396
1449
|
end
|