allowing pluggable extensions

This commit is contained in:
jonathan vanasco 2016-03-08 22:46:07 -05:00
parent 290045ac49
commit 4f48bc1213
2 changed files with 110 additions and 4 deletions

View file

@ -56,6 +56,7 @@ class FeedEntry(object):
# Extension list: # Extension list:
self.__extensions = {} self.__extensions = {}
self.__extensions_register = {}
def atom_entry(self, extensions=True): def atom_entry(self, extensions=True):
@ -654,3 +655,43 @@ class FeedEntry(object):
extinst = ext() extinst = ext()
setattr(self, name, extinst) setattr(self, name, extinst)
self.__extensions[name] = {'inst':extinst,'atom':atom,'rss':rss} self.__extensions[name] = {'inst':extinst,'atom':atom,'rss':rss}
def register_extension(
self,
namespace,
extension_class_feed=None,
extension_class_entry=None,
atom=True,
rss=True
):
'''Register a specific extension by classes to a namespace.
:param namespace: namespace for the extension
:param extension_class_feed: Class of the feed extension to load.
:param extension_class_entry: Class of the entry extension to load.
:param atom: If the extension should be used for ATOM feeds.
:param rss: If the extension should be used for RSS feeds.
'''
# Check loaded extensions
# `load_extension` ignores the "Extension" suffix.
if not isinstance(self.__extensions, dict):
self.__extensions = {}
if namespace in self.__extensions.keys():
raise ImportError('Extension already loaded')
extinst = extension_class_entry()
setattr(self, namespace, extinst)
# `load_extension` registry
self.__extensions[namespace] = {'inst': extinst,
'atom': atom,
'rss': rss
}
# `register_extension` registry
self.__extensions_register[namespace] = {
'extension_class_feed': extension_class_feed,
'extension_class_entry': extension_class_entry,
'atom': atom,
'rss': rss,
}

View file

@ -29,7 +29,6 @@ class FeedGenerator(object):
def __init__(self): def __init__(self):
self.__extensions = {}
self.__feed_entries = [] self.__feed_entries = []
## ATOM ## ATOM
@ -82,7 +81,8 @@ class FeedGenerator(object):
self.__rss_webMaster = None self.__rss_webMaster = None
# Extension list: # Extension list:
__extensions = {} self.__extensions = {}
self.__extensions_register = {}
def _create_atom(self, extensions=True): def _create_atom(self, extensions=True):
@ -1024,7 +1024,14 @@ class FeedGenerator(object):
# Try to load extensions: # Try to load extensions:
for extname,ext in items: for extname,ext in items:
try: try:
feedEntry.load_extension( extname, ext['atom'], ext['rss'] ) if extname in self.__extensions_register:
ext_reg = self.__extensions_register[extname]
feedEntry.register_extension(extname,
ext_reg['extension_class_feed'],
ext_reg['extension_class_entry'],
ext_reg['atom'], ext_reg['rss'] )
else:
feedEntry.load_extension( extname, ext['atom'], ext['rss'] )
except ImportError: except ImportError:
pass pass
@ -1066,7 +1073,14 @@ class FeedGenerator(object):
for e in entry: for e in entry:
for extname,ext in items: for extname,ext in items:
try: try:
e.load_extension( extname, ext['atom'], ext['rss'] ) if extname in self.__extensions_register:
ext_reg = self.__extensions_register[extname]
e.register_extension(extname,
ext_reg['extension_class_feed'],
ext_reg['extension_class_entry'],
ext_reg['atom'], ext_reg['rss'] )
else:
e.load_extension( extname, ext['atom'], ext['rss'] )
except ImportError: except ImportError:
pass pass
@ -1127,3 +1141,54 @@ class FeedGenerator(object):
entry.load_extension( name, atom, rss ) entry.load_extension( name, atom, rss )
except ImportError: except ImportError:
pass pass
def register_extension(
self,
namespace,
extension_class_feed = None,
extension_class_entry = None,
atom=True,
rss=True
):
'''Registers an extension by class.
:param namespace: namespace for the extension
:param extension_class_feed: Class of the feed extension to load.
:param extension_class_entry: Class of the entry extension to load
:param atom: If the extension should be used for ATOM feeds.
:param rss: If the extension should be used for RSS feeds.
'''
# Check loaded extensions
# `load_extension` ignores the "Extension" suffix.
if not isinstance(self.__extensions, dict):
self.__extensions = {}
if namespace in self.__extensions.keys():
raise ImportError('Extension already loaded')
# Load extension
extinst = extension_class_entry()
setattr(self, namespace, extinst)
# `load_extension` registry
self.__extensions[namespace] = {'inst':extinst,
'atom':atom,
'rss':rss
}
# `register_extension` registry
self.__extensions_register[namespace] = {
'extension_class_feed': extension_class_feed,
'extension_class_entry': extension_class_entry,
'atom': atom,
'rss': rss,
}
# Try to load the extension for already existing entries:
for entry in self.__feed_entries:
try:
entry.register_extension(namespace,
extension_class_entry,
extension_class_feed,
atom, rss)
except ImportError:
raise