diff --git a/tox.ini b/tox.ini index acf804419d..817fd4bd73 100644 --- a/tox.ini +++ b/tox.ini @@ -42,6 +42,9 @@ commands = [testenv:lint] commands = - pylint {toxinidir}/tuf --ignore={toxinidir}/tuf/api + # Use different pylint configs for legacy and new (tuf/api) code + # NOTE: Contrary to what the pylint docs suggest, ignoring full paths does + # work, unfortunately each subdirectory has to be ignored explicitly. + pylint {toxinidir}/tuf --ignore={toxinidir}/tuf/api,{toxinidir}/tuf/api/serialization pylint {toxinidir}/tuf/api --rcfile={toxinidir}/tuf/api/pylintrc bandit -r {toxinidir}/tuf diff --git a/tuf/api/pylintrc b/tuf/api/pylintrc index a75347f446..ad338b0564 100644 --- a/tuf/api/pylintrc +++ b/tuf/api/pylintrc @@ -4,3 +4,6 @@ disable=fixme [FORMAT] indent-string=" " max-line-length=79 + +[DESIGN] +min-public-methods=0 diff --git a/tuf/api/serialization/__init__.py b/tuf/api/serialization/__init__.py new file mode 100644 index 0000000000..a0f05b909a --- /dev/null +++ b/tuf/api/serialization/__init__.py @@ -0,0 +1,43 @@ +"""TUF role metadata de/serialization. + +This sub-package provides abstract base classes and concrete implementations to +serialize and deserialize TUF role metadata and metadata parts. + +Any custom de/serialization implementations should inherit from the abstract +base classes defined in this __init__.py module. + +- Metadata de/serializers are used to convert to and from wireline formats. +- Signed serializers are used to canonicalize data for cryptographic signatures + generation and verification. + +""" +import abc + +class MetadataDeserializer(): + """Abstract base class for deserialization of Metadata objects. """ + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def deserialize(self, raw_data: bytes) -> "Metadata": + """Deserialize passed bytes to Metadata object. """ + raise NotImplementedError + + +class MetadataSerializer(): + """Abstract base class for serialization of Metadata objects. """ + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def serialize(self, metadata_obj: "Metadata") -> bytes: + """Serialize passed Metadata object to bytes. """ + raise NotImplementedError + + +class SignedSerializer(): + """Abstract base class for serialization of Signed objects. """ + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def serialize(self, signed_obj: "Signed") -> bytes: + """Serialize passed Signed object to bytes. """ + raise NotImplementedError