better support for reloading apps

This commit is contained in:
BJ Dierkes 2012-07-04 17:43:53 -05:00
parent ecd5308d72
commit 366f45e8f9
7 changed files with 23 additions and 32 deletions

View File

@ -1,7 +1,11 @@
"""Cement core extensions module."""
import sys
from ..core import backend, exc, interface, handler
if sys.version_info[0] >= 3:
from imp import reload # pragma: no cover
Log = backend.minimal_logger(__name__)
def extension_validator(klass, obj):
@ -133,8 +137,13 @@ class CementExtensionHandler(handler.CementBaseHandler):
Log.debug("loading the '%s' framework extension" % ext_module)
try:
__import__(ext_module, globals(), locals(), [])
self.loaded_extensions.append(ext_module)
if ext_module in sys.modules:
reload(sys.modules[ext_module])
else:
__import__(ext_module, globals(), locals(), [])
if ext_module not in self.loaded_extensions:
self.loaded_extensions.append(ext_module)
except ImportError as e:
raise exc.CementRuntimeError(e.args[0])

View File

@ -343,10 +343,6 @@ class CementApp(meta.MetaMixin):
def argv(self):
return self._meta.argv
@property
def argv(self):
return self._meta.argv
def extend(self, member_name, member_object):
"""
Extend the CementApp() object with additional functions/classes such

View File

@ -6,25 +6,6 @@ class TestApp(foundation.CementApp):
class Meta:
config_files = []
argv = []
def __init__(self, *args, **kw):
super(TestApp, self).__init__(*args, **kw)
from cement.ext import ext_argparse
from cement.ext import ext_nulloutput
from cement.ext import ext_plugin
from cement.ext import ext_configparser
from cement.ext import ext_logging
from cement.ext import ext_json
if not 'configparser' in backend.handlers['config']:
handler.register(ext_configparser.ConfigParserConfigHandler)
if not 'argparse' in backend.handlers['argument']:
handler.register(ext_argparse.ArgParseArgumentHandler)
if not 'null' in backend.handlers['output']:
handler.register(ext_nulloutput.NullOutputHandler)
if not 'cement' in backend.handlers['plugin']:
handler.register(ext_plugin.CementPluginHandler)
if not 'logging' in backend.handlers['log']:
handler.register(ext_logging.LoggingLogHandler)
def setup(self):
super(TestApp, self).setup()

View File

@ -27,7 +27,6 @@ class ConfigTestCase(unittest.TestCase):
def test_has_key(self):
self.app.setup()
ok_(self.app.config.has_section(self.app._meta.config_section))
self.app.setup()
def test_config_override(self):
defaults = dict()

View File

@ -41,6 +41,10 @@ class FoundationTestCase(unittest.TestCase):
def setUp(self):
self.app = _t.prep('my_app')
def test_argv(self):
app = _t.prep('my_app', argv=['bogus', 'args'])
eq_(app.argv, ['bogus', 'args'])
def test_old_app(self):
defaults = backend.defaults()
defaults['test'] = dict()

View File

@ -90,6 +90,7 @@ class HandlerTestCase(unittest.TestCase):
raise
def test_verify_handler(self):
self.app.setup()
ok_(handler.registered('output', 'null'))
eq_(handler.registered('output', 'bogus_handler'), False)
eq_(handler.registered('bogus_type', 'bogus_handler'), False)
@ -148,8 +149,10 @@ class HandlerTestCase(unittest.TestCase):
eq_(handler.defined('bogus'), False)
def test_handler_registered(self):
self.app.setup()
eq_(handler.registered('output', 'null'), True)
def test_handler_enabled(self):
self.app.setup()
eq_(handler.enabled('output', 'null'), True)

View File

@ -10,11 +10,11 @@ from cement.utils import test_helper as _t
_t.prep()
from cement.ext import ext_json
def import_json():
from cement.ext import ext_json
handler.register(ext_json.JsonOutputHandler)
hook.register()(ext_json.cement_post_setup_hook)
hook.register()(ext_json.cement_pre_run_hook)
#def import_json():
# from cement.ext import ext_json
# handler.register(ext_json.JsonOutputHandler)
# hook.register()(ext_json.cement_post_setup_hook)
# hook.register()(ext_json.cement_pre_run_hook)
class JsonExtTestCase(unittest.TestCase):
def setUp(self):
@ -23,7 +23,6 @@ class JsonExtTestCase(unittest.TestCase):
output_handler='json',
argv=['--json']
)
import_json()
def test_json(self):
self.app.setup()