[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