ratom 0.5.2 → 0.6.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.
@@ -1,3 +1,11 @@
1
+ == 0.6.0 2009-19-03
2
+
3
+ * Now depends on libxml-ruby 1.1.2.
4
+ * Added support for hreflang on links. (David Arango)
5
+ * Update to work with latest version of libxml-ruby. (oortle & me)
6
+ * Content::Text and Content::Xhtml can now be created with String's like Content::Html.
7
+ * Make sure Atom::Generator outputs the generator name as the text of the element.
8
+
1
9
  == 0.5.2 2008-12-06
2
10
 
3
11
  * Remove whitespace modification in content. (dlisboa)
@@ -60,7 +60,7 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
60
60
  # == Optional
61
61
  p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
62
62
  # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
63
- p.extra_deps = [['libxml-ruby', '>= 0.8.0']]
63
+ p.extra_deps = [['libxml-ruby', '>= 1.1.2']]
64
64
 
65
65
  #p.spec_extras = {} # A hash of extra values to set in the gemspec.
66
66
 
@@ -8,7 +8,7 @@
8
8
  require 'forwardable'
9
9
  require 'delegate'
10
10
  require 'rubygems'
11
- gem 'libxml-ruby', '>= 0.8.0'
11
+ gem 'libxml-ruby', '>= 1.1.2'
12
12
  require 'xml/libxml'
13
13
  require 'atom/xml/parser.rb'
14
14
 
@@ -84,6 +84,14 @@ module Atom # :nodoc:
84
84
 
85
85
  yield(self) if block_given?
86
86
  end
87
+
88
+ def to_xml(nodeonly = true, name = 'generator', namespace = nil, namespace_map = Atom::Xml::NamespaceMap.new)
89
+ node = XML::Node.new("#{namespace_map.prefix(Atom::NAMESPACE, name)}")
90
+ node << @name if @name
91
+ node['uri'] = @uri if @uri
92
+ node['version'] = @version if @version
93
+ node
94
+ end
87
95
  end
88
96
 
89
97
  # Represents a Category as defined by the Atom Syndication Format specification.
@@ -185,9 +193,15 @@ module Atom # :nodoc:
185
193
  # Text content within an Atom document.
186
194
  class Text < Base
187
195
  attribute :type, :'xml:lang'
188
- def initialize(xml)
189
- super(xml.read_string)
190
- parse(xml, :once => true)
196
+ def initialize(o)
197
+ case o
198
+ when String
199
+ super(o)
200
+ @type = "text"
201
+ when XML::Reader
202
+ super(o.read_string)
203
+ parse(o, :once => true)
204
+ end
191
205
  end
192
206
 
193
207
  def to_xml(nodeonly = true, name = 'content', namespace = nil, namespace_map = Atom::Xml::NamespaceMap.new)
@@ -241,22 +255,29 @@ module Atom # :nodoc:
241
255
  XHTML = 'http://www.w3.org/1999/xhtml'
242
256
  attribute :type, :'xml:lang'
243
257
 
244
- def initialize(xml)
245
- super("")
246
- parse(xml, :once => true)
247
- starting_depth = xml.depth
248
-
249
- # Get the next element - should be a div according to the atom spec
250
- while xml.read == 1 && xml.node_type != XML::Reader::TYPE_ELEMENT; end
251
-
252
- if xml.local_name == 'div' && xml.namespace_uri == XHTML
253
- set_content(xml.read_inner_xml.strip.gsub(/\s+/, ' '))
254
- else
255
- set_content(xml.read_outer_xml)
258
+ def initialize(o)
259
+ case o
260
+ when String
261
+ super(o)
262
+ @type = "xhtml"
263
+ when XML::Reader
264
+ super("")
265
+ xml = o
266
+ parse(xml, :once => true)
267
+ starting_depth = xml.depth
268
+
269
+ # Get the next element - should be a div according to the atom spec
270
+ while xml.read && xml.node_type != XML::Reader::TYPE_ELEMENT; end
271
+
272
+ if xml.local_name == 'div' && xml.namespace_uri == XHTML
273
+ set_content(xml.read_inner_xml.strip.gsub(/\s+/, ' '))
274
+ else
275
+ set_content(xml.read_outer_xml)
276
+ end
277
+
278
+ # get back to the end of the element we were created with
279
+ while xml.read == 1 && xml.depth > starting_depth; end
256
280
  end
257
-
258
- # get back to the end of the element we were created with
259
- while xml.read == 1 && xml.depth > starting_depth; end
260
281
  end
261
282
 
262
283
  def to_xml(nodeonly = true, name = 'content', namespace = nil, namespace_map = Atom::Xml::NamespaceMap.new)
@@ -533,7 +554,7 @@ module Atom # :nodoc:
533
554
  o.read
534
555
  parse(o)
535
556
  else
536
- raise ArgumentError, "Entry created with node other than atom:entry: #{o.name}"
557
+ raise ParseError, "Entry created with node other than atom:entry: #{o.name}"
537
558
  end
