summaryrefslogtreecommitdiff
path: root/repoze
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2008-08-18 04:06:35 +0000
committerChris McDonough <chrism@agendaless.com>2008-08-18 04:06:35 +0000
commite35dc1a58a4e91977dc9819c80259f09800a0b58 (patch)
treee90fea96be6f491becd5399f177057f1feeadf68 /repoze
parent0235914a7c520e20dafcfc251237deddedaf3d80 (diff)
downloadpyramid-e35dc1a58a4e91977dc9819c80259f09800a0b58.tar.gz
pyramid-e35dc1a58a4e91977dc9819c80259f09800a0b58.tar.bz2
pyramid-e35dc1a58a4e91977dc9819c80259f09800a0b58.zip
- Generated application differences: ``make_app`` entry point
renamed to ``app`` in order to have a different name than the bfg function of the same name, to prevent confusion. - Add "options" processing to bfg's ``make_app`` to support runtime options. A new API function named ``get_options`` was added to the registry module. This function is typically used in an application's ``app`` entry point. The Paste config file section for the app can now supply the ``reload_templates`` option, which, if true, will prevent the need to restart the appserver in order for ``z3c.pt`` or XSLT template changes to be detected. - Use only the module name in generated project's "test_suite" (run all tests found in the package). - Default port for generated apps changed from 5432 to 6543 (Postgres default port is 6543).
Diffstat (limited to 'repoze')
-rw-r--r--repoze/bfg/__init__.py1
-rw-r--r--repoze/bfg/meta.zcml6
-rw-r--r--repoze/bfg/paster_template/+package+.ini_tmpl5
-rw-r--r--repoze/bfg/paster_template/+package+/run.py_tmpl12
-rw-r--r--repoze/bfg/paster_template/setup.py_tmpl4
-rw-r--r--repoze/bfg/registry.py24
-rw-r--r--repoze/bfg/router.py19
-rw-r--r--repoze/bfg/sampleapp/configure.zcml3
-rw-r--r--repoze/bfg/sampleapp/run.py2
-rw-r--r--repoze/bfg/tests/test_registry.py22
-rw-r--r--repoze/bfg/tests/test_zcml.py31
-rw-r--r--repoze/bfg/zcml.py27
12 files changed, 69 insertions, 87 deletions
diff --git a/repoze/bfg/__init__.py b/repoze/bfg/__init__.py
index e677d851b..e603a8fac 100644
--- a/repoze/bfg/__init__.py
+++ b/repoze/bfg/__init__.py
@@ -1,5 +1,6 @@
try:
from repoze.bfg.router import make_app # for import elsewhere
+ from repoze.bfg.registry import get_options # for import elsewhere
except ImportError:
# don't try so hard that we cause setup.py test to fail when the
# right modules aren't installed.
diff --git a/repoze/bfg/meta.zcml b/repoze/bfg/meta.zcml
index 91b4f40e8..72e963ae6 100644
--- a/repoze/bfg/meta.zcml
+++ b/repoze/bfg/meta.zcml
@@ -10,12 +10,6 @@
handler=".zcml.view"
/>
- <meta:directive
- name="settings"
- schema=".zcml.ISettingsDirective"
- handler=".zcml.settings"
- />
-
</meta:directives>
</configure>
diff --git a/repoze/bfg/paster_template/+package+.ini_tmpl b/repoze/bfg/paster_template/+package+.ini_tmpl
index 9bb03718c..2d6c4d0a2 100644
--- a/repoze/bfg/paster_template/+package+.ini_tmpl
+++ b/repoze/bfg/paster_template/+package+.ini_tmpl
@@ -2,10 +2,11 @@
debug = true
[app:main]
-use = egg:{{project}}#make_app
+use = egg:{{project}}#app
+reload_templates = true
[server:main]
use = egg:PasteScript#cherrypy
host = 0.0.0.0
-port = 5432
+port = 6543
numthreads = 4
diff --git a/repoze/bfg/paster_template/+package+/run.py_tmpl b/repoze/bfg/paster_template/+package+/run.py_tmpl
index f8228d30a..b3c3d1ed7 100644
--- a/repoze/bfg/paster_template/+package+/run.py_tmpl
+++ b/repoze/bfg/paster_template/+package+/run.py_tmpl
@@ -1,13 +1,13 @@
-def make_app(global_config, **kw):
+from repoze.bfg import make_app
+from repoze.bfg import get_options
+
+def app(global_config, **kw):
# paster app config callback
- from repoze.bfg import make_app
from {{project}}.models import get_root
import {{ project}}
- app = make_app(get_root, {{project}})
- return app
+ return make_app(get_root, {{project}}, options=get_options(kw))
if __name__ == '__main__':
from paste import httpserver
- app = make_app(None)
- httpserver.serve(app, host='0.0.0.0', port='5432')
+ httpserver.serve(app(None), host='0.0.0.0', port='6543')
diff --git a/repoze/bfg/paster_template/setup.py_tmpl b/repoze/bfg/paster_template/setup.py_tmpl
index 278153de8..d2b4d575b 100644
--- a/repoze/bfg/paster_template/setup.py_tmpl
+++ b/repoze/bfg/paster_template/setup.py_tmpl
@@ -35,10 +35,10 @@ setup(name='{{project}}',
tests_require=[
'repoze.bfg',
],
- test_suite="{{project}}.tests",
+ test_suite="{{project}}",
entry_points = """\
[paste.app_factory]
- make_app = {{project}}.run:make_app
+ app = {{project}}.run:app
"""
)
diff --git a/repoze/bfg/registry.py b/repoze/bfg/registry.py
index e1887bbdd..e02e5124e 100644
--- a/repoze/bfg/registry.py
+++ b/repoze/bfg/registry.py
@@ -6,9 +6,12 @@ from zope.component.interfaces import ComponentLookupError
from zope.component.interfaces import IComponentLookup
from zope.component.registry import Components
from zope.component import getSiteManager as original_getSiteManager
-
from zope.configuration import xmlconfig
+from zope.interface import implements
+
+from repoze.bfg.interfaces import ISettings
+
class ThreadLocalRegistryManager(threading.local):
registry = getGlobalSiteManager()
def set(self, registry):
@@ -28,7 +31,7 @@ def setRegistryManager(manager): # for unit tests
registry_manager = manager
return old_registry_manager
-def makeRegistry(filename, package, lock=threading.Lock()):
+def makeRegistry(filename, package, options=None, lock=threading.Lock()):
# This is absurd and probably not worth it. We want to try to
# push our ZCML-defined configuration into an app-local component
# registry in order to allow more than one bfg app to live in the
@@ -50,12 +53,21 @@ def makeRegistry(filename, package, lock=threading.Lock()):
original_getSiteManager.sethook(getSiteManager)
zope.component.getGlobalSiteManager = registry_manager.get
xmlconfig.file(filename, package=package)
+ if options is None:
+ options = {}
+ settings = Settings(options)
+ registry.registerUtility(settings, ISettings)
return registry
finally:
zope.component.getGlobalSiteManager = getGlobalSiteManager
lock.release()
registry_manager.clear()
+class Settings(object):
+ implements(ISettings)
+ def __init__(self, options):
+ self.reload_templates = options.get('reload_templates', False)
+
def getSiteManager(context=None):
if context is None:
return registry_manager.get()
@@ -65,6 +77,14 @@ def getSiteManager(context=None):
except TypeError, error:
raise ComponentLookupError(*error.args)
+def asbool(s):
+ s = str(s).strip()
+ return s.lower() in ('t', 'true', 'y', 'yes', 'on', '1')
+
+def get_options(kw):
+ reload_templates = asbool(kw.get('reload_templates'))
+ return {'reload_templates':reload_templates}
+
from zope.testing.cleanup import addCleanUp
try:
addCleanUp(original_getSiteManager.reset)
diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py
index d6b60f5ec..49ccd1ad6 100644
--- a/repoze/bfg/router.py
+++ b/repoze/bfg/router.py
@@ -74,16 +74,21 @@ def isResponse(ob):
isinstance(ob.status, basestring) ) :
return True
-def make_app(root_policy, package=None, filename='configure.zcml'):
+def make_app(root_policy, package=None, filename='configure.zcml',
+ options=None):
""" Create a view registry based on the application's ZCML. and
return a Router object, representing a ``repoze.bfg`` WSGI
- application. 'root_policy' must be a callable that accepts a WSGI
- environment and returns a graph root object. 'package' is the
- dotted-Python-path packagename of the application, 'filename' is
- the filesystem path to a ZCML file (optionally relative to the
- package path) that should be parsed to create the view registry."""
+ application. ``root_policy`` must be a callable that accepts a
+ WSGI environment and returns a graph root object. ``package`` is
+ a Python module representing the application's package,
+ ``filename`` is the filesystem path to a ZCML file (optionally
+ relative to the package path) that should be parsed to create the
+ view registry. ``options``, if used, should be a dictionary
+ containing bfg-specific runtime options, with each key
+ representing the option and the key's value representing the
+ specific option value, e.g. ``{'reload_templates':True}``"""
from repoze.bfg.registry import makeRegistry
- registry = makeRegistry(filename, package)
+ registry = makeRegistry(filename, package, options)
return Router(root_policy, registry)
diff --git a/repoze/bfg/sampleapp/configure.zcml b/repoze/bfg/sampleapp/configure.zcml
index d20d7d8f9..a5f27595e 100644
--- a/repoze/bfg/sampleapp/configure.zcml
+++ b/repoze/bfg/sampleapp/configure.zcml
@@ -4,9 +4,6 @@
<include package="repoze.bfg" />
- <bfg:settings
- reload_templates="true"/>
-
<utility
provides="repoze.bfg.interfaces.ISecurityPolicy"
factory="repoze.bfg.security.RemoteUserACLSecurityPolicy"
diff --git a/repoze/bfg/sampleapp/run.py b/repoze/bfg/sampleapp/run.py
index 6c36c430e..df2ceca39 100644
--- a/repoze/bfg/sampleapp/run.py
+++ b/repoze/bfg/sampleapp/run.py
@@ -3,7 +3,7 @@ from repoze.bfg import sampleapp
from repoze.bfg.sampleapp.models import get_root
def main():
- app = make_app(get_root, sampleapp)
+ app = make_app(get_root, sampleapp, options={'reload_templates':True})
from paste import httpserver
httpserver.serve(app, host='0.0.0.0', port='5432')
diff --git a/repoze/bfg/tests/test_registry.py b/repoze/bfg/tests/test_registry.py
index 0d051c131..de8481fd8 100644
--- a/repoze/bfg/tests/test_registry.py
+++ b/repoze/bfg/tests/test_registry.py
@@ -23,15 +23,37 @@ class TestMakeRegistry(unittest.TestCase, PlacelessSetup):
old = repoze.bfg.registry.setRegistryManager(dummyregmgr)
registry = makeRegistry('configure.zcml',
fixtureapp,
+ options={'reload_templates':True},
lock=dummylock)
from zope.component.registry import Components
self.failUnless(isinstance(registry, Components))
self.assertEqual(dummylock.acquired, True)
self.assertEqual(dummylock.released, True)
self.assertEqual(dummyregmgr.registry, registry)
+ from zope.component import getUtility
+ from repoze.bfg.interfaces import ISettings
+ settings = getUtility(ISettings)
+ self.assertEqual(settings.reload_templates, True)
finally:
repoze.bfg.registry.setRegistryManager(old)
+class TestGetOptions(unittest.TestCase):
+ def _getFUT(self):
+ from repoze.bfg.registry import get_options
+ return get_options
+
+ def test_it(self):
+ get_options = self._getFUT()
+ self.assertEqual(get_options({}),
+ {'reload_templates':False})
+ self.assertEqual(get_options({'reload_templates':'false'}),
+ {'reload_templates':False})
+ self.assertEqual(get_options({'reload_templates':'t'}),
+ {'reload_templates':True})
+ self.assertEqual(get_options({'reload_templates':'1'}),
+ {'reload_templates':True})
+
+
class TestThreadLocalRegistryManager(unittest.TestCase, PlacelessSetup):
def setUp(self):
PlacelessSetup.setUp(self)
diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py
index 407eaf24e..663022796 100644
--- a/repoze/bfg/tests/test_zcml.py
+++ b/repoze/bfg/tests/test_zcml.py
@@ -114,37 +114,6 @@ class TestViewDirective(unittest.TestCase, PlacelessSetup):
self.assertEqual(regadapt['args'][4], '')
self.assertEqual(regadapt['args'][5], None)
-class TestSettingsDirective(unittest.TestCase, PlacelessSetup):
- def setUp(self):
- PlacelessSetup.setUp(self)
-
- def tearDown(self):
- PlacelessSetup.tearDown(self)
-
- def _getFUT(self):
- from repoze.bfg.zcml import settings
- return settings
-
- def test_defaults(self):
- context = DummyContext()
- settings = self._getFUT()
- settings(context)
- actions = context.actions
- from repoze.bfg.interfaces import ISettings
- from zope.component.zcml import handler
- self.assertEqual(len(actions), 1)
- action = actions[0]
- self.assertEqual(action['discriminator'], ('settings', ISettings))
- self.assertEqual(action['callable'], handler)
- self.assertEqual(len(action['args']), 5)
- self.assertEqual(action['args'][0], 'registerUtility')
- settings = action['args'][1]
- self.assertEqual(settings.reload_templates, False)
- self.failUnless(ISettings.providedBy(settings), settings)
- self.assertEqual(action['args'][2], ISettings)
- self.assertEqual(action['args'][3], '')
- self.assertEqual(action['args'][4], context.info)
-
class TestSampleApp(unittest.TestCase, PlacelessSetup):
def setUp(self):
PlacelessSetup.setUp(self)
diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py
index bb37c6581..343abc1d7 100644
--- a/repoze/bfg/zcml.py
+++ b/repoze/bfg/zcml.py
@@ -2,44 +2,17 @@ from zope.component.zcml import handler
from zope.component.interface import provideInterface
from zope.configuration.exceptions import ConfigurationError
from zope.configuration.fields import GlobalObject
-from zope.configuration.fields import Bool
from zope.interface import Interface
-from zope.interface import implements
from zope.schema import TextLine
from repoze.bfg.interfaces import IRequest
from repoze.bfg.interfaces import IViewPermission
from repoze.bfg.interfaces import IView
-from repoze.bfg.interfaces import ISettings
from repoze.bfg.security import ViewPermissionFactory
-def _handler(*arg, **kw):
- import pdb; pdb.set_trace()
- return handler(*arg, **kw)
-
-class Settings(object):
- implements(ISettings)
- def __init__(self, reload_templates=False):
- self.reload_templates = reload_templates
-
-def settings(_context, reload_templates=False):
- settings = Settings(reload_templates=reload_templates)
- _context.action(
- discriminator = ('settings', ISettings),
- callable = handler,
- args = ('registerUtility', settings, ISettings, '', _context.info),
- )
-
-class ISettingsDirective(Interface):
- reload_templates = Bool(
- title=u"Reload templates when they change",
- description=(u"Specifies whether templates should be reloaded when"
- "a change is made"),
- default=False)
-
def view(_context,
permission=None,
for_=None,