# $SnapHashLicense:
#
# SnapLogic - Open source data services
#
# Copyright (C) 2008, SnapLogic, Inc. All rights reserved.
#
# See http://www.snaplogic.org for more information about
# the SnapLogic project.
#
# This program is free software, distributed under the terms of
# the GNU General Public License Version 2. See the LEGAL file
# at the top of the source tree.
#
# "SnapLogic" is a trademark of SnapLogic, Inc.
#
#
# $
# $Id: RssFeed.py 1438 2008-03-10 19:02:16Z dhiraj $
"""
Module for RSS Feed object.
This module contains a RssFeed object for use in accessing and formating a RSS Channel or Atom Feed element.
"""
# Imports
import xml.dom.minidom
import RssUtils
from RssElem import RssElem
from RssItem import RssItem
from RssDocument import RssDocument
from feedparser import FeedParserDict
from snaplogic.common.snap_exceptions import *
class RssFeed(RssElem):
"""
This class provides intefaces for the users to access information of a RSS Channel or Atom Feed elements.
It also include children RssItem objects for access.
"""
def __init__(self):
"""
Initialization.
"""
RssElem.__init__(self)
self._feed = self._elem
self._items = []
# Read only property
theFeedDict = property(lambda self: self._feed)
def __str__(self):
"""
Print the feed contents (not including item contents).
"""
r = RssElem.__str__(self).split('\n')
r[0] = "==== RssFeed ===="
r[-1] = "================="
return '\n'.join(r)
def addItem(self, item):
"""
Add a new item to the feed.
@param item: The new item being added.
@type item: snaplogic.common.Rss.RssItem
"""
self._items.append(item)
def getItemCount(self):
"""
Get the item count.
@return: The item count.
"""
return len(self._items)
def getItemByID(self, id):
"""
Get an item by the id.
@param id: The item id.
@type id: string
@return: The RssItem object of the specified id; None, if not found.
"""
for m in self._items:
if m.getAttribute('id') == id:
return m
return None
def getItemByLink(self, link):
"""
Get an item by the link value.
@param link: The item link value.
@type link: string
@return: The RssItem object of the specified link; None, if not found.
"""
for m in self._items:
if m.getAttribute('link') == link:
return m
return None
def getItemByOffset(self, offset):
"""
Get an item by offset (the item index starting from 0).
@param link: The item offset.
@type link: string
@return: The RssItem object of the specified offset; None, if not found.
"""
if offset < 0 or offset >= len(self._items):
return None
return self._items[offset]
def getAllItems(self):
"""
Get all the items.
@return: The list of items.
"""
return self._items
def serialize(self, protocol, format = 'xml', encoding = 'utf-8'):
"""
Serialize the feed information.
@param protocol: The protocol of the serialized document. The valid values are 'rss20' and 'atom10'.
@type document: string
@param format: The document format, valid values are 'xml', 'pretty-xml'.
@type format: string
@param encoding: The encoding scheme, default to 'utf-8'.
@type encoding: string
@return: The serialized string.
@raise SnapValueError: On invalid protocol or format value.
"""
if format != 'xml' and format != 'pretty-xml':
raise SnapValueError("RssFeed", "serialize", "format", format)
rssdoc = RssDocument()
xmldoc = rssdoc.createFeed(self.theFeedDict, protocol)
for item in self._items:
xmldoc = rssdoc.createItem(item.theItemDict, protocol, xmldoc)
# Note that empty string of encoding will cause toxml/toprettyxml to raise exception.
# If encoding is not desired, pass None as the value.
encoding = self._feed.get('encoding', encoding)
if format == 'xml': docstr = xmldoc.toxml(encoding)
else: docstr = xmldoc.toprettyxml(' ', '', encoding)
return docstr
|