diff options
| -rw-r--r-- | pyramid/paster.py | 17 | ||||
| -rw-r--r-- | pyramid/tests/test_paster.py | 165 |
2 files changed, 155 insertions, 27 deletions
diff --git a/pyramid/paster.py b/pyramid/paster.py index 0360a57bb..eabd12a1b 100644 --- a/pyramid/paster.py +++ b/pyramid/paster.py @@ -1,8 +1,8 @@ +import ConfigParser import os import re import sys from code import interact -from ConfigParser import ConfigParser import zope.deprecation @@ -23,7 +23,7 @@ def get_app(config_file, name=None, loadapp=loadapp): config file ``config_file``. If the ``name`` is None, this will attempt to parse the name from - the ``config_file`` string expecting the format ``ini_path#name``. + the ``config_file`` string expecting the format ``ini_file#name``. If no name is found, the name will default to "main".""" if '#' in config_file: path, section = config_file.split('#', 1) @@ -82,15 +82,19 @@ class PShellCommand(PCommand): dest='disable_ipython', help="Don't use IPython even if it is available") - ConfigParser = ConfigParser # testing + ConfigParser = ConfigParser.ConfigParser # testing def pshell_file_config(self, filename): resolver = DottedNameResolver(None) self.loaded_objects = {} self.object_help = {} - config = ConfigParser() + config = self.ConfigParser() config.read(filename) - for k, v in config.items('pshell'): + try: + items = config.items('pshell') + except ConfigParser.NoSectionError: + return + for k, v in items: self.loaded_objects[k] = resolver.maybe_resolve(v) self.object_help[k] = v @@ -115,7 +119,8 @@ class PShellCommand(PCommand): default_variables = {'app': 'The WSGI Application'} if hasattr(app, 'registry'): root, closer = self.get_root(app) - shell_globals.update({'root':root, 'registry':app.registry}) + shell_globals.update({'root':root, 'registry':app.registry, + 'settings': app.registry.settings}) default_variables.update({ 'root': 'The root of the default resource tree.', 'registry': 'The Pyramid registry object.', diff --git a/pyramid/tests/test_paster.py b/pyramid/tests/test_paster.py index 2bae6aba3..e7a3b7507 100644 --- a/pyramid/tests/test_paster.py +++ b/pyramid/tests/test_paster.py @@ -15,7 +15,8 @@ class TestPShellCommand(unittest.TestCase): loadapp = DummyLoadApp(app) command.interact = (interact,) command.loadapp = (loadapp,) - command.args = ('/foo/bar/myapp.ini#myapp') + command.ConfigParser = makeDummyConfigParser({}) + command.args = ('/foo/bar/myapp.ini#myapp',) class Options(object): pass command.options = Options() command.options.disable_ipython = False @@ -27,8 +28,10 @@ class TestPShellCommand(unittest.TestCase): pushed = app.threadlocal_manager.pushed[0] self.assertEqual(pushed['registry'], dummy_registry) self.assertEqual(pushed['request'].registry, dummy_registry) - self.assertEqual(interact.local, {'root':dummy_root, - 'registry':dummy_registry}) + self.assertEqual(interact.local, {'app':app, + 'root':dummy_root, + 'registry':dummy_registry, + 'settings':dummy_registry.settings}) self.assertTrue(interact.banner) self.assertEqual(len(app.threadlocal_manager.popped), 1) @@ -39,7 +42,8 @@ class TestPShellCommand(unittest.TestCase): loadapp = DummyLoadApp(app) command.interact = (interact,) command.loadapp = (loadapp,) - command.args = ('/foo/bar/myapp.ini#myapp') + command.ConfigParser = makeDummyConfigParser({}) + command.args = ('/foo/bar/myapp.ini#myapp',) class Options(object): pass command.options = Options() command.options.disable_ipython = True @@ -51,8 +55,10 @@ class TestPShellCommand(unittest.TestCase): pushed = app.threadlocal_manager.pushed[0] self.assertEqual(pushed['registry'], dummy_registry) self.assertEqual(pushed['request'].registry, dummy_registry) - self.assertEqual(interact.local, {'root':dummy_root, - 'registry':dummy_registry}) + self.assertEqual(interact.local, {'app':app, + 'root':dummy_root, + 'registry':dummy_registry, + 'settings':dummy_registry.settings}) self.assertTrue(interact.banner) self.assertEqual(len(app.threadlocal_manager.popped), 1) @@ -61,8 +67,9 @@ class TestPShellCommand(unittest.TestCase): app = DummyApp() loadapp = DummyLoadApp(app) command.loadapp = (loadapp,) + command.ConfigParser = makeDummyConfigParser({}) dummy_shell_factory = DummyIPShellFactory() - command.args = ('/foo/bar/myapp.ini#myapp') + command.args = ('/foo/bar/myapp.ini#myapp',) class Options(object): pass command.options = Options() command.options.disable_ipython = False @@ -75,7 +82,9 @@ class TestPShellCommand(unittest.TestCase): self.assertEqual(pushed['registry'], dummy_registry) self.assertEqual(pushed['request'].registry, dummy_registry) self.assertEqual(dummy_shell_factory.shell.local_ns, - {'root':dummy_root, 'registry':dummy_registry}) + {'app':app, 'root':dummy_root, + 'registry':dummy_registry, + 'settings':dummy_registry.settings}) self.assertEqual(dummy_shell_factory.shell.global_ns, {}) self.assertTrue('\n\n' in dummy_shell_factory.shell.IP.BANNER) self.assertEqual(len(app.threadlocal_manager.popped), 1) @@ -92,7 +101,8 @@ class TestPShellCommand(unittest.TestCase): interact = DummyInteractor() app = DummyApp() command.interact = (interact,) - command.args = ('/foo/bar/myapp.ini#myapp') + command.ConfigParser = makeDummyConfigParser({}) + command.args = ('/foo/bar/myapp.ini#myapp',) class Options(object): pass command.options = Options() command.options.disable_ipython =True @@ -101,11 +111,13 @@ class TestPShellCommand(unittest.TestCase): pushed = app.threadlocal_manager.pushed[0] self.assertEqual(pushed['registry'], dummy_registry) self.assertEqual(pushed['request'].registry, dummy_registry) - self.assertEqual(interact.local, {'root':dummy_root, - 'registry':dummy_registry}) + self.assertEqual(interact.local, {'app': app, + 'root':dummy_root, + 'registry':dummy_registry, + 'settings':dummy_registry.settings}) self.assertTrue(interact.banner) self.assertEqual(len(app.threadlocal_manager.popped), 1) - self.assertEqual(apped, [(('/foo/bar/myapp.ini', 'myapp'), + self.assertEqual(apped, [(('/foo/bar/myapp.ini#myapp',), {'loadapp': loadapp})]) def test_command_get_root_hookable(self): @@ -115,13 +127,14 @@ class TestPShellCommand(unittest.TestCase): loadapp = DummyLoadApp(app) command.interact = (interact,) command.loadapp = (loadapp,) + command.ConfigParser = makeDummyConfigParser({}) root = Dummy() apps = [] def get_root(app): apps.append(app) return root, lambda *arg: None command.get_root =get_root - command.args = ('/foo/bar/myapp.ini#myapp') + command.args = ('/foo/bar/myapp.ini#myapp',) class Options(object): pass command.options = Options() command.options.disable_ipython =True @@ -130,11 +143,108 @@ class TestPShellCommand(unittest.TestCase): self.assertEqual(loadapp.section_name, 'myapp') self.assertTrue(loadapp.relative_to) self.assertEqual(len(app.threadlocal_manager.pushed), 0) - self.assertEqual(interact.local, {'root':root, - 'registry':dummy_registry}) + self.assertEqual(interact.local, {'app':app, + 'root':root, + 'registry':dummy_registry, + 'settings':dummy_registry.settings}) self.assertTrue(interact.banner) self.assertEqual(apps, [app]) + def test_command_loads_custom_items(self): + command = self._makeOne() + interact = DummyInteractor() + app = DummyApp() + loadapp = DummyLoadApp(app) + command.interact = (interact,) + command.loadapp = (loadapp,) + model = Dummy() + command.ConfigParser = makeDummyConfigParser([('m', model)]) + command.args = ('/foo/bar/myapp.ini#myapp',) + class Options(object): pass + command.options = Options() + command.options.disable_ipython = False + command.command(IPShell=None) + self.assertEqual(loadapp.config_name, 'config:/foo/bar/myapp.ini') + self.assertEqual(loadapp.section_name, 'myapp') + self.assertTrue(loadapp.relative_to) + self.assertEqual(len(app.threadlocal_manager.pushed), 1) + pushed = app.threadlocal_manager.pushed[0] + self.assertEqual(pushed['registry'], dummy_registry) + self.assertEqual(pushed['request'].registry, dummy_registry) + self.assertEqual(interact.local, {'app':app, + 'root':dummy_root, + 'registry':dummy_registry, + 'settings':dummy_registry.settings, + 'm': model}) + self.assertTrue(interact.banner) + self.assertEqual(len(app.threadlocal_manager.popped), 1) + + def test_command_no_custom_section(self): + command = self._makeOne() + interact = DummyInteractor() + app = DummyApp() + loadapp = DummyLoadApp(app) + command.interact = (interact,) + command.loadapp = (loadapp,) + command.ConfigParser = makeDummyConfigParser(None) + command.args = ('/foo/bar/myapp.ini#myapp',) + class Options(object): pass + command.options = Options() + command.options.disable_ipython = False + command.command(IPShell=None) + self.assertEqual(loadapp.config_name, 'config:/foo/bar/myapp.ini') + self.assertEqual(loadapp.section_name, 'myapp') + self.assertTrue(loadapp.relative_to) + self.assertEqual(len(app.threadlocal_manager.pushed), 1) + pushed = app.threadlocal_manager.pushed[0] + self.assertEqual(pushed['registry'], dummy_registry) + self.assertEqual(pushed['request'].registry, dummy_registry) + self.assertEqual(interact.local, {'app':app, + 'root':dummy_root, + 'registry':dummy_registry, + 'settings':dummy_registry.settings}) + self.assertTrue(interact.banner) + self.assertEqual(len(app.threadlocal_manager.popped), 1) + + def test_command_custom_section_override(self): + command = self._makeOne() + interact = DummyInteractor() + app = Dummy() + loadapp = DummyLoadApp(app) + command.interact = (interact,) + command.loadapp = (loadapp,) + model = Dummy() + command.ConfigParser = makeDummyConfigParser([('app', model)]) + command.args = ('/foo/bar/myapp.ini#myapp',) + class Options(object): pass + command.options = Options() + command.options.disable_ipython = False + command.command(IPShell=None) + self.assertEqual(loadapp.config_name, 'config:/foo/bar/myapp.ini') + self.assertEqual(loadapp.section_name, 'myapp') + self.assertTrue(loadapp.relative_to) + self.assertEqual(interact.local, {'app':model}) + self.assertTrue(interact.banner) + + def test_command_generic_wsgi_app(self): + command = self._makeOne() + interact = DummyInteractor() + app = Dummy() + loadapp = DummyLoadApp(app) + command.interact = (interact,) + command.loadapp = (loadapp,) + command.ConfigParser = makeDummyConfigParser(None) + command.args = ('/foo/bar/myapp.ini#myapp',) + class Options(object): pass + command.options = Options() + command.options.disable_ipython = False + command.command(IPShell=None) + self.assertEqual(loadapp.config_name, 'config:/foo/bar/myapp.ini') + self.assertEqual(loadapp.section_name, 'myapp') + self.assertTrue(loadapp.relative_to) + self.assertEqual(interact.local, {'app':app}) + self.assertTrue(interact.banner) + class TestPRoutesCommand(unittest.TestCase): def _getTargetClass(self): from pyramid.paster import PRoutesCommand @@ -152,7 +262,7 @@ class TestPRoutesCommand(unittest.TestCase): app = DummyApp() loadapp = DummyLoadApp(app) command.loadapp = (loadapp,) - command.args = ('/foo/bar/myapp.ini#myapp') + command.args = ('/foo/bar/myapp.ini#myapp',) result = command.command() self.assertEqual(result, None) self.assertEqual(L, []) @@ -165,7 +275,7 @@ class TestPRoutesCommand(unittest.TestCase): app = DummyApp() loadapp = DummyLoadApp(app) command.loadapp = (loadapp,) - command.args = ('/foo/bar/myapp.ini#myapp') + command.args = ('/foo/bar/myapp.ini#myapp',) result = command.command() self.assertEqual(result, None) self.assertEqual(L, []) @@ -180,7 +290,7 @@ class TestPRoutesCommand(unittest.TestCase): app = DummyApp() loadapp = DummyLoadApp(app) command.loadapp = (loadapp,) - command.args = ('/foo/bar/myapp.ini#myapp') + command.args = ('/foo/bar/myapp.ini#myapp',) result = command.command() self.assertEqual(result, None) self.assertEqual(len(L), 3) @@ -205,7 +315,7 @@ class TestPRoutesCommand(unittest.TestCase): app.registry = registry loadapp = DummyLoadApp(app) command.loadapp = (loadapp,) - command.args = ('/foo/bar/myapp.ini#myapp') + command.args = ('/foo/bar/myapp.ini#myapp',) result = command.command() self.assertEqual(result, None) self.assertEqual(len(L), 3) @@ -235,7 +345,7 @@ class TestPRoutesCommand(unittest.TestCase): app.registry = registry loadapp = DummyLoadApp(app) command.loadapp = (loadapp,) - command.args = ('/foo/bar/myapp.ini#myapp') + command.args = ('/foo/bar/myapp.ini#myapp',) result = command.command() self.assertEqual(result, None) self.assertEqual(len(L), 3) @@ -268,7 +378,7 @@ class TestPRoutesCommand(unittest.TestCase): app.registry = registry loadapp = DummyLoadApp(app) command.loadapp = (loadapp,) - command.args = ('/foo/bar/myapp.ini#myapp') + command.args = ('/foo/bar/myapp.ini#myapp',) result = command.command() self.assertEqual(result, None) self.assertEqual(len(L), 3) @@ -844,6 +954,7 @@ class DummyIPShell(object): dummy_root = Dummy() class DummyRegistry(object): + settings = {} def queryUtility(self, iface, default=None, name=''): return default @@ -925,3 +1036,15 @@ class DummyMultiView(object): self.views = [(None, view, None) for view in views] self.__request_attrs__ = attrs +def makeDummyConfigParser(items): + class DummyConfigParser(object): + def read(self, filename): + self.filename = filename + + def items(self, section): + self.section = section + if items is None: + from ConfigParser import NoSectionError + raise NoSectionError, section + return items + return DummyConfigParser |
