Source code for contracts.library.strings

from ..interface import Contract, ContractNotRespected
from ..syntax import (add_contract, W, contract_expression, O, add_keyword,
    Keyword)


# Base class for string contracts
class StringBase(Contract):

    def __init__(self, length=None, where=None):
        Contract.__init__(self, where)
        self.length = length
        assert length is None or isinstance(length, Contract)

    def check_contract(self, context, value, silent):
        if not isinstance(value, self.TYPE):
            error = 'Expected %s, got %r.' % (
                self.DESCRIPTION, value.__class__.__name__)
            raise ContractNotRespected(contract=self, error=error,
                                       value=value, context=context)

        if self.length is not None:
            self.length._check_contract(context, len(value), silent)

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, self.length)

    def __str__(self):
        s = self.KEYWORDS[0]
        if self.length is not None:
            s += '[%s]' % self.length
        return s

    @classmethod
    def parse_action(cls, s, loc, tokens):
        where = W(s, loc)
        length = tokens.get('length', None)
        return cls(length, where=where)


import sys
if sys.version_info[0] == 3:  # Python 3

    __all__ = ['String']

    class String(StringBase):
        KEYWORDS = ['str', 'string']
        TYPE = str
        DESCRIPTION = "a string"

else:  # Python 2.x

    __all__ = ['String', 'AnsiString', 'UnicodeString']

[docs] class String(StringBase): KEYWORDS = ['string'] TYPE = basestring DESCRIPTION = "an ANSI or Unicode string"
[docs] class AnsiString(StringBase): KEYWORDS = ['str'] TYPE = str DESCRIPTION = "an ANSI string"
[docs] class UnicodeString(StringBase): KEYWORDS = ['unicode'] TYPE = unicode DESCRIPTION = "a Unicode string"
for cls in StringBase.__subclasses__(): for keyword in cls.KEYWORDS: mycontract = (Keyword(keyword) + O('[' - contract_expression('length') - ']')) add_keyword(keyword) add_contract(mycontract.setParseAction(cls.parse_action))