From 66afc8921e4f5d3a41e407ab6d95ce7e4ec5383a Mon Sep 17 00:00:00 2001 From: Ilya Etingof Date: Sun, 25 Aug 2019 14:35:44 +0200 Subject: Add `isInconsistent` property hook to all constructed types (#170) Added `isInconsistent` property to all constructed types. This property conceptually replaces `verifySizeSpec` method to serve a more general purpose e.g. ensuring all required fields are in a good shape. By default this check invokes subtype constraints verification and is run by codecs on value de/serialisation. --- pyasn1/codec/ber/decoder.py | 8 ++++++-- pyasn1/codec/ber/encoder.py | 8 ++++++-- pyasn1/codec/cer/encoder.py | 4 +++- pyasn1/codec/native/encoder.py | 8 ++++++-- 4 files changed, 21 insertions(+), 7 deletions(-) (limited to 'pyasn1/codec') diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py index 3f2d180..5759ab8 100644 --- a/pyasn1/codec/ber/decoder.py +++ b/pyasn1/codec/ber/decoder.py @@ -695,7 +695,9 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder): asn1Object.setComponentByPosition(idx, component) else: - asn1Object.verifySizeSpec() + inconsistency = asn1Object.isInconsistent + if inconsistency: + raise inconsistency else: asn1Object = asn1Spec.clone() @@ -879,7 +881,9 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder): asn1Object.setComponentByPosition(idx, component) else: - asn1Object.verifySizeSpec() + inconsistency = asn1Object.isInconsistent + if inconsistency: + raise inconsistency else: asn1Object = asn1Spec.clone() diff --git a/pyasn1/codec/ber/encoder.py b/pyasn1/codec/ber/encoder.py index a5d5fd3..778aa86 100644 --- a/pyasn1/codec/ber/encoder.py +++ b/pyasn1/codec/ber/encoder.py @@ -537,7 +537,9 @@ class SequenceEncoder(AbstractItemEncoder): if asn1Spec is None: # instance of ASN.1 schema - value.verifySizeSpec() + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency namedTypes = value.componentType @@ -643,7 +645,9 @@ class SequenceOfEncoder(AbstractItemEncoder): def _encodeComponents(self, value, asn1Spec, encodeFun, **options): if asn1Spec is None: - value.verifySizeSpec() + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency else: asn1Spec = asn1Spec.componentType diff --git a/pyasn1/codec/cer/encoder.py b/pyasn1/codec/cer/encoder.py index 6a9db97..935b696 100644 --- a/pyasn1/codec/cer/encoder.py +++ b/pyasn1/codec/cer/encoder.py @@ -169,7 +169,9 @@ class SetEncoder(encoder.SequenceEncoder): if asn1Spec is None: # instance of ASN.1 schema - value.verifySizeSpec() + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency namedTypes = value.componentType diff --git a/pyasn1/codec/native/encoder.py b/pyasn1/codec/native/encoder.py index 4c5908d..4318abd 100644 --- a/pyasn1/codec/native/encoder.py +++ b/pyasn1/codec/native/encoder.py @@ -72,7 +72,9 @@ class SetEncoder(AbstractItemEncoder): protoDict = dict def encode(self, value, encodeFun, **options): - value.verifySizeSpec() + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency namedTypes = value.componentType substrate = self.protoDict() @@ -90,7 +92,9 @@ class SequenceEncoder(SetEncoder): class SequenceOfEncoder(AbstractItemEncoder): def encode(self, value, encodeFun, **options): - value.verifySizeSpec() + inconsistency = value.isInconsistent + if inconsistency: + raise inconsistency return [encodeFun(x, **options) for x in value] -- cgit v1.2.3