feed-abstract 0.0.3 → 0.0.4
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/lib/feed-abstract.rb +1 -0
- data/lib/feed-abstract/channel/atom.rb +5 -0
- data/lib/feed-abstract/channel/rdf.rb +5 -0
- data/lib/feed-abstract/channel/rss.rb +7 -2
- data/lib/feed-abstract/feed.rb +32 -3
- data/lib/feed-abstract/version.rb +1 -1
- data/spec/feed_abstract_channel_spec.rb +47 -10
- data/spec/feed_abstract_item_spec.rb +28 -31
- data/spec/feed_abstract_spec.rb +15 -7
- data/spec/spec_helper.rb +25 -0
- data/spec/test_data/djcp.rss92 +62 -0
- data/spec/test_data/feedburner.rss +108 -0
- metadata +42 -52
    
        data/lib/feed-abstract.rb
    CHANGED
    
    
| @@ -14,6 +14,11 @@ module FeedAbstract | |
| 14 14 | 
             
                    @feed.channel.title
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 |  | 
| 17 | 
            +
                  def language
         | 
| 18 | 
            +
                    return '' if @feed.channel.language.nil?
         | 
| 19 | 
            +
                    @feed.channel.language
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 17 22 | 
             
                  def description
         | 
| 18 23 | 
             
                    @feed.channel.description
         | 
| 19 24 | 
             
                  end
         | 
| @@ -43,8 +48,8 @@ module FeedAbstract | |
| 43 48 |  | 
| 44 49 | 
             
                  # A Time object.
         | 
| 45 50 | 
             
                  def updated
         | 
| 46 | 
            -
                    return '' if @feed.channel.lastBuildDate.nil?
         | 
| 47 | 
            -
                    @feed.channel.lastBuildDate
         | 
| 51 | 
            +
                    return '' if @feed.channel.lastBuildDate.nil? && @feed.channel.pubDate.nil?
         | 
| 52 | 
            +
                    (@feed.channel.lastBuildDate.nil?) ? @feed.channel.pubDate : @feed.channel.lastBuildDate
         | 
| 48 53 | 
             
                  end
         | 
| 49 54 |  | 
| 50 55 | 
             
                  # A globally unique ID for this feed. A URL in this case.
         | 
    
        data/lib/feed-abstract/feed.rb
    CHANGED
    
    | @@ -10,8 +10,12 @@ module FeedAbstract | |
| 10 10 |  | 
| 11 11 | 
             
                # === Parameters
         | 
| 12 12 | 
             
                # * xml - a string or object instance that responds to <b>read</b>
         | 
| 13 | 
            -
                # * :do_validate - whether or not the feed should be validated. Passed through to RSS::Parser
         | 
| 14 | 
            -
                # * :ignore_unknown_element - passed through to RSS::Parser
         | 
| 13 | 
            +
                # * :do_validate - whether or not the feed should be validated. Passed through to RSS::Parser. Defaults to false.
         | 
| 14 | 
            +
                # * :ignore_unknown_element - passed through to RSS::Parser. Defaults to true.
         | 
| 15 | 
            +
                # * :input_encoding - Defaults to "UTF-8". This is the encoding of the feed as passed to FeedAbstract::Feed.new
         | 
| 16 | 
            +
                # * :output_encoding - Defaults to "UTF-8". This is the encoding of the feed as it's passed to the underlying parser - generally you should keep this as "UTF-8".
         | 
| 17 | 
            +
                # * :force_encoding - Force input text to be UTF-8 (or whatever you set :output_encoding to), removing invalid byte sequences before passing to RSS::Parser. Defaults to true because RSS::Parser will thrown an error if it sees invalid byte sequences.
         | 
| 18 | 
            +
                # * :transliterate_characters - Ask Iconv to transliterate unknown characters when forcing encoding conversion. This only works reliably when you set the :input_encoding properly. Defaults to false and should probably be left there because it's quirky and doesn't appear to work reliably.
         | 
| 15 19 | 
             
                #
         | 
| 16 20 | 
             
                # === Returns
         | 
| 17 21 | 
             
                # An object with three attributes:
         | 
| @@ -42,8 +46,33 @@ module FeedAbstract | |
| 42 46 | 
             
                #  f = FeedAbstract::Feed.new(Net::HTTP.get(URI.parse('http://rss.slashdot.org/Slashdot/slashdot')))
         | 
| 43 47 | 
             
                #  puts f.items.collect{|i| i.link}
         | 
| 44 48 | 
             
                #   
         | 
