feedtools 0.2.25 → 0.2.26

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.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ == FeedTools 0.2.26
2
+ * added support for retarded, ugly Radio redirects
3
+ * improved autodiscovery support
4
+ * fixed lazy evaluation issue
1
5
  == FeedTools 0.2.25
2
6
  * fixed self reference href bug
3
7
  * fixed primary link assignment heuristic
@@ -21,6 +21,9 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
+ require 'rubygems'
25
+ require 'active_record'
26
+
24
27
  #= database_feed_cache.rb
25
28
  #
26
29
  # The <tt>DatabaseFeedCache</tt> is the default caching mechanism for
@@ -45,7 +45,7 @@ module FeedTools
45
45
  @href = nil
46
46
  @id = nil
47
47
  @title = nil
48
- @description = nil
48
+ @subtitle = nil
49
49
  @link = nil
50
50
  @last_retrieved = nil
51
51
  @time_to_live = nil
@@ -158,7 +158,35 @@ module FeedTools
158
158
  end
159
159
  self.update!
160
160
  end
161
+ else
162
+ ugly_redirect = FeedTools::XmlHelper.try_xpaths(self.xml_document, [
163
+ "redirect/newLocation/text()"
164
+ ], :select_result_value => true)
165
+ if !ugly_redirect.blank?
166
+ self.feed_data = nil
167
+ self.href = ugly_redirect
168
+ if FeedTools.feed_cache.nil?
169
+ self.cache_object = nil
170
+ else
171
+ self.cache_object =
172
+ FeedTools.feed_cache.find_by_href(ugly_redirect)
173
+ end
174
+ self.update!
175
+ end
161
176
  end
177
+
178
+ # Reset everything that needs to be reset.
179
+ @xml_document = nil
180
+ @encoding_from_feed_data = nil
181
+ @root_node = nil
182
+ @channel_node = nil
183
+ @id = nil
184
+ @title = nil
185
+ @subtitle = nil
186
+ @copyright = nil
187
+ @link = nil
188
+ @time_to_live = nil
189
+ @entries = nil
162
190
  end
163
191
  end
164
192
 
@@ -331,7 +359,7 @@ module FeedTools
331
359
 
332
360
  # Returns the encoding that the feed was parsed with
333
361
  def encoding
334
- if @encoding.nil?
362
+ if @encoding.blank?
335
363
  unless self.http_headers.blank?
336
364
  @encoding = "utf-8"
337
365
  else
@@ -344,8 +372,9 @@ module FeedTools
344
372
  # Returns the encoding of feed calculated only from the xml data.
345
373
  # I.e., the encoding we would come up with if we ignore RFC 3023.
346
374
  def encoding_from_feed_data
347
- if @encoding_from_feed_data.nil?
375
+ if @encoding_from_feed_data.blank?
348
376
  raw_data = self.feed_data
377
+ return nil if raw_data.nil?
349
378
  encoding_from_xml_instruct =
350
379
  raw_data.scan(
351
380
  /^<\?xml [^>]*encoding="([\w]*)"[^>]*\?>/
@@ -404,6 +433,24 @@ module FeedTools
404
433
  unless self.cache_object.nil?
405
434
  self.cache_object.feed_data = new_feed_data
406
435
  end
436
+ ugly_redirect = FeedTools::XmlHelper.try_xpaths(self.xml_document, [
437
+ "redirect/newLocation/text()"
438
+ ], :select_result_value => true)
439
+ if !ugly_redirect.blank?
440
+ for var in self.instance_variables
441
+ self.instance_variable_set(var, nil)
442
+ end
443
+ @http_headers = {}
444
+ @feed_data = nil
445
+ self.href = ugly_redirect
446
+ if FeedTools.feed_cache.nil?
447
+ self.cache_object = nil
448
+ else
449
+ self.cache_object =
450
+ FeedTools.feed_cache.find_by_href(ugly_redirect)
451
+ end
452
+ self.update!
453
+ end
407
454
  end
408
455
 
409
456
  # Returns the feed's raw data as utf-8.
@@ -744,6 +791,7 @@ module FeedTools
744
791
  end
745
792
  end
746
793
  end
794
+
747
795
  # rdf:about is ordered last because a lot of people put the url to
748
796
  # the feed inside it instead of a link to their blog.
749
797
  # Ordering it last gives them as many chances as humanly possible
@@ -755,7 +803,8 @@ module FeedTools
755
803
  "feed/@rdf:resource",
756
804
  "feed/@resource",
757
805
  "@rdf:about",
758
- "@about"
806
+ "@about",
807
+ "newLocation/text()"
759
808
  ], :select_result_value => true) do |result|
