feedtools 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/CHANGELOG +9 -2
  2. data/lib/feed_tools.rb +489 -62
  3. data/rakefile +1 -1
  4. metadata +2 -2
data/CHANGELOG CHANGED
@@ -1,6 +1,13 @@
1
+ == FeedTools 0.2.7
2
+ * added support for Atom 1.0 output
3
+ * improved support for Atom parsing and handling
4
+ * added no content string option to keep the feed validator happy
5
+ * greatly improved handling of timestamps and feed item sorting
6
+ * added aliases for the Atom 1.0 elements that were renamed
7
+ * feed merging is now threaded
1
8
  == FeedTools 0.2.6
2
- * Added support for merging feeds
3
- * Vastly improved handling of feed creation
9
+ * added support for merging feeds
10
+ * vastly improved handling of feed creation
4
11
  == FeedTools 0.2.5
5
12
  * fixed multiple rows being created in the cache after a 301 redirection
6
13
  * fixed broken table creation for postgresql and sqlite
data/lib/feed_tools.rb CHANGED
@@ -25,7 +25,7 @@ FEED_TOOLS_ENV = ENV['FEED_TOOLS_ENV'] ||
25
25
  ENV['RAILS_ENV'] ||
26
26
  'production' # :nodoc:
27
27
 
28
- FEED_TOOLS_VERSION = "0.2.6"
28
+ FEED_TOOLS_VERSION = "0.2.7"
29
29
 
30
30
  $:.unshift(File.dirname(__FILE__))
31
31
  $:.unshift(File.dirname(__FILE__) + "/../../activerecord/lib")
@@ -305,6 +305,7 @@ module FeedTools
305
305
  @feed_cache = DatabaseFeedCache
306
306
  @user_agent = "FeedTools/#{FEED_TOOLS_VERSION} " +
307
307
  "+http://www.sporkmonger.com/projects/feedtools/"
308
+ @no_content_string = "[no description]"
308
309
 
309
310
  # Returns the current caching mechanism.
310
311
  def FeedTools.feed_cache
@@ -377,6 +378,17 @@ module FeedTools
377
378
  def FeedTools.user_agent=(new_user_agent)
378
379
  @user_agent = new_user_agent
379
380
  end
381
+
382
+ # Returns the currently used no content string.
383
+ def FeedTools.no_content_string
384
+ return @no_content_string
385
+ end
386
+
387
+ # Sets the no content string to use when a feed is missing a content element.
388
+ # Used only for xml output.
389
+ def FeedTools.no_content_string=(new_no_content_string)
390
+ @no_content_string = new_no_content_string
391
+ end
380
392
 
381
393
  # Returns true if the html tidy module can be used.
382
394
  #
@@ -548,11 +560,31 @@ module FeedTools
548
560
  end
549
561
  end
550
562
 
