From 8393983359edc25b75cbe07f0d4c13497285aa71 Mon Sep 17 00:00:00 2001 From: Ilya Etingof Date: Sat, 16 Nov 2019 12:06:16 +0100 Subject: Refactor codec classes linkage Make it looking more uniform and easier to override if needed. --- pyasn1/codec/ber/decoder.py | 14 +++++++++----- pyasn1/codec/ber/encoder.py | 11 +++++++---- pyasn1/codec/cer/decoder.py | 2 +- pyasn1/codec/cer/encoder.py | 2 +- pyasn1/codec/der/decoder.py | 2 +- pyasn1/codec/der/encoder.py | 2 +- pyasn1/codec/native/decoder.py | 10 ++++++---- pyasn1/codec/native/encoder.py | 11 +++++++---- tests/codec/ber/test_decoder.py | 2 +- 9 files changed, 34 insertions(+), 22 deletions(-) diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py index af9d89e..6dc8866 100644 --- a/pyasn1/codec/ber/decoder.py +++ b/pyasn1/codec/ber/decoder.py @@ -1899,16 +1899,17 @@ class StreamingDecoder(object): 1 2 3 """ - SINGLE_ITEM_DECODER = SingleItemDecoder() + SINGLE_ITEM_DECODER = SingleItemDecoder - def __init__(self, substrate, asn1Spec=None, **kwargs): + def __init__(self, substrate, asn1Spec=None, **options): + self._singleItemDecoder = self.SINGLE_ITEM_DECODER() self._substrate = asSeekableStream(substrate) self._asn1Spec = asn1Spec - self._options = kwargs + self._options = options def __iter__(self): while True: - for asn1Object in self.SINGLE_ITEM_DECODER( + for asn1Object in self._singleItemDecoder( self._substrate, self._asn1Spec, **self._options): yield asn1Object @@ -1990,7 +1991,10 @@ class Decoder(object): """ substrate = asSeekableStream(substrate) - for asn1Object in cls.STREAMING_DECODER(substrate, asn1Spec, **kwargs): + streamingDecoder = cls.STREAMING_DECODER( + substrate, asn1Spec, **kwargs) + + for asn1Object in streamingDecoder: if isinstance(asn1Object, SubstrateUnderrunError): raise error.SubstrateUnderrunError('Short substrate on input') diff --git a/pyasn1/codec/ber/encoder.py b/pyasn1/codec/ber/encoder.py index e80a007..7ee9b47 100644 --- a/pyasn1/codec/ber/encoder.py +++ b/pyasn1/codec/ber/encoder.py @@ -846,11 +846,14 @@ class SingleItemEncoder(object): class Encoder(object): - SINGLE_ITEM_ENCODER = SingleItemEncoder() + SINGLE_ITEM_ENCODER = SingleItemEncoder - @classmethod - def __call__(cls, pyObject, asn1Spec=None, **options): - return cls.SINGLE_ITEM_ENCODER(pyObject, asn1Spec=asn1Spec, **options) + def __init__(self, **options): + self._singleItemEncoder = self.SINGLE_ITEM_ENCODER() + + def __call__(self, pyObject, asn1Spec=None, **options): + return self._singleItemEncoder( + pyObject, asn1Spec=asn1Spec, **options) #: Turns ASN.1 object into BER octet stream. diff --git a/pyasn1/codec/cer/decoder.py b/pyasn1/codec/cer/decoder.py index 852415a..0a92b26 100644 --- a/pyasn1/codec/cer/decoder.py +++ b/pyasn1/codec/cer/decoder.py @@ -80,7 +80,7 @@ class SingleItemDecoder(decoder.SingleItemDecoder): class StreamingDecoder(decoder.StreamingDecoder): __doc__ = decoder.StreamingDecoder.__doc__ - SINGLE_ITEM_DECODER = SingleItemDecoder() + SINGLE_ITEM_DECODER = SingleItemDecoder class Decoder(decoder.Decoder): diff --git a/pyasn1/codec/cer/encoder.py b/pyasn1/codec/cer/encoder.py index b11c7ff..9e6cdac 100644 --- a/pyasn1/codec/cer/encoder.py +++ b/pyasn1/codec/cer/encoder.py @@ -270,7 +270,7 @@ class SingleItemEncoder(encoder.SingleItemEncoder): class Encoder(encoder.Encoder): - SINGLE_ITEM_ENCODER = SingleItemEncoder() + SINGLE_ITEM_ENCODER = SingleItemEncoder #: Turns ASN.1 object into CER octet stream. diff --git a/pyasn1/codec/der/decoder.py b/pyasn1/codec/der/decoder.py index ff3f004..b9526c3 100644 --- a/pyasn1/codec/der/decoder.py +++ b/pyasn1/codec/der/decoder.py @@ -50,7 +50,7 @@ class SingleItemDecoder(decoder.SingleItemDecoder): class StreamingDecoder(decoder.StreamingDecoder): __doc__ = decoder.StreamingDecoder.__doc__ - SINGLE_ITEM_DECODER = SingleItemDecoder() + SINGLE_ITEM_DECODER = SingleItemDecoder class Decoder(decoder.Decoder): diff --git a/pyasn1/codec/der/encoder.py b/pyasn1/codec/der/encoder.py index 21102b8..1a6af82 100644 --- a/pyasn1/codec/der/encoder.py +++ b/pyasn1/codec/der/encoder.py @@ -67,7 +67,7 @@ class SingleItemEncoder(encoder.SingleItemEncoder): class Encoder(encoder.Encoder): - SINGLE_ITEM_ENCODER = SingleItemEncoder() + SINGLE_ITEM_ENCODER = SingleItemEncoder #: Turns ASN.1 object into DER octet stream. diff --git a/pyasn1/codec/native/decoder.py b/pyasn1/codec/native/decoder.py index 04ae129..db30c71 100644 --- a/pyasn1/codec/native/decoder.py +++ b/pyasn1/codec/native/decoder.py @@ -181,11 +181,13 @@ class SingleItemDecoder(object): class Decoder(object): - SINGLE_ITEM_DECODER = SingleItemDecoder() + SINGLE_ITEM_DECODER = SingleItemDecoder - @classmethod - def __call__(cls, pyObject, asn1Spec=None, **kwargs): - return cls.SINGLE_ITEM_DECODER(pyObject, asn1Spec=asn1Spec, **kwargs) + def __init__(self, **options): + self._singleItemDecoder = self.SINGLE_ITEM_DECODER() + + def __call__(self, pyObject, asn1Spec=None, **kwargs): + return self._singleItemDecoder(pyObject, asn1Spec=asn1Spec, **kwargs) #: Turns Python objects of built-in types into ASN.1 objects. diff --git a/pyasn1/codec/native/encoder.py b/pyasn1/codec/native/encoder.py index 0001916..d0d65ec 100644 --- a/pyasn1/codec/native/encoder.py +++ b/pyasn1/codec/native/encoder.py @@ -225,11 +225,14 @@ class SingleItemEncoder(object): class Encoder(object): - SINGLE_ITEM_ENCODER = SingleItemEncoder() + SINGLE_ITEM_ENCODER = SingleItemEncoder - @classmethod - def __call__(cls, pyObject, asn1Spec=None, **kwargs): - return cls.SINGLE_ITEM_ENCODER(pyObject, asn1Spec=asn1Spec, **kwargs) + def __init__(self, **kwargs): + self._singleItemEncoder = self.SINGLE_ITEM_ENCODER() + + def __call__(self, pyObject, asn1Spec=None, **options): + return self._singleItemEncoder( + pyObject, asn1Spec=asn1Spec, **options) #: Turns ASN.1 object into a Python built-in type object(s). diff --git a/tests/codec/ber/test_decoder.py b/tests/codec/ber/test_decoder.py index 4b73f6a..a559209 100644 --- a/tests/codec/ber/test_decoder.py +++ b/tests/codec/ber/test_decoder.py @@ -1615,7 +1615,7 @@ class ErrorOnDecodingTestCase(BaseTestCase): defaultErrorState = decoder.stDumpRawValue class StreamingDecoder(decoder.StreamingDecoder): - SINGLE_ITEM_DECODER = SingleItemEncoder() + SINGLE_ITEM_DECODER = SingleItemEncoder class OneShotDecoder(decoder.Decoder): STREAMING_DECODER = StreamingDecoder -- cgit v1.2.1