Skip to main content

`interface_meta` provides a convenient way to expose an extensible API with enforced method signatures and consistent documentation.

Project description

InterfaceMeta

PyPI - Version PyPI - Python Version PyPI - Status CI codecov Ruff

interface_meta provides a convenient way to expose an extensible API with enforced method signatures and consistent documentation.

Overview

This library has been extracted (with some modifications) from omniduct, a library also principally written by this author, where it was central to the extensible plugin architecture. It places an emphasis on the functionality required to create a well-documented extensible plugin system, whereby the act of subclassing is sufficient to register the plugin and ensure compliance to the parent API. As such, this library boasts the following features:

  • All subclasses of an interface must conform to the parent's API.
  • Hierarchical runtime property existence and method signature checking. Methods are permitted to add additional optional arguments, but otherwise must conform to the API of their parent class (which themselves may have extended the API of the interface).
  • Subclass definition time hooks (e.g. for registration of subclasses into a library of plugins, etc).
  • Optional requirement for methods in subclasses to explicity decorate methods with an override decorator when replacing methods on an interface, making it clearer as to when a class is introducing new methods versus replacing those that form the part of the interface API.
  • Generation of clear docstrings on implementations that stitches together the base interface documentation with any downstream extensions and quirks.
  • Support for extracting the quirks documentation for a method from other method docstrings, in the event that subclass implementations are done in an internal method.
  • Compatibility with ABCMeta from the standard library.

Example code

from abc import abstractmethod
from interface_meta import InterfaceMeta, inherit_docs, override


class MyInterface(metaclass=InterfaceMeta):
    """
    An example interface.
    """

    INTERFACE_EXPLICIT_OVERRIDES = True
    INTERFACE_RAISE_ON_VIOLATION = False

    @property
    @abstractmethod
    def name(self) -> str:
        """
        The name of this interface.
        """

    @inherit_docs(method="_do_stuff")
    def do_stuff(self, a, b, c=1):
        """
        Do things with the parameters.
        """
        return self._do_stuff(a, b, c)

    @abstractmethod
    def _do_stuff(self, a, b, c):
        pass


class MyImplementation(MyInterface):
    """
    This implementation of the example interface works nicely.
    """

    @override
    @property
    def name(self) -> str:
        return "Peter"

    @override
    def _do_stuff(self, a, b, c):
        """
        In this implementation, we sum the parameters.
        """
        return a + b + c

Running help(MyImplementation) reveals how the documentation is generated:

class MyImplementation(MyInterface)
 |  This implementation of the example interface works nicely.
 |
 |  Method resolution order:
 |      MyImplementation
 |      MyInterface
 |      builtins.object
 |
 |  do_stuff(self, a, b, c=1)
 |      Do things with the parameters.
 |
 |      MyImplementation Quirks:
 |          In this implementation, we sum the parameters.
 ...

Related projects and prior art

This library is released into an already crowded space, and the author would like to recognise some of the already wonderful work done by others. The primary difference between this and other libraries is typically these other libraries focus more on abstracting interface definitions and compliance, and less on the documentation and plugin registration work. While this work overlaps with these projects, its approach is sufficiently different (in the author's opinion) to warrant a separate library.

python-interface has an emphasis on ensuring that implementations of various interfaces strictly adhere to the methods and properties associated with the interface, and that helpful errors are raised when this is violated.

By comparison this library focusses on functional comformance to parent classes, whereby methods on subclasses are allowed to include additional parameters. It also focusses on ensuring that documentation for such quirks in method signatures are correctly composed into the final documentation rendered for that method.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

interface_meta-2.0.0.tar.gz (15.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

interface_meta-2.0.0-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

File details

Details for the file interface_meta-2.0.0.tar.gz.

File metadata

  • Download URL: interface_meta-2.0.0.tar.gz
  • Upload date:
  • Size: 15.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for interface_meta-2.0.0.tar.gz
Algorithm Hash digest
SHA256 6abcf78d27e695b157f44f226ff955ff766d43e8dbd6bd1d763c3e2a99beb4f2
MD5 f599e4a5424297d9a7dfac0b56a5add0
BLAKE2b-256 c31763eb1c5d8c4ba060eab3207f2c2778a7f1411a985da2505198545725f0b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for interface_meta-2.0.0.tar.gz:

Publisher: publish.yml on matthewwardrop/interface_meta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file interface_meta-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: interface_meta-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 15.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for interface_meta-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 523b17cdffe80bbbeb9981e81321f54bee30ca88671f256d57681cb4d2a09abe
MD5 8a3529d0c44a6d751624a0862baddca6
BLAKE2b-256 fed7c0010400fc5ec90e147d64af9d15a91912278f1e1b04e20240b864bd7659

See more details on using hashes here.

Provenance

The following attestation bundles were made for interface_meta-2.0.0-py3-none-any.whl:

Publisher: publish.yml on matthewwardrop/interface_meta

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page