Skip to content

Commit

Permalink
Fixed #112 and cleaned up error reporting when loading extensions.
Browse files Browse the repository at this point in the history
  • Loading branch information
Waylan Limberg committed Jul 12, 2012
1 parent 32d57ff commit 5b3e724
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 12 deletions.
22 changes: 13 additions & 9 deletions markdown/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import codecs
import sys
import logging
import warnings
import util
from preprocessors import build_preprocessors
from blockprocessors import build_block_parser
Expand Down Expand Up @@ -163,10 +164,10 @@ def registerExtensions(self, extensions, configs):
if isinstance(ext, basestring):
ext = self.build_extension(ext, configs.get(ext, []))
if isinstance(ext, Extension):
# might raise NotImplementedError, but that's the extension author's problem
ext.extendMarkdown(self, globals())
elif ext is not None:
raise ValueError('Extension "%s.%s" must be of type: "markdown.Extension".' \
raise TypeError(
'Extension "%s.%s" must be of type: "markdown.Extension"'
% (ext.__class__.__module__, ext.__class__.__name__))

return self
Expand Down Expand Up @@ -200,19 +201,22 @@ def build_extension(self, ext_name, configs = []):
module_name_old_style = '_'.join(['mdx', ext_name])
try: # Old style (mdx_<extension>)
module = __import__(module_name_old_style)
except ImportError:
logger.warn("Failed loading extension '%s' from '%s' or '%s'"
% (ext_name, module_name, module_name_old_style))
# Return None so we don't try to initiate none-existant extension
return None
except ImportError, e:
message = "Failed loading extension '%s' from '%s' or '%s'" \
% (ext_name, module_name, module_name_old_style)
e.args = (message,) + e.args[1:]
raise

# If the module is loaded successfully, we expect it to define a
# function called makeExtension()
try:
return module.makeExtension(configs.items())
except AttributeError, e:
logger.warn("Failed to initiate extension '%s': %s" % (ext_name, e))
return None
message = e.args[0]
message = "Failed to initiate extension " \
"'%s': %s" % (ext_name, message)
e.args = (message,) + e.args[1:]
raise

def registerExtension(self, extension):
""" This gets called by the extension """
Expand Down
6 changes: 3 additions & 3 deletions tests/test_apis.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,18 +245,18 @@ def testBadOutputFormat(self):

def testLoadExtensionFailure(self):
""" Test failure of an extension to load. """
self.assertRaises(ValueError,
self.assertRaises(ImportError,
markdown.Markdown, extensions=['non_existant_ext'])

def testLoadBadExtension(self):
""" Test loading of an Extension with no makeExtension function. """
_create_fake_extension(name='fake', has_factory_func=False)
self.assertRaises(ValueError, markdown.Markdown, extensions=['fake'])
self.assertRaises(AttributeError, markdown.Markdown, extensions=['fake'])

def testNonExtension(self):
""" Test loading a non Extension object as an extension. """
_create_fake_extension(name='fake', is_wrong_type=True)
self.assertRaises(ValueError, markdown.Markdown, extensions=['fake'])
self.assertRaises(TypeError, markdown.Markdown, extensions=['fake'])

def testBaseExtention(self):
""" Test that the base Extension class will raise NotImplemented. """
Expand Down

0 comments on commit 5b3e724

Please sign in to comment.