跳转到主要内容

Grouparchy zope.schema 扩展

项目描述

;--Doctest--

字段事件

EventProperty 是一个 zope.schema FieldProperty,当字段被修改时触发事件,并将旧值和新值发送到事件。

>>> from zope import interface, schema
>>> import grouparchy.schema.event
>>> class IFoo(interface.Interface):
...     field = schema.Field()
>>> class Foo(object):
...     interface.implements(IFoo)
...     field = grouparchy.schema.event.EventProperty(
...         IFoo['field'])
>>> foo = Foo()

在配置事件处理程序之前,不会发生任何事情

>>> foo.field
>>> foo.field = 'foo'
>>> foo.field
'foo'

当我们为事件提供处理程序时,在更改值时将触发它

>>> from zope import component
>>> def handler(event):
...     print 'event: %s' % event
...     print 'object: %s' % event.object
...     print 'event.old: %s' % event.old
...     print 'event.new: %s' % event.new
>>> component.provideHandler(
...     handler, (grouparchy.schema.event.IFieldModifiedEvent,))

>>> foo.field = 'bar'
event: <grouparchy.schema.event.FieldModifiedEvent object at ...>
object: <Foo object at ...>
event.old: foo
event.new: bar

如果新值等于现有值,则不会触发事件

>>> foo.field
'bar'
>>> foo.field = 'bar'

也可以将不同的事件传递给属性

>>> class FooEvent(grouparchy.schema.event.FieldModifiedEvent):
...     pass
>>> Foo.field = grouparchy.schema.event.EventProperty(
...     IFoo['field'], event=FooEvent)
>>> foo.field = 'foo'
event: <FooEvent object at ...>
object: <Foo object at ...>
event.old: bar
event.new: foo

如果事件为 None,则不会触发事件

>>> Foo.field = grouparchy.schema.event.EventProperty(
...     IFoo['field'], event=None)
>>> foo.field = 'bar'

子类化 EventProperty 的描述符可以覆盖 notify() 方法以进行进一步的控制。例如,下面的描述符将在字段值未更改的情况下触发事件

>>> from zope import event
>>> class AlwaysEventProperty(
...     grouparchy.schema.event.EventProperty):
...     def notify(self, instance, new, old):
...         event.notify(self.event(instance, new, old))
>>> Foo.field = AlwaysEventProperty(IFoo['field'])
>>> foo.field
'bar'
>>> foo.field = 'bar'
event: <grouparchy.schema.event.FieldModifiedEvent object at ...>
object: <Foo object at ...>
event.old: bar
event.new: bar

;--Doctest--

接口字段

grouparchy.schema.interface 包含用于操作上下文提供的接口的 zope.schema 字段。

包含直接由对象提供的接口的管理实现

>>> from zope import interface
>>> from grouparchy.schema.bbb import component_iface
>>> class IFoo(interface.Interface): pass
>>> component_iface.provideInterface('', IFoo)

>>> class Context(object):
...     interface.implements(interface.Interface)

>>> from zope import component
>>> import grouparchy.schema.interface
>>> component.provideAdapter(
...     factory=grouparchy.schema.interface.DirectlyProvided)

>>> provider = Context()
>>> directlyProvided = (
...     grouparchy.schema.interface.IDirectlyProvided(
...         provider))
>>> tuple(directlyProvided.directlyProvided)
()

>>> directlyProvided.directlyProvided = (IFoo,)

>>> tuple(directlyProvided.directlyProvided)
(<InterfaceClass __builtin__.IFoo>,)

各个组件提供了更多的灵活性。

字段

InterfacesField 描述了上下文提供的接口集合。

InterfacesField 必须有一个 InterfaceField 或 Choice value_type

