view mercurial/thirdparty/attr/filters.py @ 46220:1ca7865c245d

engine: refactor code to replace stores in separate function In not all upgrades, we need to change the whole store. For example, when upgrading repository to share-safe mode, we don't touch revlogs at all hence store cloning and copying is not required. The store replacing code needs to be made aware about what all has changed and hence only copy/rename those things. To kickstart that, this patch moves existing logic into a separate function. Differential Revision: https://phab.mercurial-scm.org/D9674
author Pulkit Goyal <7895pulkit@gmail.com>
date Thu, 31 Dec 2020 14:45:16 +0530
parents a5493a251ad3
children e1c586b9a43c
line wrap: on
line source

"""
Commonly useful filters for :func:`attr.asdict`.
"""

from __future__ import absolute_import, division, print_function

from ._compat import isclass
from ._make import Attribute


def _split_what(what):
    """
    Returns a tuple of `frozenset`s of classes and attributes.
    """
    return (
        frozenset(cls for cls in what if isclass(cls)),
        frozenset(cls for cls in what if isinstance(cls, Attribute)),
    )


def include(*what):
    r"""
    Whitelist *what*.

    :param what: What to whitelist.
    :type what: :class:`list` of :class:`type` or :class:`attr.Attribute`\ s

    :rtype: :class:`callable`
    """
    cls, attrs = _split_what(what)

    def include_(attribute, value):
        return value.__class__ in cls or attribute in attrs

    return include_


def exclude(*what):
    r"""
    Blacklist *what*.

    :param what: What to blacklist.
    :type what: :class:`list` of classes or :class:`attr.Attribute`\ s.

    :rtype: :class:`callable`
    """
    cls, attrs = _split_what(what)

    def exclude_(attribute, value):
        return value.__class__ not in cls and attribute not in attrs

    return exclude_