summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyramid/paster.py17
-rw-r--r--pyramid/tests/test_paster.py165
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