>>> from zope import schema
>>> grouparchy.schema.interface.InterfacesField()
Traceback (most recent call last):
...
ValueError: 'value_type' must be an InterfaceField or a Choice.
>>> grouparchy.schema.interface.InterfacesField(
...     value_type=schema.Field())
Traceback (most recent call last):
...
ValueError: 'value_type' must be an InterfaceField or a Choice.
>>> field = grouparchy.schema.interface.InterfacesField(
...     value_type=schema.InterfaceField())

有效值是接口序列

>>> foo = object()
>>> bound = field.bind(foo)
>>> bound.validate(interface.Interface)
Traceback (most recent call last):
...
WrongType: (<InterfaceClass zope.interface.Interface>,
            (<type 'set'>, <type 'tuple'>, <type 'list'>))
>>> bound.validate((None,))
Traceback (most recent call last):
...
WrongContainedType: []
>>> bound.validate((interface.Interface,))
>>> bound.validate([interface.Interface])

类似于任何 Set 字段,它接受一个具有词汇表或源的 Choice 字段,以缩小接口集合

>>> field = grouparchy.schema.interface.InterfacesField(
...     value_type=schema.Choice(values=(IFoo,)))
>>> bound = field.bind(foo)
>>> bound.validate((interface.Interface,))
Traceback (most recent call last):
...
WrongContainedType: [<InterfaceClass zope.interface.Interface>]
>>> bound.validate((IFoo,))

Choice 字段不能绕过验证

>>> field = grouparchy.schema.interface.InterfacesField(
...     value_type=schema.Choice(values=(None,)))
>>> bound = field.bind(foo)
>>> bound.validate((None,))
Traceback (most recent call last):
...
WrongContainedType: []

还提供了一个源,该源可以与用于确定字段有效接口集合的接口类型一起使用

>>> [i for i in grouparchy.schema.interface.InterfacesSource()]
[<InterfaceClass __builtin__.IFoo>]

可以通过传递接口类型来指定接口的子集

>>> import zope.interface.interfaces
>>> class IIBar(zope.interface.interfaces.IInterface): pass
>>> class IBar(interface.Interface): pass
>>> component_iface.provideInterface('', IBar)
>>> component_iface.provideInterface('', IBar, IIBar)
>>> [i for i in grouparchy.schema.interface.InterfacesSource()]
[<InterfaceClass __builtin__.IFoo>,
 <InterfaceClass __builtin__.IBar>]
>>> source = grouparchy.schema.interface.InterfacesSource(IIBar)
>>> [i for i in source]
[<InterfaceClass __builtin__.IBar>]

属性

提供了两个属性,用于获取和设置接口对象或接口点名称的字段值。

>>> class IFoo(interface.Interface):
...     all = grouparchy.schema.interface.InterfacesField(
...         value_type=schema.InterfaceField())
...     bar = grouparchy.schema.interface.InterfacesField(
...         value_type=schema.Choice(source=source))
...     dotted = grouparchy.schema.interface.InterfacesField(
...         value_type=schema.InterfaceField())
>>> class Foo(object):
...     all = grouparchy.schema.interface.InterfacesProperty(
...         IFoo['all'])
...     bar = grouparchy.schema.interface.InterfacesProperty(
...         IFoo['bar'])
...     dotted = (
...         grouparchy.schema.interface.InterfaceIdentsProperty(
...             IFoo['dotted']))
>>> foo = Foo()

这些属性返回一个IDeclaration。

>>> isinstance(foo.all, interface.Declaration)
True

在对象提供任何内容之前,声明都是空的。

>>> tuple(foo.all)
()
>>> tuple(foo.bar)
()
>>> tuple(foo.dotted)
()

>>> interface.alsoProvides(foo, interface.Interface)
>>> tuple(foo.all)
(<InterfaceClass zope.interface.Interface>,)
>>> tuple(foo.dotted)
('zope.interface.Interface',)

>>> interface.alsoProvides(foo, IBar)
>>> tuple(foo.all)
(<InterfaceClass zope.interface.Interface>,
 <InterfaceClass __builtin__.IBar>)
