atom-tools 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/README +2 -2
  2. data/Rakefile +1 -1
  3. data/bin/atom-client.rb +71 -45
  4. data/lib/atom/element.rb +7 -2
  5. data/lib/atom/entry.rb +51 -16
  6. data/lib/atom/feed.rb +6 -6
  7. data/lib/atom/http.rb +23 -19
  8. data/lib/atom/service.rb +0 -2
  9. data/lib/atom/text.rb +34 -12
  10. data/lib/atom/xml.rb +26 -17
  11. data/lib/atom/yaml.rb +23 -8
  12. data/test/test_constructs.rb +16 -2
  13. data/test/test_general.rb +22 -9
  14. data/test/test_http.rb +12 -8
  15. data/test/test_xml.rb +66 -20
  16. metadata +4 -40
  17. data/doc/classes/Atom/Author.html +0 -130
  18. data/doc/classes/Atom/Category.html +0 -128
  19. data/doc/classes/Atom/Collection.html +0 -322
  20. data/doc/classes/Atom/Content.html +0 -129
  21. data/doc/classes/Atom/Contributor.html +0 -119
  22. data/doc/classes/Atom/DigestAuth.html +0 -285
  23. data/doc/classes/Atom/Element.html +0 -325
  24. data/doc/classes/Atom/Entry.html +0 -369
  25. data/doc/classes/Atom/Feed.html +0 -595
  26. data/doc/classes/Atom/HTTP.html +0 -436
  27. data/doc/classes/Atom/HTTPResponse.html +0 -149
  28. data/doc/classes/Atom/Link.html +0 -137
  29. data/doc/classes/Atom/Service.html +0 -260
  30. data/doc/classes/Atom/Text.html +0 -245
  31. data/doc/classes/Atom/Workspace.html +0 -121
  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/collection_rb.html +0 -110
  36. data/doc/files/lib/atom/element_rb.html +0 -109
  37. data/doc/files/lib/atom/entry_rb.html +0 -111
  38. data/doc/files/lib/atom/feed_rb.html +0 -112
  39. data/doc/files/lib/atom/http_rb.html +0 -112
  40. data/doc/files/lib/atom/service_rb.html +0 -111
  41. data/doc/files/lib/atom/text_rb.html +0 -109
  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 -42
  45. data/doc/fr_file_index.html +0 -36
  46. data/doc/fr_method_index.html +0 -69
  47. data/doc/index.html +0 -24
  48. data/doc/rdoc-style.css +0 -208
data/lib/atom/service.rb CHANGED
@@ -5,8 +5,6 @@ require "atom/element"
5
5
  require "atom/collection"
6
6
 
7
7
  module Atom
8
- PP_NS = "http://purl.org/atom/app#"
9
-
10
8
  class WrongNamespace < RuntimeError #:nodoc:
11
9
  end
12
10
  class WrongResponse < RuntimeError # :nodoc:
data/lib/atom/text.rb CHANGED
@@ -4,11 +4,19 @@ module XHTML
4
4
  NS = "http://www.w3.org/1999/xhtml"
5
5
  end
6
6
 
7
- module Atom
7
+ module Atom
8
8
  # An Atom::Element representing a text construct.
9
- # It has a single attribute, "type", which accepts values
10
- # "text", "html" and "xhtml"
11
-
9
+ # It has a single attribute, "type", which specifies how to interpret
10
+ # the element's content. Different types are:
11
+ #
12
+ # text:: a plain string, without any markup (default)
13
+ # html:: a chunk of HTML
14
+ # xhtml:: a chunk of *well-formed* XHTML
15
+ #
16
+ # You should set this attribute appropriately after you set a Text
17
+ # element (entry.content, entry.title or entry.summary).
18
+ #
19
+ # This content of this element can be retrieved in different formats, see #html and #xml
12
20
  class Text < Atom::Element
13
21
  attrb :type
14
22
 
@@ -16,19 +24,24 @@ module Atom
16
24
  @content = value
17
25
  @content ||= "" # in case of nil
18
26
  self["type"] = "text"
19
-
27
+
20
28
  super name
21
29
  end
22
30
 
31
+ # convenient, but not overly useful. see #html instead.
23
32
  def to_s
24
- if self["type"] == "xhtml"
33
+ if self["type"] == "xhtml"
25
34
  @content.children.to_s
26
35
  else
27
36
  @content.to_s
28
37
  end
29
38
  end
