mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-21 07:22:14 +00:00
114 lines
3.3 KiB
Python
114 lines
3.3 KiB
Python
##############################################################################
|
|
#
|
|
# Copyright (c) 2007 Zope Foundation 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.
|
|
#
|
|
##############################################################################
|
|
"""Condition Implementation
|
|
"""
|
|
import reportlab
|
|
import sys
|
|
import zope.interface
|
|
import zope.schema
|
|
from zope.schema import fieldproperty
|
|
|
|
class ICondition(zope.interface.Interface):
|
|
"""Condition that is checked before a directive is available."""
|
|
|
|
__doc__ = zope.schema.TextLine(
|
|
title=u'Description',
|
|
description=u'The description of the condition.',
|
|
required=True)
|
|
|
|
def __call__(directive):
|
|
"""Check whether the condition is fulfilled for the given directive."""
|
|
|
|
|
|
class IOccurence(zope.interface.Interface):
|
|
"""Description of the occurence of a sub-directive."""
|
|
|
|
__doc__ = zope.schema.TextLine(
|
|
title=u'Description',
|
|
description=u'The description of the occurence.',
|
|
required=True)
|
|
|
|
tag = zope.schema.BytesLine(
|
|
title=u'Tag',
|
|
description=u'The tag of the sub-directive within the directive',
|
|
required=True)
|
|
|
|
signature = zope.schema.Field(
|
|
title=u'Signature',
|
|
description=u'The signature of the sub-directive.',
|
|
required=True)
|
|
|
|
condition = zope.schema.Field(
|
|
title=u'Condition',
|
|
description=u'The condition that the directive is available.',
|
|
required=False)
|
|
|
|
|
|
@zope.interface.implementer(ICondition)
|
|
def laterThanReportlab21(directive):
|
|
"""The directive is only available in Reportlab 2.1 and higher."""
|
|
return [int(num) for num in reportlab.Version.split('.')] >= (2, 0)
|
|
|
|
|
|
def containing(*occurences):
|
|
frame = sys._getframe(1)
|
|
f_locals = frame.f_locals
|
|
f_globals = frame.f_globals
|
|
|
|
if not (f_locals is not f_globals
|
|
and f_locals.get('__module__')
|
|
and f_locals.get('__module__') == f_globals.get('__name__')
|
|
):
|
|
raise TypeError("contains not called from signature interface")
|
|
|
|
f_locals['__interface_tagged_values__'] = {'directives': occurences}
|
|
|
|
|
|
class Occurence(object):
|
|
zope.interface.implements(IOccurence)
|
|
|
|
tag = fieldproperty.FieldProperty(IOccurence['tag'])
|
|
signature = fieldproperty.FieldProperty(IOccurence['signature'])
|
|
condition = fieldproperty.FieldProperty(IOccurence['condition'])
|
|
|
|
def __init__(self, tag, signature, condition=None):
|
|
self.tag = tag
|
|
self.signature = signature
|
|
self.condition = condition
|
|
|
|
|
|
class ZeroOrMore(Occurence):
|
|
"""Zero or More
|
|
|
|
This sub-directive can occur zero or more times.
|
|
"""
|
|
|
|
class ZeroOrOne(Occurence):
|
|
"""Zero or one
|
|
|
|
This sub-directive can occur zero or one time.
|
|
"""
|
|
|
|
class OneOrMore(Occurence):
|
|
"""One or More
|
|
|
|
This sub-directive can occur one or more times.
|
|
"""
|
|
|
|
class One(Occurence):
|
|
"""One
|
|
|
|
This sub-directive must occur exactly one time.
|
|
"""
|