[Checkins] SVN: grok/branches/philikon-grokcore.component/ Move the
base classes, decorators and grokkers out to grokcore.component.
Philipp von Weitershausen
philikon at philikon.de
Wed Aug 22 13:00:24 EDT 2007
Log message for revision 79130:
Move the base classes, decorators and grokkers out to grokcore.component.
No tests yet. But grok tests still pass.
Changed:
U grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/__init__.py
A grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/components.py
A grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/decorators.py
A grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/grokkers.py
U grok/branches/philikon-grokcore.component/grokcore.component/setup.py
U grok/branches/philikon-grokcore.component/src/grok/__init__.py
U grok/branches/philikon-grokcore.component/src/grok/_grok.py
U grok/branches/philikon-grokcore.component/src/grok/components.py
U grok/branches/philikon-grokcore.component/src/grok/meta.py
-=-
Modified: grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/__init__.py
===================================================================
--- grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/__init__.py 2007-08-22 16:56:38 UTC (rev 79129)
+++ grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/__init__.py 2007-08-22 17:00:24 UTC (rev 79130)
@@ -1,2 +1,18 @@
-# Make this directory a package
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Convenience imports
+"""
+from grokcore.component.components import Adapter, MultiAdapter, GlobalUtility
+from grokcore.component.decorators import subscribe, adapter, implementer
Added: grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/components.py
===================================================================
--- grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/components.py (rev 0)
+++ grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/components.py 2007-08-22 17:00:24 UTC (rev 79130)
@@ -0,0 +1,27 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Base classes for adapters, utlities, etc.
+"""
+class Adapter(object):
+
+ def __init__(self, context):
+ self.context = context
+
+
+class MultiAdapter(object):
+ pass
+
+
+class GlobalUtility(object):
+ pass
Property changes on: grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/components.py
___________________________________________________________________
Name: svn:eol-style
+ native
Added: grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/decorators.py
===================================================================
--- grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/decorators.py (rev 0)
+++ grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/decorators.py 2007-08-22 17:00:24 UTC (rev 79130)
@@ -0,0 +1,66 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Decorators for subscribers, adapter factories, etc.
+"""
+import sys
+import types
+from zope.component._declaration import adapter as _adapter
+from zope.interface.declarations import implementer as _implementer
+from martian.util import frame_is_module
+from martian.error import GrokImportError
+
+class subscribe:
+
+ def __init__(self, *args):
+ self.subscribed = args
+
+ def __call__(self, function):
+ frame = sys._getframe(1)
+ if not frame_is_module(frame):
+ raise GrokImportError("@grok.subscribe can only be used on module "
+ "level.")
+
+ if not self.subscribed:
+ raise GrokImportError("@grok.subscribe requires at least one "
+ "argument.")
+
+ subscribers = frame.f_locals.get('__grok_subscribers__', None)
+ if subscribers is None:
+ frame.f_locals['__grok_subscribers__'] = subscribers = []
+ subscribers.append((function, self.subscribed))
+
+class adapter(_adapter):
+
+ def __init__(self, *interfaces):
+ # Override the z.c.adapter decorator to force sanity checking
+ # and have better error reporting.
+ if not interfaces:
+ raise GrokImportError(
+ "@grok.adapter requires at least one argument.")
+ if type(interfaces[0]) is types.FunctionType:
+ raise GrokImportError(
+ "@grok.adapter requires at least one argument.")
+ self.interfaces = interfaces
+
+class implementer(_implementer):
+
+ def __call__(self, ob):
+ # XXX we do not have function grokkers (yet) so we put the annotation
+ # on the module.
+ frame = sys._getframe(1)
+ implementers = frame.f_locals.get('__implementers__', None)
+ if implementers is None:
+ frame.f_locals['__implementers__'] = implementers = []
+ implementers.append(ob)
+ return _implementer.__call__(self, ob)
Property changes on: grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/decorators.py
___________________________________________________________________
Name: svn:eol-style
+ native
Added: grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/grokkers.py
===================================================================
--- grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/grokkers.py (rev 0)
+++ grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/grokkers.py 2007-08-22 17:00:24 UTC (rev 79130)
@@ -0,0 +1,95 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Grokkers for adapters, utilities, subscribers, etc.
+"""
+import martian
+import zope.component.interface
+from martian import util
+from martian.error import GrokError
+from grokcore.component import Adapter, MultiAdapter, GlobalUtility
+
+
+def check_adapts(class_):
+ if zope.component.adaptedBy(class_) is None:
+ raise GrokError("%r must specify which contexts it adapts "
+ "(use grok.adapts to specify)."
+ % class_, class_)
+
+
+class AdapterGrokker(martian.ClassGrokker):
+ component_class = Adapter
+
+ def grok(self, name, factory, context, module_info, templates):
+ adapter_context = util.determine_class_context(factory, context)
+ provides = util.class_annotation(factory, 'grok.provides', None)
+ if provides is None:
+ util.check_implements_one(factory)
+ name = util.class_annotation(factory, 'grok.name', '')
+ zope.component.provideAdapter(factory, adapts=(adapter_context,),
+ provides=provides,
+ name=name)
+ return True
+
+
+class MultiAdapterGrokker(martian.ClassGrokker):
+ component_class = MultiAdapter
+
+ def grok(self, name, factory, context, module_info, templates):
+ provides = util.class_annotation(factory, 'grok.provides', None)
+ if provides is None:
+ util.check_implements_one(factory)
+ check_adapts(factory)
+ name = util.class_annotation(factory, 'grok.name', '')
+ zope.component.provideAdapter(factory, provides=provides, name=name)
+ return True
+
+
+class GlobalUtilityGrokker(martian.ClassGrokker):
+ component_class = GlobalUtility
+
+ def grok(self, name, factory, context, module_info, templates):
+ provides = util.class_annotation(factory, 'grok.provides', None)
+ if provides is None:
+ util.check_implements_one(factory)
+ name = util.class_annotation(factory, 'grok.name', '')
+ zope.component.provideUtility(factory(), provides=provides, name=name)
+ return True
+
+
+class SubscriberGrokker(martian.GlobalGrokker):
+
+ def grok(self, name, module, context, module_info, templates):
+ subscribers = module_info.getAnnotation('grok.subscribers', [])
+
+ for factory, subscribed in subscribers:
+ zope.component.provideHandler(factory, adapts=subscribed)
+ for iface in subscribed:
+ zope.component.interface.provideInterface('', iface)
+ return True
+
+
+class AdapterDecoratorGrokker(martian.GlobalGrokker):
+
+ def grok(self, name, module, context, module_info, templates):
+ implementers = module_info.getAnnotation('implementers', [])
+ for function in implementers:
+ interfaces = getattr(function, '__component_adapts__', None)
+ if interfaces is None:
+ # There's no explicit interfaces defined, so we assume the
+ # module context to be the thing adapted.
+ util.check_context(module_info.getModule(), context)
+ interfaces = (context, )
+ zope.component.provideAdapter(
+ function, adapts=interfaces, provides=function.__implemented__)
+ return True
Property changes on: grok/branches/philikon-grokcore.component/grokcore.component/grokcore/component/grokkers.py
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: grok/branches/philikon-grokcore.component/grokcore.component/setup.py
===================================================================
--- grok/branches/philikon-grokcore.component/grokcore.component/setup.py 2007-08-22 16:56:38 UTC (rev 79129)
+++ grok/branches/philikon-grokcore.component/grokcore.component/setup.py 2007-08-22 17:00:24 UTC (rev 79130)
@@ -32,5 +32,7 @@
zip_safe=False,
install_requires=['setuptools',
'martian',
+ 'zope.component',
+ 'zope.interface',
],
)
Modified: grok/branches/philikon-grokcore.component/src/grok/__init__.py
===================================================================
--- grok/branches/philikon-grokcore.component/src/grok/__init__.py 2007-08-22 16:56:38 UTC (rev 79129)
+++ grok/branches/philikon-grokcore.component/src/grok/__init__.py 2007-08-22 17:00:24 UTC (rev 79130)
@@ -30,9 +30,9 @@
IContainerModifiedEvent, ContainerModifiedEvent)
from martian import ClassGrokker, InstanceGrokker, GlobalGrokker
-from grok.components import Model, Adapter, MultiAdapter, View, XMLRPC, JSON
+from grok.components import Model, View, XMLRPC, JSON
from grok.components import PageTemplate, PageTemplateFile, Container, Traverser
-from grok.components import Site, GlobalUtility, LocalUtility, Annotation
+from grok.components import Site, LocalUtility, Annotation
from grok.components import Application, Form, AddForm, EditForm, DisplayForm
from grok.components import Indexes
from grok.components import Permission, Role
@@ -41,13 +41,13 @@
permissions, require, site)
from grok._grok import do_grok as grok # Avoid name clash within _grok
from grok._grok import grok_component
-from grok._grok import SubscribeDecorator as subscribe
-from grok._grok import adapter, implementer
-from martian.error import GrokError, GrokImportError
-
from grok.formlib import action, AutoFields, Fields
from grok.util import url
+from grokcore.component import Adapter, MultiAdapter, GlobalUtility
+from grokcore.component import subscribe, adapter, implementer
+from martian.error import GrokError, GrokImportError
+
# Our __init__ provides the grok API directly so using 'import grok' is enough.
from grok.interfaces import IGrokAPI
from zope.interface import moduleProvides
Modified: grok/branches/philikon-grokcore.component/src/grok/_grok.py
===================================================================
--- grok/branches/philikon-grokcore.component/src/grok/_grok.py 2007-08-22 16:56:38 UTC (rev 79129)
+++ grok/branches/philikon-grokcore.component/src/grok/_grok.py 2007-08-22 17:00:24 UTC (rev 79130)
@@ -13,27 +13,20 @@
##############################################################################
"""Grok
"""
-import os
-import sys
-import types
-
from zope import component
-from zope import interface
-
from zope.component.interfaces import IDefaultViewName
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.app.component.site import LocalSiteManager
import martian
from martian import scan
-from martian.error import GrokError, GrokImportError
-from martian.util import frame_is_module, determine_module_context
+from martian.error import GrokError
+from martian.util import determine_module_context
import grok
+import grokcore.component.grokkers
+from grok import components, meta, templatereg
-from grok import components, meta
-from grok import templatereg
-
_bootstrapped = False
def bootstrap():
component.provideAdapter(components.ModelTraverser)
@@ -53,6 +46,8 @@
# now grok the grokkers
martian.grok_module(scan.module_info_from_module(meta), the_module_grokker)
+ martian.grok_module(scan.module_info_from_module(grokcore.component.grokkers),
+ the_module_grokker)
def addSiteHandler(site, event):
sitemanager = LocalSiteManager(site)
@@ -115,51 +110,3 @@
the_module_grokker = martian.ModuleGrokker(the_multi_grokker,
prepare=prepare_grok,
finalize=finalize_grok)
-
-# decorators
-class SubscribeDecorator:
-
- def __init__(self, *args):
- self.subscribed = args
-
- def __call__(self, function):
- frame = sys._getframe(1)
- if not frame_is_module(frame):
- raise GrokImportError("@grok.subscribe can only be used on module "
- "level.")
-
- if not self.subscribed:
- raise GrokImportError("@grok.subscribe requires at least one "
- "argument.")
-
- subscribers = frame.f_locals.get('__grok_subscribers__', None)
- if subscribers is None:
- frame.f_locals['__grok_subscribers__'] = subscribers = []
- subscribers.append((function, self.subscribed))
-
-from zope.component._declaration import adapter as _adapter
-class adapter(_adapter):
-
- def __init__(self, *interfaces):
- # Override the z.c.adapter decorator to force sanity checking
- # and have better error reporting.
- if not interfaces:
- raise GrokImportError(
- "@grok.adapter requires at least one argument.")
- if type(interfaces[0]) is types.FunctionType:
- raise GrokImportError(
- "@grok.adapter requires at least one argument.")
- self.interfaces = interfaces
-
-from zope.interface.declarations import implementer as _implementer
-class implementer(_implementer):
-
- def __call__(self, ob):
- # XXX we do not have function grokkers (yet) so we put the annotation
- # on the module.
- frame = sys._getframe(1)
- implementers = frame.f_locals.get('__implementers__', None)
- if implementers is None:
- frame.f_locals['__implementers__'] = implementers = []
- implementers.append(ob)
- return _implementer.__call__(self, ob)
Modified: grok/branches/philikon-grokcore.component/src/grok/components.py
===================================================================
--- grok/branches/philikon-grokcore.component/src/grok/components.py 2007-08-22 16:56:38 UTC (rev 79129)
+++ grok/branches/philikon-grokcore.component/src/grok/components.py 2007-08-22 17:00:24 UTC (rev 79130)
@@ -75,24 +75,10 @@
interface.implements(interfaces.IApplication)
-class Adapter(object):
-
- def __init__(self, context):
- self.context = context
-
-
-class GlobalUtility(object):
- pass
-
-
class LocalUtility(Model):
pass
-class MultiAdapter(object):
- pass
-
-
class Annotation(persistent.Persistent):
pass
Modified: grok/branches/philikon-grokcore.component/src/grok/meta.py
===================================================================
--- grok/branches/philikon-grokcore.component/src/grok/meta.py 2007-08-22 16:56:38 UTC (rev 79129)
+++ grok/branches/philikon-grokcore.component/src/grok/meta.py 2007-08-22 17:00:24 UTC (rev 79130)
@@ -46,7 +46,7 @@
import grok
from grok import components, formlib
-from grok.util import check_adapts, get_default_permission, make_checker
+from grok.util import get_default_permission, make_checker
class ModelGrokker(martian.ClassGrokker):
@@ -66,46 +66,6 @@
component_class = grok.LocalUtility
-class AdapterGrokker(martian.ClassGrokker):
- component_class = grok.Adapter
-
- def grok(self, name, factory, context, module_info, templates):
- adapter_context = util.determine_class_context(factory, context)
- provides = util.class_annotation(factory, 'grok.provides', None)
- if provides is None:
- util.check_implements_one(factory)
- name = util.class_annotation(factory, 'grok.name', '')
- component.provideAdapter(factory, adapts=(adapter_context,),
- provides=provides,
- name=name)
- return True
-
-
-class MultiAdapterGrokker(martian.ClassGrokker):
- component_class = grok.MultiAdapter
-
- def grok(self, name, factory, context, module_info, templates):
- provides = util.class_annotation(factory, 'grok.provides', None)
- if provides is None:
- util.check_implements_one(factory)
- check_adapts(factory)
- name = util.class_annotation(factory, 'grok.name', '')
- component.provideAdapter(factory, provides=provides, name=name)
- return True
-
-
-class GlobalUtilityGrokker(martian.ClassGrokker):
- component_class = grok.GlobalUtility
-
- def grok(self, name, factory, context, module_info, templates):
- provides = util.class_annotation(factory, 'grok.provides', None)
- if provides is None:
- util.check_implements_one(factory)
- name = util.class_annotation(factory, 'grok.name', '')
- component.provideUtility(factory(), provides=provides, name=name)
- return True
-
-
class XMLRPCGrokker(martian.ClassGrokker):
component_class = grok.XMLRPC
@@ -287,34 +247,6 @@
return True
-class SubscriberGrokker(martian.GlobalGrokker):
-
- def grok(self, name, module, context, module_info, templates):
- subscribers = module_info.getAnnotation('grok.subscribers', [])
-
- for factory, subscribed in subscribers:
- component.provideHandler(factory, adapts=subscribed)
- for iface in subscribed:
- zope.component.interface.provideInterface('', iface)
- return True
-
-
-class AdapterDecoratorGrokker(martian.GlobalGrokker):
-
- def grok(self, name, module, context, module_info, templates):
- implementers = module_info.getAnnotation('implementers', [])
- for function in implementers:
- interfaces = getattr(function, '__component_adapts__', None)
- if interfaces is None:
- # There's no explicit interfaces defined, so we assume the
- # module context to be the thing adapted.
- util.check_context(module_info.getModule(), context)
- interfaces = (context, )
- component.provideAdapter(
- function, adapts=interfaces, provides=function.__implemented__)
- return True
-
-
class StaticResourcesGrokker(martian.GlobalGrokker):
def grok(self, name, module, context, module_info, templates):
More information about the Checkins
mailing list