>>> tuple(foo.bar)
(<InterfaceClass __builtin__.IBar>,)

>>> IBar.providedBy(foo)
True
>>> foo.bar = ()
>>> tuple(foo.bar)
()
>>> IBar.providedBy(foo)
False
>>> foo.bar = (IBar,)
>>> tuple(foo.bar)
(<InterfaceClass __builtin__.IBar>,)
>>> IBar.providedBy(foo)
True

属性需要知道如何从属性所在的对象中获取提供接口的上下文。这是通过适配器实现的。以下代码检查了在适配器上通常可以找到上下文的一些名称,并回退到对象本身。

>>> context = foo.context = Foo()
>>> interface.alsoProvides(foo.context, interface.Interface)
>>> tuple(foo.all)
(<InterfaceClass zope.interface.Interface>,
 <InterfaceClass __builtin__.IBar>)

>>> component.provideAdapter(
...     grouparchy.schema.interface.getInterfacesContext)

>>> tuple(foo.all)
(<InterfaceClass zope.interface.Interface>,)
>>> del foo.context
>>> tuple(foo.all)
(<InterfaceClass zope.interface.Interface>,
 <InterfaceClass __builtin__.IBar>)
>>> foo.object = context
>>> tuple(foo.all)
(<InterfaceClass zope.interface.Interface>,)
>>> del foo.object

事件

默认情况下,属性会触发一个事件。

>>> import zope.interface.interfaces
>>> def getIfacesStr(ifaces):
...     return ', '.join((str(i) for i in sorted(ifaces)))
>>> def printInterfacesModified(event):
...     print 'Event: %s' % event
...     print 'Object: %s' % event.object
...     print 'New: ' + getIfacesStr(event.new)
...     print 'Old: ' + getIfacesStr(event.old)
...     print 'Added: ' + getIfacesStr(event.added)
...     print 'Removed: ' + getIfacesStr(event.removed)
>>> component.provideHandler(
...     factory=printInterfacesModified,
...     adapts=(
...         grouparchy.schema.interface.IInterfacesModified,))

>>> class IBaz(interface.Interface): pass
>>> component_iface.provideInterface('', IBaz)
>>> component_iface.provideInterface('', IBaz, IIBar)

默认事件都提供IInterfacesModified,但触发的事件提供更具体的IInterfacesPopulated、IInterfacesCleared、IInterfacesAdded、IInterfacesRemoved或IInterfacesChanged之一。

>>> foo.bar = ()
Event:
<grouparchy.schema.interface.InterfacesCleared object at ...>
Object: <Foo object at ...>
New:
Old: <InterfaceClass __builtin__.IBar>
Added:
Removed: <InterfaceClass __builtin__.IBar>
>>> foo.bar = (IBar,)
Event:
<grouparchy.schema.interface.InterfacesPopulated object at ...>
Object: <Foo object at ...>
New: <InterfaceClass __builtin__.IBar>
Old:
Added: <InterfaceClass __builtin__.IBar>
Removed:
>>> foo.bar = (IBar, IBaz)
Event:
<grouparchy.schema.interface.InterfacesAdded object at ...>
Object: <Foo object at ...>
New: <InterfaceClass __builtin__.IBar>,
<InterfaceClass __builtin__.IBaz>
Old: <InterfaceClass __builtin__.IBar>
Added: <InterfaceClass __builtin__.IBaz>
Removed:
>>> foo.bar = (IBar,)
Event:
<grouparchy.schema.interface.InterfacesRemoved object at ...>
Object: <Foo object at ...>
New: <InterfaceClass __builtin__.IBar>
Old: <InterfaceClass __builtin__.IBar>,
<InterfaceClass __builtin__.IBaz>
Added:
Removed: <InterfaceClass __builtin__.IBaz>
>>> foo.bar = (IBaz,)
Event:
<grouparchy.schema.interface.InterfacesChanged object at ...>
Object: <Foo object at ...>
New: <InterfaceClass __builtin__.IBaz>
Old: <InterfaceClass __builtin__.IBar>
Added: <InterfaceClass __builtin__.IBaz>
Removed: <InterfaceClass __builtin__.IBar>

