[Checkins] SVN: megrok.quarry/ add source files
Kevin Smith
kevin at mcweekly.com
Wed May 2 03:23:50 EDT 2007
Log message for revision 74991:
add source files
Changed:
D megrok.quarry/.installed.cfg
A megrok.quarry/trunk/src/megrok/
A megrok.quarry/trunk/src/megrok/__init__.py
A megrok.quarry/trunk/src/megrok/quarry/
A megrok.quarry/trunk/src/megrok/quarry/__init__.py
A megrok.quarry/trunk/src/megrok/quarry/components.py
A megrok.quarry/trunk/src/megrok/quarry/configure.zcml
A megrok.quarry/trunk/src/megrok/quarry/directive.py
A megrok.quarry/trunk/src/megrok/quarry/ftests/
A megrok.quarry/trunk/src/megrok/quarry/ftests/view/
A megrok.quarry/trunk/src/megrok/quarry/meta.py
A megrok.quarry/trunk/src/megrok/quarry/meta.zcml
-=-
Deleted: megrok.quarry/.installed.cfg
===================================================================
--- megrok.quarry/.installed.cfg 2007-05-02 07:16:06 UTC (rev 74990)
+++ megrok.quarry/.installed.cfg 2007-05-02 07:23:49 UTC (rev 74991)
@@ -1,86 +0,0 @@
-[buildout]
-installed_develop_eggs = /home/notroot/now/now/megrok.quarry/develop-eggs/megrok.quarry.egg-link
- /home/notroot/now/now/megrok.quarry/develop-eggs/grok.egg-link
-parts = test data instance
-
-[test]
-__buildout_installed__ = /home/notroot/now/now/megrok.quarry/bin/test
-__buildout_signature__ = zc.recipe.testrunner-1.0.0b7-py2.4.egg zc.recipe.egg-1.0.0b6-py2.4.egg setuptools-0.6c5-py2.4.egg zope.testing-3.4-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg
-_b = /home/notroot/now/now/megrok.quarry/bin
-_d = /home/notroot/now/now/megrok.quarry/develop-eggs
-_e = /root/eggs/
-bin-directory = /home/notroot/now/now/megrok.quarry/bin
-defaults = ['--tests-pattern', '^f?tests$',
- '-v'
- ]
-develop-eggs-directory = /home/notroot/now/now/megrok.quarry/develop-eggs
-eggs = megrok.quarry
- grok
-eggs-directory = /root/eggs/
-executable = /usr/bin/python
-extra-paths = /root/zope3/src
-recipe = zc.recipe.testrunner
-script = /home/notroot/now/now/megrok.quarry/bin/test
-working-directory = parts/instance
-
-[data]
-__buildout_installed__ =
-__buildout_signature__ = zc.recipe.filestorage-1.0a5-py2.4.egg setuptools-0.6c5-py2.4.egg zope.testing-3.4-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg
-path = /home/notroot/now/now/megrok.quarry/parts/data/Data.fs
-recipe = zc.recipe.filestorage
-zconfig = <zodb>
- %(__buildout_space__)s%(__buildout_space__)s<filestorage>
- %(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)spath /home/notroot/now/now/megrok.quarry/parts/data/Data.fs
- %(__buildout_space__)s%(__buildout_space__)s</filestorage>
- </zodb>%(__buildout_space_n__)s
-
-[instance]
-__buildout_installed__ = /home/notroot/now/now/megrok.quarry/parts/instance
-__buildout_signature__ = zc.recipe.zope3instance-1.0.0a1-py2.4.egg zc.recipe.egg-1.0.0b6-py2.4.egg setuptools-0.6c5-py2.4.egg zope.testing-3.4-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg zc.buildout-1.0.0b23-py2.4.egg
-_b = /home/notroot/now/now/megrok.quarry/bin
-_d = /home/notroot/now/now/megrok.quarry/develop-eggs
-_e = /root/eggs/
-bin-directory = /home/notroot/now/now/megrok.quarry/bin
-database = data
-database-config = <zodb>
- %(__buildout_space__)s%(__buildout_space__)s<filestorage>
- %(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)s%(__buildout_space__)spath /home/notroot/now/now/megrok.quarry/parts/data/Data.fs
- %(__buildout_space__)s%(__buildout_space__)s</filestorage>
- </zodb>%(__buildout_space_n__)s
-develop-eggs-directory = /home/notroot/now/now/megrok.quarry/develop-eggs
-eggs = setuptools
- grok
- megrok.quarry
-eggs-directory = /root/eggs/
-executable = /usr/bin/python
-location = /home/notroot/now/now/megrok.quarry/parts/instance
-recipe = zc.recipe.zope3instance
-scripts =
-user = ksmith:123
-zcml = zope.annotation
- zope.copypastemove
- zope.formlib
- zope.i18n-meta
- zope.i18n.locales
- zope.publisher
- zope.security-meta
- zope.size
- zope.traversing
- zope.traversing.browser
- zope.app
- zope.app-meta
- zope.app.securitypolicy
- zope.app.securitypolicy-meta
- zope.app.authentication
- zope.app.catalog
- zope.app.intid
- zope.app.keyreference
- zope.app.twisted
- megrok.quarry-meta
- grok
- grok-meta
-zope3 = zope3
-zope3-directory = /root/zope3
-
-[buildout]
-parts = data instance test
Added: megrok.quarry/trunk/src/megrok/__init__.py
===================================================================
--- megrok.quarry/trunk/src/megrok/__init__.py 2007-05-02 07:16:06 UTC (rev 74990)
+++ megrok.quarry/trunk/src/megrok/__init__.py 2007-05-02 07:23:49 UTC (rev 74991)
@@ -0,0 +1,6 @@
+# namespace package boilerplate
+try:
+ __import__('pkg_resources').declare_namespace(__name__)
+except ImportError, e:
+ from pkgutil import extend_path
+ __path__ = extend_path(__path__, __name__)
Added: megrok.quarry/trunk/src/megrok/quarry/__init__.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/__init__.py 2007-05-02 07:16:06 UTC (rev 74990)
+++ megrok.quarry/trunk/src/megrok/quarry/__init__.py 2007-05-02 07:23:49 UTC (rev 74991)
@@ -0,0 +1,5 @@
+# this directory is a package
+
+
+from directive import layer, template
+from components import Layer, Skin, View
Added: megrok.quarry/trunk/src/megrok/quarry/components.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/components.py 2007-05-02 07:16:06 UTC (rev 74990)
+++ megrok.quarry/trunk/src/megrok/quarry/components.py 2007-05-02 07:23:49 UTC (rev 74991)
@@ -0,0 +1,214 @@
+from zope import interface, component
+from zope.publisher.browser import BrowserPage
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.publisher.publish import mapply
+from grok import util, interfaces, formlib
+
+
+class Layer(IDefaultBrowserLayer):
+ pass
+
+
+class Skin(object):
+ pass
+
+
+class View(BrowserPage):
+ interface.implements(interfaces.IGrokView)
+
+ def __init__(self, context, request):
+ super(View, self).__init__(context, request)
+ self.static = component.queryAdapter(
+ self.request,
+ interface.Interface,
+ name=self.module_info.package_dotted_name
+ )
+
+ @property
+ def response(self):
+ return self.request.response
+
+ def __call__(self):
+ mapply(self.update, (), self.request)
+ if self.request.response.getStatus() in (302, 303):
+ # A redirect was triggered somewhere in update(). Don't
+ # continue rendering the template or doing anything else.
+ return
+
+ template = getattr(self, 'template', None)
+ if template is not None:
+ return self._render_template()
+ return mapply(self.render, (), self.request)
+
+ def _render_template(self):
+ namespace = self.template.pt_getContext()
+ namespace['request'] = self.request
+ namespace['view'] = self
+ namespace['context'] = self.context
+ # XXX need to check whether we really want to put None here if missing
+ namespace['static'] = self.static
+ return self.template.pt_render(namespace)
+
+ def __getitem__(self, key):
+ # XXX give nice error message if template is None
+ return self.template.macros[key]
+
+ def url(self, obj=None, name=None):
+ # if the first argument is a string, that's the name. There should
+ # be no second argument
+ if isinstance(obj, basestring):
+ if name is not None:
+ raise TypeError(
+ 'url() takes either obj argument, obj, string arguments, '
+ 'or string argument')
+ name = obj
+ obj = None
+
+ if name is None and obj is None:
+ # create URL to view itself
+ obj = self
+ elif name is not None and obj is None:
+ # create URL to view on context
+ obj = self.context
+ return util.url(self.request, obj, name)
+
+ def redirect(self, url):
+ return self.request.response.redirect(url)
+
+ def update(self):
+ pass
+
+
+# class ViewletManager(ViewletManagerBase):
+# """ A grok.View-like ViewletManager
+# """
+
+# template = None
+
+# def __init__(self, context, request, view):
+# super(ViewletManager, self).__init__(context, request, view)
+# self.static = component.queryAdapter(
+# self.request,
+# interface.Interface,
+# name=self.module_info.package_dotted_name
+# )
+
+# def render(self):
+# """See zope.contentprovider.interfaces.IContentProvider"""
+# # Now render the view
+# if self.template:
+# #return self.template(viewlets=self.viewlets)
+# return self._render_template()
+# else:
+# return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
+
+# @property
+# def response(self):
+# return self.request.response
+
+# def _render_template(self):
+# namespace = self.template.pt_getContext()
+# namespace['request'] = self.request
+# namespace['view'] = self
+# namespace['viewlets'] = self.viewlets
+# namespace['static'] = self.static
+# namespace['context'] = self.context
+# # XXX need to check whether we really want to put None here if missing
+# return self.template.pt_render(namespace)
+
+# def sort(self, viewlets):
+# # sort by viewlet class name as default
+# return sorted(viewlets, lambda x,y: cmp(x[0], y[0]))
+
+# def url(self, obj=None, name=None):
+# # if the first argument is a string, that's the name. There should
+# # be no second argument
+# if isinstance(obj, basestring):
+# if name is not None:
+# raise TypeError(
+# 'url() takes either obj argument, obj, string arguments, '
+# 'or string argument')
+# name = obj
+# obj = None
+
+# if name is None and obj is None:
+# # create URL to view itself
+# obj = self
+# elif name is not None and obj is None:
+# # create URL to view on context
+# obj = self.context
+# return util.url(self.request, obj, name)
+
+# def redirect(self, url):
+# return self.request.response.redirect(url)
+
+
+# class Viewlet(ViewletBase):
+# """ A grok.View-like viewlet
+# """
+
+
+# def __init__(self, context, request, view, manager):
+# super(Viewlet, self).__init__(context, request, view, manager)
+# self.static = component.queryAdapter(
+# self.request,
+# interface.Interface,
+# name=self.module_info.package_dotted_name
+# )
+
+
+# @property
+# def response(self):
+# return self.request.response
+
+
+# def render(self):
+# mapply(self.update, (), self.request)
+# if self.request.response.getStatus() in (302, 303):
+# # A redirect was triggered somewhere in update(). Don't
+# # continue rendering the template or doing anything else.
+# return
+
+# template = getattr(self, 'template', None)
+# if template is not None:
+# return self._render_template()
+
+# def _render_template(self):
+# namespace = self.template.pt_getContext()
+# namespace['request'] = self.request
+# namespace['view'] = self
+# namespace['context'] = self.context
+# # XXX need to check whether we really want to put None here if missing
+# namespace['static'] = self.static
+# return self.template.pt_render(namespace)
+
+# def __getitem__(self, key):
+# # XXX give nice error message if template is None
+# return self.template.macros[key]
+
+# def url(self, obj=None, name=None):
+# # if the first argument is a string, that's the name. There should
+# # be no second argument
+# if isinstance(obj, basestring):
+# if name is not None:
+# raise TypeError(
+# 'url() takes either obj argument, obj, string arguments, '
+# 'or string argument')
+# name = obj
+# obj = None
+
+# if name is None and obj is None:
+# # create URL to view itself
+# obj = self
+# elif name is not None and obj is None:
+# # create URL to view on context
+# obj = self.context
+# return util.url(self.request, obj, name)
+
+# def redirect(self, url):
+# return self.request.response.redirect(url)
+
+# def update(self):
+# pass
+
+
Added: megrok.quarry/trunk/src/megrok/quarry/configure.zcml
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/configure.zcml 2007-05-02 07:16:06 UTC (rev 74990)
+++ megrok.quarry/trunk/src/megrok/quarry/configure.zcml 2007-05-02 07:23:49 UTC (rev 74991)
@@ -0,0 +1,5 @@
+<configure>
+
+<!--<grok package="" xmlns="http://namespaces.zope.org/grok" />-->
+
+</configure>
\ No newline at end of file
Added: megrok.quarry/trunk/src/megrok/quarry/directive.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/directive.py 2007-05-02 07:16:06 UTC (rev 74990)
+++ megrok.quarry/trunk/src/megrok/quarry/directive.py 2007-05-02 07:23:49 UTC (rev 74991)
@@ -0,0 +1,7 @@
+from grok.directive import InterfaceOrClassDirective, ClassOrModuleDirectiveContext
+from grok.directive import SingleTextDirective, ClassDirectiveContext
+
+layer = InterfaceOrClassDirective('quarry.layer',
+ ClassOrModuleDirectiveContext())
+
+template = SingleTextDirective('quarry.template', ClassDirectiveContext())
Added: megrok.quarry/trunk/src/megrok/quarry/meta.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/meta.py 2007-05-02 07:16:06 UTC (rev 74990)
+++ megrok.quarry/trunk/src/megrok/quarry/meta.py 2007-05-02 07:23:49 UTC (rev 74991)
@@ -0,0 +1,246 @@
+import grok
+from megrok import quarry
+from grok import util, components, formlib
+from grok.error import GrokError
+
+from zope.publisher.interfaces.browser import IBrowserSkinType
+from zope.viewlet.interfaces import IViewletManager, IViewlet
+from zope.security.permission import Permission
+from zope.security.interfaces import IPermission
+from zope.security.checker import NamesChecker, defineChecker
+
+from zope.dottedname.resolve import resolve
+from zope import interface, component
+import zope.component.interface
+
+class LayerGrokker(grok.ClassGrokker):
+ component_class = quarry.Layer
+
+
+class SkinGrokker(grok.ClassGrokker):
+ component_class = quarry.Skin
+
+ def register(self, context, name, factory, module_info, templates):
+ layer = util.class_annotation(factory, 'quarry.layer',
+ None) or module_info.getAnnotation('grok.layer',
+ None) or grok.IDefaultBrowserLayer
+ name = util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+ zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
+
+
+class ViewGrokker(grok.ClassGrokker):
+ component_class = quarry.View
+
+ def register(self, context, name, factory, module_info, templates):
+ view_context = util.determine_class_context(factory, context)
+
+ factory.module_info = module_info
+ factory_name = factory.__name__.lower()
+
+ if util.check_subclass(factory, components.GrokForm):
+ # setup form_fields from context class if we've encountered a form
+ if getattr(factory, 'form_fields', None) is None:
+ factory.form_fields = formlib.get_auto_fields(view_context)
+
+ if not getattr(factory.render, 'base_method', False):
+ raise GrokError(
+ "It is not allowed to specify a custom 'render' "
+ "method for form %r. Forms either use the default "
+ "template or a custom-supplied one." % factory,
+ factory)
+
+ # find templates
+ if util.class_annotation(factory, 'grok.template',
+ None):
+ raise GrokError(
+ "%s may not use grok.template, use quarry.template instead."
+ % factory.__name__, factory)
+
+ template_name = util.class_annotation(factory, 'quarry.template',
+ None)
+ if template_name is None:
+ template_name = factory_name
+
+ template = templates.get(template_name)
+
+
+ if factory_name != template_name:
+ # grok.template is being used
+ if templates.get(factory_name):
+ raise GrokError("Multiple possible templates for view %r. It "
+ "uses grok.template('%s'), but there is also "
+ "a template called '%s'."
+ % (factory, template_name, factory_name),
+ factory)
+ # no conflicts, lets try and load the template
+ # using grok.Template('with.dotted.name')
+ try:
+ factory.template = resolve(template_name)
+ # accept string and unicode objects, useful if .__doc__ is referenced
+ if isinstance(factory.template, (str, unicode)):
+ factory.template = grok.PageTemplate(factory.template)
+ except ImportError:
+ # verify this is a dotted name
+ if template_name.find('.') >=0:
+ raise GrokError(
+ "'%s' is not importable. Check the path and"
+ "be sure it's a grok.PageTemplate,"
+ "grok.PageTemplateFile, string, or unicode object"
+ % template_name, factory)
+
+ # support in-class imports template = grok.PageTemplateFile
+ factory_template = getattr(factory, 'template', None)
+
+ if template:
+ if (getattr(factory, 'render', None) and not
+ util.check_subclass(factory, components.GrokForm)):
+ # we do not accept render and template both for a view
+ # (unless it's a form, they happen to have render.
+ raise GrokError(
+ "Multiple possible ways to render view %r. "
+ "It has both a 'render' method as well as "
+ "an associated template." % factory, factory)
+
+ templates.markAssociated(template_name)
+ factory.template = template
+ elif factory_template:
+ pass
+ else:
+ if not getattr(factory, 'render', None):
+ # we do not accept a view without any way to render it
+ raise GrokError("View %r has no associated template or "
+ "'render' method." % factory, factory)
+
+ view_layer = util.class_annotation(factory, 'grok.layer',
+ None) or module_info.getAnnotation('grok.layer',
+ None) or IDefaultBrowserLayer
+
+ view_name = util.class_annotation(factory, 'grok.name',
+ factory_name)
+ # __view_name__ is needed to support IAbsoluteURL on views
+ factory.__view_name__ = view_name
+ component.provideAdapter(factory,
+ adapts=(view_context, view_layer),
+ provides=interface.Interface,
+ name=view_name)
+
+ # protect view, public by default
+ default_permission = util.get_default_permission(factory)
+ util.make_checker(factory, factory, default_permission)
+
+ # safety belt: make sure that the programmer didn't use
+ # @grok.require on any of the view's methods.
+ methods = util.methods_from_class(factory)
+ for method in methods:
+ if getattr(method, '__grok_require__', None) is not None:
+ raise GrokError('The @grok.require decorator is used for '
+ 'method %r in view %r. It may only be used '
+ 'for XML-RPC methods.'
+ % (method.__name__, factory), factory)
+
+
+
+
+# class ViewletManagerGrokker(grok.ClassGrokker):
+# component_class = (grok.ViewletManager, grok.OrderedViewletManager)
+
+# def register(self, context, name, factory, module_info, templates):
+
+# factory.module_info = module_info # to make /static available
+
+# name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+# view_layer = util.class_annotation(factory, 'grok.layer',
+# None) or module_info.getAnnotation('grok.layer',
+# None) or IDefaultBrowserLayer
+
+# view_context = util.determine_class_context(factory, context)
+# component.provideAdapter(factory,
+# adapts=(None, # TODO: Make configurable
+# view_layer, # TODO: Make configurable
+# view_context),
+# provides=IViewletManager,
+# name=name)
+
+
+# class ViewletGrokker(grok.ClassGrokker):
+# component_class = grok.Viewlet
+
+# def register(self, context, name, factory, module_info, templates):
+# # Try to set up permissions (copied from the View grokker)
+
+# factory.module_info = module_info # to make /static available
+# factory_name = factory.__name__.lower()
+
+# permissions = grok.util.class_annotation(factory, 'grok.require', [])
+# if not permissions:
+# checker = NamesChecker(['update', 'render'])
+# elif len(permissions) > 1:
+# raise GrokError('grok.require was called multiple times in viewlet '
+# '%r. It may only be called once.' % factory,
+# factory)
+# elif permissions[0] == 'zope.Public':
+# checker = NamesChecker(['update','render'])
+# else:
+# perm = permissions[0]
+# if component.queryUtility(IPermission, name=perm) is None:
+# raise GrokError('Undefined permission %r in view %r. Use '
+# 'grok.define_permission first.'
+# % (perm, factory), factory)
+# checker = NamesChecker(['update','render'], permissions[0])
+
+# defineChecker(factory, checker)
+
+
+# # find templates
+# template_name = util.class_annotation(factory, 'grok.template',
+# factory_name)
+# template = templates.get(template_name)
+
+# if factory_name != template_name:
+# # grok.template is being used
+# if templates.get(factory_name):
+# raise GrokError("Multiple possible templates for view %r. It "
+# "uses grok.template('%s'), but there is also "
+# "a template called '%s'."
+# % (factory, template_name, factory_name),
+# factory)
+
+# factory_template = getattr(factory,'template', None)
+
+# if template:
+# if (getattr(factory, 'render', None) and not
+# util.check_subclass(factory, components.GrokForm) and not
+# util.check_subclass(factory, components.Viewlet)):
+# # we do not accept render and template both for a view
+# # (unless it's a form, they happen to have render.)
+# # Forms currently not implemented in viewlets.
+# raise GrokError(
+# "Multiple possible ways to render view %r. "
+# "It has both a 'render' method as well as "
+# "an associated template." % factory, factory)
+
+# templates.markAssociated(template_name)
+# factory.template = template
+# elif factory_template and isinstance(factory_template, (components.PageTemplate, components.PageTemplateFile)):
+# pass
+# else:
+# if not getattr(factory, 'render', None):
+# # we do not accept a view without any way to render it
+# raise GrokError("View %r has no associated template or "
+# "'render' method." % factory, factory)
+
+
+# # New directive
+# viewletmanager = grok.util.class_annotation(factory, 'grok.viewletmanager', [])
+# layer = util.class_annotation(factory, 'grok.layer',
+# None) or module_info.getAnnotation('grok.layer',
+# None) or IDefaultBrowserLayer
+
+# component.provideAdapter(factory,
+# adapts=(None, # TODO: Make configurable
+# layer,
+# IBrowserView,
+# viewletmanager),
+# provides=IViewlet,
+# name=name)
+
Added: megrok.quarry/trunk/src/megrok/quarry/meta.zcml
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/meta.zcml 2007-05-02 07:16:06 UTC (rev 74990)
+++ megrok.quarry/trunk/src/megrok/quarry/meta.zcml 2007-05-02 07:23:49 UTC (rev 74991)
@@ -0,0 +1 @@
+<grok package=".meta" xmlns="http://namespaces.zope.org/grok" />
\ No newline at end of file
More information about the Checkins
mailing list