30
39
 
31
- # returns a string suitable for dumping into an HTML document
40
+ # returns a string suitable for dumping into an HTML document.
41
+ # (or nil if that's impossible)
42
+ #
43
+ # if you're storing the content of a Text construct, you probably
44
+ # want this representation.
32
45
  def html
33
46
  if self["type"] == "xhtml" or self["type"] == "html"
34
47
  to_s
@@ -40,7 +53,7 @@ module Atom
40
53
  # attempts to parse the content of this element as XML and return it
41
54
  # as an array of REXML::Elements.
42
55
  #
43
- # If this self["type"] is "html" and Hpricot is installed, it will
56
+ # If self["type"] is "html" and Hpricot is installed, it will
44
57
  # be converted to XHTML first.
45
58
  def xml
46
59
  if self["type"] == "xhtml"
@@ -83,7 +96,7 @@ module Atom
83
96
 
84
97
  super(key, value)
85
98
  end
86
-
99
+
87
100
  def to_element # :nodoc:
88
101
  e = super
89
102
 
@@ -106,18 +119,19 @@ module Atom
106
119
 
107
120
  e
108
121
  end
109
-
122
+
110
123
  private
124
+ # converts @content based on the value of self["type"]
111
125
  def convert_contents e
112
126
  if self["type"] == "xhtml"
113
127
  @content
114
128
  elsif self["type"] == "text" or self["type"].nil?
115
129
  REXML::Text.normalize(@content.to_s)
116
130
  elsif self["type"] == "html"
117
- @content.to_s
131
+ @content.to_s.gsub(/&/, "&amp;")
118
132
  end
119
133
  end
120
-
134
+
121
135
  def valid_type? type
122
136
  ["text", "xhtml", "html"].member? type
123
137
  end
@@ -154,6 +168,14 @@ module Atom
154
168
  class Content < Atom::Text
155
169
  attrb :src
156
170
 
171
+ def html
172
+ if self["src"]
173
+ ""
174
+ else
175
+ super
176
+ end
177
+ end
178
+
157
179
  private
158
180
  def valid_type? type
