atom-tools 0.9.0 → 0.9.1

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.
Files changed (49) hide show
  1. data/README +3 -3
  2. data/Rakefile +1 -1
  3. data/bin/atom-client.rb +13 -10
  4. data/lib/atom/collection.rb +2 -2
  5. data/lib/atom/element.rb +5 -1
  6. data/lib/atom/entry.rb +9 -2
  7. data/lib/atom/feed.rb +11 -6
  8. data/lib/atom/http.rb +157 -38
  9. data/lib/atom/service.rb +170 -0
  10. data/lib/atom/text.rb +15 -2
  11. data/lib/atom/xml.rb +1 -1
  12. data/test/conformance/updated.rb +2 -1
  13. data/test/test_constructs.rb +45 -2
  14. data/test/test_feed.rb +27 -0
  15. data/test/test_http.rb +116 -20
  16. data/test/test_protocol.rb +77 -13
  17. data/test/test_xml.rb +15 -1
  18. metadata +3 -38
  19. data/bin/atom-server.rb~ +0 -71
  20. data/doc/classes/Atom/App.html +0 -217
  21. data/doc/classes/Atom/Author.html +0 -130
  22. data/doc/classes/Atom/Category.html +0 -128
  23. data/doc/classes/Atom/Collection.html +0 -322
  24. data/doc/classes/Atom/Content.html +0 -129
  25. data/doc/classes/Atom/Contributor.html +0 -119
  26. data/doc/classes/Atom/Element.html +0 -325
  27. data/doc/classes/Atom/Entry.html +0 -365
  28. data/doc/classes/Atom/Feed.html +0 -585
  29. data/doc/classes/Atom/HTTP.html +0 -374
  30. data/doc/classes/Atom/Link.html +0 -137
  31. data/doc/classes/Atom/Text.html +0 -229
  32. data/doc/classes/XHTML.html +0 -118
  33. data/doc/created.rid +0 -1
  34. data/doc/files/README.html +0 -213
  35. data/doc/files/lib/atom/app_rb.html +0 -110
  36. data/doc/files/lib/atom/collection_rb.html +0 -110
  37. data/doc/files/lib/atom/element_rb.html +0 -109
  38. data/doc/files/lib/atom/entry_rb.html +0 -111
  39. data/doc/files/lib/atom/feed_rb.html +0 -112
  40. data/doc/files/lib/atom/http_rb.html +0 -109
  41. data/doc/files/lib/atom/text_rb.html +0 -108
  42. data/doc/files/lib/atom/xml_rb.html +0 -110
  43. data/doc/files/lib/atom/yaml_rb.html +0 -109
  44. data/doc/fr_class_index.html +0 -39
  45. data/doc/fr_file_index.html +0 -36
  46. data/doc/fr_method_index.html +0 -62
  47. data/doc/index.html +0 -24
  48. data/doc/rdoc-style.css +0 -208
  49. data/lib/atom/app.rb +0 -87
@@ -1,6 +1,6 @@
1
1
  require "test/unit"
2
2
 
3
- require "atom/app"
3
+ require "atom/service"
4
4
 
5
5
  class FakeHTTP
6
6
  Response = Struct.new(:body, :code, :content_type)
@@ -20,8 +20,7 @@ end
20
20
 
21
21
  class AtomProtocolTest < Test::Unit::TestCase
22
22
  def test_introspection
23
-
24
- service = <<END
23
+ doc = <<END
25
24
  <service xmlns="http://purl.org/atom/app#"
26
25
  xmlns:atom="http://www.w3.org/2005/Atom">
27
26
  <workspace>
@@ -37,24 +36,89 @@ class AtomProtocolTest < Test::Unit::TestCase
37
36
  </service>
38
37
  END
39
38
 
40
- http = FakeHTTP.new({ "http://example.com/service.xml" => service }, "application/atomserv+xml")
39
+ #http = FakeHTTP.new({ "http://example.com/service.xml" => service }, "application/atomserv+xml")
40
+
41
+ service = Atom::Service.new
42
+ service.parse doc
43
+ #service = Atom::Service.new "http://example.com/service.xml", http
44
+
45
+ ws = service.workspaces.first
46
+ assert_equal "My Blog", ws.title.to_s
41
47
 
48
+ coll = ws.collections.first
49
+ assert_equal URI.parse("http://example.org/myblog/entries"), coll.uri
50
+ assert_equal "Entries", coll.title.to_s
51
+ assert_equal "entry", coll.accepts
42
52
 