538
559
  when Hash
539
560
  o.each do |k,v|
@@ -573,7 +594,11 @@ module Atom # :nodoc:
573
594
  #
574
595
  # Returns the first link with rel == 'alternate' that matches the given type.
575
596
  def alternate(type = nil)
576
- detect { |link| (link.rel.nil? || link.rel == Link::Rel::ALTERNATE) && (type.nil? || type == link.type) }
597
+ detect { |link|
598
+ (link.rel.nil? || link.rel == Link::Rel::ALTERNATE) && (type.nil? || type == link.type) && (link.hreflang.nil?)
599
+ } || detect { |link|
600
+ (link.rel.nil? || link.rel == Link::Rel::ALTERNATE) && (type.nil? || type == link.type)
601
+ }
577
602
  end
578
603
 
579
604
  # Get all alternates.
@@ -654,7 +679,7 @@ module Atom # :nodoc:
654
679
  end
655
680
 
656
681
  include Xml::Parseable
657
- attribute :href, :rel, :type, :length
682
+ attribute :href, :rel, :type, :length, :hreflang
658
683
 
659
684
  # Create a link.
660
685
  #
@@ -669,7 +694,7 @@ module Atom # :nodoc:
669
694
  raise ArgumentError, "Link created with node other than atom:link: #{o.name}"
670
695
  end
671
696
  when Hash
672
- [:href, :rel, :type, :length].each do |attr|
697
+ [:href, :rel, :type, :length, :hreflang].each do |attr|
673
698
  self.send("#{attr}=", o[attr])
674
699
  end
675
700
  else
@@ -7,8 +7,8 @@
7
7
  module Atom #:nodoc:
8
8
  module VERSION #:nodoc:
9
9
  MAJOR = 0
10
- MINOR = 5
11
- TINY = 2
10
+ MINOR = 6
11
+ TINY = 0
12
12
 
13
13
  STRING = [MAJOR, MINOR, TINY].join('.')
14
14
  end
@@ -261,9 +261,9 @@ module Atom
261
261
  xml =
262
262
  case o
263
263
  when String
264
- XML::Reader.new(o)
264
+ XML::Reader.string(o)
265
265
  when IO
266
- XML::Reader.new(o.read)
266
+ XML::Reader.io(o)
267
267
  when URI
268
268
  raise ArgumentError, "#{class_name}.load only handles http URIs" if o.scheme != 'http'
269
269
  response = nil
@@ -283,7 +283,7 @@ module Atom
283
283
  end
284
284
  case response
285
285
  when Net::HTTPSuccess
286
- XML::Reader.new(response.body)
286
+ XML::Reader.string(response.body)
287
287
  when nil
288
288
  raise ArgumentError.new("nil response to #{o}")
289
289
  else
@@ -294,9 +294,9 @@ module Atom
294
294
  end
295
295
 
296
296
  if error_handler
297
- xml.set_error_handler(&error_handler)
297
+ XML::Error.set_handler(&error_handler)
298
298
  else
299
- xml.set_error_handler do |reader, message, severity, base, line|
299
+ XML::Error.set_handler do |reader, message, severity, base, line|
300
300
  if severity == XML::Reader::SEVERITY_ERROR
301
301
  raise ParseError, "#{message} at #{line} in #{o}"
302
302
  end
@@ -654,6 +654,20 @@ describe Atom do
654
654
  @entry.links.map{|l| l.href }.should include('http://www.snellspace.com/public/linktests/example')
655
655
  end
656
656
  end
657
+
658
+ describe 'linktest9' do
659
+ before(:all) do
660
+ @entry = @entries[8]
661
+ end
662
+
663
+ it "should parse all links" do
664
+ @entry.should have(3).links
665
+ end
666
+
667
+ it "should pick the alternate without hreflang" do
668
+ @entry.alternate.href.should == 'http://www.snellspace.com/public/linktests/alternate'
669
+ end
670
+ end
657
671
  end
658
672
 
659
673
  describe 'ordertest.atom' do
@@ -1071,21 +1085,40 @@ describe Atom do
1071
1085
 
1072
1086
  describe 'single custom_extensions' do
1073
1087
  before(:all) do
1074
- Atom::Entry.add_extension_namespace :custom, "http://custom.namespace"
1075
- Atom::Entry.element "custom:property", :class => Atom::Extensions::Property
1088
+ Atom::Entry.add_extension_namespace :custom, "http://single.custom.namespace"
1089
+ Atom::Entry.element "custom:singleproperty", :class => Atom::Extensions::Property
1076
1090
  @entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry_with_single_custom_extension.atom'))
1077
1091
  end
1078
1092
 
1079
1093
  it "should load single custom extensions for entry" do
1080
- @entry.custom_property.should_not be_nil
1094
+ @entry.custom_singleproperty.should_not be_nil
1081
1095
  end
1082
1096
 
1083
1097
  it "should load correct data for custom extensions for entry" do