159
181
  super or type.match(/\//)
data/lib/atom/xml.rb CHANGED
@@ -28,11 +28,22 @@ module REXML # :nodoc: all
28
28
  end
29
29
  end
30
30
 
31
- def get_extensions
31
+ def copy_extensions(coll)
32
32
  # XXX also look for attributes
33
- children.find_all { |child| child.respond_to? :namespace and child.namespace != Atom::NS }
33
+ children.find_all do |child|
34
+ child.respond_to? :namespace and child.namespace != Atom::NS
35
+ end.each do |elem|
36
+ e = elem.dup
37
+
38
+ # because namespaces might be defined on parents
39
+ unless e.prefix.empty?
40
+ e.add_namespace e.prefix, e.namespace
41
+ end
42
+
43
+ coll << e
44
+ end
34
45
  end
35
-
46
+
36
47
  # get the text content of a descendant element in the Atom namespace
37
48
  def get_atom_text name
38
49
  elem = get_atom_element name
@@ -54,14 +65,14 @@ module REXML # :nodoc: all
54
65
 
55
66
  self.attributes[attr]
56
67
  end
57
-
68
+
58
69
  def fill_text_construct(entry, name)
59
70
  text = get_atom_element(name)
60
71
  if text
61
72
  type = text.ns_attr("type")
62
73
  src = text.ns_attr("src")
63
74
 
64
- if src and name == :content
75
+ if src and name == :content
65
76
  # the only content is out of line
66
77
  entry.send( "#{name}=".to_sym, "")
67
78
  entry.send(name.to_sym)["src"] = src
@@ -74,10 +85,10 @@ module REXML # :nodoc: all
74
85
  # content is the serialized content of the <div> wrapper
75
86
  entry.send( "#{name}=".to_sym, div )
76
87
  else
77
- raw = text.text
88
+ raw = text.text || ""
78
89
  entry.send( "#{name}=", raw )
79
90
  end
80
-
91
+
81
92
  if text.attributes["xml:base"]
82
93
  entry.send(name.to_sym).base = text.attributes["xml:base"]
83
94
  end
@@ -91,7 +102,7 @@ module REXML # :nodoc: all
91
102
  def fill_elem_element(top, kind)
92
103
  each_atom_element(kind) do |elem|
93
104
  person = top.send("#{kind}s".to_sym).new
94
-
105
+
95
106
  ["name", "uri", "email"].each do |name|
96
107
  person.send("#{name}=".to_sym, elem.get_atom_text(name))
97
108
  end
@@ -105,7 +116,11 @@ module REXML # :nodoc: all
105
116
  thing.class.attrs.each do |name,req|
106
117
  value = elem.ns_attr name.to_s
107
118
  if value and name == :href
108
- thing[name.to_s] = (top.base.to_uri + value).to_s
119
+ begin
120
+ thing[name.to_s] = (top.base.to_uri + value).to_s
121
+ rescue URI::BadURIError
122
+ raise "Document contains relative URIs and no xml:base. You must pass a base URI to #parse()"
123
+ end
109
124
  elsif value
110
125
  thing[name.to_s] = value
111
126
  end
@@ -145,10 +160,7 @@ module REXML # :nodoc: all
145
160
  fill_attr_element(entry, v, k)
146
161
  end
147
162
 
148
- # extension elements
149
- get_extensions.each do |elem|
150
- entry.extensions << elem.dup # otherwise they get removed from the doc
151
- end
163
+ copy_extensions(entry.extensions)
152
164
 
153
165
  entry
154
166
  end
@@ -189,10 +201,7 @@ module REXML # :nodoc: all
189
201
  feed << elem.to_atom_entry(feed.base)
190
202
  end
191
203
 
192
- get_extensions.each do |elem|
193
- # have to duplicate them, or they'll get removed from the doc
194
- feed.extensions << elem.dup
195
- end
204
+ copy_extensions(feed.extensions)
196
205
 
197
206
  feed
198
207
  end
data/lib/atom/yaml.rb CHANGED
@@ -62,36 +62,51 @@ module Atom
62
62
  def to_yaml_type # :nodoc:
63
63
  '!necronomicorp.com,2006/entry'
64
64
  end
65
-
65
+
66
+ def to_yaml( opts = {} ) # :nodoc:
67
+ YAML::quick_emit( object_id, opts ) do |out|
68
+ out.map( taguri, to_yaml_style ) do |map|
69
+ self.to_yaml_properties.each do |m|
70
+ map.add( m[1..-1], instance_variable_get( m ) )
71
+ end
72
+ map.add("draft", true) if self.draft
73
+ end
74
+ end
75
+ end
76
+
66
77
  # parses an Atom::Entry from YAML
67
78
  def self.from_yaml yaml
68
79
  hash = if yaml.kind_of?(Hash); yaml else YAML.load(yaml); end
69
80
 
70
81
  entry = Atom::Entry.new
71
82
 
72
- entry.title = hash["title"]
73
- entry.summary = hash["summary"]
74
-
75
- elem_constructs = {"authors" => entry.authors, "contributors" => entry.contributors, "links" => entry.links, "categories" => entry.categories}
83
+ ["id", "published", "updated", "title", "summary", "draft"].each do |name|
84
+ entry.send("#{name}=".to_sym, hash[name])
85
+ end
86
+
87
+ elem_constructs = {"authors" => entry.authors,
88
+ "contributors" => entry.contributors,
89
+ "links" => entry.links,
90
+ "categories" => entry.categories}
76
91
 
77
92
  elem_constructs.each do |type,ary|
78
93
  hash[type] ||= []
79
-
94
+
80
95
  hash[type].each do |yelem|
81
96
  elem = ary.new
82
97
 
83
98
  elem.class.attrs.each do |attrb,req|
84
99
  elem[attrb.to_s] = yelem[attrb.to_s]
85
100
  end
86
-
101
+
87
102
  elem.class.elements.each do |name,kind,req|
88
103
  elem.send("#{name}=".to_sym, yelem[name.to_s])
89
104
  end
90
105
  end
91
106
  end
92
107
 
93
- # this adds more categories, and could cause conflicts
94
108
  entry.tag_with hash["tags"]
109
+
95
110
  entry.content = hash["content"]
96
111
  entry.content["type"] = hash["type"] if hash["type"]
97
112
 
@@ -44,12 +44,12 @@ END
44
44
  assert_equal "This really is a horrendous mess.", last.text
45
45
  =end
46
46
  end
47
-
47
+
48
48
  def test_text_construct_text
49
49
  entry = Atom::Entry.new
50
50
 
51
51
  assert_nil entry.title
52
- assert_equal "", entry.title.to_s
52
+ assert_equal "", entry.title.to_s
53
53
 
54
54
  entry.title = "<3"
55
55
 
@@ -124,6 +124,20 @@ END
124
124
  assert_equal("", entry.content.to_s)
125
125
  end
126
126
 
127
+ def test_multiple
128
+ entry = Atom::Entry.new
129
+
130
+ link = Atom::Link.new
131
+ link["href"] = "http://example.org/"
132
+
133
+ assert_raises(ArgumentError) { entry.authors << "test" }
134
+ assert_raises(ArgumentError) { entry.authors << link }
135
+
136
+ entry.links << link
137
+
138
+ assert_equal 1, entry.links.length
139
+ end
140
+
127
141
  require "date"
128
142
  def test_date_construct
129
143
  today = Date.today
data/test/test_general.rb CHANGED
@@ -46,30 +46,43 @@ class AtomTest < Test::Unit::TestCase
46
46
  assert_has_category(xml, "tags")
47
47
  end
48
48
 
49
- def test_snarf_yaml
50
- yaml = """title: testing YAML
49
+ def test_devour_yaml
50
+ time = Time.parse "2007-01-18T12:37:46Z"
51
+
52
+ yaml = <<END
53
+ title: testing YAML
54
+ draft: yes
55
+
51
56
  authors:
52
57
  - name: Mr. Safe
53
58
  uri: http://example.com/
59
+
54
60
  links:
55
61
  - href: http://atomenabled.org/
56
- content: not much here\
57
- """
62
+
63
+ content: not much here
64
+
65
+ updated: #{time.iso8601}
66
+ END
58
67
 
59
68
  entry = Atom::Entry.from_yaml(yaml)
60
69
 
61
70
  assert_equal("testing YAML", entry.title.to_s)
62
71
 
72
+ assert entry.draft
73
+
63
74
  assert_equal(1, entry.authors.length)
64
75
  assert_equal("Mr. Safe", entry.authors.first.name)
65
76
  assert_equal("http://example.com/", entry.authors.first.uri)
66
-
77
+
67
78
  assert_equal(1, entry.links.length)
68
79
  assert_equal("http://atomenabled.org/", entry.links.first["href"])
69
80
 
70
81
  assert_equal("not much here", entry.content.to_s)
82
+
83
+ assert_equal(time, entry.updated)
71
84
  end
72
-
85
+
73
86
  def assert_has_category xml, term
74
87
  assert_not_nil(REXML::XPath.match(xml, "/entry/category[@term = #{term}]"))
75
88
  end
@@ -85,10 +98,10 @@ content: not much here\
85
98
  def get_elements entry
86
99
  xml = entry.to_xml
87
100
 
88
- assert_equal(entry.to_s, Atom::Entry.parse(xml).to_s)
89
-
101
+ assert_equal(entry.to_s, Atom::Entry.parse(xml).to_s)
102
+
90
103
  base_check xml
91
-
104
+
92
105
  xml
93
106
  end
94
107
 
data/test/test_http.rb CHANGED
@@ -150,24 +150,31 @@ class AtomHTTPTest < Test::Unit::TestCase
150
150
  # no credentials
151
151
  assert_raises(Atom::Unauthorized) { get_root }
152
152
 
153
+ # incorrect credentials
153
154
  @http.user = USER
154
155
  @http.pass = "incorrect_password"
155
156
 
156
157
  one_shot
157
158
 
158
- # incorrect credentials
159
159
  assert_raises(Atom::Unauthorized) { get_root }
160
160
 
161
+ # no credentials, fancy block
162
+ @http.when_auth do nil end
163
+
164
+ one_shot
165
+
166
+ assert_raises(Atom::Unauthorized) { get_root }
167
+
168
+ # correct credentials, fancy block
161
169
  @http.when_auth do |abs_url,realm|
162
170
  assert_equal "http://localhost:#{@port}/", abs_url
163
171
  assert_equal REALM, realm
164
172
 
165
173
  [USER, PASS]
166
174
  end
167
-
175
+
168
176
  one_shot
169
-
170
- # correct credentials
177
+
171
178
  assert_authenticates
172
179
  end
173
180
 
@@ -218,11 +225,8 @@ class AtomHTTPTest < Test::Unit::TestCase
218
225
  assert_equal USER, p[:Username]
219
226
  assert_match /^UsernameToken /, xwsse
220
227
 
221
- # un-base64 in preparation for SHA1-ing
222
- nonce = p[:Nonce].unpack("m").first
223
-
224
228
  # Base64( SHA1( Nonce + CreationTimestamp + Password ) )
225
- pd_string = nonce + p[:Created] + PASS
229
+ pd_string = p[:Nonce] + p[:Created] + PASS
226
230
  password_digest = [Digest::SHA1.digest(pd_string)].pack("m").chomp
227
231
 
228
232
  assert_equal password_digest, p[:PasswordDigest]
data/test/test_xml.rb CHANGED
@@ -6,12 +6,12 @@ require "atom/service"
6
6
  class AtomTest < Test::Unit::TestCase
7
7
  def test_text_type_text
8
8
  entry = get_entry
9
-
9
+
10
10
  entry.title = "Atom-drunk pirates run amok!"
11
11
  assert_equal("text", entry.title["type"])
12
12
 
13
13
  xml = get_elements entry
14
-
14
+
15
15
  assert_equal("Atom-drunk pirates run amok!", xml.elements["/entry/title"].text)
16
16
  end
17
17
 
@@ -34,17 +34,26 @@ class AtomTest < Test::Unit::TestCase
34
34
  entry.title["type"] = "xhtml"
35
35
 
36
36
  xml = get_elements entry
37
-
37
+
38
38
  base_check xml
39
39
 
40
40
  assert_equal(XHTML::NS, xml.elements["/entry/title/div"].namespace)
41
41
  assert_equal("run amok", xml.elements["/entry/title/div/em"].text)
42
42
  end
43
43
 
44
+ def test_html_text_with_entities
45
+ entry = get_entry
46
+
47
+ entry.title = "Atoms discovered to be smaller than 1&mu;m"
48
+ entry.title["type"] = "html"
49
+
50
+ assert_match(/&amp;mu;/, entry.to_s)
51
+ end
52
+
44
53
  def test_author
45
54
  entry = get_entry
46
55
  a = entry.authors.new
47
-
56
+
48
57
  a.name= "Brendan Taylor"
49
58
  a.uri = "http://necronomicorp.com/blog/"
50
59
 
@@ -111,6 +120,32 @@ class AtomTest < Test::Unit::TestCase
111
120
  assert_equal("http://purl.org/", xml.elements["/entry/test"].namespace)
112
121
  end
113
122
 
123
+ def test_roundtrip_extension
124
+ entry = Atom::Entry.parse("<entry xmlns='http://www.w3.org/2005/Atom' xmlns:nil='http://necronomicorp.com/nil'><nil:ext/></entry>")
125
+
126
+ assert_match(/xmlns:nil='http:\/\/necronomicorp.com\/nil'/, entry.to_s)
127
+ end
128
+
129
+ def test_app_control
130
+ entry = get_entry
131
+
132
+ assert !entry.draft
133
+
134
+ assert_nil get_elements(entry).elements["/entry/control"]
135
+
136
+ entry.draft = true
137
+
138
+ xml = get_elements entry
139
+
140
+ assert_equal Atom::PP_NS, xml.elements["/entry/control"].namespace
141
+ assert_equal Atom::PP_NS, xml.elements["/entry/control/draft"].namespace
142
+ assert_equal "yes", xml.elements["/entry/control/draft"].text
143
+
144
+ entry2 = Atom::Entry.parse xml
145
+
146
+ assert entry.draft
147
+ end
148
+
114
149
  def test_extensive_enty_parsing
115
150
  str = '<entry xmlns="http://www.w3.org/2005/Atom">
116
151
  <title>Atom draft-07 snapshot</title>
@@ -141,10 +176,10 @@ str = '<entry xmlns="http://www.w3.org/2005/Atom">
141
176
  </entry>'
142
177
 
143
178
  entry = Atom::Entry.parse(str)
144
-
179
+
145
180
  assert_equal("Atom draft-07 snapshot", entry.title.to_s)
146
181
  assert_equal("tag:example.org,2003:3.2397", entry.id)
147
-
182
+
148
183
  assert_equal(Time.parse("2005-07-31T12:29:29Z"), entry.updated)
149
184
  assert_equal(Time.parse("2003-12-13T08:29:29-04:00"), entry.published)
150
185
 
@@ -162,16 +197,16 @@ str = '<entry xmlns="http://www.w3.org/2005/Atom">
162
197
  assert_equal("Mark Pilgrim", entry.authors.first.name)
163
198
  assert_equal("http://example.org/", entry.authors.first.uri)
164
199
  assert_equal("f8dy@example.com", entry.authors.first.email)
165
-
200
+
166
201
  assert_equal(2, entry.contributors.length)
167
202
  assert_equal("Sam Ruby", entry.contributors.first.name)
168
203
  assert_equal("Joe Gregorio", entry.contributors.last.name)
169
-
204
+
170
205
  assert_equal("xhtml", entry.content["type"])
171
-
206
+
172
207
  assert_match("<p><i>[Update: The Atom draft is finished.]</i></p>",
173
208
  entry.content.to_s)
174
-
209
+
175
210
  assert_equal("http://diveintomark.org/", entry.content.base)
176
211
  # XXX unimplemented
177
212
  # assert_equal("en", entry.content.lang)
@@ -239,7 +274,7 @@ END
239
274
  # XXX unimplemented
240
275
  # assert_equal("http://www.example.com/", feed.generator["uri"])
241
276
  # assert_equal("1.0", feed.generator["version"])
242
-
277
+
243
278
  assert_equal(1, feed.entries.length)
244
279
  assert_equal "Atom draft-07 snapshot", feed.entries.first.title.to_s
245
280
  end
@@ -259,6 +294,18 @@ END
259
294
  assert_equal "<p>...&amp; as a result of this, I submit that <var>pi</var> &lt; 4", entry.summary.html.strip
260
295
  end
261
296
 
297
+ def test_parse_goofy_entries
298
+ xml = <<END
299
+ <entry xmlns="http://www.w3.org/2005/Atom">
300
+ <content type="html"></content>
301
+ </entry>
302
+ END
303
+
304
+ entry = Atom::Entry.parse(xml)
305
+
306
+ assert_equal("", entry.content.to_s)
307
+ end
308
+
262
309
  def test_parse_outofline_content
263
310
  xml = <<END
264
311
  <entry xmlns="http://www.w3.org/2005/Atom">
@@ -267,7 +314,7 @@ Summary doesn't have src.
267
314
  </summary>
268
315
  </entry>
269
316
  END
270
-
317
+
271
318
  entry = Atom::Entry.parse xml
272
319
 
273
320
  assert_raises(RuntimeError) { entry.summary["src"] }
@@ -291,7 +338,7 @@ END
291
338
  entry = Atom::Entry.new
292
339
 
293
340
  entry.base = "http://necronomicorp.com/nil"
294
-
341
+
295
342
  base = get_elements(entry).root.attributes["xml:base"]
296
343
  assert_equal "http://necronomicorp.com/nil", base
297
344
 
@@ -304,11 +351,11 @@ END
304
351
  def test_relative_base
305
352
  base_url = "http://www.tbray.org/ongoing/ongoing.atom"
306
353
  doc = "<entry xmlns='http://www.w3.org/2005/Atom' xml:base='When/200x/2006/10/11/'/>"
307
-
354
+
308
355
  entry = Atom::Entry.parse(doc, base_url)
309
356
  assert_equal("http://www.tbray.org/ongoing/When/200x/2006/10/11/", entry.base)
310
357
  end
311
-
358
+
312
359
  def test_edit_url
313
360
  doc = <<END
314
361
  <entry xmlns="http://www.w3.org/2005/Atom"><link rel="edit"/></entry>
@@ -324,7 +371,7 @@ END
324
371
  entry = Atom::Entry.parse(doc)
325
372
 
326
373
  assert_nil(entry.edit_url)
327
-
374
+
328
375
  doc = <<END
329
376
  <entry xmlns="http://www.w3.org/2005/Atom">
330
377
  <link rel="edit" href="http://necronomicorp.com/nil"/>
@@ -336,7 +383,6 @@ END
336
383
  assert_equal("http://necronomicorp.com/nil", entry.edit_url)
337
384
  end
338
385
 
339
-
340
386
  def assert_has_category xml, term
341
387
  assert_not_nil(REXML::XPath.match(xml, "/entry/category[@term = #{term}]"))
342
388
  end
@@ -353,10 +399,10 @@ END
353
399
  def get_elements entry
354
400
  xml = entry.to_xml
355
401
 
356
- assert_equal(entry.to_s, Atom::Entry.parse(xml).to_s)
357
-
402
+ assert_equal(entry.to_s, Atom::Entry.parse(xml).to_s)
403
+
358
404
  base_check xml
359
-
405
+
360
406
  xml
361
407
  end
362
408