Example #1
0
    def parse(self):
        """
        Parses raw data into Entries
        """
        if self.data is None and self.raw_data:
            try:
                self.data = self.parse_raw_data(self.raw_data)
            except ParserException as e:
                app.logger.exception(
                    u'Failed to parse notification for Feed {0}, Message: {1}, Raw_data: {2}'
                    .format(self.feed, str(e)), self.raw_data)
                return
        elif self.data is None and self.raw_data is None:
            raise ParserException('No data passed into parser')

        # Wordpress hubs don't send correct feed details
        if not self.is_wordpress_hub(self.feed.hub):
            self.feed = self.update_feed_details(self.data, self.feed)

        self.feed = self.update_feed_version(self.data, self.feed)
        db.session.add(self.feed)

        items = self.get_items(self.data)
        if not items:
            app.logger.info(u'No items to parse for Feed {0}'
                            .format(self.feed))
            db.session.commit()
            return

        self.create_item_parsers(items)
        self.add_entries_to_item_parsers()

        app.logger.info(u'Parsing {0} items'.format(len(self.item_parsers)))
        self.parse_items(self.item_parsers)

        # Removed for performance reasons. Author RSS is updated on request.
        # if self.authors:
        #     self.update_authors(self.authors)

        # Send entries to SubscriptionHandler
        if self.entries:
            new_entries = self.new_entries(self.entries)
            app.logger.info(
                u'Sending entries_added signal for {0} new entries: {1}'
                .format(len(new_entries), new_entries))
            entries_added.send(self, entries=new_entries)

        db.session.commit()

        app.logger.info(
            u'Parsed {0} items, added/updated {1} entries and {2} authors'.format(
                len(items), len(self.entries), len(self.authors)))

        return
Example #2
0
def test_listen_for_entries_added(subhandler, session):
    user = UserFactory(active=True)
    author = AuthorFactory()
    entry = EntryFactory()
    entry.authors.append(author)
    sub = SubscriptionFactory(user=user, author=author, active=True)
    sub.add_period(PERIOD.IMMEDIATE)
    db.session.add(sub)
    db.session.commit()

    class TestSender:
        def __init__(self, entries):
            self.entries = entries

    with mail.record_messages() as outbox:
        entries_added.connect(when_entries_added)
        sender = TestSender([entry])
        assert len(sender.entries) == 1
        entries_added.send(sender, entries=[entry])

        assert len(outbox) == 1
Example #3
0
    def parse(self):
        """
        Parses raw data into Entries
        """
        if not self.data:
            raise ParserException("No data passed into parser")

        if not self.parsed:
            try:
                self.data = self.parse_raw_data(self.data, self.encoding, self.headers)

            except ParserException as e:
                app.logger.exception(
                    "Failed to parse notification for %s, " "Message: %s, Raw_data: %s",
                    self.feed,
                    e,
                    self.data,
                )
                return

        # Wordpress hubs don't send correct feed details
        if not self.is_wordpress_hub(self.feed.hub):
            self.update_feed_details(self.data, self.feed)

        self.update_feed_version(self.data, self.feed)
        # db.session.add(self.feed)

        items = self.get_items(self.data)
        if not items:
            app.logger.info("No items to parse for %s", self.feed)
            db.session.commit()
            return

        # Create an item parser for each item
        self.create_item_parsers(items)
        # Search for existing entries for each item guid, and add them
        # to the corresponding item parser.
        self.add_entries_to_item_parsers()

        # Parse items
        self.parse_items(self.item_parsers)

        db.session.commit()

        # Update author RSS feeds
        if self.authors:
            app.logger.info(
                "Sending authors-entries-added signal for %d authors", len(self.authors)
            )
            authors_entries_added.send(self, authors=self.authors)

        # Send entries to SubscriptionHandler
        new_entries = self.new_entries(self.entries)
        # Update FeedStats
        self.update_stats(new_entries, len(items))
        if new_entries:
            app.logger.info(
                "Sending entries_added signal for %d new entries", len(new_entries)
            )
            entries_added.send(self, entries=new_entries)

        db.session.commit()

        app.logger.info(
            "PARSED: items=%d new=%d updated=%d authors=%d",
            len(items),
            self.len_new_entries,
            self.len_updated_entries,
            len(self.authors),
        )

        return