Remove decoder2/encoder2

This commit is contained in:
Jakub Warmuz 2015-03-20 23:17:41 +00:00
parent 8208a7f4d5
commit e6b07f66d5
No known key found for this signature in database
GPG key ID: 2A7BAD3A489B52EA
2 changed files with 13 additions and 57 deletions

View file

@ -30,13 +30,7 @@ class Field(object):
:class:`~letsencrypt.acme.jose.errors.SerializationError`
(:class:`~letsencrypt.acme.jose.errors.DeserializationError`).
For greater flexibility, ``encoder2`` and ``decoder2`` accept two
parameters: the whole object ("``self``" in case of encoding, and
JSON serialized object ``jobj`` in case of decoding) and the value
to be encoded/decoded.
Note, that ``decoder`` and ``decoder2`` should perform partial
serialization only.
Note, that ``decoder`` should perform partial serialization only.
:ivar str json_name: Name of the field when encoded to JSON.
:ivar default: Default value (used when not present in JSON object).
@ -52,14 +46,12 @@ class Field(object):
'fdec', 'fenc', 'fdec2', 'fenc2')
def __init__(self, json_name, default=None, omitempty=False,
decoder=None, encoder=None, decoder2=None, encoder2=None):
decoder=None, encoder=None):
# pylint: disable=too-many-arguments
self.json_name = json_name
self.default = default
self.omitempty = omitempty
self.fdec2 = decoder2
self.fenc2 = encoder2
self.fdec = self.default_decoder if decoder is None else decoder
self.fenc = self.default_encoder if encoder is None else encoder
@ -80,37 +72,24 @@ class Field(object):
def _update_params(self, **kwargs):
current = dict(json_name=self.json_name, default=self.default,
omitempty=self.omitempty,
decoder=self.fdec, encoder=self.fenc,
decoder2=self.fdec2, encoder2=self.fenc2)
decoder=self.fdec, encoder=self.fenc)
current.update(kwargs)
return type(self)(**current) # pylint: disable=star-args
def decoder(self, fdec):
"""Descriptor to change the decoder on JSON object field."""
return self._update_params(decoder=fdec, decoder2=None)
return self._update_params(decoder=fdec)
def encoder(self, fenc):
"""Descriptor to change the encoder on JSON object field."""
return self._update_params(encoder=fenc, encoder2=None)
return self._update_params(encoder=fenc)
def decoder2(self, fdec2):
"""Descriptor to change the decoder2 on JSON object field."""
return self._update_params(decoder2=fdec2, decoder=None)
def encoder2(self, fenc2):
"""Descriptor to change the encoder2 on JSON object field."""
return self._update_params(encoder2=fenc2, encoder=None)
def decode(self, value, jobj=None):
def decode(self, value):
"""Decode a value, optionally with context JSON object."""
if self.fdec2 is not None:
return self.fdec2(jobj, value)
return self.fdec(value)
def encode(self, value, obj=None):
def encode(self, value):
"""Encode a value, optionally with context JSON object."""
if self.fenc2 is not None:
return self.fenc2(obj, value)
return self.fenc(value)
@classmethod
@ -241,7 +220,7 @@ class JSONObjectWithFields(util.ImmutableMap, interfaces.JSONDeSerializable):
logging.debug('Ommiting empty field "%s" (%s)', slot, value)
else:
try:
jobj[field.json_name] = field.encode(value, self)
jobj[field.json_name] = field.encode(value)
except errors.SerializationError as error:
raise errors.SerializationError(
'Could not encode {0} ({1}): {2}'.format(
@ -274,7 +253,7 @@ class JSONObjectWithFields(util.ImmutableMap, interfaces.JSONDeSerializable):
else:
value = jobj[field.json_name]
try:
fields[slot] = field.decode(value, jobj)
fields[slot] = field.decode(value)
except errors.DeserializationError as error:
raise errors.DeserializationError(
'Could not decode {0!r} ({1!r}): {2}'.format(

View file

@ -21,8 +21,6 @@ class FieldTest(unittest.TestCase):
"""Tests for letsencrypt.acme.jose.json_util.Field."""
def test_descriptors(self):
mock_jobj = mock.MagicMock()
mock_obj = mock.MagicMock()
mock_value = mock.MagicMock()
# pylint: disable=missing-docstring
@ -33,36 +31,15 @@ class FieldTest(unittest.TestCase):
def encoder(unused_value):
return 'e'
def decoder2(jobj, unused_value):
self.assertTrue(jobj is mock_jobj)
return 'd2'
def encoder2(obj, unused_value):
self.assertTrue(obj is mock_obj)
return 'e2'
from letsencrypt.acme.jose.json_util import Field
field = Field('foo', decoder=decoder, encoder=encoder,
decoder2=decoder2, encoder2=encoder2)
self.assertEqual('e2', field.encode(mock_value, mock_obj))
self.assertEqual('d2', field.decode(mock_value, mock_jobj))
field = Field('foo')
field = field.encoder(encoder)
self.assertEqual('e', field.encode(mock_value, mock_obj))
self.assertEqual('d2', field.decode(mock_value, mock_jobj))
self.assertEqual('e', field.encode(mock_value))
field = field.decoder(decoder)
self.assertEqual('e', field.encode(mock_value, mock_obj))
self.assertEqual('d', field.decode(mock_value, mock_jobj))
field = field.encoder2(encoder2)
self.assertEqual('e2', field.encode(mock_value, mock_obj))
self.assertEqual('d', field.decode(mock_value, mock_jobj))
field = field.decoder2(decoder2)
self.assertEqual('e2', field.encode(mock_value, mock_obj))
self.assertEqual('d2', field.decode(mock_value, mock_jobj))
self.assertEqual('e', field.encode(mock_value))
self.assertEqual('d', field.decode(mock_value))
def test_default_encoder_is_partial(self):
class MockField(interfaces.JSONDeSerializable):