551
- # Returns true if the parameter appears to be a valid url
552
- def FeedTools.is_url?(url)
563
+ # Converts a url into a tag uri
564
+ def FeedTools.build_tag_uri(url, date)
565
+ unless url.kind_of? String
566
+ raise ArgumentError, "Expected String, got #{url.class.name}"
567
+ end
568
+ unless date.kind_of? Time
569
+ raise ArgumentError, "Expected Time, got #{date.class.name}"
570
+ end
571
+ tag_uri = normalize_url(url)
572
+ host = URI.parse(tag_uri).host
573
+ tag_uri.gsub!(/^(http|ftp|file):\/*/, "")
574
+ tag_uri.gsub!(/#/, "/")
575
+ tag_uri = "tag:#{host},#{date.strftime('%Y-%m-%d')}:" +
576
+ "#{tag_uri[(tag_uri.index(host) + host.size)..-1]}"
577
+ return tag_uri
578
+ end
579
+
580
+ # Returns true if the parameter appears to be a valid uri
581
+ def FeedTools.is_uri?(url)
553
582
  return false if url.nil?
554
583
  begin
555
584
  uri = URI.parse(url)
585
+ if uri.scheme.nil? || uri.scheme == ""
586
+ return false
587
+ end
556
588
  rescue URI::InvalidURIError
557
589
  return false
558
590
  end
@@ -699,8 +731,18 @@ module FeedTools
699
731
  def FeedTools.build_merged_feed(url_array)
700
732
  return nil if url_array.nil?
701
733
  merged_feed = Feed.new
734
+ retrieved_feeds = []
735
+ feed_threads = []
702
736
  url_array.each do |feed_url|
703
- feed = Feed.open(feed_url)
737
+ feed_threads << Thread.new do
738
+ feed = Feed.open(feed_url)
739
+ retrieved_feeds << feed
740
+ end
741
+ end
742
+ feed_threads.each do |thread|
743
+ thread.join
744
+ end
745
+ retrieved_feeds.each do |feed|
704
746
  merged_feed.entries.concat(
705
747
  feed.entries.collect do |entry|
706
748
  entry.title = "#{feed.title}: #{entry.title}"
@@ -1508,7 +1550,7 @@ module FeedTools
1508
1550
  end
1509
1551
  end
1510
1552
  if @link == "" || @link.nil?
1511
- if FeedTools.is_url? self.guid
1553
+ if FeedTools.is_uri? self.guid
1512
1554
  @link = self.guid
1513
1555
  end
1514
1556
  end
@@ -1562,7 +1604,7 @@ module FeedTools
1562
1604
  if @icon == ""
1563
1605
  @icon = FeedTools.unescape_entities(
1564
1606
  XPath.first(icon_node, "text()").to_s)
1565
- unless FeedTools.is_url? @icon
1607
+ unless FeedTools.is_uri? @icon
1566
1608
  @icon = ""
1567
1609
  end
1568
1610
  end
@@ -1581,19 +1623,20 @@ module FeedTools
1581
1623
  def author
1582
1624
  if @author.nil?
1583
1625
  @author = FeedTools::Feed::Author.new
1584
-
1585
- author_node = XPath.first(channel_node, "author")
1586
- if author_node.nil?
1587
- author_node = XPath.first(channel_node, "managingEditor")
1588
- end
1589
- if author_node.nil?
1590
- author_node = XPath.first(channel_node, "dc:author")
1591
- end
1592
- if author_node.nil?
1593
- author_node = XPath.first(channel_node, "dc:creator")
1594
- end
1595
- if author_node.nil?
1596
- author_node = XPath.first(channel_node, "atom:author")
1626
+ unless channel_node.nil?
1627
+ author_node = XPath.first(channel_node, "author")
1628
+ if author_node.nil?
1629
+ author_node = XPath.first(channel_node, "managingEditor")
1630
+ end
1631
+ if author_node.nil?
1632
+ author_node = XPath.first(channel_node, "dc:author")
1633
+ end
1634
+ if author_node.nil?
1635
+ author_node = XPath.first(channel_node, "dc:creator")
1636
+ end
1637
+ if author_node.nil?
1638
+ author_node = XPath.first(channel_node, "atom:author")
1639
+ end
1597
1640
  end
1598
1641
  unless author_node.nil?
1599
1642
  @author.raw = FeedTools.unescape_entities(
@@ -1771,6 +1814,149 @@ module FeedTools
1771
1814
  return @itunes_author
1772
1815
  end
1773
1816
 
1817
+ # Returns the feed item time
1818
+ def time
1819
+ if @time.nil?
1820
+ unless channel_node.nil?
1821
+ time_string = XPath.first(channel_node, "pubDate/text()").to_s
1822
+ if time_string == ""
1823
+ time_string = XPath.first(channel_node, "dc:date/text()").to_s
1824
+ end
1825
+ if time_string == ""
1826
+ time_string = XPath.first(channel_node, "issued/text()").to_s
1827
+ end
1828
+ if time_string == ""
1829
+ time_string = XPath.first(channel_node, "updated/text()").to_s
1830
+ end
1831
+ if time_string == ""
1832
+ time_string = XPath.first(channel_node, "time/text()").to_s
1833
+ end
1834
+ end
1835
+ begin
1836
+ if time_string != nil && time_string != ""
1837
+ @time = Time.parse(time_string) rescue self.succ_time
1838
+ elsif time_string == nil
1839
+ @time = self.succ_time
1840
+ end
1841
+ if @time == nil
1842
+ @time = Time.now
1843
+ end
1844
+ rescue
1845
+ @time = Time.now
1846
+ end
1847
+ end
1848
+ return @time
1849
+ end
1850
+
1851
+ # Sets the feed item time
1852
+ def time=(new_time)
1853
+ @time = new_time
1854
+ end
1855
+
1856
+ # Returns 1 second after the previous item's time.
1857
+ def succ_time #:nodoc:
1858
+ begin
1859
+ if feed.nil?
1860
+ return nil
1861
+ end
1862
+ feed.items
1863
+ unsorted_items = feed.instance_variable_get("@items")
1864
+ item_index = unsorted_items.index(self)
1865
+ if item_index.nil?
1866
+ return nil
1867
+ end
1868
+ if item_index <= 0
1869
+ return Time.now
1870
+ end
1871
+ previous_item = unsorted_items[item_index - 1]
1872
+ return previous_item.time.succ
1873
+ rescue
1874
+ return nil
1875
+ end
1876
+ end
1877
+ private :succ_time
1878
+
1879
+ # Returns the feed item updated time
1880
+ def updated
1881
+ if @updated.nil?
1882
+ unless channel_node.nil?
1883
+ updated_string = XPath.first(channel_node, "updated/text()").to_s
1884
+ if updated_string == ""
1885
+ updated_string = XPath.first(channel_node, "modified/text()").to_s
1886
+ end
1887
+ end
1888
+ if updated_string != nil && updated_string != ""
1889
+ @updated = Time.parse(updated_string) rescue nil
1890
+ else
1891
+ @updated = nil
1892
+ end
1893
+ end
1894
+ return @updated
1895
+ end
1896
+
1897
+ # Sets the feed item updated time
1898
+ def updated=(new_updated)
1899
+ @updated = new_updated
1900
+ end
1901
+
1902
+ # Returns the feed item issued time
1903
+ def issued
1904
+ if @issued.nil?
1905
+ unless channel_node.nil?
1906
+ issued_string = XPath.first(channel_node, "issued/text()").to_s
1907
+ if issued_string == ""
1908
+ issued_string = XPath.first(channel_node, "pubDate/text()").to_s
1909
+ end
1910
+ if issued_string == ""
1911
+ issued_string = XPath.first(channel_node, "dc:date/text()").to_s
1912
+ end
1913
+ if issued_string == ""
1914
+ issued_string = XPath.first(channel_node, "published/text()").to_s
1915
+ end
1916
+ end
1917
+ if issued_string != nil && issued_string != ""
1918
+ @issued = Time.parse(issued_string) rescue nil
1919
+ else
1920
+ @issued = nil
1921
+ end
1922
+ end
1923
+ return @issued
1924
+ end
1925
+
1926
+ # Sets the feed item issued time
1927
+ def issued=(new_issued)
1928
+ @issued = new_issued
1929
+ end
1930
+
1931
+ # Returns the feed item published time
1932
+ def published
1933
+ if @published.nil?
1934
+ unless channel_node.nil?
1935
+ published_string = XPath.first(channel_node, "published/text()").to_s
1936
+ if published_string == ""
1937
+ published_string = XPath.first(channel_node, "pubDate/text()").to_s
1938
+ end
1939
+ if published_string == ""
1940
+ published_string = XPath.first(channel_node, "dc:date/text()").to_s
1941
+ end
1942
+ if published_string == ""
1943
+ published_string = XPath.first(channel_node, "issued/text()").to_s
1944
+ end
1945
+ end
1946
+ if published_string != nil && published_string != ""
1947
+ @published = Time.parse(published_string) rescue nil
1948
+ else
1949
+ @published = nil
1950
+ end
1951
+ end
1952
+ return @published
1953
+ end
1954
+
1955
+ # Sets the feed item published time
1956
+ def published=(new_published)
1957
+ @published = new_published
1958
+ end
1959
+
1774
1960
  # Returns a list of the feed's categories
1775
1961
  def categories
1776
1962
  if @categories.nil?
@@ -1889,15 +2075,20 @@ module FeedTools
1889
2075
  # Returns the feed's copyright information
1890
2076
  def copyright
1891
2077
  if @copyright.nil?
1892
- @copyright = XPath.first(channel_node, "copyright/text()").to_s
1893
- if @copyright == ""
1894
- @copyright = XPath.first(channel_node, "dc:rights/text()").to_s
1895
- end
1896
- if @copyright == ""
1897
- @copyright = XPath.first(channel_node, "copyrights/text()").to_s
2078
+ unless channel_node.nil?
2079
+ @copyright = XPath.first(channel_node, "copyright/text()").to_s
2080
+ if @copyright == ""
2081
+ @copyright = XPath.first(channel_node, "rights/text()").to_s
2082
+ end
2083
+ if @copyright == ""
2084
+ @copyright = XPath.first(channel_node, "dc:rights/text()").to_s
2085
+ end
2086
+ if @copyright == ""
2087
+ @copyright = XPath.first(channel_node, "copyrights/text()").to_s
2088
+ end
2089
+ @copyright = FeedTools.sanitize_html(@copyright, :strip)
2090
+ @copyright = nil if @copyright == ""
1898
2091
  end
1899
- @copyright = FeedTools.sanitize_html(@copyright, :strip)
1900
- @copyright = nil if @copyright == ""
1901
2092
  end
1902
2093
  return @copyright
1903
2094
  end
@@ -2335,7 +2526,7 @@ module FeedTools
2335
2526
  end
2336
2527
  end
2337
2528
  end
2338
- elsif feed_type == "atom"
2529
+ elsif feed_type == "atom" && version == 0.3
2339
2530
  # normal atom format
2340
2531
  return xml_builder.feed("xmlns" => "http://purl.org/atom/ns#",
2341
2532
  "version" => version,
@@ -2345,6 +2536,19 @@ module FeedTools
2345
2536
  "mode" => "escaped",
2346
2537
  "type" => "text/html")
2347
2538
  end
2539
+ xml_builder.author do
2540
+ unless self.author.nil? || self.author.name.nil?
2541
+ xml_builder.name(self.author.name)
2542
+ else
2543
+ xml_builder.name("n/a")
2544
+ end
2545
+ unless self.author.nil? || self.author.email.nil?
2546
+ xml_builder.email(self.author.email)
2547
+ end
2548
+ unless self.author.nil? || self.author.url.nil?
2549
+ xml_builder.url(self.author.url)
2550
+ end
2551
+ end
2348
2552
  unless link.nil? || link == ""
2349
2553
  xml_builder.link("href" => link,
2350
2554
  "rel" => "alternate",
@@ -2365,6 +2569,74 @@ module FeedTools
2365
2569
  end
2366
2570
  end
2367
2571
  end
2572
+ elsif feed_type == "atom" && version == 1.0
2573
+ # normal atom format
2574
+ return xml_builder.feed("xmlns" => "http://www.w3.org/2005/Atom",
2575
+ "xml:lang" => language) do
2576
+ unless title.nil? || title == ""
2577
+ xml_builder.title(title,
2578
+ "type" => "html")
2579
+ end
2580
+ xml_builder.author do
2581
+ unless self.author.nil? || self.author.name.nil?
2582
+ xml_builder.name(self.author.name)
2583
+ else
2584
+ xml_builder.name("n/a")
2585
+ end
2586
+ unless self.author.nil? || self.author.email.nil?
2587
+ xml_builder.email(self.author.email)
2588
+ end
2589
+ unless self.author.nil? || self.author.url.nil?
2590
+ xml_builder.url(self.author.url)
2591
+ end
2592
+ end
2593
+ unless self.url.nil? || self.url == ""
2594
+ xml_builder.link("href" => self.url,
2595
+ "rel" => "self",
2596
+ "type" => "application/atom+xml")
2597
+ end
2598
+ unless self.link.nil? || self.link == ""
2599
+ xml_builder.link("href" => self.link,
2600
+ "rel" => "alternate",
2601
+ "type" => "text/html",
2602
+ "title" => self.title)
2603
+ end
2604
+ unless description.nil? || description == ""
2605
+ xml_builder.subtitle(description,
2606
+ "type" => "html")
2607
+ else
2608
+ xml_builder.subtitle(FeedTools.no_content_string,
2609
+ "type" => "html")
2610
+ end
2611
+ if self.updated != nil
2612
+ xml_builder.updated(self.updated.iso8601)
2613
+ elsif self.time != nil
2614
+ # Not technically correct, but a heck of a lot better
2615
+ # than the Time.now fall-back.
2616
+ xml_builder.updated(self.time.iso8601)
2617
+ else
2618
+ xml_builder.updated(Time.now.iso8601)
2619
+ end
2620
+ unless self.published.nil?
2621
+ xml_builder.published(self.published.iso8601)
2622
+ end
2623
+ xml_builder.generator("FeedTools - " +
2624
+ "http://www.sporkmonger.com/projects/feedtools")
2625
+ unless self.id.nil?
2626
+ unless FeedTools.is_uri? self.id
2627
+ raise "The unique id must be a URI."
2628
+ end
2629
+ xml_builder.id(self.id)
2630
+ else
2631
+ raise "Cannot build feed, missing feed unique id."
2632
+ end
2633
+ build_xml_hook(feed_type, version, xml_builder)
2634
+ unless items.nil?
2635
+ for item in items
2636
+ item.build_xml(feed_type, version, xml_builder)
2637
+ end
2638
+ end
2639
+ end
2368
2640
  end
2369
2641
  end
2370
2642
 
@@ -2678,6 +2950,15 @@ module FeedTools
2678
2950
  unless root_node.nil?
2679
2951
  repair_entities = false
2680
2952
  description_node = XPath.first(root_node, "description")
2953
+ if description_node.nil?
2954
+ description_node = XPath.first(root_node, "content:encoded")
2955
+ end
2956
+ if description_node.nil?
2957
+ description_node = XPath.first(root_node, "content")
2958
+ end
2959
+ if description_node.nil?
2960
+ description_node = XPath.first(root_node, "fullitem")
2961
+ end
2681
2962
  if description_node.nil?
2682
2963
  description_node = XPath.first(root_node, "xhtml:body")
2683
2964
  end
@@ -2699,15 +2980,6 @@ module FeedTools
2699
2980
  if description_node.nil?
2700
2981
  description_node = XPath.first(root_node, "ABSTRACT")
2701
2982
  end
2702
- if description_node.nil?
2703
- description_node = XPath.first(root_node, "content:encoded")
2704
- end
2705
- if description_node.nil?
2706
- description_node = XPath.first(root_node, "content")
2707
- end
2708
- if description_node.nil?
2709
- description_node = XPath.first(root_node, "fullitem")
2710
- end
2711
2983
  if description_node.nil?
2712
2984
  description_node = XPath.first(root_node, "info")
2713
2985
  @bozo = true unless description_node.nil?
@@ -2853,7 +3125,7 @@ module FeedTools
2853
3125
  end
2854
3126
  end
2855
3127
  if @link == "" || @link.nil?
2856
- if FeedTools.is_url? self.guid
3128
+ if FeedTools.is_uri? self.guid
2857
3129
  @link = self.guid
2858
3130
  end
2859
3131
  end
@@ -3016,9 +3288,20 @@ module FeedTools
3016
3288
  # Returns the feed item's copyright information
3017
3289
  def copyright
3018
3290
  if @copyright.nil?
3019
- @copyright = XPath.first(root_node, "dc:rights/text()").to_s
3020
- @copyright = FeedTools.sanitize_html(@copyright, :strip)
3021
- @copyright = nil if @copyright == ""
3291
+ unless root_node.nil?
3292
+ @copyright = XPath.first(root_node, "dc:rights/text()").to_s
3293
+ if @copyright == ""
3294
+ @copyright = XPath.first(root_node, "rights/text()").to_s
3295
+ end
3296
+ if @copyright == ""
3297
+ @copyright = XPath.first(root_node, "copyright/text()").to_s
3298
+ end
3299
+ if @copyright == ""
3300
+ @copyright = XPath.first(root_node, "copyrights/text()").to_s
3301
+ end
3302
+ @copyright = FeedTools.sanitize_html(@copyright, :strip)
3303
+ @copyright = nil if @copyright == ""
3304
+ end
3022
3305
  end
3023
3306
  return @copyright
3024
3307
  end
@@ -3400,19 +3683,20 @@ module FeedTools
3400
3683
  def author
3401
3684
  if @author.nil?
3402
3685
  @author = FeedTools::Feed::Author.new
3403
-
3404
- author_node = XPath.first(root_node, "author")
3405
- if author_node.nil?
3406
- author_node = XPath.first(root_node, "managingEditor")
3407
- end
3408
- if author_node.nil?
3409
- author_node = XPath.first(root_node, "dc:author")
3410
- end
3411
- if author_node.nil?
3412
- author_node = XPath.first(root_node, "dc:creator")
3413
- end
3414
- if author_node.nil?
3415
- author_node = XPath.first(root_node, "atom:author")
3686
+ unless root_node.nil?
3687
+ author_node = XPath.first(root_node, "author")
3688
+ if author_node.nil?
3689
+ author_node = XPath.first(root_node, "managingEditor")
3690
+ end
3691
+ if author_node.nil?
3692
+ author_node = XPath.first(root_node, "dc:author")
3693
+ end
3694
+ if author_node.nil?
3695
+ author_node = XPath.first(root_node, "dc:creator")
3696
+ end
3697
+ if author_node.nil?
3698
+ author_node = XPath.first(root_node, "atom:author")
3699
+ end
3416
3700
  end
3417
3701
  unless author_node.nil?
3418
3702
  @author.raw = FeedTools.unescape_entities(
@@ -3621,14 +3905,22 @@ module FeedTools
3621
3905
  # Returns the feed item time
3622
3906
  def time
3623
3907
  if @time.nil?
3624
- time_string = XPath.first(root_node, "pubDate/text()").to_s
3625
- if time_string == ""
3626
- time_string = XPath.first(root_node, "dc:date/text()").to_s
3627
- end
3628
- if time_string == ""
3629
- time_string = XPath.first(root_node, "issued/text()").to_s
3908
+ unless root_node.nil?
3909
+ time_string = XPath.first(root_node, "pubDate/text()").to_s
3910
+ if time_string == ""
3911
+ time_string = XPath.first(root_node, "dc:date/text()").to_s
3912
+ end
3913
+ if time_string == ""
3914
+ time_string = XPath.first(root_node, "issued/text()").to_s
3915
+ end
3916
+ if time_string == ""
3917
+ time_string = XPath.first(root_node, "updated/text()").to_s
3918
+ end
3919
+ if time_string == ""
3920
+ time_string = XPath.first(root_node, "time/text()").to_s
3921
+ end
3630
3922
  end
3631
- if time_string != ""
3923
+ if time_string != nil && time_string != ""
3632
3924
  @time = Time.parse(time_string) rescue Time.now
3633
3925
  elsif time_string == nil
3634
3926
  @time = Time.now
@@ -3641,7 +3933,59 @@ module FeedTools
3641
3933
  def time=(new_time)
3642
3934
  @time = new_time
3643
3935
  end
3936
+
3937
+ # Returns the feed item updated time
3938
+ def updated
3939
+ if @updated.nil?
3940
+ unless root_node.nil?
3941
+ updated_string = XPath.first(root_node, "updated/text()").to_s
3942
+ if updated_string == ""
3943
+ updated_string = XPath.first(root_node, "modified/text()").to_s
3944
+ end
3945
+ end
3946
+ if updated_string != nil && updated_string != ""
3947
+ @updated = Time.parse(updated_string) rescue nil
3948
+ else
3949
+ @updated = nil
3950
+ end
3951
+ end
3952
+ return @updated
3953
+ end
3954
+
3955
+ # Sets the feed item updated time
3956
+ def updated=(new_updated)
3957
+ @updated = new_updated
3958
+ end
3959
+
3960
+ # Returns the feed item issued time
3961
+ def issued
3962
+ if @issued.nil?
3963
+ unless root_node.nil?
3964
+ issued_string = XPath.first(root_node, "issued/text()").to_s
3965
+ if issued_string == ""
3966
+ issued_string = XPath.first(root_node, "published/text()").to_s
3967
+ end
3968
+ if issued_string == ""
3969
+ issued_string = XPath.first(root_node, "pubDate/text()").to_s
3970
+ end
3971
+ if issued_string == ""
3972
+ issued_string = XPath.first(root_node, "dc:date/text()").to_s
3973
+ end
3974
+ end
3975
+ if issued_string != nil && issued_string != ""
3976
+ @issued = Time.parse(issued_string) rescue nil
3977
+ else
3978
+ @issued = nil
3979
+ end
3980
+ end
3981
+ return @issued
3982
+ end
3644
3983
 
3984
+ # Sets the feed item issued time
3985
+ def issued=(new_issued)
3986
+ @issued = new_issued
3987
+ end
3988
+
3645
3989
  # Returns the url for posting comments
3646
3990
  def comments
3647
3991
  if @comments.nil?
@@ -3837,7 +4181,7 @@ module FeedTools
3837
4181
  end
3838
4182
  build_xml_hook(feed_type, version, xml_builder)
3839
4183
  end
3840
- elsif feed_type == "atom"
4184
+ elsif feed_type == "atom" && version == 0.3
3841
4185
  # normal atom format
3842
4186
  return xml_builder.entry("xmlns" => "http://purl.org/atom/ns#") do
3843
4187
  unless title.nil? || title == ""
@@ -3845,6 +4189,19 @@ module FeedTools
3845
4189
  "mode" => "escaped",
3846
4190
  "type" => "text/html")
3847
4191
  end
4192
+ xml_builder.author do
4193
+ unless self.author.nil? || self.author.name.nil?
4194
+ xml_builder.name(self.author.name)
4195
+ else
4196
+ xml_builder.name("n/a")
4197
+ end
4198
+ unless self.author.nil? || self.author.email.nil?
4199
+ xml_builder.email(self.author.email)
4200
+ end
4201
+ unless self.author.nil? || self.author.url.nil?
4202
+ xml_builder.url(self.author.url)
4203
+ end
4204
+ end
3848
4205
  unless link.nil? || link == ""
3849
4206
  xml_builder.link("href" => link,
3850
4207
  "rel" => "alternate",
@@ -3866,6 +4223,74 @@ module FeedTools
3866
4223
  end
3867
4224
  build_xml_hook(feed_type, version, xml_builder)
3868
4225
  end
4226
+ elsif feed_type == "atom" && version == 1.0
4227
+ # normal atom format
4228
+ return xml_builder.entry("xmlns" => "http://www.w3.org/2005/Atom") do
4229
+ unless title.nil? || title == ""
4230
+ xml_builder.title(title,
4231
+ "type" => "html")
4232
+ end
4233
+ xml_builder.author do
4234
+ unless self.author.nil? || self.author.name.nil?
4235
+ xml_builder.name(self.author.name)
4236
+ else
4237
+ xml_builder.name("n/a")
4238
+ end
4239
+ unless self.author.nil? || self.author.email.nil?
4240
+ xml_builder.email(self.author.email)
4241
+ end
4242
+ unless self.author.nil? || self.author.url.nil?
4243
+ xml_builder.url(self.author.url)
4244
+ end
4245
+ end
4246
+ unless link.nil? || link == ""
4247
+ xml_builder.link("href" => link,
4248
+ "rel" => "alternate",
4249
+ "type" => "text/html",
4250
+ "title" => title)
4251
+ end
4252
+ unless description.nil? || description == ""
4253
+ xml_builder.content(description,
4254
+ "type" => "html")
4255
+ else
4256
+ xml_builder.content(FeedTools.no_content_string,
4257
+ "type" => "html")
4258
+ end
4259
+ if self.updated != nil
4260
+ xml_builder.updated(self.updated.iso8601)
4261
+ elsif self.time != nil
4262
+ # Not technically correct, but a heck of a lot better
4263
+ # than the Time.now fall-back.
4264
+ xml_builder.updated(self.time.iso8601)
4265
+ else
4266
+ xml_builder.updated(Time.now.iso8601)
4267
+ end
4268
+ unless self.published.nil?
4269
+ xml_builder.published(self.published.iso8601)
4270
+ end
4271
+ if self.id != nil
4272
+ unless FeedTools.is_uri? self.id
4273
+ if self.time != nil && self.link != nil
4274
+ xml_builder.id(FeedTools.build_tag_uri(self.link, self.time))
4275
+ else
4276
+ raise "The unique id must be a URI. " +
4277
+ "(Attempted to generate id, but failed.)"
4278
+ end
4279
+ else
4280
+ xml_builder.id(self.id)
4281
+ end
4282
+ elsif self.time != nil && self.link != nil
4283
+ xml_builder.id(FeedTools.build_tag_uri(self.link, self.time))
4284
+ else
4285
+ raise "Cannot build feed, missing feed unique id."
4286
+ end
4287
+ unless self.tags.nil? || self.tags.size == 0
4288
+ for tag in self.tags
4289
+ xml_builder.category("term" => tag)
4290
+ end
4291
+ end
4292
+ build_xml_hook(feed_type, version, xml_builder)
4293
+ end
3869
4294
  end
3870
4295
  end
3871
4296
 
@@ -3881,6 +4306,8 @@ module FeedTools
3881
4306
  alias_method :content=, :description=
3882
4307
  alias_method :guid, :id
3883
4308
  alias_method :guid=, :id=
4309
+ alias_method :published, :issued
4310
+ alias_method :published=, :issued=
3884
4311
  end
3885
4312
  end
3886
4313
 
data/rakefile CHANGED
@@ -7,7 +7,7 @@ require 'rake/gempackagetask'
7
7
  require 'rake/contrib/rubyforgepublisher'
8
8
 
9
9
  PKG_NAME = 'feedtools'
10
- PKG_VERSION = '0.2.6'
10
+ PKG_VERSION = '0.2.7'
11
11
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
12
12
 
13
13
  RELEASE_NAME = "REL #{PKG_VERSION}"
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: feedtools
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.6
7
- date: 2005-09-01 00:00:00 -04:00
6
+ version: 0.2.7
7
+ date: 2005-09-02 00:00:00 -04:00
8
8
  summary: "Parsing, generation, and caching system for xml news feeds."
9
9
  require_paths:
10
10
  - lib