Source code for contracts.library.seq

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


try:
    import numpy
    has_numpy = True
except:
    has_numpy = False


[docs]class Seq(Contract): def __init__(self, length_contract=None, elements_contract=None, where=None): Contract.__init__(self, where) self.length_contract = length_contract self.elements_contract = elements_contract
[docs] def check_contract(self, context, value, silent): if has_numpy and isinstance(value, numpy.ndarray): # TODO: check basic datatypes # use value.size and value.flat for iteration if self.length_contract is not None: self.length_contract._check_contract(context, value.size, silent) if self.elements_contract is not None: n = value.size for i in xrange(n): element = value.flat[i] if ((element.dtype == numpy.int32) or (element.dtype == numpy.int64)): element = int(element) # XXX: hack self.elements_contract._check_contract(context, element, silent) return if not isinstance(value, collections.Sequence): error = 'Expected a Sequence, got %r.' % value.__class__.__name__ raise ContractNotRespected(self, error, value, context) if self.length_contract is not None: self.length_contract._check_contract(context, len(value), silent) if self.elements_contract is not None: for element in value: self.elements_contract._check_contract(context, element, silent)
def __str__(self): s = 'seq' if self.length_contract is not None: s += '[%s]' % self.length_contract if self.elements_contract is not None: s += '(%s)' % self.elements_contract return s def __repr__(self): s = 'Seq(%r,%r)' % (self.length_contract, self.elements_contract) return s
[docs] @staticmethod def parse_action(s, loc, tokens): where = W(s, loc) length_contract = tokens.get('length_contract', None) elements_contract = tokens.get('elements_contract', None) return Seq(length_contract, elements_contract, where=where)
list_contract = (Keyword('seq') - O(S('[') - contract_expression('length_contract') - S(']')) + O(S('(') - contract_expression('elements_contract') - S(')'))) list_contract.setParseAction(Seq.parse_action) list_contract.setName('Seq contract') add_keyword('seq') add_contract(list_contract)