| 45 | 
            -
                def initialize(xml = nil,  | 
| 49 | 
            +
                def initialize(xml = nil, opts = {})
         | 
| 50 | 
            +
                  options = {
         | 
| 51 | 
            +
                    :do_validate => false, 
         | 
| 52 | 
            +
                    :ignore_unknown_element => true, 
         | 
| 53 | 
            +
                    :input_encoding => 'UTF-8', 
         | 
| 54 | 
            +
                    :output_encoding => 'UTF-8', 
         | 
| 55 | 
            +
                    :force_encoding => true, 
         | 
| 56 | 
            +
                    :transliterate_characters => false
         | 
| 57 | 
            +
                  }.merge(opts)
         | 
| 58 | 
            +
             | 
| 46 59 | 
             
                  input = (xml.respond_to?(:read)) ? xml.read : xml
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  if options[:force_encoding]
         | 
| 62 | 
            +
                    ic = Iconv.new(options[:output_encoding].upcase + ((options[:transliterate_characters]) ? '//TRANSLIT' : '') + '//IGNORE',options[:input_encoding].upcase)
         | 
| 63 | 
            +
                    if input.respond_to?(:encoding)
         | 
| 64 | 
            +
                      # ruby 1.9
         | 
| 65 | 
            +
                      # Only transcode if the encoding isn't valid.
         | 
| 66 | 
            +
                      # See: http://po-ru.com/diary/fixing-invalid-utf-8-in-ruby-revisited/ for why we're appending the extra space.
         | 
| 67 | 
            +
                      unless (input.encoding.to_s.upcase == options[:output_encoding].upcase && input.valid_encoding?)
         | 
| 68 | 
            +
                        input = ic.iconv(input << ' ')[0..-2]
         | 
| 69 | 
            +
                      end
         | 
| 70 | 
            +
                    else
         | 
| 71 | 
            +
                      # ruby 1.8
         | 
| 72 | 
            +
                      input = ic.iconv(input << ' ')[0..-2]
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
             | 
| 47 76 | 
             
                  @raw_feed = RSS::Parser.parse(input,options[:do_validate], options[:ignore_unknown_element])
         | 
| 48 77 | 
             
                  if @raw_feed == nil
         | 
| 49 78 | 
             
                    raise FeedAbstract::ParserError
         | 
| @@ -5,37 +5,38 @@ module FeedAbstract | |
| 5 5 |  | 
| 6 6 | 
             
              describe 'Channels' do
         | 
| 7 7 | 
             
                before(:all) do
         | 
| 8 | 
            -
                   | 
| 9 | 
            -
                  @kpgatom = Feed.new(File.read('spec/test_data/katanapg.atom'))
         | 
| 10 | 
            -
                  @djcprss2 = Feed.new(File.read('spec/test_data/djcp.rss'))
         | 
| 11 | 
            -
                  @oa = Feed.new(File.read('spec/test_data/oa.africa.rss'))
         | 
| 12 | 
            -
                  @delicious = Feed.new(File.read('spec/test_data/djcp_delicious.rss'))
         | 
| 13 | 
            -
                  @zotero = Feed.new(File.read('spec/test_data/zotero.rss'))
         | 
| 8 | 
            +
                  instantiate_feeds
         | 
| 14 9 | 
             
                end
         | 
| 15 10 |  | 
| 16 | 
            -
                [:title, :subtitle, :description, :link, :generator, :authors, :author, :categories,  :category, :icon, :logo, :rights, :updated, :guid].each do|att|
         | 
| 11 | 
            +
                [:title, :language, :subtitle, :description, :link, :generator, :authors, :author, :categories,  :category, :icon, :logo, :rights, :updated, :guid].each do|att|
         | 
| 17 12 | 
             
                  it { @docatom.channel.should respond_to att}
         | 
| 18 13 | 
             
                  it { @kpgatom.channel.should respond_to att}
         | 
| 19 14 | 
             
                  it { @djcprss2.channel.should respond_to att}
         | 
| 15 | 
            +
                  it { @djcprss92.channel.should respond_to att}
         | 
| 20 16 | 
             
                  it { @oa.channel.should respond_to att}
         | 
| 21 17 | 
             
                  it { @delicious.channel.should respond_to att}
         | 
| 22 18 | 
             
                  it { @zotero.channel.should respond_to att}
         | 
| 19 | 
            +
                  it { @feedburner.channel.should respond_to att}
         | 
| 23 20 |  | 
| 24 21 | 
             
                  it { @docatom.channel.send(att).should_not == false}
         | 
| 25 22 | 
             
                  it { @kpgatom.channel.send(att).should_not == false}
         | 
| 26 23 | 
             
                  it { @djcprss2.channel.send(att).should_not == false}
         | 
| 24 | 
            +
                  it { @djcprss92.channel.send(att).should_not == false}
         | 
| 27 25 | 
             
                  it { @oa.channel.send(att).should_not == false}
         | 
| 28 26 | 
             
                  it { @delicious.channel.send(att).should_not == false}
         | 
| 29 27 | 
             
                  it { @zotero.channel.send(att).should_not == false}
         | 
| 28 | 
            +
                  it { @feedburner.channel.send(att).should_not == false}
         | 
| 30 29 | 
             
                end
         | 
| 31 30 |  | 
| 32 31 | 
             
                it "should have the correct title" do
         | 
| 33 32 | 
             
                  @docatom.channel.title.should == 'Doc Searls Weblog'
         | 
| 34 33 | 
             
                  @kpgatom.channel.title.should == 'Katana Photo Groups: (Latest Updates)'
         | 
| 35 34 | 
             
                  @djcprss2.channel.title.should == 'Dan Collis-Puro'
         | 
| 35 | 
            +
                  @djcprss92.channel.title.should == 'Dan Collis-Puro'
         | 
| 36 36 | 
             
                  @oa.channel.title.should == 'Connotea: petersuber\'s bookmarks matching tag oa.africa'
         | 
| 37 37 | 
             
                  @delicious.channel.title.should == 'Delicious/djcp'
         | 
| 38 38 | 
             
                  @zotero.channel.title.should == 'Zotero / PROS Paper Group / Items'
         | 
| 39 | 
            +
                  @feedburner.channel.title.should == 'CNN.com'
         | 
| 39 40 | 
             
                end
         | 
| 40 41 |  | 
| 41 42 | 
             
                it "should have the correct subtitle and description" do
         | 
| @@ -48,6 +49,9 @@ module FeedAbstract | |
| 48 49 | 
             
                  @djcprss2.channel.subtitle.should == 'Tech. Open Source. Stuff that doesn\'t suck.'
         | 
| 49 50 | 
             
                  @djcprss2.channel.description.should == 'Tech. Open Source. Stuff that doesn\'t suck.'
         | 
| 50 51 |  | 
| 52 | 
            +
                  @djcprss92.channel.subtitle.should == 'Tech. Open Source. Stuff that doesn\'t suck.'
         | 
| 53 | 
            +
                  @djcprss92.channel.description.should == 'Tech. Open Source. Stuff that doesn\'t suck.'
         | 
| 54 | 
            +
             | 
| 51 55 | 
             
                  @oa.channel.description.should == 'Connotea: petersuber\'s bookmarks matching tag oa.africa'
         | 
| 52 56 | 
             
                  @oa.channel.subtitle.should == 'Connotea: petersuber\'s bookmarks matching tag oa.africa'
         | 
| 53 57 |  | 
| @@ -56,42 +60,62 @@ module FeedAbstract | |
| 56 60 |  | 
| 57 61 | 
             
                  @zotero.channel.subtitle.should == ''
         | 
| 58 62 | 
             
                  @zotero.channel.description.should == ''
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  @feedburner.channel.description.should == 'CNN.com delivers up-to-the-minute news and information on the latest top stories, weather, entertainment, politics and more.'
         | 
| 65 | 
            +
                  @feedburner.channel.subtitle.should == 'CNN.com delivers up-to-the-minute news and information on the latest top stories, weather, entertainment, politics and more.'
         | 
| 59 66 | 
             
                end
         | 
| 60 67 |  | 
| 61 68 | 
             
                it "should have the correct link" do
         | 
| 62 69 | 
             
                  @docatom.channel.link.should == 'http://blogs.law.harvard.edu/doc'
         | 
| 63 70 | 
             
                  @kpgatom.channel.link.should == 'http://www.katanapg.com/latest'
         | 
| 64 71 | 
             
                  @djcprss2.channel.link.should == 'http://blogs.law.harvard.edu/djcp'
         | 
| 65 | 
            -
             | 
| 72 | 
            +
                  @djcprss92.channel.link.should == 'http://blogs.law.harvard.edu/djcp'
         | 
| 66 73 | 
             
                  @oa.channel.link.should == 'http://www.connotea.org/user/petersuber/tag/oa.africa'
         | 
| 67 74 | 
             
                  @delicious.channel.link.should == 'http://www.delicious.com/djcp'
         | 
| 68 | 
            -
             | 
| 69 75 | 
             
                  @zotero.channel.link.should == 'https://api.zotero.org/groups/52650/items'
         | 
| 76 | 
            +
                  @feedburner.channel.link.should == 'http://www.cnn.com/?eref=rss_topstories'
         | 
| 70 77 | 
             
                end
         | 
| 71 78 |  | 
| 72 79 | 
             
                it "should have the correct generator" do
         | 
| 73 80 | 
             
                  @docatom.channel.generator.should == 'WordPress'
         | 
| 74 81 | 
             
                  @kpgatom.channel.generator.should == ''
         | 
| 75 82 | 
             
                  @djcprss2.channel.generator.should == 'WordPress'
         | 
| 83 | 
            +
                  @djcprss92.channel.generator.should == ''
         | 
| 76 84 | 
             
                  @oa.channel.generator.should == 'Connotea'
         | 
| 77 85 | 
             
                  @delicious.channel.generator.should == 'Delicious'
         | 
| 78 86 | 
             
                  @zotero.channel.generator.should == 'Zotero'
         | 
| 87 | 
            +
                  @feedburner.channel.generator.should == ''
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                it "should have the correct language" do
         | 
| 91 | 
            +
                  @docatom.channel.language.should == 'en'
         | 
| 92 | 
            +
                  @kpgatom.channel.language.should == ''
         | 
| 93 | 
            +
                  @djcprss2.channel.language.should == 'en'
         | 
| 94 | 
            +
                  @djcprss92.channel.language.should == 'en'
         | 
| 95 | 
            +
                  @oa.channel.language.should == ''
         | 
| 96 | 
            +
                  @delicious.channel.language.should == ''
         | 
| 97 | 
            +
                  @zotero.channel.language.should == ''
         | 
| 98 | 
            +
                  @feedburner.channel.language.should == 'en-us'
         | 
| 79 99 | 
             
                end
         | 
| 80 100 |  | 
| 81 101 | 
             
                it "should have the correct authors" do
         | 
| 82 102 | 
             
                  @docatom.channel.authors.should == ['Doc Searls']
         | 
| 83 103 | 
             
                  @kpgatom.channel.authors.should == ['Nick Pappas']
         | 
| 84 104 | 
             
                  @djcprss2.channel.authors.should == ['DJCP']
         | 
| 105 | 
            +
                  @djcprss92.channel.authors.should == []
         | 
| 85 106 | 
             
                  @oa.channel.authors.should == []
         | 
| 86 107 | 
             
                  @delicious.channel.authors.should == []
         | 
| 87 108 | 
             
                  @zotero.channel.authors.should == []
         | 
| 109 | 
            +
                  @feedburner.channel.authors.should == []
         | 
| 88 110 |  | 
| 89 111 | 
             
                  @docatom.channel.author.should == 'Doc Searls'
         | 
| 90 112 | 
             
                  @kpgatom.channel.author.should == 'Nick Pappas'
         | 
| 91 113 | 
             
                  @djcprss2.channel.author.should == 'DJCP'
         | 
| 114 | 
            +
                  @djcprss92.channel.author.should == ''
         | 
| 92 115 | 
             
                  @oa.channel.author.should == ''
         | 
| 93 116 | 
             
                  @delicious.channel.author.should == ''
         | 
| 94 117 | 
             
                  @zotero.channel.author.should == ''
         | 
| 118 | 
            +
                  @feedburner.channel.author.should == ''
         | 
| 95 119 |  | 
| 96 120 | 
             
                end
         | 
| 97 121 |  | 
| @@ -99,62 +123,75 @@ module FeedAbstract | |
| 99 123 | 
             
                  @docatom.channel.categories.should == []
         | 
| 100 124 | 
             
                  @kpgatom.channel.categories.should == ['photos']
         | 
| 101 125 | 
             
                  @djcprss2.channel.categories.should == ['Tech','Open Source','oa.africa','oa.test']
         | 
| 126 | 
            +
                  @djcprss92.channel.categories.should == []
         | 
| 102 127 | 
             
                  @oa.channel.categories.should == ['oa.africa','oa.test']
         | 
| 103 128 | 
             
                  @delicious.channel.categories.should == []
         | 
| 104 129 | 
             
                  @zotero.channel.categories.should == []
         | 
| 130 | 
            +
                  @feedburner.channel.categories.should == []
         | 
| 105 131 |  | 
| 106 132 | 
             
                  @docatom.channel.category.should == ''
         | 
| 107 133 | 
             
                  @kpgatom.channel.category.should == 'photos'
         | 
| 108 134 | 
             
                  @djcprss2.channel.category.should == 'Tech, Open Source'
         | 
| 135 | 
            +
                  @djcprss92.channel.category.should == ''
         | 
| 109 136 | 
             
                  @oa.channel.category.should == 'oa.africa, oa.test'
         | 
| 110 137 | 
             
                  @delicious.channel.category.should == ''
         | 
| 111 138 | 
             
                  @zotero.channel.category.should == ''
         | 
| 139 | 
            +
                  @feedburner.channel.category.should == ''
         | 
| 112 140 | 
             
                end
         | 
| 113 141 |  | 
| 114 142 | 
             
                it "should have the correct icon" do
         | 
| 115 143 | 
             
                  @docatom.channel.icon.should == ''
         | 
| 116 144 | 
             
                  @kpgatom.channel.icon.should == '/favicon.ico'
         | 
| 117 145 | 
             
                  @djcprss2.channel.icon.should == '/foobar.gif'
         | 
| 146 | 
            +
                  @djcprss92.channel.icon.should == ''
         | 
| 118 147 | 
             
                  @oa.channel.icon.should == 'http://example.com/image.gif'
         | 
| 119 148 | 
             
                  @delicious.channel.icon.should == ''
         | 
| 120 149 | 
             
                  @zotero.channel.icon.should == ''
         | 
| 150 | 
            +
                  @feedburner.channel.icon.should == 'http://i2.cdn.turner.com/cnn/.element/img/1.0/logo/cnn.logo.rss.gif'
         | 
| 121 151 | 
             
                end
         | 
| 122 152 |  | 
| 123 153 | 
             
                it "should have the correct logo" do
         | 
| 124 154 | 
             
                  @docatom.channel.logo.should == ''
         | 
| 125 155 | 
             
                  @kpgatom.channel.logo.should == '/images/rss.gif'
         | 
| 126 156 | 
             
                  @djcprss2.channel.logo.should == '/foobar.gif'
         | 
| 157 | 
            +
                  @djcprss92.channel.logo.should == ''
         | 
| 127 158 | 
             
                  @oa.channel.logo.should == 'http://example.com/image.gif'
         | 
| 128 159 | 
             
                  @delicious.channel.logo.should == ''
         | 
| 129 160 | 
             
                  @zotero.channel.logo.should == ''
         | 
| 161 | 
            +
                  @feedburner.channel.logo.should == 'http://i2.cdn.turner.com/cnn/.element/img/1.0/logo/cnn.logo.rss.gif'
         | 
| 130 162 | 
             
                end
         | 
| 131 163 |  | 
| 132 164 | 
             
                it "should have the correct rights" do
         | 
| 133 165 | 
             
                  @docatom.channel.rights.should == ''
         | 
| 134 166 | 
             
                  @kpgatom.channel.rights.should == ''
         | 
| 135 167 | 
             
                  @djcprss2.channel.rights.should == '2011 DJCP'
         | 
| 168 | 
            +
                  @djcprss92.channel.rights.should == ''
         | 
| 136 169 | 
             
                  @oa.channel.rights.should == 'Connotea 2011'
         | 
| 137 170 | 
             
                  @delicious.channel.rights.should == ''
         | 
| 138 171 | 
             
                  @zotero.channel.rights.should == ''
         | 
| 172 | 
            +
                  @feedburner.channel.rights.should == ' 2011 Cable News Network LP, LLLP.'
         | 
| 139 173 | 
             
                end
         | 
| 140 174 |  | 
| 141 175 | 
             
                it "should have the correct updated value" do
         | 
| 142 176 | 
             
                  @docatom.channel.updated.should == Time.parse('2011-07-29 12:33:29 UTC')
         | 
| 143 177 | 
             
                  @kpgatom.channel.updated.should == Time.parse('2011-08-24 23:59:40 -0400')
         | 
| 144 178 | 
             
                  @djcprss2.channel.updated.should == Time.parse('Tue, 02 Aug 2011 01:05:26 +0000')
         | 
| 179 | 
            +
                  @djcprss92.channel.updated.should == Time.parse('Sat, 03 Sep 2011 01:16:50 +0000')
         | 
| 145 180 | 
             
                  @oa.channel.updated.should == Time.parse('2011-09-01T08:07:21Z')
         | 
| 146 181 | 
             
                  @delicious.channel.updated.should == ''
         | 
| 147 182 | 
             
                  @zotero.channel.updated.should == Time.parse('2011-09-02T17:16:11Z')
         | 
| 183 | 
            +
                  @feedburner.channel.updated.should == Time.parse('Sat, 03 Sep 2011 16:14:16 EDT')
         | 
| 148 184 | 
             
                end
         | 
| 149 185 |  | 
| 150 186 | 
             
                it "should have the correct guid" do
         | 
| 151 187 | 
             
                  @docatom.channel.guid.should == 'http://blogs.law.harvard.edu/doc/feed/atom/'
         | 
| 152 188 | 
             
                  @kpgatom.channel.guid.should == 'urn:uuid:www.katanapg.com-latest-xml'
         | 
| 153 | 
            -
             | 
| 154 189 | 
             
                  @djcprss2.channel.guid.should == 'http://blogs.law.harvard.edu/djcp'
         | 
| 190 | 
            +
                  @djcprss92.channel.guid.should == 'http://blogs.law.harvard.edu/djcp'
         | 
| 155 191 | 
             
                  @oa.channel.guid.should == 'http://www.connotea.org/user/petersuber/tag/oa.africa'
         | 
| 156 192 | 
             
                  @delicious.channel.guid.should == 'http://www.delicious.com/djcp'
         | 
| 157 193 | 
             
                  @zotero.channel.guid.should == 'http://zotero.org/groups/52650/items'
         | 
| 194 | 
            +
                  @feedburner.channel.guid.should == 'http://www.cnn.com/?eref=rss_topstories'
         | 
| 158 195 | 
             
                end
         | 
| 159 196 | 
             
              end
         | 
| 160 197 | 
             
            end
         | 
| @@ -5,39 +5,21 @@ module FeedAbstract | |
| 5 5 |  | 
| 6 6 | 
             
              describe Item do
         | 
| 7 7 | 
             
                before(:all) do
         | 
| 8 | 
            -
                   | 
| 9 | 
            -
                   | 
| 10 | 
            -
             | 
| 11 | 
            -
                  @kpgatom = Feed.new(File.read('spec/test_data/katanapg.atom'))
         | 
| 12 | 
            -
                  @kpgatomitem = @kpgatom.items.first
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                  @djcprss2 = Feed.new(File.read('spec/test_data/djcp.rss'))
         | 
| 15 | 
            -
                  @djcprss2item = @djcprss2.items.first
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  @oa = Feed.new(File.read('spec/test_data/oa.africa.rss'))
         | 
| 18 | 
            -
                  @oaitem = @oa.items.first
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  @delicious = Feed.new(File.read('spec/test_data/djcp_delicious.rss'))
         | 
| 21 | 
            -
                  @deliciousitem = @delicious.items.first
         | 
| 22 | 
            -
                  
         | 
| 23 | 
            -
                  @zotero = Feed.new(File.read('spec/test_data/zotero.rss'))
         | 
| 24 | 
            -
                  @zoteroitem = @zotero.items.first
         | 
| 8 | 
            +
                  instantiate_feeds
         | 
| 9 | 
            +
                  instantiate_example_items
         | 
| 25 10 | 
             
                end
         | 
| 26 11 |  | 
| 27 | 
            -
                 | 
| 28 | 
            -
                  it { @docatomitem.should respond_to att}
         | 
| 29 | 
            -
                  it { @kpgatomitem.should respond_to att}
         | 
| 30 | 
            -
                  it { @djcprss2item.should respond_to att}
         | 
| 31 | 
            -
                  it { @oaitem.should respond_to att}
         | 
| 32 | 
            -
                  it { @deliciousitem.should respond_to att}
         | 
| 33 | 
            -
                  it { @zoteroitem.should respond_to att}
         | 
| 12 | 
            +
                it{@docatom.should respond_to :items}
         | 
| 34 13 |  | 
| 35 | 
            -
             | 
| 36 | 
            -
                   | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 14 | 
            +
                it "responds to all attributes without causing an error" do
         | 
| 15 | 
            +
                  @all_feeds.each do |feed|
         | 
| 16 | 
            +
                    [:title, :summary, :content, :link, :authors, :author, :contributor, :contributors, :categories, :category, :rights, :updated, :guid, :published].each do|att|
         | 
| 17 | 
            +
                      feed.items.each do|item|
         | 
| 18 | 
            +
                        item.should respond_to att 
         | 
| 19 | 
            +
                        item.send(att).should_not == false 
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 41 23 | 
             
                end
         | 
| 42 24 |  | 
| 43 25 | 
             
                it "should have the correct title" do 
         | 
| @@ -47,6 +29,7 @@ module FeedAbstract | |
| 47 29 | 
             
                  @oaitem.title.should == 'Mali doctoral students learn about access to e-resources | EIFL'
         | 
| 48 30 | 
             
                  @deliciousitem.title.should == 'aspic and other delights'
         | 
| 49 31 | 
             
                  @zoteroitem.title.should == 'An experimental application of the Delphi method to the use of experts'
         | 
| 32 | 
            +
                  @feedburneritem.title.should == 'Did Libya help CIA with renditions of terror suspects?'
         | 
| 50 33 | 
             
                end
         | 
| 51 34 |  | 
| 52 35 | 
             
                it "should have the correct summary" do 
         | 
| @@ -58,6 +41,9 @@ module FeedAbstract | |
| 58 41 | 
             
                 @oaitem.summary.should == %q|""On August 13, 2011, Consortium Malien des Bibliothèques (COMBI)  organized a workshop on access and use of e-resources (both commercial and open access)....There was a special focus on resources made freely available through EIFL for Malian institutions and also on the various international initiatives working to improve access to scientific information in Mali. Digital libraries and portals for open access journals were also demonstrated...."" Posted by petersuber to oa.notes ru.no oa.event oa.africa oa.new on Thu Aug 18 2011|
         | 
| 59 42 | 
             
                  @deliciousitem.summary.should == ''
         | 
| 60 43 | 
             
                  @zoteroitem.summary.should == ''
         | 
| 44 | 
            +
                  @feedburneritem.summary.should == %q|Documents seized at Libyan intelligence headquarters have unearthed insights into the CIA's surprisingly close relationship with counterparts in the Gadhafi regime.<div class="feedflare">
         | 
| 45 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=sV5N-C76mOM:9JZ1FBt9fS4:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=sV5N-C76mOM:9JZ1FBt9fS4:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 46 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/sV5N-C76mOM" height="1" width="1"/>|
         | 
| 61 47 | 
             
                end
         | 
| 62 48 |  | 
| 63 49 | 
             
                it "should have the correct content" do 
         | 
| @@ -68,7 +54,6 @@ module FeedAbstract | |
| 68 54 | 
             
            <p>A couple months back I <a href="http://www.youtube.com/watch?v=4dn1jkWgFvM&feature=youtu.be">gave a talk</a> at the <a href="http://personaldemocracy.com/">Personal Democracy Forum</a> where I was warmly introduced as one of those elders we should all listen to. That was nice, but here’s the strange part: when it comes to what I do in the world, I’m still young. Most of the people I hang and work with are half my age or less, yet I rarely notice or think about that, because it’s irrelevant. My job is changing the world, and that’s an calling that tends to involve smart, young, energetic people. The difference with a few of us is that we’ve been young a lot longer.</p>
         | 
| 69 55 | 
             
            <p>But I don’t have illusions about the facts of life. It’s in one’s sixties that the croak rate starts to angle north on the Y axis as age ticks east on the X. Still, I’m in no less hurry to make things happen than I ever was. I’m just more patient. That’s because one of the things I’ve learned is that now is always earlier than it seems. None of the future has happened yet, and it’s always bigger than the past.</p>
         | 
| 70 56 | 
             
            |
         | 
| 71 | 
            -
             | 
| 72 57 | 
             
                  @kpgatomitem.content.should == %q|<div xmlns="http://www.w3.org/1999/xhtml">
         | 
| 73 58 | 
             
                   <img src="http://misuzu.katanapg.com/62/1134022551906b98/thumb.jpg"/>
         | 
| 74 59 | 
             
                 </div>|
         | 
| @@ -107,6 +92,7 @@ module FeedAbstract | |
| 107 92 | 
             
                      </tr>
         | 
| 108 93 | 
             
                    </table>
         | 
| 109 94 | 
             
                  </div>|
         | 
| 95 | 
            +
                  @feedburneritem.content.should == ''
         | 
| 110 96 | 
             
                end
         | 
| 111 97 |  | 
| 112 98 | 
             
                it "should have the correct link" do
         | 
| @@ -116,6 +102,7 @@ module FeedAbstract | |
| 116 102 | 
             
                  @oaitem.link.should == 'http://www.eifl.net/news/mali-doctoral-students-learn-about-access-e-r'
         | 
| 117 103 | 
             
                  @deliciousitem.link.should == 'http://aspicandotherdelights.tumblr.com/'
         | 
| 118 104 | 
             
                  @zoteroitem.link.should == 'https://api.zotero.org/groups/52650/items/FHDJ5PXZ'
         | 
| 105 | 
            +
                  @feedburneritem.link.should == 'http://rss.cnn.com/~r/rss/cnn_topstories/~3/sV5N-C76mOM/index.html'
         | 
| 119 106 | 
             
                end
         | 
| 120 107 |  | 
| 121 108 | 
             
                it "should have the correct author" do
         | 
| @@ -125,6 +112,7 @@ module FeedAbstract | |
| 125 112 | 
             
                  @oaitem.author.should == 'petersuber'
         | 
| 126 113 | 
             
                  @deliciousitem.author.should == 'djcp'
         | 
| 127 114 | 
             
                  @zoteroitem.author.should == 'ingle.atul'
         | 
| 115 | 
            +
                  @feedburneritem.author.should == ''
         | 
| 128 116 | 
             
                end
         | 
| 129 117 |  | 
| 130 118 | 
             
                it "should have the correct authors" do
         | 
| @@ -134,6 +122,7 @@ module FeedAbstract | |
| 134 122 | 
             
                  @oaitem.authors.should == ['petersuber']
         | 
| 135 123 | 
             
                  @deliciousitem.authors.should == ['djcp']
         | 
| 136 124 | 
             
                  @zoteroitem.authors.should == ['ingle.atul']
         | 
| 125 | 
            +
                  @feedburneritem.authors.should == []
         | 
| 137 126 | 
             
                end
         | 
| 138 127 |  | 
| 139 128 | 
             
                it "should have the correct contributor" do
         | 
| @@ -143,6 +132,7 @@ module FeedAbstract | |
| 143 132 | 
             
                  @oaitem.contributor.should == ''
         | 
| 144 133 | 
             
                  @deliciousitem.contributor.should == ''
         | 
| 145 134 | 
             
                  @zoteroitem.contributor.should == ''
         | 
| 135 | 
            +
                  @feedburneritem.contributor.should == ''
         | 
| 146 136 | 
             
                end
         | 
| 147 137 |  | 
| 148 138 | 
             
                it "should have the correct contributors" do
         | 
| @@ -152,6 +142,7 @@ module FeedAbstract | |
| 152 142 | 
             
                  @oaitem.contributors.should == []
         | 
| 153 143 | 
             
                  @deliciousitem.contributors.should == []
         | 
| 154 144 | 
             
                  @zoteroitem.contributors.should == []
         | 
| 145 | 
            +
                  @feedburneritem.contributors.should == []
         | 
| 155 146 | 
             
                end
         | 
| 156 147 |  | 
| 157 148 | 
             
                it "should have the correct category" do
         | 
| @@ -161,6 +152,7 @@ module FeedAbstract | |
| 161 152 | 
             
                  @oaitem.category.should == 'oa.notes, ru.no, oa.event, oa.africa, oa.new'
         | 
| 162 153 | 
             
                  @deliciousitem.category.should == 'cooking, oddness'
         | 
| 163 154 | 
             
                  @zoteroitem.category.should == ''
         | 
| 155 | 
            +
                  @feedburneritem.category.should == ''
         | 
| 164 156 | 
             
                end
         | 
| 165 157 |  | 
| 166 158 | 
             
                it "should have the correct categories" do
         | 
| @@ -170,6 +162,7 @@ module FeedAbstract | |
| 170 162 | 
             
                  @oaitem.categories.should == ["oa.notes", "ru.no", "oa.event", "oa.africa", "oa.new"]
         | 
| 171 163 | 
             
                  @deliciousitem.categories.should == ['cooking', 'oddness']
         | 
| 172 164 | 
             
                  @zoteroitem.categories.should == []
         | 
| 165 | 
            +
                  @feedburneritem.categories.should == []
         | 
| 173 166 | 
             
                end
         | 
| 174 167 |  | 
| 175 168 | 
             
                it "should have the correct rights" do
         | 
| @@ -179,6 +172,7 @@ module FeedAbstract | |
| 179 172 | 
             
                  @oaitem.rights.should == ''
         | 
| 180 173 | 
             
                  @deliciousitem.rights.should == ''
         | 
| 181 174 | 
             
                  @zoteroitem.rights.should == ''
         | 
| 175 | 
            +
                  @feedburneritem.rights.should == ''
         | 
| 182 176 | 
             
                end
         | 
| 183 177 |  | 
| 184 178 | 
             
                it "should have been updated at the correct time" do
         | 
| @@ -188,6 +182,7 @@ module FeedAbstract | |
| 188 182 | 
             
                  @oaitem.updated.should == Time.parse('2011-08-18T21:14:38Z')
         | 
| 189 183 | 
             
                  @deliciousitem.updated.should == Time.parse('Fri, 19 Aug 2011 00:56:26 +0000')
         | 
| 190 184 | 
             
                  @zoteroitem.updated.should == Time.parse('2011-09-02T17:16:11Z')
         | 
| 185 | 
            +
                  @feedburneritem.updated.should == Time.parse('Sat, 03 Sep 2011 16:11:39 EDT')
         | 
| 191 186 | 
             
                end
         | 
| 192 187 |  | 
| 193 188 | 
             
                it "should have been published at the proper time" do
         | 
| @@ -197,6 +192,7 @@ module FeedAbstract | |
| 197 192 | 
             
                  @oaitem.published.should == Time.parse('2011-08-18T21:14:38Z')
         | 
| 198 193 | 
             
                  @deliciousitem.published.should == Time.parse('Fri, 19 Aug 2011 00:56:26 +0000')
         | 
| 199 194 | 
             
                  @zoteroitem.published.should == Time.parse('2011-09-02T17:14:22Z')
         | 
| 195 | 
            +
                  @feedburneritem.published.should == Time.parse('Sat, 03 Sep 2011 16:11:39 EDT')
         | 
| 200 196 | 
             
                end
         | 
| 201 197 |  | 
| 202 198 | 
             
                it "should have the proper guid" do
         | 
| @@ -206,6 +202,7 @@ module FeedAbstract | |
| 206 202 | 
             
                  @oaitem.guid.should == 'http://www.connotea.org/user/petersuber/uri/924b97cee02e01888a93473ca6752213'
         | 
| 207 203 | 
             
                  @deliciousitem.guid.should == 'http://www.delicious.com/url/6e0504ca698232809a0b5065e8b83031#djcp'
         | 
| 208 204 | 
             
                  @zoteroitem.guid.should == 'http://zotero.org/groups/pros_paper/items/FHDJ5PXZ'
         | 
| 205 | 
            +
                  @feedburneritem.guid.should == 'http://www.cnn.com/2011/WORLD/africa/09/03/libya.west.spies/index.html?eref=rss_topstories'
         | 
| 209 206 | 
             
                end
         | 
| 210 207 |  | 
| 211 208 | 
             
              end
         | 
    
        data/spec/feed_abstract_spec.rb
    CHANGED
    
    | @@ -4,25 +4,33 @@ require 'spec_helper' | |
| 4 4 | 
             
            module FeedAbstract
         | 
| 5 5 |  | 
| 6 6 | 
             
              describe Feed do
         | 
| 7 | 
            +
                before(:all) do
         | 
| 8 | 
            +
                  instantiate_feeds
         | 
| 9 | 
            +
                end
         | 
| 7 10 |  | 
| 8 11 | 
             
                it "should be able to instantiate" do
         | 
| 9 12 | 
             
                  Feed.respond_to?(:new).should == true
         | 
| 10 13 | 
             
                end
         | 
| 11 14 |  | 
| 12 15 | 
             
                it "should recognize atom feeds properly" do
         | 
| 13 | 
            -
                   | 
| 14 | 
            -
                   | 
| 16 | 
            +
                  @docatom.channel.class.should == Channel::Atom
         | 
| 17 | 
            +
                  @kpgatom.channel.class.should == Channel::Atom
         | 
| 15 18 | 
             
                end
         | 
| 16 19 |  | 
| 17 20 | 
             
                it "should recognize rss feeds properly" do
         | 
| 18 | 
            -
                   | 
| 19 | 
            -
                   | 
| 20 | 
            -
                   | 
| 21 | 
            +
                  @djcprss2.channel.class.should == Channel::RSS
         | 
| 22 | 
            +
                  @djcprss92.channel.class.should == Channel::RSS
         | 
| 23 | 
            +
                  @delicious.channel.class.should == Channel::RSS
         | 
| 21 24 | 
             
                end
         | 
| 22 25 |  | 
| 23 26 | 
             
                it "should recognize rdf feeds properly" do
         | 
| 24 | 
            -
                   | 
| 25 | 
            -
             | 
| 27 | 
            +
                  @oa.channel.class.should == Channel::RDF
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                it "should have items" do
         | 
| 31 | 
            +
                  @all_feeds.each do|feed|
         | 
| 32 | 
            +
                    feed.should respond_to :items
         | 
| 33 | 
            +
                  end
         | 
| 26 34 | 
             
                end
         | 
| 27 35 |  | 
| 28 36 | 
             
              end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -1,2 +1,27 @@ | |
| 1 | 
            +
            # encoding: UTF-8
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            $:.unshift File.dirname(__FILE__) + '/../lib'
         | 
| 2 4 | 
             
            require 'feed-abstract'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            def instantiate_feeds
         | 
| 7 | 
            +
              @docatom = FeedAbstract::Feed.new(File.open('spec/test_data/doc.atom'))
         | 
| 8 | 
            +
              @kpgatom = FeedAbstract::Feed.new(File.open('spec/test_data/katanapg.atom'))
         | 
| 9 | 
            +
              @djcprss2 = FeedAbstract::Feed.new(File.open('spec/test_data/djcp.rss'))
         | 
| 10 | 
            +
              @djcprss92 = FeedAbstract::Feed.new(File.open('spec/test_data/djcp.rss92'))
         | 
| 11 | 
            +
              @oa = FeedAbstract::Feed.new(File.open('spec/test_data/oa.africa.rss'))
         | 
| 12 | 
            +
              @delicious = FeedAbstract::Feed.new(File.open('spec/test_data/djcp_delicious.rss'))
         | 
| 13 | 
            +
              @zotero = FeedAbstract::Feed.new(File.open('spec/test_data/zotero.rss'))
         | 
| 14 | 
            +
              @feedburner = FeedAbstract::Feed.new(File.open('spec/test_data/feedburner.rss'))
         | 
| 15 | 
            +
              
         | 
| 16 | 
            +
              @all_feeds = [@docatom, @kpgatom, @djcprss2, @djcprss92, @oa, @delicious, @zotero, @feedburner]
         | 
| 17 | 
            +
            end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            def instantiate_example_items
         | 
| 20 | 
            +
              @docatomitem = @docatom.items.first
         | 
| 21 | 
            +
              @kpgatomitem = @kpgatom.items.first
         | 
| 22 | 
            +
              @djcprss2item = @djcprss2.items.first
         | 
| 23 | 
            +
              @oaitem = @oa.items.first
         | 
| 24 | 
            +
              @deliciousitem = @delicious.items.first
         | 
| 25 | 
            +
              @zoteroitem = @zotero.items.first
         | 
| 26 | 
            +
              @feedburneritem = @feedburner.items.first
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?><rss version="0.92">
         | 
| 2 | 
            +
            <channel>
         | 
| 3 | 
            +
            	<title>Dan Collis-Puro</title>
         | 
| 4 | 
            +
            	<link>http://blogs.law.harvard.edu/djcp</link>
         | 
| 5 | 
            +
            	<description>Tech. Open Source. Stuff that doesn't suck.</description>
         | 
| 6 | 
            +
            	<lastBuildDate>Sat, 03 Sep 2011 01:16:50 +0000</lastBuildDate>
         | 
| 7 | 
            +
            	<docs>http://backend.userland.com/rss092</docs>
         | 
| 8 | 
            +
            	<language>en</language>
         | 
| 9 | 
            +
            	<!-- generator="WordPress/3.2.1" -->
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            	<item>
         | 
| 12 | 
            +
            		<title>S1:E10 – Hide and “Q”</title>
         | 
| 13 | 
            +
            		<description><![CDATA[“Q is annoying. I thought Riker was going crazy after getting the powers at the beginning, but Picard make him feel like an idiot. Troi’s not in this.” TNG watches TNG – an ongoing series where my 11 year old … <a href="http://blogs.law.harvard.edu/djcp/2011/09/s1e10-hide-and-q/">Continue reading <span class="meta-nav">→</span></a>]]></description>
         | 
| 14 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/09/s1e10-hide-and-q/</link>
         | 
| 15 | 
            +
            			</item>
         | 
| 16 | 
            +
            	<item>
         | 
| 17 | 
            +
            		<title>S1:E8 – The Battle</title>
         | 
| 18 | 
            +
            		<description><![CDATA[“I thought he was going to hurt himself. The Ferengi are mean, but the Ferengi first officer was good because he didn’t leave the bad guy that wanted revenge in command.  Wesley was funny when he said “Adults!”" TNG watches … <a href="http://blogs.law.harvard.edu/djcp/2011/08/s1e8-the-battle/">Continue reading <span class="meta-nav">→</span></a>]]></description>
         | 
| 19 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/08/s1e8-the-battle/</link>
         | 
| 20 | 
            +
            			</item>
         | 
| 21 | 
            +
            	<item>
         | 
| 22 | 
            +
            		<title>S1:E7 – Justice</title>
         | 
| 23 | 
            +
            		<description><![CDATA[“Everybody’s blonde – they’re all way too happy. I bet it will all be an animation. I bet that ship is making the whole planet. It’s sucking all the data out – of Data. They wear weird clothes. Eww. So … <a href="http://blogs.law.harvard.edu/djcp/2011/08/s1e7-justice/">Continue reading <span class="meta-nav">→</span></a>]]></description>
         | 
| 24 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/08/s1e7-justice/</link>
         | 
| 25 | 
            +
            			</item>
         | 
| 26 | 
            +
            	<item>
         | 
| 27 | 
            +
            		<title>S1:E6 – Lonely Among Us</title>
         | 
| 28 | 
            +
            		<description><![CDATA[“It’s an evil power that’s making her want to control the bridge! The ones that had beards ate raw animals – that was gross.” TNG watches TNG – an ongoing series where my almost 11 year old daughter discovers Star … <a href="http://blogs.law.harvard.edu/djcp/2011/08/s1e6-lonely-among-us/">Continue reading <span class="meta-nav">→</span></a>]]></description>
         | 
| 29 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/08/s1e6-lonely-among-us/</link>
         | 
| 30 | 
            +
            			</item>
         | 
| 31 | 
            +
            	<item>
         | 
| 32 | 
            +
            		<title>S1:E5 – Where No One Has Gone Before</title>
         | 
| 33 | 
            +
            		<description><![CDATA[“Riker and Troi are friends! The intro to the show takes too long. I like Wesley, even though he’s a nerd. He’s a know-it-all but I like him.  Referring to Kosinki, the warp-drive “consultant”: Self-confident, self-satisifed pig! I like the part … <a href="http://blogs.law.harvard.edu/djcp/2011/07/s1e5-where-no-one-has-gone-before/">Continue reading <span class="meta-nav">→</span></a>]]></description>
         | 
| 34 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/07/s1e5-where-no-one-has-gone-before/</link>
         | 
| 35 | 
            +
            			</item>
         | 
| 36 | 
            +
            	<item>
         | 
| 37 | 
            +
            		<title>S1:E4 – The Last Outpost</title>
         | 
| 38 | 
            +
            		<description><![CDATA[“It’s good because it says you shouldn’t battle each other. Commander Riker is pretty cool in this one. The Ferengi are sort of dumb and mean.  Data is really funny when he gets his fingers caught in the Chinese finger … <a href="http://blogs.law.harvard.edu/djcp/2011/07/s1e4-the-last-outpost/">Continue reading <span class="meta-nav">→</span></a>]]></description>
         | 
| 39 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/07/s1e4-the-last-outpost/</link>
         | 
| 40 | 
            +
            			</item>
         | 
| 41 | 
            +
            	<item>
         | 
| 42 | 
            +
            		<title>S1:E3 – Code of Honor</title>
         | 
| 43 | 
            +
            		<description><![CDATA[“Good story, I don’t remember too much. Lieutenant Yar shows how awesome she is.” TNG watches TNG – an ongoing series where my almost 11 year old daughter discovers Star Trek.]]></description>
         | 
| 44 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/07/s1e3-code-of-honor/</link>
         | 
| 45 | 
            +
            			</item>
         | 
| 46 | 
            +
            	<item>
         | 
| 47 | 
            +
            		<title>S1:E2 – The Naked Now</title>
         | 
| 48 | 
            +
            		<description><![CDATA[“This one sorta creeped me out. It was really weird. Most of them got cuckoo, the Doctor fell in love with the Captain. They get drunk, and even Wes! He takes over the ship, and Riker doesn’t get drunk, he … <a href="http://blogs.law.harvard.edu/djcp/2011/07/s1e2-the-naked-now/">Continue reading <span class="meta-nav">→</span></a>]]></description>
         | 
| 49 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/07/s1e2-the-naked-now/</link>
         | 
| 50 | 
            +
            			</item>
         | 
| 51 | 
            +
            	<item>
         | 
| 52 | 
            +
            		<title>S1:E1 – Encounter at Farpoint</title>
         | 
| 53 | 
            +
            		<description><![CDATA[“It has a nice ending. It sorta said SOME true stuff about people, but we’re a little more advanced than Q thinks we are. This show is weird – at the end, they figure out that the people in Farpoint … <a href="http://blogs.law.harvard.edu/djcp/2011/07/s1e1-encounter-at-farpoint/">Continue reading <span class="meta-nav">→</span></a>]]></description>
         | 
| 54 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/07/s1e1-encounter-at-farpoint/</link>
         | 
| 55 | 
            +
            			</item>
         | 
| 56 | 
            +
            	<item>
         | 
| 57 | 
            +
            		<title>TNG watches TNG</title>
         | 
| 58 | 
            +
            		<description><![CDATA[My daughter knows NOTHING about Star Trek – she’s never seen an episode, doesn’t know what a Klingon or a Vulcan is. She does have the ability to enjoy large, complicated storylines as evidenced by her love of LoTR, Harry … <a href="http://blogs.law.harvard.edu/djcp/2011/07/tng-watches-tng/">Continue reading <span class="meta-nav">→</span></a>]]></description>
         | 
| 59 | 
            +
            		<link>http://blogs.law.harvard.edu/djcp/2011/07/tng-watches-tng/</link>
         | 
| 60 | 
            +
            			</item>
         | 
| 61 | 
            +
            </channel>
         | 
| 62 | 
            +
            </rss>
         | 
| @@ -0,0 +1,108 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="ISO-8859-1"?>
         | 
| 2 | 
            +
            <?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://rss.cnn.com/~d/styles/itemcontent.css"?><rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel>
         | 
| 3 | 
            +
            <title>CNN.com</title>
         | 
| 4 | 
            +
            <link>http://www.cnn.com/?eref=rss_topstories</link>
         | 
| 5 | 
            +
            <description>CNN.com delivers up-to-the-minute news and information on the latest top stories, weather, entertainment, politics and more.</description>
         | 
| 6 | 
            +
            <language>en-us</language>
         | 
| 7 | 
            +
            <copyright>� 2011 Cable News Network LP, LLLP.</copyright>
         | 
| 8 | 
            +
            <pubDate>Sat, 03 Sep 2011 16:14:16 EDT</pubDate>
         | 
| 9 | 
            +
            <ttl>5</ttl>
         | 
| 10 | 
            +
            <image>
         | 
| 11 | 
            +
            <title>CNN.com</title>
         | 
| 12 | 
            +
            <link>http://www.cnn.com/?eref=rss_topstories</link>
         | 
| 13 | 
            +
            <url>http://i2.cdn.turner.com/cnn/.element/img/1.0/logo/cnn.logo.rss.gif</url>
         | 
| 14 | 
            +
            <width>144</width>
         | 
| 15 | 
            +
            <height>33</height>
         | 
| 16 | 
            +
            <description>CNN.com delivers up-to-the-minute news and information on the latest top stories, weather, entertainment, politics and more.</description>
         | 
| 17 | 
            +
            </image>
         | 
| 18 | 
            +
            <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://rss.cnn.com/rss/cnn_topstories" /><feedburner:info uri="rss/cnn_topstories" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><thespringbox:skin xmlns:thespringbox="http://www.thespringbox.com/dtds/thespringbox-1.0.dtd">http://rss.cnn.com/rss/cnn_topstories?format=skin</thespringbox:skin><item>
         | 
| 19 | 
            +
            <title>Did Libya help CIA with renditions of terror suspects?</title>
         | 
| 20 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/WORLD/africa/09/03/libya.west.spies/index.html?eref=rss_topstories</guid>
         | 
| 21 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/sV5N-C76mOM/index.html</link>
         | 
| 22 | 
            +
            <description>Documents seized at Libyan intelligence headquarters have unearthed insights into the CIA's surprisingly close relationship with counterparts in the Gadhafi regime.<div class="feedflare">
         | 
| 23 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=sV5N-C76mOM:9JZ1FBt9fS4:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sV5N-C76mOM:9JZ1FBt9fS4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=sV5N-C76mOM:9JZ1FBt9fS4:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 24 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/sV5N-C76mOM" height="1" width="1"/></description>
         | 
| 25 | 
            +
            <pubDate>Sat, 03 Sep 2011 16:11:39 EDT</pubDate>
         | 
| 26 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/WORLD/africa/09/03/libya.west.spies/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 27 | 
            +
            <item>
         | 
| 28 | 
            +
            <title>Tropical storm hovers off Gulf Coast</title>
         | 
| 29 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/US/09/03/tropical.weather.gulf/index.html?eref=rss_topstories</guid>
         | 
| 30 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/YHu7oeSim2g/index.html</link>
         | 
| 31 | 
            +
            <description>The slow-moving rainmaker is expected to dump 8 to 10 inches on New Orleans. Forecasters warn that "a few tornadoes will be possible" along the Gulf Coast.<div class="feedflare">
         | 
| 32 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=YHu7oeSim2g:x-PiCXe0iz0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=YHu7oeSim2g:x-PiCXe0iz0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=YHu7oeSim2g:x-PiCXe0iz0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=YHu7oeSim2g:x-PiCXe0iz0:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=YHu7oeSim2g:x-PiCXe0iz0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=YHu7oeSim2g:x-PiCXe0iz0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=YHu7oeSim2g:x-PiCXe0iz0:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 33 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/YHu7oeSim2g" height="1" width="1"/></description>
         | 
| 34 | 
            +
            <pubDate>Sat, 03 Sep 2011 12:41:40 EDT</pubDate>
         | 
| 35 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/US/09/03/tropical.weather.gulf/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 36 | 
            +
            <item>
         | 
| 37 | 
            +
            <title>Katia a hurricane, again</title>
         | 
| 38 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/WORLD/americas/09/02/atlantic.katia.alert/index.html?eref=rss_topstories</guid>
         | 
| 39 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/S0QQre3az4o/index.html</link>
         | 
| 40 | 
            +
            <description>The storm named Katia has become a hurricane again in the Atlantic, the National Hurricane Center said Friday. It had briefly weakened into a tropical storm but has since regained strength, the center said.<div class="feedflare">
         | 
| 41 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=S0QQre3az4o:zqdMwUmJU00:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=S0QQre3az4o:zqdMwUmJU00:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=S0QQre3az4o:zqdMwUmJU00:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=S0QQre3az4o:zqdMwUmJU00:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=S0QQre3az4o:zqdMwUmJU00:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=S0QQre3az4o:zqdMwUmJU00:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=S0QQre3az4o:zqdMwUmJU00:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 42 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/S0QQre3az4o" height="1" width="1"/></description>
         | 
| 43 | 
            +
            <pubDate>Sat, 03 Sep 2011 10:15:32 EDT</pubDate>
         | 
| 44 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/WORLD/americas/09/02/atlantic.katia.alert/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 45 | 
            +
            <item>
         | 
| 46 | 
            +
            <title>Vatican rejects criticism by Ireland</title>
         | 
| 47 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/WORLD/europe/09/03/vatican.ireland.abuse/index.html?eref=rss_topstories</guid>
         | 
| 48 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/sPJoliU4n1Y/index.html</link>
         | 
| 49 | 
            +
            <description>The Vatican has rejected criticism that church leaders sought to cover up extensive abuse of young people by priests in Ireland, in a lengthy statement sent to the Irish government Saturday.<div class="feedflare">
         | 
| 50 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sPJoliU4n1Y:Fg0IxcgfVXc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sPJoliU4n1Y:Fg0IxcgfVXc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sPJoliU4n1Y:Fg0IxcgfVXc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=sPJoliU4n1Y:Fg0IxcgfVXc:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sPJoliU4n1Y:Fg0IxcgfVXc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=sPJoliU4n1Y:Fg0IxcgfVXc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=sPJoliU4n1Y:Fg0IxcgfVXc:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 51 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/sPJoliU4n1Y" height="1" width="1"/></description>
         | 
| 52 | 
            +
            <pubDate>Sat, 03 Sep 2011 10:41:12 EDT</pubDate>
         | 
| 53 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/WORLD/europe/09/03/vatican.ireland.abuse/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 54 | 
            +
            <item>
         | 
| 55 | 
            +
            <title>Military plane goes missing in Chile</title>
         | 
| 56 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/WORLD/americas/09/02/chile.plane/index.html?eref=rss_topstories</guid>
         | 
| 57 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/v_9sR8IcXxY/index.html</link>
         | 
| 58 | 
            +
            <description>A military plane with 21 people aboard went missing off Chile's Pacific coast near the Juan Fernandez islands, Chile's defense minister said on Friday.<div class="feedflare">
         | 
| 59 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=v_9sR8IcXxY:lnWtazcZt0I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=v_9sR8IcXxY:lnWtazcZt0I:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=v_9sR8IcXxY:lnWtazcZt0I:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=v_9sR8IcXxY:lnWtazcZt0I:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=v_9sR8IcXxY:lnWtazcZt0I:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=v_9sR8IcXxY:lnWtazcZt0I:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=v_9sR8IcXxY:lnWtazcZt0I:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 60 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/v_9sR8IcXxY" height="1" width="1"/></description>
         | 
| 61 | 
            +
            <pubDate>Sat, 03 Sep 2011 10:44:27 EDT</pubDate>
         | 
| 62 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/WORLD/americas/09/02/chile.plane/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 63 | 
            +
            <item>
         | 
| 64 | 
            +
            <title>WikiLeaks puts out U.S. embassy cables</title>
         | 
| 65 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/WORLD/europe/09/02/us.wikileaks/index.html?eref=rss_topstories</guid>
         | 
| 66 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/fsqFTZM5poc/index.html</link>
         | 
| 67 | 
            +
            <description>WikiLeaks threw open the doors Friday to its archive of more than a quarter million secret U.S. diplomatic cables, unfiltered and unedited, exposing and possibly endangering confidential diplomatic sources.<div class="feedflare">
         | 
| 68 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=fsqFTZM5poc:4NoqUQxI2fM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=fsqFTZM5poc:4NoqUQxI2fM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=fsqFTZM5poc:4NoqUQxI2fM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=fsqFTZM5poc:4NoqUQxI2fM:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=fsqFTZM5poc:4NoqUQxI2fM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=fsqFTZM5poc:4NoqUQxI2fM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=fsqFTZM5poc:4NoqUQxI2fM:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 69 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/fsqFTZM5poc" height="1" width="1"/></description>
         | 
| 70 | 
            +
            <pubDate>Fri, 02 Sep 2011 11:13:08 EDT</pubDate>
         | 
| 71 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/WORLD/europe/09/02/us.wikileaks/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 72 | 
            +
            <item>
         | 
| 73 | 
            +
            <title>Police help Apple in search for iPhone</title>
         | 
| 74 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/TECH/mobile/09/02/iphone.5.prototype/index.html?eref=rss_topstories</guid>
         | 
| 75 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/DwBJNaLCZF0/index.html</link>
         | 
| 76 | 
            +
            <description>Police said they helped Apple investigators search a man's home here recently.<div class="feedflare">
         | 
| 77 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=DwBJNaLCZF0:U6LymrChQ34:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=DwBJNaLCZF0:U6LymrChQ34:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=DwBJNaLCZF0:U6LymrChQ34:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=DwBJNaLCZF0:U6LymrChQ34:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=DwBJNaLCZF0:U6LymrChQ34:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=DwBJNaLCZF0:U6LymrChQ34:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=DwBJNaLCZF0:U6LymrChQ34:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 78 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/DwBJNaLCZF0" height="1" width="1"/></description>
         | 
| 79 | 
            +
            <pubDate>Sat, 03 Sep 2011 10:37:39 EDT</pubDate>
         | 
| 80 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/TECH/mobile/09/02/iphone.5.prototype/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 81 | 
            +
            <item>
         | 
| 82 | 
            +
            <title>Goodwill rolls at 'Bama-Kent State game</title>
         | 
| 83 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/US/09/02/alabama.football.tornado/index.html?eref=rss_topstories</guid>
         | 
| 84 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/m2-BJEkCrZg/index.html</link>
         | 
| 85 | 
            +
            <description>There are college football fans. And then there are University of Alabama football fans.<div class="feedflare">
         | 
| 86 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=m2-BJEkCrZg:qFGEeDMnNKw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=m2-BJEkCrZg:qFGEeDMnNKw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=m2-BJEkCrZg:qFGEeDMnNKw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=m2-BJEkCrZg:qFGEeDMnNKw:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=m2-BJEkCrZg:qFGEeDMnNKw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=m2-BJEkCrZg:qFGEeDMnNKw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=m2-BJEkCrZg:qFGEeDMnNKw:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 87 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/m2-BJEkCrZg" height="1" width="1"/></description>
         | 
| 88 | 
            +
            <pubDate>Sat, 03 Sep 2011 13:30:46 EDT</pubDate>
         | 
| 89 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/US/09/02/alabama.football.tornado/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 90 | 
            +
            <item>
         | 
| 91 | 
            +
            <title>Apple's philanthropy needs a reboot</title>
         | 
| 92 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/OPINION/09/03/martin.cary.apple.charity/index.html?eref=rss_topstories</guid>
         | 
| 93 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/a024YgJrn7M/index.html</link>
         | 
| 94 | 
            +
            <description>As newly crowned CEO Tim Cook gets used to his new role and the extraordinary power and pressure that it brings, many Apple fans will likely urge him to continue leading the company much as his famous, turtle-necked predecessor Steve Jobs did.<div class="feedflare">
         | 
| 95 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=a024YgJrn7M:RfWjapU4TZo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=a024YgJrn7M:RfWjapU4TZo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=a024YgJrn7M:RfWjapU4TZo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=a024YgJrn7M:RfWjapU4TZo:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=a024YgJrn7M:RfWjapU4TZo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=a024YgJrn7M:RfWjapU4TZo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=a024YgJrn7M:RfWjapU4TZo:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 96 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/a024YgJrn7M" height="1" width="1"/></description>
         | 
| 97 | 
            +
            <pubDate>Sat, 03 Sep 2011 13:50:56 EDT</pubDate>
         | 
| 98 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/OPINION/09/03/martin.cary.apple.charity/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 99 | 
            +
            <item>
         | 
| 100 | 
            +
            <title>Angelou criticizes King inscription</title>
         | 
| 101 | 
            +
            <guid isPermaLink="false">http://www.cnn.com/2011/US/09/03/maya.angelou.king.memorial/index.html?eref=rss_topstories</guid>
         | 
| 102 | 
            +
            <link>http://rss.cnn.com/~r/rss/cnn_topstories/~3/tmBtePJ7dbY/index.html</link>
         | 
| 103 | 
            +
            <description>Celebrated poet and author Maya Angelou continued her criticism of the inscription etched on the Martin Luther King Jr. National Memorial, saying an edit of the civil rights leader's statement makes him appear arrogant.<div class="feedflare">
         | 
| 104 | 
            +
            <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=tmBtePJ7dbY:m5hFV2bU73Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=tmBtePJ7dbY:m5hFV2bU73Q:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=tmBtePJ7dbY:m5hFV2bU73Q:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=tmBtePJ7dbY:m5hFV2bU73Q:V_sGLiPBpWU" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=tmBtePJ7dbY:m5hFV2bU73Q:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?d=qj6IDK7rITs" border="0"></img></a> <a href="http://rss.cnn.com/~ff/rss/cnn_topstories?a=tmBtePJ7dbY:m5hFV2bU73Q:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/rss/cnn_topstories?i=tmBtePJ7dbY:m5hFV2bU73Q:gIN9vFwOqvQ" border="0"></img></a>
         | 
| 105 | 
            +
            </div><img src="http://feeds.feedburner.com/~r/rss/cnn_topstories/~4/tmBtePJ7dbY" height="1" width="1"/></description>
         | 
| 106 | 
            +
            <pubDate>Sat, 03 Sep 2011 15:34:36 EDT</pubDate>
         | 
| 107 | 
            +
            <feedburner:origLink>http://www.cnn.com/2011/US/09/03/maya.angelou.king.memorial/index.html?eref=rss_topstories</feedburner:origLink></item>
         | 
| 108 | 
            +
            </channel></rss>
         | 
    
        metadata
    CHANGED
    
    | @@ -1,46 +1,41 @@ | |
| 1 | 
            -
            --- !ruby/object:Gem::Specification | 
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: feed-abstract
         | 
| 3 | 
            -
            version: !ruby/object:Gem::Version | 
| 4 | 
            -
               | 
| 5 | 
            -
               | 
| 6 | 
            -
              - 0
         | 
| 7 | 
            -
              - 0
         | 
| 8 | 
            -
              - 3
         | 
| 9 | 
            -
              version: 0.0.3
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.0.4
         | 
| 5 | 
            +
              prerelease: 
         | 
| 10 6 | 
             
            platform: ruby
         | 
| 11 | 
            -
            authors: | 
| 7 | 
            +
            authors:
         | 
| 12 8 | 
             
            - Daniel Collis-Puro
         | 
| 13 9 | 
             
            autorequire: 
         | 
| 14 10 | 
             
            bindir: bin
         | 
| 15 11 | 
             
            cert_chain: []
         | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
            dependencies: 
         | 
| 20 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 12 | 
            +
            date: 2011-09-06 00:00:00.000000000Z
         | 
| 13 | 
            +
            dependencies:
         | 
| 14 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 21 15 | 
             
              name: rspec
         | 
| 22 | 
            -
               | 
| 23 | 
            -
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 16 | 
            +
              requirement: &72099580 !ruby/object:Gem::Requirement
         | 
| 24 17 | 
             
                none: false
         | 
| 25 | 
            -
                requirements: | 
| 26 | 
            -
                - -  | 
| 27 | 
            -
                  - !ruby/object:Gem::Version | 
| 28 | 
            -
                     | 
| 29 | 
            -
                    - 2
         | 
| 30 | 
            -
                    - 6
         | 
| 31 | 
            -
                    version: "2.6"
         | 
| 18 | 
            +
                requirements:
         | 
| 19 | 
            +
                - - =
         | 
| 20 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 21 | 
            +
                    version: '2.6'
         | 
| 32 22 | 
             
              type: :development
         | 
| 33 | 
            -
               | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 23 | 
            +
              prerelease: false
         | 
| 24 | 
            +
              version_requirements: *72099580
         | 
| 25 | 
            +
            description: ! 'This library creates a common object graph for the RSS/Atom/RDF parsing
         | 
| 26 | 
            +
              classes in the ruby standard library. This allows you parse different feed formats
         | 
| 27 | 
            +
              and get back the same (or at least a very similar) set of results - item authors
         | 
| 28 | 
            +
              are accessible under an "author(s)" attribute, categories/tags/subjects are accessible
         | 
| 29 | 
            +
              under "category(ies)" attributes, etc. We do our best to make sure the data makes
         | 
| 30 | 
            +
              sense, too - RSS items lack an "updated" attribute, so we use "pubDate" to populate
         | 
| 31 | 
            +
              it. '
         | 
| 32 | 
            +
            email:
         | 
| 36 33 | 
             
            - djcp@cyber.law.harvard.edu
         | 
| 37 34 | 
             
            executables: []
         | 
| 38 | 
            -
             | 
| 39 35 | 
             
            extensions: []
         | 
| 40 | 
            -
             | 
| 41 | 
            -
            extra_rdoc_files: 
         | 
| 36 | 
            +
            extra_rdoc_files:
         | 
| 42 37 | 
             
            - README.rdoc
         | 
| 43 | 
            -
            files: | 
| 38 | 
            +
            files:
         | 
| 44 39 | 
             
            - .gitignore
         | 
| 45 40 | 
             
            - Gemfile
         | 
| 46 41 | 
             
            - README.rdoc
         | 
| @@ -64,43 +59,38 @@ files: | |
| 64 59 | 
             
            - spec/feed_abstract_spec.rb
         | 
| 65 60 | 
             
            - spec/spec_helper.rb
         | 
| 66 61 | 
             
            - spec/test_data/djcp.rss
         | 
| 62 | 
            +
            - spec/test_data/djcp.rss92
         | 
| 67 63 | 
             
            - spec/test_data/djcp_code.rss
         | 
| 68 64 | 
             
            - spec/test_data/djcp_delicious.rss
         | 
| 69 65 | 
             
            - spec/test_data/doc.atom
         | 
| 66 | 
            +
            - spec/test_data/feedburner.rss
         | 
| 70 67 | 
             
            - spec/test_data/katanapg.atom
         | 
| 71 68 | 
             
            - spec/test_data/oa.africa.rss
         | 
| 72 69 | 
             
            - spec/test_data/zotero.rss
         | 
| 73 | 
            -
            has_rdoc: true
         | 
| 74 70 | 
             
            homepage: https://github.com/berkmancenter/feed-abstract
         | 
| 75 71 | 
             
            licenses: []
         | 
| 76 | 
            -
             | 
| 77 72 | 
             
            post_install_message: 
         | 
| 78 | 
            -
            rdoc_options: | 
| 73 | 
            +
            rdoc_options:
         | 
| 79 74 | 
             
            - --charset=UTF-8
         | 
| 80 | 
            -
            require_paths: | 
| 75 | 
            +
            require_paths:
         | 
| 81 76 | 
             
            - lib
         | 
| 82 | 
            -
            required_ruby_version: !ruby/object:Gem::Requirement | 
| 77 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 83 78 | 
             
              none: false
         | 
| 84 | 
            -
              requirements: | 
| 85 | 
            -
              - -  | 
| 86 | 
            -
                - !ruby/object:Gem::Version | 
| 87 | 
            -
                   | 
| 88 | 
            -
             | 
| 89 | 
            -
                  version: "0"
         | 
| 90 | 
            -
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 79 | 
            +
              requirements:
         | 
| 80 | 
            +
              - - ! '>='
         | 
| 81 | 
            +
                - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                  version: '0'
         | 
| 83 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 91 84 | 
             
              none: false
         | 
| 92 | 
            -
              requirements: | 
| 93 | 
            -
              - -  | 
| 94 | 
            -
                - !ruby/object:Gem::Version | 
| 95 | 
            -
                   | 
| 96 | 
            -
                  - 0
         | 
| 97 | 
            -
                  version: "0"
         | 
| 85 | 
            +
              requirements:
         | 
| 86 | 
            +
              - - ! '>='
         | 
| 87 | 
            +
                - !ruby/object:Gem::Version
         | 
| 88 | 
            +
                  version: '0'
         | 
| 98 89 | 
             
            requirements: []
         | 
| 99 | 
            -
             | 
| 100 90 | 
             
            rubyforge_project: 
         | 
| 101 | 
            -
            rubygems_version: 1. | 
| 91 | 
            +
            rubygems_version: 1.8.6
         | 
| 102 92 | 
             
            signing_key: 
         | 
| 103 93 | 
             
            specification_version: 3
         | 
| 104 | 
            -
            summary: Abstracts RSS/Atom/RDF parsing features from the ruby standard lib into a | 
| 94 | 
            +
            summary: Abstracts RSS/Atom/RDF parsing features from the ruby standard lib into a
         | 
| 95 | 
            +
              common object graph.
         | 
| 105 96 | 
             
            test_files: []
         | 
| 106 | 
            -
             |