From: <fwi...@us...> - 2007-03-01 17:58:28
|
Author: fwiemann Date: 2007-03-01 18:58:13 +0100 (Thu, 01 Mar 2007) New Revision: 4973 Modified: branches/plugins/HISTORY.txt branches/plugins/docutils/core.py branches/plugins/docutils/utils.py branches/plugins/docutils/writers/__init__.py Log: moved writers.get_writer_class to generic utils.get_entry_point Modified: branches/plugins/HISTORY.txt =================================================================== --- branches/plugins/HISTORY.txt 2007-03-01 17:57:21 UTC (rev 4972) +++ branches/plugins/HISTORY.txt 2007-03-01 17:58:13 UTC (rev 4973) @@ -14,6 +14,21 @@ .. contents:: +Plugins Branch +============== + +* docutils/utils.py: + + - Added ``get_entry_point()`` method, which uses setuptools. + +* docutils/core.py: + + - Use setuptools' entry-point architecture for discovering + components. + - Reader, parser, and writer names are now case-sensitive; a warning + is issued if the uppercase version of a component name is used. + + Changes Since 0.4 ================= Modified: branches/plugins/docutils/core.py =================================================================== --- branches/plugins/docutils/core.py 2007-03-01 17:57:21 UTC (rev 4972) +++ branches/plugins/docutils/core.py 2007-03-01 17:58:13 UTC (rev 4973) @@ -82,7 +82,7 @@ def set_writer(self, writer_name): """Set `self.writer` by name.""" - writer_class = writers.get_writer_class(writer_name) + writer_class = utils.get_entry_point('docutils.writers', writer_name) self.writer = writer_class() def set_components(self, reader_name, parser_name, writer_name): Modified: branches/plugins/docutils/utils.py =================================================================== --- branches/plugins/docutils/utils.py 2007-03-01 17:57:21 UTC (rev 4972) +++ branches/plugins/docutils/utils.py 2007-03-01 17:58:13 UTC (rev 4973) @@ -15,10 +15,10 @@ import warnings import unicodedata from types import StringType, UnicodeType +import pkg_resources from docutils import ApplicationError, DataError from docutils import nodes - class SystemMessage(ApplicationError): def __init__(self, system_message, level): @@ -577,3 +577,33 @@ else: output_file = None return '%s(%r, %s)' % (self.__class__.__name__, output_file, self.list) + + +class EntryPointNotFoundError(ApplicationError): pass +class DuplicateEntryPointError(ApplicationError): pass + +def get_entry_point(group, name): + """ + Load the entry point with name `name` in entry point group `group` + and return the associated Python object. If no such entry point + is found, raise `EntryPointNotFoundError`. If more than one entry + point is found, raise `DuplicateEntryPointError`. + """ + entry_points = list(pkg_resources.iter_entry_points(group, name)) + if not len(entry_points): + # Retrieving components used to be case-insensitive, but that's + # probably a bad idea. + if name != name.lower(): + entry_point = get_entry_point(group, name.lower()) + print >>sys.stderr, 'Warning: Entry point names are case-'\ + 'sensitive; using lower-case name "%s.%s"' \ + % (group, name.lower()) + return entry_point + else: + raise EntryPointNotFoundError( + 'Entry point "%s.%s" not found.' % (group, name)) + if len(entry_points) > 1: + raise DuplicateEntryPointError('More than one entry point "%s.%s" ' + 'installed on system.' % (group, name)) + entry_point = entry_points[0] + return entry_point.load() Modified: branches/plugins/docutils/writers/__init__.py =================================================================== --- branches/plugins/docutils/writers/__init__.py 2007-03-01 17:57:21 UTC (rev 4972) +++ branches/plugins/docutils/writers/__init__.py 2007-03-01 17:58:13 UTC (rev 4973) @@ -11,7 +11,7 @@ import os.path import docutils -from docutils import languages, Component +from docutils import languages, utils, Component from docutils.transforms import universal @@ -113,26 +113,3 @@ # later, the then-used writer will add the appropriate # transforms. return Component.get_transforms(self) - - -_writer_aliases = { - 'html': 'html4css1', - 'latex': 'latex2e', - 'pprint': 'pseudoxml', - 'pformat': 'pseudoxml', - 'pdf': 'rlpdf', - 'xml': 'docutils_xml', - 's5': 's5_html'} - -def get_writer_class(writer_name): - """Return the Writer class from the `writer_name` module.""" - writer_name = writer_name.lower() - if _writer_aliases.has_key(writer_name): - writer_name = _writer_aliases[writer_name] - import pkg_resources - writer = None - for entrypoint in pkg_resources.iter_entry_points('docutils.writers'): - if entrypoint.name == writer_name: - writer = entrypoint.load() - assert writer is not None, 'writer "%s" not found' % writer_name - return writer |