43
- server = Atom::App.new "http://example.com/service.xml", http
53
+ coll = ws.collections.last
54
+ assert_equal URI.parse("http://example.org/myblog/fotes"), coll.uri
55
+ assert_equal "Photos", coll.title.to_s
56
+ assert_equal "image/*", coll.accepts
44
57
 
45
- coll = server.collections.first
46
- assert_equal(URI.parse("http://example.org/myblog/entries"), coll.uri)
47
- assert_equal("Entries", coll.title.to_s)
48
- assert_equal("entry", coll.accepts)
58
+ http = service.instance_variable_get(:@http)
59
+ assert_instance_of Atom::HTTP, http
49
60
 
50
- coll = server.collections.last
51
- assert_equal(URI.parse("http://example.org/myblog/fotes"), coll.uri)
52
- assert_equal("Photos", coll.title.to_s)
53
- assert_equal("image/*", coll.accepts)
61
+ # collections should inherit the service's HTTP object
62
+ assert_equal http, coll.instance_variable_get(:@http)
54
63
 
55
64
  # XXX write a test for relative hrefs
56
65
  end
57
66
 
67
+ def test_write_introspection
68
+ service = Atom::Service.new
69
+
70
+ ws = service.workspaces.new
71
+
72
+ ws.title = "Workspace 1"
73
+
74
+ coll = Atom::Collection.new "http://example.org/entries"
75
+ coll.title = "Entries"
76
+ ws.collections << coll
77
+
78
+ coll = Atom::Collection.new "http://example.org/audio"
79
+ coll.title = "Audio"
80
+ coll.accepts = "audio/*"
81
+ ws.collections << coll
82
+
83
+ nses = { "app" => Atom::PP_NS, "atom" => Atom::NS }
84
+
85
+ doc = REXML::Document.new(service.to_s)
86
+
87
+ assert_equal "http://purl.org/atom/app#", doc.root.namespace
88
+
89
+ ws = REXML::XPath.first( doc.root,
90
+ "/app:service/app:workspace",
91
+ nses )
92
+
93
+ title = REXML::XPath.first( ws, "./atom:title", nses)
94
+
95
+ assert_equal "Workspace 1", title.text
96
+ assert_equal "http://www.w3.org/2005/Atom", title.namespace
97
+
98
+ colls = REXML::XPath.match( ws, "./app:collection", nses)
99
+ assert_equal(2, colls.length)
100
+
101
+ entries = colls.first
102
+
103
+ assert_equal "http://example.org/entries", entries.attributes["href"]
104
+
105
+ title = REXML::XPath.first(entries, "./atom:title", nses)
106
+ assert_equal "Entries", title.text
107
+
108
+ accepts = REXML::XPath.first(entries, "./app:accepts", nses)
109
+ assert_nil accepts
110
+
111
+ audio = colls.last
112
+
113
+ assert_equal "http://example.org/audio", audio.attributes["href"]
114
+
115
+ title = REXML::XPath.first(audio, "./atom:title", nses)
116
+ assert_equal "Audio", title.text
117
+
118
+ accepts = REXML::XPath.first(audio, "./app:accepts", nses)
119
+ assert_equal "audio/*", accepts.text
120
+ end
121
+
58
122
  def test_dont_specify_http_object
59
123
  collection = Atom::Collection.new("http://necronomicorp.com/testatom?atom")
60
124
 
data/test/test_xml.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require "test/unit"
2
2
 
3
3
  # for entry.edit_url
4
- require "atom/app"
4
+ require "atom/service"
5
5
 
6
6
  class AtomTest < Test::Unit::TestCase
7
7
  def test_text_type_text
@@ -287,6 +287,20 @@ END
287
287
  assert_equal "", entry.content.to_s
288
288
  end
289
289
 
290
+ def test_serialize_base
291
+ entry = Atom::Entry.new
292
+
293
+ entry.base = "http://necronomicorp.com/nil"
294
+
295
+ base = get_elements(entry).root.attributes["xml:base"]
296
+ assert_equal "http://necronomicorp.com/nil", base
297
+
298
+ entry.base = URI.parse("http://necronomicorp.com/nil")
299
+
300
+ base = get_elements(entry).root.attributes["xml:base"]
301
+ assert_equal "http://necronomicorp.com/nil", base
302
+ end
303
+
290
304
  def test_relative_base
291
305
  base_url = "http://www.tbray.org/ongoing/ongoing.atom"
