view mercurial/interfaces/util.py @ 42927:d459cd8ea42d

interfaces: introduce an interface for dirstate implementations As usual with adding interface definitions, this describes the way things are, not the way we'd like things to be. There are some clear problems in the interface right now (eg ._map leaks in a few places), but I have plans to clean those up. There are also many missing docstrings, but again, we'll make a second pass to clean that up. Differential Revision: https://phab.mercurial-scm.org/D6836
author Augie Fackler <augie@google.com>
date Tue, 10 Sep 2019 09:21:38 -0400
parents 2c4f656c8e9f
children 2372284d9457
line wrap: on
line source

# util.py - Utilities for declaring interfaces.
#
# Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

# zope.interface imposes a run-time cost due to module import overhead and
# bookkeeping for declaring interfaces. So, we use stubs for various
# zope.interface primitives unless instructed otherwise.

from __future__ import absolute_import

from .. import (
    encoding,
)

if encoding.environ.get('HGREALINTERFACES'):
    from ..thirdparty.zope import (
        interface as zi,
    )

    Attribute = zi.Attribute
    Interface = zi.Interface
    implementer = zi.implementer
else:
    class Attribute(object):
        def __init__(self, __name__, __doc__=''):
            pass

    class Interface(object):
        def __init__(self, name, bases=(), attrs=None, __doc__=None,
                 __module__=None):
            pass

    def implementer(*ifaces):
        def wrapper(cls):
            return cls

        return wrapper