diff options
Diffstat (limited to 'pyasn1/codec/native/encoder.py')
-rw-r--r-- | pyasn1/codec/native/encoder.py | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/pyasn1/codec/native/encoder.py b/pyasn1/codec/native/encoder.py index 4318abd..a3e17a9 100644 --- a/pyasn1/codec/native/encoder.py +++ b/pyasn1/codec/native/encoder.py @@ -107,7 +107,7 @@ class AnyEncoder(AbstractItemEncoder): return value.asOctets() -tagMap = { +TAG_MAP = { univ.Boolean.tagSet: BooleanEncoder(), univ.Integer.tagSet: IntegerEncoder(), univ.BitString.tagSet: BitStringEncoder(), @@ -140,7 +140,7 @@ tagMap = { # Put in ambiguous & non-ambiguous types for faster codec lookup -typeMap = { +TYPE_MAP = { univ.Boolean.typeId: BooleanEncoder(), univ.Integer.typeId: IntegerEncoder(), univ.BitString.typeId: BitStringEncoder(), @@ -175,20 +175,24 @@ typeMap = { } -class Encoder(object): +class SingleItemEncoder(object): + + TAG_MAP = TAG_MAP + TYPE_MAP = TYPE_MAP - # noinspection PyDefaultArgument - def __init__(self, tagMap, typeMap={}): - self.__tagMap = tagMap - self.__typeMap = typeMap + def __init__(self, tagMap=None, typeMap=None): + self.__tagMap = tagMap or self.TAG_MAP + self.__typeMap = typeMap or self.TYPE_MAP def __call__(self, value, **options): if not isinstance(value, base.Asn1Item): - raise error.PyAsn1Error('value is not valid (should be an instance of an ASN.1 Item)') + raise error.PyAsn1Error( + 'value is not valid (should be an instance of an ASN.1 Item)') if LOG: debug.scope.push(type(value).__name__) - LOG('encoder called for type %s <%s>' % (type(value).__name__, value.prettyPrint())) + LOG('encoder called for type %s ' + '<%s>' % (type(value).__name__, value.prettyPrint())) tagSet = value.tagSet @@ -197,7 +201,8 @@ class Encoder(object): except KeyError: # use base type for codec lookup to recover untagged types - baseTagSet = tag.TagSet(value.tagSet.baseTag, value.tagSet.baseTag) + baseTagSet = tag.TagSet( + value.tagSet.baseTag, value.tagSet.baseTag) try: concreteEncoder = self.__tagMap[baseTagSet] @@ -206,17 +211,28 @@ class Encoder(object): raise error.PyAsn1Error('No encoder for %s' % (value,)) if LOG: - LOG('using value codec %s chosen by %s' % (concreteEncoder.__class__.__name__, tagSet)) + LOG('using value codec %s chosen by ' + '%s' % (concreteEncoder.__class__.__name__, tagSet)) pyObject = concreteEncoder.encode(value, self, **options) if LOG: - LOG('encoder %s produced: %s' % (type(concreteEncoder).__name__, repr(pyObject))) + LOG('encoder %s produced: ' + '%s' % (type(concreteEncoder).__name__, repr(pyObject))) debug.scope.pop() return pyObject +class Encoder(object): + SINGLE_ITEM_ENCODER = SingleItemEncoder + + @classmethod + def __call__(cls, pyObject, asn1Spec=None, **kwargs): + singleItemEncoder = cls.SINGLE_ITEM_ENCODER() + return singleItemEncoder(pyObject, asn1Spec=asn1Spec, **kwargs) + + #: Turns ASN.1 object into a Python built-in type object(s). #: #: Takes any ASN.1 object (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) @@ -253,4 +269,4 @@ class Encoder(object): #: >>> encode(seq) #: [1, 2, 3] #: -encode = Encoder(tagMap, typeMap) +encode = SingleItemEncoder() |