IInterfacesPopulated和IInterfacesCleared分别扩展IInterfacesAdded和IInterfacesRemoved。IInterfacesChanged同时扩展两者。

>>> def printInterfacesAdded(event): print 'Interfaces Added'
>>> component.provideHandler(
...     factory=printInterfacesAdded,
...     adapts=(
...         grouparchy.schema.interface.IInterfacesAdded,))

>>> def printInterfacesRemoved(event): print 'Interfaces Removed'
>>> component.provideHandler(
...     factory=printInterfacesRemoved,
...     adapts=(
...         grouparchy.schema.interface.IInterfacesRemoved,))

>>> foo.bar = ()
Event:
<grouparchy.schema.interface.InterfacesCleared object at ...>
Object: <Foo object at ...>
New:
Old: <InterfaceClass __builtin__.IBaz>
Added:
Removed: <InterfaceClass __builtin__.IBaz>
Interfaces Removed
>>> foo.bar = (IBar,)
Event:
<grouparchy.schema.interface.InterfacesPopulated object at ...>
Object: <Foo object at ...>
New: <InterfaceClass __builtin__.IBar>
Old:
Added: <InterfaceClass __builtin__.IBar>
Removed:
Interfaces Added
>>> foo.bar = (IBaz,)
Event:
<grouparchy.schema.interface.InterfacesChanged object at ...>
Object: <Foo object at ...>
New: <InterfaceClass __builtin__.IBaz>
Old: <InterfaceClass __builtin__.IBar>
Added: <InterfaceClass __builtin__.IBaz>
Removed: <InterfaceClass __builtin__.IBar>
Interfaces Removed
Interfaces Added

可以像grouparchy.schema.event.EventProperty一样将事件类传递给属性。

>>> import grouparchy.schema.event
>>> class IBarInterfacesModified(
...     grouparchy.schema.event.IFieldModifiedEvent): pass
>>> class BarInterfacesModified(
...     grouparchy.schema.event.FieldModifiedEvent):
...         interface.implements(IBarInterfacesModified)

>>> def printBarInterfacesModified(event):
...     print 'Event: %s' % event
...     print 'Object: %s' % event.object
...     print 'New: ' + getIfacesStr(event.new)
...     print 'Old: ' + getIfacesStr(event.old)
>>> component.provideHandler(
...     factory=printBarInterfacesModified,
...     adapts=(IBarInterfacesModified,))

>>> foo.bar = ()
Event:
<grouparchy.schema.interface.InterfacesCleared object at ...>
Object: <Foo object at ...>
New:
Old: <InterfaceClass __builtin__.IBaz>
Added:
Removed: <InterfaceClass __builtin__.IBaz>
Interfaces Removed
>>> foo.bar = (IBar,)
Event:
<grouparchy.schema.interface.InterfacesPopulated object at ...>
Object: <Foo object at ...>
New: <InterfaceClass __builtin__.IBar>
Old:
Added: <InterfaceClass __builtin__.IBar>
Removed:
Interfaces Added

>>> Foo.bar = grouparchy.schema.interface.InterfacesProperty(
...     IFoo['bar'],
...     event=BarInterfacesModified)

>>> foo.bar = ()
Event: <BarInterfacesModified object at ...>
Object: <Foo object at ...>
New:
Old: <InterfaceClass __builtin__.IBar>
>>> foo.bar = (IBar,)
Event: <BarInterfacesModified object at ...>
Object: <Foo object at ...>
New: <InterfaceClass __builtin__.IBar>
Old:

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

grouparchy.schema-0.1.tar.gz (16.8 kB 查看哈希值)

上传时间 源代码

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面