292
306
  doc = "<entry xmlns='http://www.w3.org/2005/Atom' xml:base='When/200x/2006/10/11/'/>"
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: atom-tools
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.9.0
7
- date: 2006-11-10 00:00:00 -07:00
6
+ version: 0.9.1
7
+ date: 2006-11-26 00:00:00 -07:00
8
8
  summary: Tools for working with Atom Entries, Feeds and Collections
9
9
  require_paths:
10
10
  - lib
@@ -32,42 +32,7 @@ files:
32
32
  - README
33
33
  - Rakefile
34
34
  - setup.rb
35
- - bin/atom-server.rb~
36
35
  - bin/atom-client.rb
37
- - doc/files
38
- - doc/index.html
39
- - doc/rdoc-style.css
40
- - doc/fr_method_index.html
41
- - doc/fr_class_index.html
42
- - doc/fr_file_index.html
43
- - doc/created.rid
44
- - doc/classes
45
- - doc/files/lib
46
- - doc/files/README.html
47
- - doc/files/lib/atom
48
- - doc/files/lib/atom/feed_rb.html
49
- - doc/files/lib/atom/text_rb.html
50
- - doc/files/lib/atom/xml_rb.html
51
- - doc/files/lib/atom/yaml_rb.html
52
- - doc/files/lib/atom/element_rb.html
53
- - doc/files/lib/atom/app_rb.html
54
- - doc/files/lib/atom/entry_rb.html
55
- - doc/files/lib/atom/http_rb.html
56
- - doc/files/lib/atom/collection_rb.html
57
- - doc/classes/Atom
58
- - doc/classes/XHTML.html
59
- - doc/classes/Atom/Author.html
60
- - doc/classes/Atom/Element.html
61
- - doc/classes/Atom/App.html
62
- - doc/classes/Atom/Feed.html
63
- - doc/classes/Atom/Text.html
64
- - doc/classes/Atom/Contributor.html
65
- - doc/classes/Atom/HTTP.html
66
- - doc/classes/Atom/Link.html
67
- - doc/classes/Atom/Collection.html
68
- - doc/classes/Atom/Content.html
69
- - doc/classes/Atom/Category.html
70
- - doc/classes/Atom/Entry.html
71
36
  - test/test_constructs.rb
72
37
  - test/runtests.rb
73
38
  - test/test_feed.rb
@@ -85,8 +50,8 @@ files:
85
50
  - lib/atom/yaml.rb
86
51
  - lib/atom/feed.rb
87
52
  - lib/atom/text.rb
88
- - lib/atom/app.rb
89
53
  - lib/atom/collection.rb
54
+ - lib/atom/service.rb
90
55
  - lib/atom/entry.rb
91
56
  - lib/atom/xml.rb
92
57
  - lib/atom/element.rb
