From c0a1acc18c46aff92c76e6b84b6d55534195bc76 Mon Sep 17 00:00:00 2001 From: Bob Breznak Date: Tue, 12 Sep 2017 10:50:26 -0400 Subject: [PATCH 1/2] Add Simple GeoRSS support --- feedgen/ext/geo.py | 15 +++++++++++++++ feedgen/ext/geo_entry.py | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 feedgen/ext/geo.py create mode 100644 feedgen/ext/geo_entry.py diff --git a/feedgen/ext/geo.py b/feedgen/ext/geo.py new file mode 100644 index 0000000..e4370e3 --- /dev/null +++ b/feedgen/ext/geo.py @@ -0,0 +1,15 @@ +from lxml import etree +from feedgen.ext.base import BaseExtension + +class GeoExtension(BaseExtension): + def __init__(self): + self.__point__ = None + + def extend_ns(self): + return { 'georss' : 'http://www.georss.org/georss' } + + def extend_rss(self, rss_feed): + return rss_feed + + def extend_atom(self, atom_feed): + return atom_feed diff --git a/feedgen/ext/geo_entry.py b/feedgen/ext/geo_entry.py new file mode 100644 index 0000000..d158c4b --- /dev/null +++ b/feedgen/ext/geo_entry.py @@ -0,0 +1,22 @@ +from lxml import etree +from feedgen.ext.base import BaseEntryExtension + +class GeoEntryExtension(BaseEntryExtension): + def __init__(self): + self.__point = None + + def extend_rss(self, entry): + GEO_NS = 'http://www.georss.org/georss' + + if self.__point: + point = etree.SubElement(entry, '{%s}point' % GEO_NS) + point.text = self.__point + + return entry + + def extend_atom(self, entry): + return self.extend_rss(self, entry) + + def point(self, point=None): + self.__point = point or '0.0 0.0' + return self.__point From ae5759d133251c1e5d035d95529e169a0ae41093 Mon Sep 17 00:00:00 2001 From: Bob Breznak Date: Tue, 12 Sep 2017 15:50:05 -0400 Subject: [PATCH 2/2] Better format Geo and GeoEntry. Add test for Geo Extension --- feedgen/ext/geo.py | 23 ++++++++++++++--------- feedgen/ext/geo_entry.py | 38 +++++++++++++++++++++++++++++++++++--- tests/test_extension.py | 23 +++++++++++++++++++++++ 3 files changed, 72 insertions(+), 12 deletions(-) diff --git a/feedgen/ext/geo.py b/feedgen/ext/geo.py index e4370e3..1f31a2b 100644 --- a/feedgen/ext/geo.py +++ b/feedgen/ext/geo.py @@ -1,15 +1,20 @@ -from lxml import etree +# -*- coding: utf-8 -*- +''' + feedgen.ext.geo + ~~~~~~~~~~~~~~~~~~~ + + Extends the FeedGenerator to produce Simple GeoRSS feeds. + + :copyright: 2017, Bob Breznak + + :license: FreeBSD and LGPL, see license.* for more details. +''' + from feedgen.ext.base import BaseExtension class GeoExtension(BaseExtension): - def __init__(self): - self.__point__ = None + '''FeedGenerator extension for Simple GeoRSS. + ''' def extend_ns(self): return { 'georss' : 'http://www.georss.org/georss' } - - def extend_rss(self, rss_feed): - return rss_feed - - def extend_atom(self, atom_feed): - return atom_feed diff --git a/feedgen/ext/geo_entry.py b/feedgen/ext/geo_entry.py index d158c4b..f57fe26 100644 --- a/feedgen/ext/geo_entry.py +++ b/feedgen/ext/geo_entry.py @@ -1,11 +1,32 @@ +# -*- coding: utf-8 -*- +''' + feedgen.ext.geo_entry + ~~~~~~~~~~~~~~~~~~~ + + Extends the FeedGenerator to produce Simple GeoRSS feeds. + + :copyright: 2017, Bob Breznak + + :license: FreeBSD and LGPL, see license.* for more details. +''' + from lxml import etree from feedgen.ext.base import BaseEntryExtension class GeoEntryExtension(BaseEntryExtension): + '''FeedEntry extension for Simple GeoRSS. + ''' + def __init__(self): + # Simple GeoRSS tag self.__point = None - def extend_rss(self, entry): + def extend_file(self, entry): + '''Add additional fields to an RSS item. + + :param feed: The RSS item XML element to use. + ''' + GEO_NS = 'http://www.georss.org/georss' if self.__point: @@ -14,9 +35,20 @@ class GeoEntryExtension(BaseEntryExtension): return entry + def extend_rss(self, entry): + return self.extend_file(entry) + def extend_atom(self, entry): - return self.extend_rss(self, entry) + return self.extend_file(entry) def point(self, point=None): - self.__point = point or '0.0 0.0' + '''Get or set the georss:point of the entry. + + :param point: The GeoRSS formatted point (i.e. "42.36 -71.05") + :returns: The author of the podcast. + ''' + + if point is not None: + self.__point = point + return self.__point diff --git a/tests/test_extension.py b/tests/test_extension.py index d717e20..d8568fd 100644 --- a/tests/test_extension.py +++ b/tests/test_extension.py @@ -134,6 +134,29 @@ class TestExtensionPodcast(unittest.TestCase): namespaces=ns) assert author == ['Lars Kiesow'] +class TestExtensionGeo(unittest.TestCase): + + def setUp(self): + self.fg = FeedGenerator() + self.fg.load_extension('geo') + self.fg.title('title') + self.fg.link(href='http://example.com', rel='self') + self.fg.description('description') + + def test_geoEntryItems(self): + fe = self.fg.add_item() + fe.title('y') + fe.geo.point('42.36 -71.05') + + assert fe.geo.point() == '42.36 -71.05' + + # Check that we have the item in the resulting XML + ns = {'georss': 'http://www.georss.org/georss'} + root = etree.fromstring(self.fg.rss_str()) + point = root.xpath('/rss/channel/item/georss:point/text()', + namespaces=ns) + assert point == ['42.36 -71.05'] + class TestExtensionDc(unittest.TestCase):