760
809
  override_href.call(FeedTools::UriHelper.normalize_url(result))
761
810
  end
@@ -2439,6 +2488,10 @@ module FeedTools
2439
2488
  # The cache is disabled for this feed, do nothing.
2440
2489
  return
2441
2490
  end
2491
+ if self.feed_data.blank? && self.http_headers.blank?
2492
+ # There's no data, nothing to save.
2493
+ return
2494
+ end
2442
2495
  if self.http_headers['content-type'] =~ /text\/html/ ||
2443
2496
  self.http_headers['content-type'] =~ /application\/xhtml\+xml/
2444
2497
  if self.title.nil? && self.link.nil? && self.entries.blank?
@@ -553,7 +553,13 @@ module REXML # :nodoc:
553
553
  parser.variables = variables
554
554
  path = "*" unless path
555
555
  element = [element] unless element.kind_of? Array
556
- parser.parse(path, element)
556
+ retried = false
557
+ begin
558
+ parser.parse(path, element)
559
+ rescue NoMethodError => error
560
+ retry if !retried
561
+ raise error
562
+ end
557
563
  end
558
564
 
559
565
  def self.liberal_first(element, path=nil, namespaces={},
@@ -563,7 +569,13 @@ module REXML # :nodoc:
563
569
  parser.variables = variables
564
570
  path = "*" unless path
565
571
  element = [element] unless element.kind_of? Array
566
- parser.parse(path, element)[0]
572
+ retried = false
573
+ begin
574
+ parser.parse(path, element)[0]
575
+ rescue NoMethodError => error
576
+ retry if !retried
577
+ raise error
578
+ end
567
579
  end
568
580
 
569
581
  def self.liberal_each(element, path=nil, namespaces={},
@@ -573,7 +585,13 @@ module REXML # :nodoc:
573
585
  parser.variables = variables
574
586
  path = "*" unless path
575
587
  element = [element] unless element.kind_of? Array
576
- parser.parse(path, element).each( &block )
588
+ retried = false
589
+ begin
590
+ parser.parse(path, element).each( &block )
591
+ rescue NoMethodError => error
592
+ retry if !retried
593
+ raise error
594
+ end
577
595
  end
578
596
  end
579
597
 
@@ -2,7 +2,7 @@ module FeedTools
2
2
  module FEED_TOOLS_VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- TINY = 25
5
+ TINY = 26
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -20,6 +20,18 @@ class RssTest < Test::Unit::TestCase
20
20
  }
21
21
  end
22
22
 
23
+ def test_radio_redirection
24
+ with_feed(:from_data => <<-FEED
25
+ <redirect>
26
+ <newLocation>http://www.slashdot.org/index.rss</newLocation>
27
+ </redirect>
28
+ FEED
29
+ ) { |feed|
30
+ assert_not_nil feed.href
31
+ assert_not_nil feed.title
32
+ }
33
+ end
34
+
23
35
  def test_feed_title
24
36
  with_feed(:from_file => 'wellformed/rss/channel_title.xml') { |feed|
25
37
  assert_equal("Example feed", feed.title)
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: feedtools
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.25
7
- date: 2006-07-08 00:00:00 -04:00
6
+ version: 0.2.26
7
+ date: 2006-07-20 00:00:00 -04:00
8
8
  summary: Parsing, generation, and caching system for xml news feeds.
9
9
  require_paths:
10
10
  - lib