[Checkins] SVN: grokcore.component/trunk/ Merged the
'philikon-decl-dir-rules' branch:
Philipp von Weitershausen
philikon at philikon.de
Wed May 14 12:18:11 EDT 2008
Log message for revision 86740:
Merged the 'philikon-decl-dir-rules' branch:
* Ported class grokkers to make use of the new declarative way of
retrieving directive information from a class. This requires
Martian 0.9.6.
Changed:
U grokcore.component/trunk/CHANGES.txt
U grokcore.component/trunk/setup.py
U grokcore.component/trunk/src/grokcore/component/directive.py
U grokcore.component/trunk/src/grokcore/component/meta.py
U grokcore.component/trunk/src/grokcore/component/scan.py
U grokcore.component/trunk/src/grokcore/component/tests/directive/multipletimes.py
U grokcore.component/trunk/versions.cfg
-=-
Modified: grokcore.component/trunk/CHANGES.txt
===================================================================
--- grokcore.component/trunk/CHANGES.txt 2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/CHANGES.txt 2008-05-14 16:18:11 UTC (rev 86740)
@@ -4,7 +4,9 @@
1.3 (unreleased)
----------------
-* ...
+* Ported class grokkers to make use of the new declarative way of
+ retrieving directive information from a class. This requires
+ Martian 0.9.6.
1.2.1 (2008-05-04)
------------------
Modified: grokcore.component/trunk/setup.py
===================================================================
--- grokcore.component/trunk/setup.py 2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/setup.py 2008-05-14 16:18:11 UTC (rev 86740)
@@ -32,7 +32,7 @@
include_package_data=True,
zip_safe=False,
install_requires=['setuptools',
- 'martian >= 0.9.5',
+ 'martian >= 0.9.6',
'zope.component',
'zope.configuration',
'zope.interface',
Modified: grokcore.component/trunk/src/grokcore/component/directive.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/directive.py 2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/src/grokcore/component/directive.py 2008-05-14 16:18:11 UTC (rev 86740)
@@ -18,7 +18,7 @@
import grokcore.component
from zope.interface.interfaces import IInterface
from martian.error import GrokImportError
-from grokcore.component.scan import check_module_component
+from grokcore.component.scan import UnambiguousComponentScope
class global_utility(martian.MultipleTimesDirective):
scope = martian.MODULE
@@ -28,24 +28,15 @@
raise GrokImportError(
"You can only pass an interface to the "
"provides argument of %s." % self.name)
- return GlobalUtilityInfo(factory, provides, name, direct)
-class GlobalUtilityInfo(object):
-
- def __init__(self, factory, provides=None, name=u'', direct=None):
- self.factory = factory
+ if provides is None:
+ provides = grokcore.component.provides.bind().get(factory)
if direct is None:
- direct = grokcore.component.direct.get(factory)
- self.direct = direct
+ direct = grokcore.component.direct.bind().get(factory)
+ if not name:
+ name = grokcore.component.name.bind().get(factory)
+ return (factory, provides, name, direct)
- if provides is None:
- provides = grokcore.component.provides.get(factory)
- self.provides = provides
-
- if name is u'':
- name = grokcore.component.name.get(factory)
- self.name = name
-
class name(martian.Directive):
scope = martian.CLASS
store = martian.ONCE
@@ -53,19 +44,10 @@
validate = martian.validateText
class context(martian.Directive):
- scope = martian.CLASS_OR_MODULE
+ scope = UnambiguousComponentScope('context')
store = martian.ONCE
validate = martian.validateInterfaceOrClass
- @classmethod
- def get(cls, component, module=None):
- value = super(cls, context).get(component, module)
- if not isinstance(component, types.ModuleType):
- # 'component' must be a class then, so let's make sure
- # that the context is not ambiguous or None.
- check_module_component(component, value, 'context', cls)
- return value
-
class title(martian.Directive):
scope = martian.CLASS
store = martian.ONCE
Modified: grokcore.component/trunk/src/grokcore/component/meta.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/meta.py 2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/src/grokcore/component/meta.py 2008-05-14 16:18:11 UTC (rev 86740)
@@ -24,15 +24,18 @@
from grokcore.component.interfaces import IContext
from grokcore.component.interfaces import IContext
-def get_provides(factory):
- provides = grokcore.component.provides.get(factory)
- if provides is None:
- martian.util.check_implements_one(factory)
- provides = list(interface.implementedBy(factory))[0]
- return provides
+def default_provides(factory, module=None, **data):
+ martian.util.check_implements_one(factory)
+ return list(interface.implementedBy(factory))[0]
+def default_global_utility_provides(factory, module, direct, **data):
+ if direct:
+ martian.util.check_provides_one(factory)
+ return list(interface.providedBy(factory))[0]
+ return default_provides(factory)
+
class ContextGrokker(martian.GlobalGrokker):
priority = 1001
@@ -48,15 +51,17 @@
class AdapterGrokker(martian.ClassGrokker):
component_class = grokcore.component.Adapter
- def grok(self, name, factory, module_info, config, **kw):
- adapter_context = grokcore.component.context.get(factory, module_info.getModule())
- provides = get_provides(factory)
- name = grokcore.component.name.get(factory)
+ directives = [
+ grokcore.component.context.bind(),
+ grokcore.component.provides.bind(get_default=default_provides),
+ grokcore.component.name.bind(),
+ ]
+ def execute(self, factory, config, context, provides, name, **kw):
config.action(
- discriminator=('adapter', adapter_context, provides, name),
+ discriminator=('adapter', context, provides, name),
callable=component.provideAdapter,
- args=(factory, (adapter_context,), provides, name),
+ args=(factory, (context,), provides, name),
)
return True
@@ -64,10 +69,12 @@
class MultiAdapterGrokker(martian.ClassGrokker):
component_class = grokcore.component.MultiAdapter
- def grok(self, name, factory, module_info, config, **kw):
- provides = get_provides(factory)
- name = grokcore.component.name.get(factory)
+ directives = [
+ grokcore.component.provides.bind(get_default=default_provides),
+ grokcore.component.name.bind(),
+ ]
+ def execute(self, factory, config, provides, name, **kw):
if component.adaptedBy(factory) is None:
raise GrokError("%r must specify which contexts it adapts "
"(use the 'adapts' directive to specify)."
@@ -89,33 +96,28 @@
# happens, since it relies on the ITemplateFileFactories being grokked.
priority = 1100
- def grok(self, name, factory, module_info, config, **kw):
- provides = grokcore.component.provides.get(factory)
- direct = grokcore.component.direct.get(factory)
- name = grokcore.component.name.get(factory)
+ directives = [
+ grokcore.component.direct.bind(),
+ grokcore.component.provides.bind(
+ get_default=default_global_utility_provides),
+ grokcore.component.name.bind(),
+ ]
- if direct:
- obj = factory
- if provides is None:
- martian.util.check_provides_one(factory)
- provides = list(interface.providedBy(factory))[0]
- else:
- obj = factory()
- if provides is None:
- provides = get_provides(factory)
+ def execute(self, factory, config, direct, provides, name, **kw):
+ if not direct:
+ factory = factory()
config.action(
discriminator=('utility', provides, name),
callable=component.provideUtility,
- args=(obj, provides, name),
+ args=(factory, provides, name),
)
return True
-
class AdapterDecoratorGrokker(martian.GlobalGrokker):
def grok(self, name, module, module_info, config, **kw):
- context = grokcore.component.context.get(module)
+ context = grokcore.component.context.bind().get(module=module)
implementers = module_info.getAnnotation('implementers', [])
for function in implementers:
interfaces = getattr(function, '__component_adapts__', None)
@@ -137,25 +139,23 @@
class GlobalUtilityDirectiveGrokker(martian.GlobalGrokker):
def grok(self, name, module, module_info, config, **kw):
- infos = grokcore.component.global_utility.get(module)
+ infos = grokcore.component.global_utility.bind().get(module=module)
- for info in infos:
- provides = info.provides
-
- if info.direct:
- obj = info.factory
+ for factory, provides, name, direct in infos:
+ if direct:
+ obj = factory
if provides is None:
martian.util.check_provides_one(obj)
provides = list(interface.providedBy(obj))[0]
else:
- obj = info.factory()
+ obj = factory()
if provides is None:
- provides = get_provides(info.factory)
+ provides = default_provides(factory)
config.action(
- discriminator=('utility', provides, info.name),
+ discriminator=('utility', provides, name),
callable=component.provideUtility,
- args=(obj, provides, info.name),
+ args=(obj, provides, name),
)
return True
Modified: grokcore.component/trunk/src/grokcore/component/scan.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/scan.py 2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/src/grokcore/component/scan.py 2008-05-14 16:18:11 UTC (rev 86740)
@@ -16,6 +16,7 @@
from martian.error import GrokError
from martian.util import scan_for_classes
+from martian.directive import ClassOrModuleScope
AMBIGUOUS_COMPONENT = object()
def check_module_component(factory, component, component_name, directive):
@@ -64,7 +65,30 @@
else:
component= AMBIGUOUS_COMPONENT
- module_component = directive.get(module)
+ module_component = directive.bind().get(module=module)
if module_component is not None:
component = module_component
return component
+
+
+class UnambiguousComponentScope(ClassOrModuleScope):
+
+ def __init__(self, name):
+ self.name = name
+
+ def get(self, directive, component, module, default):
+ value = default
+ if component is not None:
+ value = directive.store.get(directive, component, default)
+ if value is default and module is not None:
+ value = directive.store.get(directive, module, default)
+
+ # When both 'component' and 'module' where passed in, perform
+ # a check for ambiguous components.
+ if None not in (component, module):
+ value_to_check = value
+ if value_to_check is default:
+ value_to_check = None
+ check_module_component(component, value_to_check, self.name,
+ directive)
+ return value
Modified: grokcore.component/trunk/src/grokcore/component/tests/directive/multipletimes.py
===================================================================
--- grokcore.component/trunk/src/grokcore/component/tests/directive/multipletimes.py 2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/src/grokcore/component/tests/directive/multipletimes.py 2008-05-14 16:18:11 UTC (rev 86740)
@@ -6,21 +6,24 @@
>>> from martian import scan
>>> import grokcore.component as grok
>>> from grokcore.component.tests.directive import multipletimes
- >>> guis = grok.global_utility.get(multipletimes)
- >>> guis
- [<grokcore.component.directive.GlobalUtilityInfo object at 0x...>,
- <grokcore.component.directive.GlobalUtilityInfo object at 0x...>]
- >>> guis[0].factory
+ >>> guis = grok.global_utility.bind().get(module=multipletimes)
+ >>> len(guis)
+ 2
+
+ >>> factory, provides, name, direct = guis[0]
+ >>> factory
<class 'grokcore.component.tests.directive.multipletimes.Club'>
- >>> guis[0].provides
+ >>> provides
<InterfaceClass grokcore.component.tests.directive.multipletimes.IClub>
- >>> guis[0].name
+ >>> name
'foo'
- >>> guis[1].factory
+
+ >>> factory, provides, name, direct = guis[1]
+ >>> factory
<class 'grokcore.component.tests.directive.multipletimes.Cave'>
- >>> guis[1].provides is None
+ >>> provides is None
True
- >>> guis[1].name
+ >>> name
u''
"""
Modified: grokcore.component/trunk/versions.cfg
===================================================================
--- grokcore.component/trunk/versions.cfg 2008-05-14 16:15:57 UTC (rev 86739)
+++ grokcore.component/trunk/versions.cfg 2008-05-14 16:18:11 UTC (rev 86740)
@@ -1,5 +1,5 @@
[versions]
-martian = 0.9.5
+martian = 0.9.6
zope.configuration = 3.4.0
zope.deferredimport = 3.4.0
zope.deprecation = 3.4.0
More information about the Checkins
mailing list