1084
- @entry.custom_property.name.should == 'foo'
1085
- @entry.custom_property.value.should == 'bar'
1098
+ @entry.custom_singleproperty.name.should == 'foo'
1099
+ @entry.custom_singleproperty.value.should == 'bar'
1086
1100
  end
1087
1101
  end
1088
-
1102
+
1103
+ describe 'write_support' do
1104
+ # FIXME this example depends on "custom_extensions" for configuring Atom::Entry
1105
+ before(:all) do
1106
+ @entry = Atom::Entry.new
1107
+ @entry.ns_alias_property << Atom::Extensions::Property.new('ratom', 'rocks')
1108
+ @entry.ns_alias_property << Atom::Extensions::Property.new('custom extensions', 'also rock')
1109
+ @node = @entry.to_xml(true)
1110
+ end
1111
+
1112
+ it "should_write_custom_extensions_on_to_xml" do
1113
+ @node.children.size.should == 2
1114
+ ratom, custom_extensions = @node.children
1115
+ ratom.attributes["name"].should == "ratom"
1116
+ ratom.attributes["value"].should == "rocks"
1117
+ custom_extensions.attributes["name"].should == "custom extensions"
1118
+ custom_extensions.attributes["value"].should == "also rock"
1119
+ end
1120
+ end
1121
+
1089
1122
  describe Atom::Link do
1090
1123
  before(:each) do
1091
1124
  @href = 'http://example.org/next'
@@ -1185,6 +1218,22 @@ describe Atom do
1185
1218
  end
1186
1219
  end
1187
1220
 
1221
+ describe Atom::Content::Text do
1222
+ it "should be createable from a string" do
1223
+ txt = Atom::Content::Text.new("This is some text")
1224
+ txt.should == "This is some text"
1225
+ txt.type.should == "text"
1226
+ end
1227
+ end
1228
+
1229
+ describe Atom::Content::Xhtml do
1230
+ it "should be createable from a string" do
1231
+ txt = Atom::Content::Xhtml.new("<p>This is some text</p>")
1232
+ txt.should == "<p>This is some text</p>"
1233
+ txt.type.should == "xhtml"
1234
+ end
1235
+ end
1236
+
1188
1237
  describe 'Atom::Category initializer' do
1189
1238
  it "should create a empty category" do
1190
1239
  lambda { Atom::Category.new }.should_not raise_error
@@ -1233,18 +1282,23 @@ describe Atom do
1233
1282
  end
1234
1283
 
1235
1284
  it "should create from a hash" do
1236
- source = Atom::Generator.new(:name => 'generator', :uri => 'http://generator')
1237
- source.name.should == 'generator'
1238
- source.uri.should == 'http://generator'
1285
+ generator = Atom::Generator.new(:name => 'generator', :uri => 'http://generator')
1286
+ generator.name.should == 'generator'
1287
+ generator.uri.should == 'http://generator'
1239
1288
  end
1240
1289
 
1241
1290
  it "should create from a block" do
1242
- source = Atom::Generator.new do |source|
1243
- source.name = 'generator'
1244
- source.uri = 'http://generator'
1291
+ generator = Atom::Generator.new do |generator|
1292
+ generator.name = 'generator'
1293
+ generator.uri = 'http://generator'
1245
1294
  end
1246
- source.name.should == 'generator'
1247
- source.uri.should == 'http://generator'
1295
+ generator.name.should == 'generator'
1296
+ generator.uri.should == 'http://generator'
1297
+ end
1298
+
1299
+ it "should output the name as the text of the generator element" do
1300
+ generator = Atom::Generator.new({:name => "My Generator"})
1301
+ generator.to_xml(true).to_s.should == "<generator>My Generator</generator>"
1248
1302
  end
1249
1303
  end
1250
1304
  end
@@ -90,4 +90,14 @@
90
90
  <link href="http://www.snellspace.com/public/linktests/alternate" />
91
91
  </entry>
92
92
 
93
+ <entry>
94
+ <id>tag:snellspace.com,2006:/atom/conformance/linktest/8</id>
95
+ <title>Entry with links in different languages</title>
96
+ <updated>2005-01-18T15:00:06Z</updated>
97
+ <summary>The aggregator should pick the second link as alternate.</summary>
98
+ <link rel="alternate" hreflang="es" href="http://www.snellspace.com/es/public/linktests/alternate" />
99
+ <link rel="alternate" href="http://www.snellspace.com/public/linktests/alternate" />
100
+ <link rel="alternate" hreflang="cat" href="http://www.snellspace.com/cat/public/linktests/alternate" />
101
+ </entry>
102
+
93
103
  </feed>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ratom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peerworks
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-12-06 00:00:00 +10:30
13
+ date: 2009-03-19 00:00:00 +10:30
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -21,7 +21,7 @@ dependencies:
21
21
  requirements:
22
22
  - - ">="
23
23
  - !ruby/object:Gem::Version
24
- version: 0.8.0
24
+ version: 1.1.2
25
25
  version:
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: hoe