data/bin/atom-server.rb~ DELETED
@@ -1,71 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require "atom/pub-server"
4
- require "webrick/httpserver"
5
- require "atom/feed"
6
-
7
- # syntax: ./atom-server <port> <path>
8
-
9
- module Atom
10
- # @docs must implement [], []=, next_id!
11
- # including servlet must implement gen_id, url_to_key, key_to_url, do_GET
12
- class MemoryCollection < WEBrick::HTTPServlet::AbstractServlet
13
- include Atom::AtomPub
14
-
15
- def initialize server, docs
16
- super
17
-
18
- @docs = docs
19
- end
20
-
21
- def gen_id key
22
- key
23
- end
24
-
25
- def key_to_url req, key
26
- req.script_name + "/" + key
27
- end
28
-
29
- def url_to_key url
30
- url.split("/").last
31
- end
32
-
33
- def add_edit entry, key
34
- edit = entry.links.new
35
- edit["rel"] = "edit"
36
- edit
37
- end
38
-
39
- def do_GET req, res
40
- res.body = if req.path_info.empty? or req.path_info == "/"
41
- feed = Atom::Feed.new
42
-
43
- @docs.each do |key,doc|
44
- entry = doc.to_atom_entry
45
- add_edit(entry, key)["href"] = key_to_url(req, key)
46
- feed << entry
47
- end
48
-
49
- feed.entries.first.to_s
50
- else
51
- key = url_to_key(req.request_uri.to_s)
52
- entry = @docs[key].to_atom_entry
53
- add_edit(entry, key)["href"] = key_to_url(req, key)
54
- entry.to_s
55
- end
56
- end
57
- end
58
- end
59
-
60
- h = WEBrick::HTTPServer.new(:Port => ARGV[0])
61
-
62
- docs = {}
63
- docs.instance_variable_set :@last_key, "0"
64
-
65
- def docs.next_key!
66
- @last_key.next!
67
- end
68
-
69
- h.mount(ARGV[1], Atom::MemoryCollection, docs)
70
-
71
- h.start
@@ -1,217 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>Class: Atom::App</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="classHeader">
50
- <table class="header-table">
51
- <tr class="top-aligned-row">
52
- <td><strong>Class</strong></td>
53
- <td class="class-name-in-header">Atom::App</td>
54
- </tr>
55
- <tr class="top-aligned-row">
56
- <td><strong>In:</strong></td>
57
- <td>
58
- <a href="../../files/lib/atom/app_rb.html">
59
- lib/atom/app.rb
60
- </a>
61
- <br />
62
- </td>
63
- </tr>
64
-
65
- <tr class="top-aligned-row">
66
- <td><strong>Parent:</strong></td>
67
- <td>
68
- Object
69
- </td>
70
- </tr>
71
- </table>
72
- </div>
73
- <!-- banner header -->
74
-
75
- <div id="bodyContent">
76
-
77
-
78
-
79
- <div id="contextContent">
80
-
81
- <div id="description">
82
- <p>
83
- <a href="App.html">Atom::App</a> represents an Atom Publishing Protocol
84
- introspection document.
85
- </p>
86
-
87
- </div>
88
-
89
-
90
- </div>
91
-
92
- <div id="method-list">
93
- <h3 class="section-bar">Methods</h3>
94
-
95
- <div class="name-list">
96
- <a href="#M000006">new</a>&nbsp;&nbsp;
97
- </div>
98
- </div>
99
-
100
- </div>
101
-
102
-
103
- <!-- if includes -->
104
-
105
- <div id="section">
106
-
107
-
108
-
109
-
110
-
111
- <div id="attribute-list">
112
- <h3 class="section-bar">Attributes</h3>
113
-
114
- <div class="name-list">
115
- <table>
116
- <tr class="top-aligned-row context-row">
117
- <td class="context-item-name">collections</td>
118
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
119
- <td class="context-item-desc">
120
- collections referred to by the introspection document
121
-
122
- </td>
123
- </tr>
124
- </table>
125
- </div>
126
- </div>
127
-
128
-
129
-
130
- <!-- if method_list -->
131
- <div id="methods">
132
- <h3 class="section-bar">Public Class methods</h3>
133
-
134
- <div id="method-M000006" class="method-detail">
135
- <a name="M000006"></a>
136
-
137
- <div class="method-heading">
138
- <a href="#M000006" class="method-signature">
139
- <span class="method-name">new</span><span class="method-args">(introspection_url, http = Atom::HTTP.new)</span>
140
- </a>
141
- </div>
142
-
143
- <div class="method-description">
144
- <p>
145
- retrieves and parses an Atom introspection document.
146
- </p>
147
- <p><a class="source-toggle" href="#"
148
- onclick="toggleCode('M000006-source');return false;">[Source]</a></p>
149
- <div class="method-source-code" id="M000006-source">
150
- <pre>
151
- <span class="ruby-comment cmt"># File lib/atom/app.rb, line 23</span>
152
- 23: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">introspection_url</span>, <span class="ruby-identifier">http</span> = <span class="ruby-constant">Atom</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span>.<span class="ruby-identifier">new</span>)
153
- 24: <span class="ruby-identifier">i_url</span> = <span class="ruby-constant">URI</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">introspection_url</span>)
154
- 25:
155
- 26: <span class="ruby-identifier">rxml</span> = <span class="ruby-keyword kw">nil</span>
156
- 27:
157
- 28: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">http</span>.<span class="ruby-identifier">get</span>(<span class="ruby-identifier">i_url</span>)
158
- 29:
159
- 30: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">res</span>.<span class="ruby-identifier">code</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;200&quot;</span> <span class="ruby-comment cmt"># redirects, &amp;c.</span>
160
- 31: <span class="ruby-identifier">raise</span> <span class="ruby-constant">WrongResponse</span>, <span class="ruby-node">&quot;introspection document responded with unexpected code #{res.code}&quot;</span>
161
- 32: <span class="ruby-keyword kw">end</span>
162
- 33:
163
- 34: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">res</span>.<span class="ruby-identifier">content_type</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;application/atomserv+xml&quot;</span>
164
- 35: <span class="ruby-identifier">raise</span> <span class="ruby-constant">WrongMimetype</span>, <span class="ruby-value str">&quot;this isn't an introspection document!&quot;</span>
165
- 36: <span class="ruby-keyword kw">end</span>
166
- 37:
167
- 38: <span class="ruby-identifier">rxml</span> = <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">Document</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">res</span>.<span class="ruby-identifier">body</span>)
168
- 39:
169
- 40: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rxml</span>.<span class="ruby-identifier">root</span>.<span class="ruby-identifier">namespace</span> <span class="ruby-operator">==</span> <span class="ruby-constant">PP_NS</span>
170
- 41: <span class="ruby-identifier">raise</span> <span class="ruby-constant">WrongNamespace</span>, <span class="ruby-value str">&quot;this isn't an introspection document!&quot;</span>
171
- 42: <span class="ruby-keyword kw">end</span>
172
- 43:
173
- 44: <span class="ruby-comment cmt"># TODO: expose workspaces</span>
174
- 45: <span class="ruby-identifier">colls</span> = <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">XPath</span>.<span class="ruby-identifier">match</span>( <span class="ruby-identifier">rxml</span>,
175
- 46: <span class="ruby-value str">&quot;/app:service/app:workspace/app:collection&quot;</span>,
176
- 47: {<span class="ruby-value str">&quot;app&quot;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Atom</span><span class="ruby-operator">::</span><span class="ruby-constant">PP_NS</span>} )
177
- 48:
178
- 49: <span class="ruby-ivar">@collections</span> = []
179
- 50:
180
- 51: <span class="ruby-identifier">colls</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">collection</span><span class="ruby-operator">|</span>
181
- 52: <span class="ruby-comment cmt"># absolutize relative URLs</span>
182
- 53: <span class="ruby-identifier">url</span> = <span class="ruby-identifier">i_url</span> <span class="ruby-operator">+</span> <span class="ruby-constant">URI</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">collection</span>.<span class="ruby-identifier">attributes</span>[<span class="ruby-value str">&quot;href&quot;</span>])
183
- 54:
184
- 55: <span class="ruby-identifier">coll</span> = <span class="ruby-constant">Atom</span><span class="ruby-operator">::</span><span class="ruby-constant">Collection</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">url</span>, <span class="ruby-identifier">http</span>)
185
- 56:
186
- 57: <span class="ruby-comment cmt"># XXX this is a Text Construct, and should be parsed as such</span>
187
- 58: <span class="ruby-identifier">coll</span>.<span class="ruby-identifier">title</span> = <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">XPath</span>.<span class="ruby-identifier">first</span>( <span class="ruby-identifier">collection</span>,
188
- 59: <span class="ruby-value str">&quot;./atom:title&quot;</span>,
189
- 60: {<span class="ruby-value str">&quot;app&quot;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Atom</span><span class="ruby-operator">::</span><span class="ruby-constant">PP_NS</span>,
190
- 61: <span class="ruby-value str">&quot;atom&quot;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Atom</span><span class="ruby-operator">::</span><span class="ruby-constant">NS</span> } ).<span class="ruby-identifier">text</span>
191
- 62:
192
- 63: <span class="ruby-identifier">accepts</span> = <span class="ruby-constant">REXML</span><span class="ruby-operator">::</span><span class="ruby-constant">XPath</span>.<span class="ruby-identifier">first</span>( <span class="ruby-identifier">collection</span>,
193
- 64: <span class="ruby-value str">&quot;./app:accept&quot;</span>,
194
- 65: {<span class="ruby-value str">&quot;app&quot;</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">Atom</span><span class="ruby-operator">::</span><span class="ruby-constant">PP_NS</span>} )
195
- 66: <span class="ruby-identifier">coll</span>.<span class="ruby-identifier">accepts</span> = (<span class="ruby-identifier">accepts</span> <span class="ruby-value">? </span><span class="ruby-identifier">accepts</span>.<span class="ruby-identifier">text</span> <span class="ruby-operator">:</span> <span class="ruby-value str">&quot;entry&quot;</span>)
196
- 67:
197
- 68: <span class="ruby-ivar">@collections</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">coll</span>
198
- 69: <span class="ruby-keyword kw">end</span>
199
- 70: <span class="ruby-keyword kw">end</span>
200
- </pre>
201
- </div>
202
- </div>
203
- </div>
204
-
205
-
206
- </div>
207
-
208
-
209
- </div>
210
-
211
-
212
- <div id="validator-badges">
213
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
214
- </div>
215
-
216
- </body>
217
- </html>