def test_feed_has_entries_list(self, mock_parse):
     mock_parse.return_value = self.feedparser_dict
     feed = fetch_feedparser_dict(feed_url=self.feed_url)
     self.assertIn('entries', feed)
     self.assertIsInstance(feed['entries'], list)
     self.assertEqual(len(feed['entries']),
                      len(self.feedparser_dict.entries))
Exemple #2
0
    def fetch_and_set_feed_details(self):
        """Fetches meta details about feed from its URL.

        The fetched values ar then assigned to 
        the appropriate fields of the Feed model. 
        Note that the method does not call save().

        Raises:
            TypeError: when the Feed link is not given
        """
        if not self.link:
            raise TypeError('No URL for feed provided')

        parsed_feed = fetch_feedparser_dict(feed_url=self.link)
        self.title = parsed_feed.feed.get('title', '')
        self.description = parsed_feed.feed.get('description', '')
        self.version = parsed_feed.get('version', '')
Exemple #3
0
    def update_feed_entries(self):
        """Fetches a given feed's available entries.

        The method then tries to save all new entries.

        Returns:
            int: count of successfully saved entries
        """
        parsed_feed = fetch_feedparser_dict(self.link)
        saved_entries_count = 0
        old_entries_count = 0
        for feed_entry in parsed_feed.entries:
            # Check if max count is reached
            if old_entries_count >= settings.MAX_SAVED_ENTRIES_COUNT:
                break

            try:
                # Process raw entry and 
                # create Entry object if it does not exist yet
                item = preprocess_feed_entry_item(feed_entry)
                entry, _ = Entry.objects.get_or_create(
                    link=item['link'],
                    defaults={k: v for k, v in item.items() if k != 'link'}
                )

                # Check existing entry is already part of current feed
                old_entry = self.entries.filter(link=entry.link)

                if old_entry.exists():
                    old_entries_count += 1
                    continue
                else:
                    self.entries.add(entry)

            except Exception as e:
                pass
            else:
                saved_entries_count += 1
                old_entries_count = 0

        return saved_entries_count
 def test_missing_feed_details_dict_raises_error(self, mock_parse):
     del self.feedparser_dict['feed']
     mock_parse.return_value = self.feedparser_dict
     with self.assertRaises(ValueError):
         fetch_feedparser_dict(self.feed_url)
 def test_badly_formed_feed_raises_error(self, mock_parse):
     self.feedparser_dict['bozo'] = 1
     mock_parse.return_value = self.feedparser_dict
     with self.assertRaises(ValueError):
         fetch_feedparser_dict(self.feed_url)
 def test_unknown_rss_version_raises_error(self, mock_parse):
     self.feedparser_dict['version'] = ''
     mock_parse.return_value = self.feedparser_dict
     with self.assertRaises(ValueError):
         fetch_feedparser_dict(self.feed_url)
 def test_null_feedparser_object_raises_error(self, mock_parse):
     self.feedparser_dict = None
     mock_parse.return_value = self.feedparser_dict
     with self.assertRaises(ValueError):
         fetch_feedparser_dict(self.feed_url)
 def test_returns_feedparser_dict_object(self, mock_parse):
     mock_parse.return_value = self.feedparser_dict
     feed = fetch_feedparser_dict(feed_url=self.feed_url)
     self.assertTrue(mock_parse.called)
     self.assertIsInstance(feed, FeedParserDict)
     self.assertIn('feed', feed)  # details dict is in parse result