atomutil 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +28 -0
- data/LICENSE.txt +20 -0
- data/License.txt +1 -1
- data/README.rdoc +19 -0
- data/Rakefile +50 -4
- data/VERSION +1 -0
- data/atomutil.gemspec +84 -0
- data/lib/atomutil.rb +7 -4
- data/spec/spec_helper.rb +11 -7
- metadata +107 -46
- data/History.txt +0 -48
- data/Manifest.txt +0 -35
- data/README.txt +0 -635
- data/config/hoe.rb +0 -71
- data/config/requirements.rb +0 -17
- data/log/debug.log +0 -0
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/script/txt2html +0 -74
- data/setup.rb +0 -1585
- data/tasks/deployment.rake +0 -34
- data/tasks/environment.rake +0 -7
- data/tasks/rspec.rake +0 -21
- data/tasks/website.rake +0 -17
- data/website/index.html +0 -63
- data/website/index.txt +0 -39
- data/website/javascripts/rounded_corners_lite.inc.js +0 -285
- data/website/stylesheets/screen.css +0 -138
- data/website/template.rhtml +0 -48
data/README.txt
DELETED
@@ -1,635 +0,0 @@
|
|
1
|
-
= Utilities for AtomPub / Atom Syndication Format
|
2
|
-
|
3
|
-
This library allows you to handle AtomPub and Atom Syndication Format easily.
|
4
|
-
Most of the idea is from great Perl modules on CPAN.
|
5
|
-
|
6
|
-
= INSTALLATION
|
7
|
-
|
8
|
-
sudo gem install atomutil
|
9
|
-
|
10
|
-
= SYNOPSIS
|
11
|
-
|
12
|
-
== Building or parsing XML with Atom Syndication Format
|
13
|
-
|
14
|
-
=== How To Construct Each Atom Element
|
15
|
-
|
16
|
-
Create new object and setup with each accessor.
|
17
|
-
|
18
|
-
entry = Atom::Entry.new
|
19
|
-
|
20
|
-
entry.title = 'Title!'
|
21
|
-
entry.summary = 'Summary!'
|
22
|
-
entry.published = Time.now
|
23
|
-
|
24
|
-
Or you can do that at once with passing hash parameter to constructor
|
25
|
-
|
26
|
-
entry = Atom::Entry.new(
|
27
|
-
:title => 'Title!',
|
28
|
-
:summary => 'Summary',
|
29
|
-
:published => Time.now
|
30
|
-
)
|
31
|
-
|
32
|
-
And you also can setup new element within a block if you pass one.
|
33
|
-
|
34
|
-
entry = Atom::Entry.new(:title => 'New Entry') do |e|
|
35
|
-
e.summary = 'New Summary'
|
36
|
-
author = Atom::Author.new :name => 'John'
|
37
|
-
e.author = author
|
38
|
-
e.published = Time.now
|
39
|
-
end
|
40
|
-
|
41
|
-
And finally you can get xml-document from them.
|
42
|
-
|
43
|
-
xml_string = entry.to_s
|
44
|
-
|
45
|
-
If you pass false to to_s, it returns non-indented string
|
46
|
-
|
47
|
-
xml_string = entry.to_s(false)
|
48
|
-
|
49
|
-
=== How To Parse Each Atom XML Document
|
50
|
-
|
51
|
-
xml_string = <<-EOS
|
52
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
53
|
-
<entry xmlns="http://www.w3.org/2005/Atom">
|
54
|
-
<id>tag:example.org,2007-12-01:mybook</id>
|
55
|
-
<title>Title</title>
|
56
|
-
<summary>Summary</summary>
|
57
|
-
<author><name>John</name></author>
|
58
|
-
</entry>
|
59
|
-
EOS
|
60
|
-
|
61
|
-
Pass the xml-string to proper Atom Element Class with :stream key
|
62
|
-
|
63
|
-
entry = Atom::Entry.new :stream => xml_string
|
64
|
-
puts entry.title # Book
|
65
|
-
puts entry.summary # Summary
|
66
|
-
puts entry.author.name # John
|
67
|
-
|
68
|
-
Atom::Feed and Atom::Entry can be build from files
|
69
|
-
|
70
|
-
entry = Atom::Feed.new :file => 'my_feed.atom'
|
71
|
-
|
72
|
-
or from uri
|
73
|
-
|
74
|
-
entry = Atom::Feed.new :uri => 'http://example.com/feed.atom'
|
75
|
-
|
76
|
-
== How To Handle other Namespace
|
77
|
-
|
78
|
-
There are times when you want to extend your atom element
|
79
|
-
with other namespaces.
|
80
|
-
For example, in case you want to deal pagination with OpenSearch
|
81
|
-
|
82
|
-
xmlstring = <<-EOS
|
83
|
-
<feed xmlns="http://www.w3.org/2005/Atom"
|
84
|
-
xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">
|
85
|
-
<openSearch:totalResult>153</openSearch:totalResult>
|
86
|
-
<openSearch:startIndex>40</openSearch:startIndex>
|
87
|
-
<openSearch:itemsPerPage>20</openSearch:itemsPerPage>
|
88
|
-
...
|
89
|
-
</feed>
|
90
|
-
EOS
|
91
|
-
|
92
|
-
How to get these values?
|
93
|
-
The answer is using 'get' method.
|
94
|
-
And then, just a reminder, you have to prepare Atom::Namespace object.
|
95
|
-
Pass the object and element name to the method.
|
96
|
-
And it returns REXML::Element object.
|
97
|
-
|
98
|
-
feed = Atom::Feed.new :stream => xmlstring
|
99
|
-
open_search_ns = Atom::Namespace.new(
|
100
|
-
:prefix => 'openSearch',
|
101
|
-
:uri => 'http://a9.com/-/spec/opensearchrss/1.1/')
|
102
|
-
|
103
|
-
total = feed.get(open_search_ns, 'totalResult').text.to_i
|
104
|
-
start = feed.get(open_search_ns, 'startIndex').text.to_i
|
105
|
-
per_page = feed.get(open_search_ns, 'itemsPerPage').text.to_i
|
106
|
-
|
107
|
-
And of cource, you also can 'set'
|
108
|
-
|
109
|
-
feed = Atom::Feed.new
|
110
|
-
feed.title = 'my new feed'
|
111
|
-
feed.set(open_search_ns, 'totalResult', 153)
|
112
|
-
feed.set(open_search_ns, 'startIndex', 40)
|
113
|
-
feed.set(open_search_ns, 'itemsPerPage', 20)
|
114
|
-
|
115
|
-
In this example, I take the 'openSearch' for pagination, but it's already implemented with
|
116
|
-
useful methods.
|
117
|
-
|
118
|
-
feed = Atom::Feed.new
|
119
|
-
feed.total_results = 35
|
120
|
-
feed.start_index = 1
|
121
|
-
feed.items_per_page = 20
|
122
|
-
|
123
|
-
puts feed.total_results
|
124
|
-
puts feed.start_index
|
125
|
-
puts feed.items_per_page
|
126
|
-
|
127
|
-
=== Build a Service Document
|
128
|
-
|
129
|
-
Create root service element
|
130
|
-
|
131
|
-
service = Atom::Service.new
|
132
|
-
|
133
|
-
Create workspace element which the service appends.
|
134
|
-
|
135
|
-
blog_workspace = Atom::Workspace.new
|
136
|
-
blog_workspace.title = 'My Blog'
|
137
|
-
|
138
|
-
collection = Atom::Collection.new
|
139
|
-
collection.href = 'http://blog.example.org/feed'
|
140
|
-
collection.title = 'Sample Blog'
|
141
|
-
|
142
|
-
Create categories that your collection handles
|
143
|
-
|
144
|
-
cats = Atom::Categories.new
|
145
|
-
cats.fixed = 'no'
|
146
|
-
|
147
|
-
You can set each concrete categories here
|
148
|
-
|
149
|
-
category1 = Atom::Category.new
|
150
|
-
category1.term = 'technology'
|
151
|
-
category2 = Atom::Category.new
|
152
|
-
category2.term = 'music'
|
153
|
-
category3 = Atom::Category.new
|
154
|
-
category3.term = 'sport'
|
155
|
-
cats.add_category category1
|
156
|
-
cats.add_category category2
|
157
|
-
cats.add_category category3
|
158
|
-
|
159
|
-
Or set only href parameter that represents uri for Categories Document,
|
160
|
-
Instead of setting each categories here.
|
161
|
-
Then you should provides Categories Document at indicated uri.
|
162
|
-
|
163
|
-
cats.href = 'http://blog.example.org/categories'
|
164
|
-
|
165
|
-
collection.add_categories cats
|
166
|
-
blog_workspace.add_collection collection
|
167
|
-
service.add_workspace blog_workspace
|
168
|
-
service_document_xml_string = service.to_s
|
169
|
-
|
170
|
-
=== Build a Categories Document
|
171
|
-
|
172
|
-
cats = Atom::Categories.new
|
173
|
-
category1 = Atom::Category.new
|
174
|
-
category1.term = 'technology'
|
175
|
-
category2 = Atom::Category.new
|
176
|
-
category2.term = 'music'
|
177
|
-
category3 = Atom::Category.new
|
178
|
-
category3.term = 'sport'
|
179
|
-
cats.add_category category1
|
180
|
-
cats.add_category category2
|
181
|
-
cats.add_category category3
|
182
|
-
|
183
|
-
categories_xml_string = cats.to_s
|
184
|
-
|
185
|
-
=== Build an Entry
|
186
|
-
|
187
|
-
entry = Atom::Entry.new
|
188
|
-
|
189
|
-
* id
|
190
|
-
* title
|
191
|
-
* summary
|
192
|
-
* rights
|
193
|
-
* source
|
194
|
-
|
195
|
-
Simple text accessors
|
196
|
-
|
197
|
-
entry.id = 'tag:example.org,2007:example'
|
198
|
-
entry.title = 'My First Blog Post'
|
199
|
-
entry.summary = 'This is summary'
|
200
|
-
entry.rights = 'Copyright(c) 2007 Lyo Kato all rights reserved.'
|
201
|
-
|
202
|
-
* published
|
203
|
-
* updated
|
204
|
-
|
205
|
-
You can set them with Time class
|
206
|
-
|
207
|
-
entry.published = Time.now
|
208
|
-
entry.updated = Time.now
|
209
|
-
|
210
|
-
Or you can set with W3CDTF formatted string
|
211
|
-
|
212
|
-
entry.published = "2007-12-01T01:30:00Z"
|
213
|
-
|
214
|
-
And pick it up as Time object
|
215
|
-
|
216
|
-
published = entry.published
|
217
|
-
puts published.year
|
218
|
-
puts published.month
|
219
|
-
|
220
|
-
* author
|
221
|
-
* contributor
|
222
|
-
|
223
|
-
Set person construct with Atom::Person
|
224
|
-
|
225
|
-
person = Atom::Person.new
|
226
|
-
person.name = 'Lyo Kato'
|
227
|
-
person.email = 'lyo.kato atmark gmail.com'
|
228
|
-
person.uri = 'http://www.lyokato.net/'
|
229
|
-
|
230
|
-
entry.author = person.to_author
|
231
|
-
entry.contributor = person.to_contributor
|
232
|
-
|
233
|
-
Or Atom::Author, Atom::Contributor directly
|
234
|
-
|
235
|
-
cont = Atom::Contributor.new
|
236
|
-
cont.name = 'Lyo'
|
237
|
-
cont.email = 'lyo.kato atmark gmail.com'
|
238
|
-
entry.contributor = cont
|
239
|
-
|
240
|
-
To set multiple data
|
241
|
-
|
242
|
-
entry.add_author author1
|
243
|
-
entry.add_author author2
|
244
|
-
entry.add_contributor contributor1
|
245
|
-
entry.add_contributor contributor2
|
246
|
-
|
247
|
-
Get all authors and contributors
|
248
|
-
|
249
|
-
authors = entry.authors
|
250
|
-
contributors = entry.contributors
|
251
|
-
|
252
|
-
Get only first author and contributor
|
253
|
-
|
254
|
-
author = entry.author
|
255
|
-
contributor = entry.contributor
|
256
|
-
|
257
|
-
* link
|
258
|
-
|
259
|
-
Link Element Accessor
|
260
|
-
|
261
|
-
link = Atom::Link.new
|
262
|
-
link.href = 'http://example.org/entry/1'
|
263
|
-
link.rel = 'alternate'
|
264
|
-
link.type = 'text/html'
|
265
|
-
link.hreflang = 'fr'
|
266
|
-
link.length = '512'
|
267
|
-
link.title = 'My Blog Post'
|
268
|
-
entry.link = link
|
269
|
-
|
270
|
-
You can set multiple links
|
271
|
-
|
272
|
-
entry.add_link link1
|
273
|
-
entry.add_link link2
|
274
|
-
|
275
|
-
To get all links as an Array
|
276
|
-
|
277
|
-
links = entry.links
|
278
|
-
|
279
|
-
To get first one
|
280
|
-
|
281
|
-
link = entry.link
|
282
|
-
puts link.href
|
283
|
-
puts link.rel
|
284
|
-
|
285
|
-
Further more, useful methods are implemented for major 'rel' types.
|
286
|
-
|
287
|
-
entry.alternate_link = 'http://example.org/entry/1'
|
288
|
-
|
289
|
-
This is same as
|
290
|
-
|
291
|
-
link = Atom::Link.new
|
292
|
-
link.rel = 'alternate'
|
293
|
-
link.href = 'http://example.org/entry/1'
|
294
|
-
entry.add_link link
|
295
|
-
|
296
|
-
And
|
297
|
-
|
298
|
-
puts entry.alternate_link # http://example.org/entry1
|
299
|
-
|
300
|
-
This is same as
|
301
|
-
|
302
|
-
links = entry.links
|
303
|
-
alternate_link = links.select{ |l| l.rel == 'alternate' }.first
|
304
|
-
puts alternate_link.href
|
305
|
-
|
306
|
-
If it contains multiple 'alternate' links, to get all of them,
|
307
|
-
|
308
|
-
alternate_links = links.alternate_links
|
309
|
-
|
310
|
-
Like this, you can use following methods for each links
|
311
|
-
|
312
|
-
entry.self_link:: <link rel='self' href='...'/>
|
313
|
-
entry.edit_link:: <link rel='edit' href='...'/>
|
314
|
-
entry.edit_media_link:: <link rel='edit-media' href='...'/>
|
315
|
-
entry.enclosure_link:: <link rel='enclosure' href='...'/>
|
316
|
-
entry.related_link:: <link rel='related' href='...' />
|
317
|
-
entry.via_link:: <link rel='via' href='...' />
|
318
|
-
entry.first_link:: <link rel='first' href='...'/>
|
319
|
-
entry.previous_link:: <link rel='previous' href='...'/>
|
320
|
-
entry.next_link:: <link rel='next' href='...' />
|
321
|
-
entry.last_link:: <link rel='last' href='...' />
|
322
|
-
|
323
|
-
* category
|
324
|
-
|
325
|
-
Category Element Accessor
|
326
|
-
|
327
|
-
category = Atom::Category.new
|
328
|
-
category.term = 'music'
|
329
|
-
category.scheme = 'http://example.org/category/music'
|
330
|
-
category.label = 'My Music'
|
331
|
-
entry.category = category
|
332
|
-
|
333
|
-
You can set multiple categories
|
334
|
-
|
335
|
-
entry.add_category cat1
|
336
|
-
entry.add_category cat2
|
337
|
-
|
338
|
-
To get all categories as an Array
|
339
|
-
|
340
|
-
categories = entry.categories
|
341
|
-
|
342
|
-
To get first one
|
343
|
-
|
344
|
-
first_category = entry.category
|
345
|
-
puts first_category.term
|
346
|
-
puts first_category.scheme
|
347
|
-
|
348
|
-
* content
|
349
|
-
|
350
|
-
You can push it as a text
|
351
|
-
|
352
|
-
entry.content = 'This is a content'
|
353
|
-
|
354
|
-
Or an Atom::Content object
|
355
|
-
|
356
|
-
content = Atom::Content.new :body => 'This is a content'
|
357
|
-
entry.content = content
|
358
|
-
|
359
|
-
To pick it up
|
360
|
-
|
361
|
-
content = entry.content
|
362
|
-
|
363
|
-
puts content.type
|
364
|
-
puts content.body
|
365
|
-
|
366
|
-
* control
|
367
|
-
|
368
|
-
Control Element Accessor
|
369
|
-
|
370
|
-
control = Atom::Control.new
|
371
|
-
control.draft = 'yes'
|
372
|
-
entry.control = control
|
373
|
-
|
374
|
-
Then entry includes
|
375
|
-
|
376
|
-
<app:control xmlns:app='http://www.w3.org/2007/app'>
|
377
|
-
<app:draft>yes</app:draft>
|
378
|
-
</app:control>
|
379
|
-
|
380
|
-
* edited
|
381
|
-
|
382
|
-
Represents what time this entry was edited.
|
383
|
-
|
384
|
-
entry.edited = Time.now
|
385
|
-
|
386
|
-
Then entry includes
|
387
|
-
|
388
|
-
<app:edited>2007-09-01T00:00:00Z</app:edited>
|
389
|
-
|
390
|
-
To pick it up
|
391
|
-
|
392
|
-
edited = entry.edited
|
393
|
-
puts edited.year
|
394
|
-
puts edited.month
|
395
|
-
|
396
|
-
You also can handle Atom-Threading
|
397
|
-
(http://tools.ietf.org/html/rfc4685)
|
398
|
-
|
399
|
-
target = Atom::ReplyTarget.new
|
400
|
-
target.id = 'tag:example.org,2007:12:example'
|
401
|
-
target.href = 'http://example.org/blog/2007/12/archive01'
|
402
|
-
target.type = 'text/xhtml'
|
403
|
-
|
404
|
-
entry.in_reply_to target
|
405
|
-
|
406
|
-
Or you can set the target direclty with hash
|
407
|
-
|
408
|
-
entry.in_reply_to(
|
409
|
-
:id => 'tag:example.org,2007:12:example',
|
410
|
-
:href => 'http://example.org/blog/2007/12/archive01',
|
411
|
-
:type => 'text/xhtml'
|
412
|
-
)
|
413
|
-
|
414
|
-
And then entry includes xml
|
415
|
-
|
416
|
-
<thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0'
|
417
|
-
ref='tag:example.org,2007:12:example'
|
418
|
-
href='http://example.org/blog/2007/12/archive01'
|
419
|
-
type='text/xhtml'/>
|
420
|
-
|
421
|
-
Pick it up from entry
|
422
|
-
|
423
|
-
target = entry.in_reply_to
|
424
|
-
puts target.id
|
425
|
-
puts target.href
|
426
|
-
puts target.type
|
427
|
-
|
428
|
-
Add a replies link
|
429
|
-
|
430
|
-
link = Atom::RepliesLink.new
|
431
|
-
link.href = 'http://example.org/entry/1/replies'
|
432
|
-
link.count = 10
|
433
|
-
link.updated = Time.now
|
434
|
-
|
435
|
-
entry.add_link link
|
436
|
-
|
437
|
-
Then entry includes
|
438
|
-
|
439
|
-
<link rel='replies' href='http://example.org/entry/1/replies'
|
440
|
-
thr:count='10' thr:updated='2007-01-01T00:00:00Z'>
|
441
|
-
|
442
|
-
Add total replies count
|
443
|
-
|
444
|
-
entry.total = 10
|
445
|
-
|
446
|
-
Then entry includes
|
447
|
-
|
448
|
-
<thr:total>10</thr:total>
|
449
|
-
|
450
|
-
=== Build a Feed
|
451
|
-
|
452
|
-
feed = Atom::Feed.new
|
453
|
-
|
454
|
-
* id
|
455
|
-
* title
|
456
|
-
* subtitle
|
457
|
-
* rights
|
458
|
-
* icon
|
459
|
-
* logo
|
460
|
-
* language
|
461
|
-
* version
|
462
|
-
|
463
|
-
Simple text accessors
|
464
|
-
|
465
|
-
feed.id = 'tag:example.org,2007:example'
|
466
|
-
feed.title = 'Example Feed'
|
467
|
-
feed.subtitle = 'Subtitle of Example Feed'
|
468
|
-
feed.rights = 'Copyright(c) 2007 example.org all rights reserved'
|
469
|
-
feed.icon = 'http://example.org/icon.png'
|
470
|
-
feed.logo = 'http://example.org/logo.png'
|
471
|
-
feed.language = 'fr'
|
472
|
-
feed.version = '1.0'
|
473
|
-
|
474
|
-
* updated
|
475
|
-
|
476
|
-
Time accessor
|
477
|
-
|
478
|
-
feed.updated = Time.now
|
479
|
-
updated = feed.updated
|
480
|
-
puts updated.year
|
481
|
-
puts updated.month
|
482
|
-
|
483
|
-
* generator
|
484
|
-
|
485
|
-
You can set generator information
|
486
|
-
|
487
|
-
feed.generator = 'MyGenerator'
|
488
|
-
|
489
|
-
Or more in detail
|
490
|
-
|
491
|
-
generator = Atom::Generator.new(
|
492
|
-
:name => 'MyGenerator',
|
493
|
-
:uri => 'http://example.org/mygenerator',
|
494
|
-
:version => '1.0'
|
495
|
-
)
|
496
|
-
feed.generator = generator
|
497
|
-
|
498
|
-
generator = feed.generator
|
499
|
-
puts generator.name
|
500
|
-
puts generator.uri
|
501
|
-
puts generator.version
|
502
|
-
|
503
|
-
* link
|
504
|
-
|
505
|
-
You can set links like you do with entry
|
506
|
-
|
507
|
-
link1 = Atom::Link.new :href => 'http://example.org/entry/1', :rel => 'alternate'
|
508
|
-
feed.add_link link1
|
509
|
-
|
510
|
-
feed.edit_link = 'http://example.org/entry/1/edit'
|
511
|
-
|
512
|
-
* category
|
513
|
-
|
514
|
-
You can set categoryes like you do with entry
|
515
|
-
|
516
|
-
* author
|
517
|
-
* contributor
|
518
|
-
|
519
|
-
Person construct data.
|
520
|
-
You can set authors/contributors on same way for entry.
|
521
|
-
|
522
|
-
* entry
|
523
|
-
|
524
|
-
Entry Accessors
|
525
|
-
|
526
|
-
entry1 = Atom::Entry.new
|
527
|
-
entry1.title = 'Entry1'
|
528
|
-
|
529
|
-
entry2 = Atom::Entry.new
|
530
|
-
entry2.title = 'Entry2'
|
531
|
-
|
532
|
-
feed.add_entry entry1
|
533
|
-
feed.add_entry entry2
|
534
|
-
|
535
|
-
entries = feed.entries
|
536
|
-
|
537
|
-
OpenSeach Pagination Control
|
538
|
-
|
539
|
-
feed.total_results = 35
|
540
|
-
feed.items_per_page = 10
|
541
|
-
feed.start_index = 11
|
542
|
-
|
543
|
-
Then feed includes
|
544
|
-
|
545
|
-
<openSearch:totalResults>35</openSearch:totalResults>
|
546
|
-
<openSearch:itemsPerPage>10</openSearch:itemsPerPage>
|
547
|
-
<openSearch:startIndex>11</openSearch:startIndex>
|
548
|
-
|
549
|
-
== Using service that provides AtomPub API
|
550
|
-
|
551
|
-
At first, construct appropriate authorizer
|
552
|
-
At this time, let's assume that we're requried WSSE Authentication.
|
553
|
-
Of cource, you can choose other authorizer,
|
554
|
-
for example, Atom::Auth::Basic(Basic authentication),
|
555
|
-
and in future, Atom::Auth::OAuth, Atom::Auth::OpenID, and etc.
|
556
|
-
|
557
|
-
auth = Atompub::Auth::Wsse.new :username => 'myname', :password => 'mypass'
|
558
|
-
|
559
|
-
client = Atompub::Client.new :auth => auth
|
560
|
-
|
561
|
-
service = client.get_service( 'http://example/service/api/endpoint' )
|
562
|
-
collection = service.workspaces.first.collection.first
|
563
|
-
categories = client.get_categories( collection.categories.href )
|
564
|
-
|
565
|
-
categories.categories.each do |category|
|
566
|
-
puts category.label
|
567
|
-
puts category.scheme
|
568
|
-
puts category.term
|
569
|
-
end
|
570
|
-
|
571
|
-
feed = client.get_feed( collection.href )
|
572
|
-
|
573
|
-
puts feed.title # 'Example Feed'
|
574
|
-
puts feed.icon # http://example/icon.jpg
|
575
|
-
puts feed.logo # http://example/logo.jpg
|
576
|
-
|
577
|
-
entries = feed.entries
|
578
|
-
entries.each do |entry|
|
579
|
-
puts entry.id
|
580
|
-
puts entry.title
|
581
|
-
end
|
582
|
-
|
583
|
-
entry = entries.first
|
584
|
-
entry.title = 'Changed!'
|
585
|
-
|
586
|
-
client.update_entry( entry.edit_link, entry )
|
587
|
-
|
588
|
-
client.delete_entry( entries[2].edit_link )
|
589
|
-
|
590
|
-
new_entry = Atom::Entry.new
|
591
|
-
new_entry.title = 'New!'
|
592
|
-
new_entry.summary = 'New Entry for Example'
|
593
|
-
new_entry.published = Time.now
|
594
|
-
|
595
|
-
edit_uri = client.create_entry( collection.href, new_entry )
|
596
|
-
|
597
|
-
# you also can use 'slug'
|
598
|
-
slug = 'new entry'
|
599
|
-
edit_uri = client.create_entry( collection.href, new_entry, slug )
|
600
|
-
|
601
|
-
media_collection = service.workspaces.first.collections[1]
|
602
|
-
media_collection_uri = media_collection.href
|
603
|
-
|
604
|
-
media_uri = client.create_media( media_collection_uri, 'foo.jpg', 'image/jpeg')
|
605
|
-
# with slug
|
606
|
-
# client.create_media( media_collection_uri, 'foo.jpg', 'image/jpeg', 'new-image')
|
607
|
-
|
608
|
-
media_entry = client.get_entry( media_uri )
|
609
|
-
edit_media_link = media_entry.edit_media_link
|
610
|
-
client.update_media( edit_media_link, 'bar.jpg', 'image/jpeg' )
|
611
|
-
client.delete_media( edit_media_link )
|
612
|
-
|
613
|
-
feed_contains_media_entreis = client.get_feed( media_collection_uri )
|
614
|
-
|
615
|
-
= TO DO
|
616
|
-
|
617
|
-
* More document
|
618
|
-
* More tests (RSpec)
|
619
|
-
* Encoding control
|
620
|
-
* New Auth classes Atompub::Auth::OpenID and Atompub::Auth::OAuth
|
621
|
-
|
622
|
-
= SEE ALSO
|
623
|
-
|
624
|
-
AtomPub Spec(RFC):: http://atompub.org/rfc4287.html
|
625
|
-
XML::Atom(Perl):: http://search.cpan.org/perldoc?XML%3A%3AAtom
|
626
|
-
XML::Atom::Service(Perl):: http://search.cpan.org/perldoc?XML%3A%3AAtom%3A%3AService
|
627
|
-
XML::Atom::Ext::Threading(Perl):: http://search.cpan.org/perldoc?XML%3A%3AAtom%3A%3AExt%3A%3AThreading
|
628
|
-
Atompub(Perl):: http://search.cpan.org/perldoc?Atompub
|
629
|
-
|
630
|
-
= Author and License
|
631
|
-
|
632
|
-
Author:: Lyo Kato (lyo.kato atmark gmail.com)
|
633
|
-
Copyright:: Copyright (c) 2007, Lyo Kato All rights reserved.
|
634
|
-
License:: Ruby License
|
635
|
-
|
data/config/hoe.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'atomutil'
|
2
|
-
|
3
|
-
AUTHOR = 'Lyo Kato' # can also be an array of Authors
|
4
|
-
EMAIL = "lyo.kato atmark gmail.com"
|
5
|
-
DESCRIPTION = "Utilities for AtomPub / Atom Syndication Format"
|
6
|
-
GEM_NAME = 'atomutil' # what ppl will type to install your gem
|
7
|
-
RUBYFORGE_PROJECT = 'atomutil' # The unix name for your project
|
8
|
-
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
9
|
-
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
10
|
-
|
11
|
-
@config_file = "~/.rubyforge/user-config.yml"
|
12
|
-
@config = nil
|
13
|
-
RUBYFORGE_USERNAME = "lyokato"
|
14
|
-
def rubyforge_username
|
15
|
-
unless @config
|
16
|
-
begin
|
17
|
-
@config = YAML.load(File.read(File.expand_path(@config_file)))
|
18
|
-
rescue
|
19
|
-
puts <<-EOS
|
20
|
-
ERROR: No rubyforge config file found: #{@config_file}
|
21
|
-
Run 'rubyforge setup' to prepare your env for access to Rubyforge
|
22
|
-
- See http://newgem.rubyforge.org/rubyforge.html for more details
|
23
|
-
EOS
|
24
|
-
exit
|
25
|
-
end
|
26
|
-
end
|
27
|
-
RUBYFORGE_USERNAME.replace @config["username"]
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
REV = nil
|
32
|
-
# UNCOMMENT IF REQUIRED:
|
33
|
-
# REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
|
34
|
-
VERS = AtomUtil::VERSION::STRING + (REV ? ".#{REV}" : "")
|
35
|
-
RDOC_OPTS = ['--quiet', '--title', 'atomutil documentation',
|
36
|
-
"--opname", "index.html",
|
37
|
-
"--line-numbers",
|
38
|
-
"--main", "README",
|
39
|
-
"--inline-source"]
|
40
|
-
|
41
|
-
class Hoe
|
42
|
-
def extra_deps
|
43
|
-
@extra_deps.reject! { |x| Array(x).first == 'hoe' }
|
44
|
-
@extra_deps
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Generate all the Rake tasks
|
49
|
-
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
50
|
-
hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
51
|
-
p.author = AUTHOR
|
52
|
-
p.description = DESCRIPTION
|
53
|
-
p.email = EMAIL
|
54
|
-
p.summary = DESCRIPTION
|
55
|
-
p.url = HOMEPATH
|
56
|
-
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
57
|
-
p.test_globs = ["test/**/test_*.rb"]
|
58
|
-
p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
|
59
|
-
|
60
|
-
# == Optional
|
61
|
-
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
62
|
-
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
63
|
-
|
64
|
-
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
|
69
|
-
PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
70
|
-
hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
|
71
|
-
hoe.rsync_args = '-av --delete --ignore-errors'
|
data/config/requirements.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
include FileUtils
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
%w[rake hoe newgem rubigen].each do |req_gem|
|
6
|
-
begin
|
7
|
-
require req_gem
|
8
|
-
rescue LoadError
|
9
|
-
puts "This Rakefile requires the '#{req_gem}' RubyGem."
|
10
|
-
puts "Installation: gem install #{req_gem} -y"
|
11
|
-
exit
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
$:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
|
16
|
-
|
17
|
-
require 'atomutil'
|