summaryrefslogtreecommitdiff
path: root/pyasn1
diff options
context:
space:
mode:
authorIlya Etingof <etingof@gmail.com>2019-08-25 14:35:44 +0200
committerGitHub <noreply@github.com>2019-08-25 14:35:44 +0200
commit66afc8921e4f5d3a41e407ab6d95ce7e4ec5383a (patch)
treee552f03ee7846566b4b036c192d9ed326a9e74a5 /pyasn1
parentec580e545ef25f117573014d40ca5c512e58dbf3 (diff)
downloadpyasn1-git-66afc8921e4f5d3a41e407ab6d95ce7e4ec5383a.tar.gz
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.
Diffstat (limited to 'pyasn1')
-rw-r--r--pyasn1/codec/ber/decoder.py8
-rw-r--r--pyasn1/codec/ber/encoder.py8
-rw-r--r--pyasn1/codec/cer/encoder.py4
-rw-r--r--pyasn1/codec/native/encoder.py8
-rw-r--r--pyasn1/type/base.py23
-rw-r--r--pyasn1/type/univ.py2
6 files changed, 43 insertions, 10 deletions
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]
diff --git a/pyasn1/type/base.py b/pyasn1/type/base.py
index 21e4041..1fd69f9 100644
--- a/pyasn1/type/base.py
+++ b/pyasn1/type/base.py
@@ -655,8 +655,23 @@ class ConstructedAsn1Type(Asn1Type):
return clone
- def verifySizeSpec(self):
- self.sizeSpec(self)
+ @property
+ def isInconsistent(self):
+ """Run necessary checks to ensure object consistency.
+
+ Default action is to verify |ASN.1| object against constraints imposed
+ by `subtypeSpec`.
+
+ Raises
+ ------
+ :py:class:`~pyasn1.error.PyAsn1tError` on any inconsistencies found
+ """
+ try:
+ self.sizeSpec(self)
+
+ except error.PyAsn1Error:
+ exc = sys.exc_info()[1]
+ return exc
def getComponentByPosition(self, idx):
raise error.PyAsn1Error('Method not implemented')
@@ -679,5 +694,9 @@ class ConstructedAsn1Type(Asn1Type):
def getComponentType(self):
return self.componentType
+ def verifySizeSpec(self):
+ self.sizeSpec(self)
+
+
# Backward compatibility
AbstractConstructedAsn1Item = ConstructedAsn1Type
diff --git a/pyasn1/type/univ.py b/pyasn1/type/univ.py
index b39c533..4f305f6 100644
--- a/pyasn1/type/univ.py
+++ b/pyasn1/type/univ.py
@@ -3004,7 +3004,7 @@ class Choice(Set):
if self._currentIdx is not None:
yield self.componentType[self._currentIdx].getName(), self[self._currentIdx]
- def verifySizeSpec(self):
+ def checkConsistency(self):
if self._currentIdx is None:
raise error.PyAsn1Error('Component not chosen')