From 69dfd4ba10c01181ae006266efce5d6057091b72 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sat, 12 Jul 2008 10:46:04 +0000 Subject: metaconfigure.py -> zcml.py --- repoze/bfg/meta.zcml | 4 +- repoze/bfg/metaconfigure.py | 116 --------------------------------- repoze/bfg/tests/test_metaconfigure.py | 92 -------------------------- repoze/bfg/tests/test_zcml.py | 92 ++++++++++++++++++++++++++ repoze/bfg/zcml.py | 116 +++++++++++++++++++++++++++++++++ 5 files changed, 210 insertions(+), 210 deletions(-) delete mode 100644 repoze/bfg/metaconfigure.py delete mode 100644 repoze/bfg/tests/test_metaconfigure.py create mode 100644 repoze/bfg/tests/test_zcml.py create mode 100644 repoze/bfg/zcml.py diff --git a/repoze/bfg/meta.zcml b/repoze/bfg/meta.zcml index eba63db8d..c27123485 100644 --- a/repoze/bfg/meta.zcml +++ b/repoze/bfg/meta.zcml @@ -6,8 +6,8 @@ diff --git a/repoze/bfg/metaconfigure.py b/repoze/bfg/metaconfigure.py deleted file mode 100644 index bc136055a..000000000 --- a/repoze/bfg/metaconfigure.py +++ /dev/null @@ -1,116 +0,0 @@ -import os - -from zope.schema import TextLine -from zope.configuration.fields import Path -from zope.interface import Interface -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.security.zcml import Permission - -from repoze.bfg.interfaces import IRequest -from repoze.bfg.interfaces import IViewFactory - -from repoze.bfg.template import ViewPageTemplateFile -from repoze.bfg.template import PageTemplateFile - -class ViewBase: - def __init__(self, context, request): - self.context = context - self.request = request - - def __call__(self, *arg, **kw): - return self.index(*arg, **kw) - -def page(_context, - permission, - for_, - name="", - template=None, - class_=None, - ): - - # XXX we do nothing yet with permission - - if not (class_ or template): - raise ConfigurationError("Must specify a class or a template") - - if template: - template = os.path.abspath(str(_context.path(template))) - if not os.path.isfile(template): - raise ConfigurationError("No such file", template) - - template_inst = PageTemplateFile(template) - - def view_factory(context, request): - if template: - if class_ is None: - base = ViewBase - else: - base = class_ - class ViewClass(base): - __name__ = name - index = ViewPageTemplateFile(template_inst) - return ViewClass(context, request) - - else: - return class_(context, request) - - if for_ is not None: - _context.action( - discriminator = None, - callable = provideInterface, - args = ('', for_) - ) - - _context.action( - discriminator = ('view', for_, name, IRequest, IViewFactory), - callable = handler, - args = ('registerAdapter', - view_factory, (for_, IRequest), IViewFactory, name, - _context.info), - ) - -class IPageDirective(Interface): - """ - The page directive is used to create views that provide a single - url or page. - - The page directive creates a new view class from a given template - and/or class and registers it. - """ - - for_ = GlobalObject( - title=u"The interface or class this view is for.", - required=False - ) - - permission = Permission( - title=u"Permission", - description=u"The permission needed to use the view.", - required=True - ) - - class_ = GlobalObject( - title=u"Class", - description=u"A class that provides a __call__ used by the view.", - required=False, - ) - - name = TextLine( - title=u"The name of the page (view)", - description=u""" - The name shows up in URLs/paths. For example 'foo' or - 'foo.html'.""", - required=False, - ) - - template = Path( - title=u"The name of a template that implements the page.", - description=u""" - Refers to a file containing a page template (should end in - extension '.pt' or '.html').""", - required=False - ) - diff --git a/repoze/bfg/tests/test_metaconfigure.py b/repoze/bfg/tests/test_metaconfigure.py deleted file mode 100644 index e349abe5d..000000000 --- a/repoze/bfg/tests/test_metaconfigure.py +++ /dev/null @@ -1,92 +0,0 @@ -import unittest - -from zope.component.testing import PlacelessSetup - -class TestPageDirective(unittest.TestCase, PlacelessSetup): - def setUp(self): - PlacelessSetup.setUp(self) - - def tearDown(self): - PlacelessSetup.tearDown(self) - - def _getFUT(self): - from repoze.bfg.metaconfigure import page - return page - - def test_no_class_or_template(self): - f = self._getFUT() - from zope.configuration.exceptions import ConfigurationError - context = DummyContext() - self.assertRaises(ConfigurationError, f, context, 'repoze.view', None) - - def test_no_such_file(self): - f = self._getFUT() - from zope.configuration.exceptions import ConfigurationError - context = DummyContext() - self.assertRaises(ConfigurationError, f, context, 'repoze.view', None, - template='notthere.pt') - - def test_only_template(self): - f = self._getFUT() - context = DummyContext() - f(context, 'repoze.view', None, template='minimal.pt') - actions = context.actions - from repoze.bfg.interfaces import IRequest - from repoze.bfg.interfaces import IViewFactory - from zope.component.zcml import handler - expected0 = ('view', None, '', IRequest, IViewFactory) - expected1 = handler - self.assertEqual(actions[0]['discriminator'], expected0) - self.assertEqual(actions[0]['callable'], expected1) - self.assertEqual(actions[0]['args'][0], 'registerAdapter') - import types - self.failUnless(isinstance(actions[0]['args'][1], types.FunctionType)) - self.assertEqual(actions[0]['args'][2], (None, IRequest)) - self.assertEqual(actions[0]['args'][3], IViewFactory) - self.assertEqual(actions[0]['args'][4], '') - self.assertEqual(actions[0]['args'][5], None) - - def test_template_and_class(self): - f = self._getFUT() - context = DummyContext() - f(context, 'repoze.view', None, template='minimal.pt', - class_=DummyViewClass) - actions = context.actions - from repoze.bfg.interfaces import IRequest - from repoze.bfg.interfaces import IViewFactory - from zope.component.zcml import handler - expected0 = ('view', None, '', IRequest, IViewFactory) - expected1 = handler - self.assertEqual(actions[0]['discriminator'], expected0) - self.assertEqual(actions[0]['callable'], expected1) - self.assertEqual(actions[0]['args'][0], 'registerAdapter') - import types - self.failUnless(isinstance(actions[0]['args'][1], types.FunctionType)) - self.assertEqual(actions[0]['args'][2], (None, IRequest)) - self.assertEqual(actions[0]['args'][3], IViewFactory) - self.assertEqual(actions[0]['args'][4], '') - self.assertEqual(actions[0]['args'][5], None) - -class DummyViewClass: - pass - -class DummyContext: - def __init__(self): - self.actions = [] - self.info = None - - def path(self, name): - import os - here = os.path.dirname(__file__) - fixtures = os.path.join(here, 'fixtures') - return os.path.join(fixtures, name) - - def action(self, discriminator, callable, args): - self.actions.append( - {'discriminator':discriminator, - 'callable':callable, - 'args':args} - ) - - - diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py new file mode 100644 index 000000000..bcb065d9e --- /dev/null +++ b/repoze/bfg/tests/test_zcml.py @@ -0,0 +1,92 @@ +import unittest + +from zope.component.testing import PlacelessSetup + +class TestPageDirective(unittest.TestCase, PlacelessSetup): + def setUp(self): + PlacelessSetup.setUp(self) + + def tearDown(self): + PlacelessSetup.tearDown(self) + + def _getFUT(self): + from repoze.bfg.zcml import page + return page + + def test_no_class_or_template(self): + f = self._getFUT() + from zope.configuration.exceptions import ConfigurationError + context = DummyContext() + self.assertRaises(ConfigurationError, f, context, 'repoze.view', None) + + def test_no_such_file(self): + f = self._getFUT() + from zope.configuration.exceptions import ConfigurationError + context = DummyContext() + self.assertRaises(ConfigurationError, f, context, 'repoze.view', None, + template='notthere.pt') + + def test_only_template(self): + f = self._getFUT() + context = DummyContext() + f(context, 'repoze.view', None, template='minimal.pt') + actions = context.actions + from repoze.bfg.interfaces import IRequest + from repoze.bfg.interfaces import IViewFactory + from zope.component.zcml import handler + expected0 = ('view', None, '', IRequest, IViewFactory) + expected1 = handler + self.assertEqual(actions[0]['discriminator'], expected0) + self.assertEqual(actions[0]['callable'], expected1) + self.assertEqual(actions[0]['args'][0], 'registerAdapter') + import types + self.failUnless(isinstance(actions[0]['args'][1], types.FunctionType)) + self.assertEqual(actions[0]['args'][2], (None, IRequest)) + self.assertEqual(actions[0]['args'][3], IViewFactory) + self.assertEqual(actions[0]['args'][4], '') + self.assertEqual(actions[0]['args'][5], None) + + def test_template_and_class(self): + f = self._getFUT() + context = DummyContext() + f(context, 'repoze.view', None, template='minimal.pt', + class_=DummyViewClass) + actions = context.actions + from repoze.bfg.interfaces import IRequest + from repoze.bfg.interfaces import IViewFactory + from zope.component.zcml import handler + expected0 = ('view', None, '', IRequest, IViewFactory) + expected1 = handler + self.assertEqual(actions[0]['discriminator'], expected0) + self.assertEqual(actions[0]['callable'], expected1) + self.assertEqual(actions[0]['args'][0], 'registerAdapter') + import types + self.failUnless(isinstance(actions[0]['args'][1], types.FunctionType)) + self.assertEqual(actions[0]['args'][2], (None, IRequest)) + self.assertEqual(actions[0]['args'][3], IViewFactory) + self.assertEqual(actions[0]['args'][4], '') + self.assertEqual(actions[0]['args'][5], None) + +class DummyViewClass: + pass + +class DummyContext: + def __init__(self): + self.actions = [] + self.info = None + + def path(self, name): + import os + here = os.path.dirname(__file__) + fixtures = os.path.join(here, 'fixtures') + return os.path.join(fixtures, name) + + def action(self, discriminator, callable, args): + self.actions.append( + {'discriminator':discriminator, + 'callable':callable, + 'args':args} + ) + + + diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py new file mode 100644 index 000000000..bc136055a --- /dev/null +++ b/repoze/bfg/zcml.py @@ -0,0 +1,116 @@ +import os + +from zope.schema import TextLine +from zope.configuration.fields import Path +from zope.interface import Interface +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.security.zcml import Permission + +from repoze.bfg.interfaces import IRequest +from repoze.bfg.interfaces import IViewFactory + +from repoze.bfg.template import ViewPageTemplateFile +from repoze.bfg.template import PageTemplateFile + +class ViewBase: + def __init__(self, context, request): + self.context = context + self.request = request + + def __call__(self, *arg, **kw): + return self.index(*arg, **kw) + +def page(_context, + permission, + for_, + name="", + template=None, + class_=None, + ): + + # XXX we do nothing yet with permission + + if not (class_ or template): + raise ConfigurationError("Must specify a class or a template") + + if template: + template = os.path.abspath(str(_context.path(template))) + if not os.path.isfile(template): + raise ConfigurationError("No such file", template) + + template_inst = PageTemplateFile(template) + + def view_factory(context, request): + if template: + if class_ is None: + base = ViewBase + else: + base = class_ + class ViewClass(base): + __name__ = name + index = ViewPageTemplateFile(template_inst) + return ViewClass(context, request) + + else: + return class_(context, request) + + if for_ is not None: + _context.action( + discriminator = None, + callable = provideInterface, + args = ('', for_) + ) + + _context.action( + discriminator = ('view', for_, name, IRequest, IViewFactory), + callable = handler, + args = ('registerAdapter', + view_factory, (for_, IRequest), IViewFactory, name, + _context.info), + ) + +class IPageDirective(Interface): + """ + The page directive is used to create views that provide a single + url or page. + + The page directive creates a new view class from a given template + and/or class and registers it. + """ + + for_ = GlobalObject( + title=u"The interface or class this view is for.", + required=False + ) + + permission = Permission( + title=u"Permission", + description=u"The permission needed to use the view.", + required=True + ) + + class_ = GlobalObject( + title=u"Class", + description=u"A class that provides a __call__ used by the view.", + required=False, + ) + + name = TextLine( + title=u"The name of the page (view)", + description=u""" + The name shows up in URLs/paths. For example 'foo' or + 'foo.html'.""", + required=False, + ) + + template = Path( + title=u"The name of a template that implements the page.", + description=u""" + Refers to a file containing a page template (should end in + extension '.pt' or '.html').""", + required=False + ) + -- cgit v1.2.3