Source code for objutils.registry

#!/usr/bin/env python

__version__ = "0.1.0"

__copyright__ = """
    objutils - Object file library for Python.

   (C) 2010-2019 by Christoph Schueler <cpu12.gems@googlemail.com>

   All Rights Reserved

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
"""

from collections import OrderedDict, namedtuple
from typing import Iterator, MutableMapping, Any, Type, NamedTuple

from objutils.utils import SingletonBase


[docs] class CodecDoesNotExistError(Exception): pass
[docs] class CodecAlreadyExistError(Exception): pass
[docs] class Codec(NamedTuple): Reader: Type[Any] Writer: Type[Any] description: str
[docs] class Registry(SingletonBase): def __init__(self): self._codecs: "OrderedDict[str, Codec]" = OrderedDict() def __iter__(self) -> Iterator[tuple[str, Codec]]: return iter(self._codecs.items())
[docs] def _get_codecs(self) -> "OrderedDict[str, Codec]": return self._codecs
[docs] def _get_formats(self) -> list[str]: return sorted(self.codecs.keys())
[docs] def get(self, name: str) -> Codec: codec = self.codecs.get(name.lower()) if not codec: raise CodecDoesNotExistError(name) return codec
[docs] def register(self, name: str, readerClass: Type[Any], writerClass: Type[Any], description: str = "") -> None: if name in self.codecs: raise CodecAlreadyExistError(name) self._codecs[name] = Codec(readerClass, writerClass, description) readerClass.codecName = name writerClass.codecName = name
codecs = property(_get_codecs) formats = property(_get_formats)
registry = Registry()