|
|
|
# Copyright 2009-2024 Joshua Bronson. All rights reserved.
|
|
|
|
#
|
|
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
|
|
|
|
|
|
|
"""Provide :class:`OnDup` and related functionality."""
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
import typing as t
|
|
|
|
from enum import Enum
|
|
|
|
|
|
|
|
|
|
|
|
class OnDupAction(Enum):
|
|
|
|
"""An action to take to prevent duplication from occurring."""
|
|
|
|
|
|
|
|
#: Raise a :class:`~bidict.DuplicationError`.
|
|
|
|
RAISE = 'RAISE'
|
|
|
|
#: Overwrite existing items with new items.
|
|
|
|
DROP_OLD = 'DROP_OLD'
|
|
|
|
#: Keep existing items and drop new items.
|
|
|
|
DROP_NEW = 'DROP_NEW'
|
|
|
|
|
|
|
|
def __repr__(self) -> str:
|
|
|
|
return f'{self.__class__.__name__}.{self.name}'
|
|
|
|
|
|
|
|
|
|
|
|
RAISE: t.Final[OnDupAction] = OnDupAction.RAISE
|
|
|
|
DROP_OLD: t.Final[OnDupAction] = OnDupAction.DROP_OLD
|
|
|
|
DROP_NEW: t.Final[OnDupAction] = OnDupAction.DROP_NEW
|
|
|
|
|
|
|
|
|
|
|
|
class OnDup(t.NamedTuple):
|
|
|
|
r"""A combination of :class:`~bidict.OnDupAction`\s specifying how to handle various types of duplication.
|
|
|
|
|
|
|
|
The :attr:`~OnDup.key` field specifies what action to take when a duplicate key is encountered.
|
|
|
|
|
|
|
|
The :attr:`~OnDup.val` field specifies what action to take when a duplicate value is encountered.
|
|
|
|
|
|
|
|
In the case of both key and value duplication across two different items,
|
|
|
|
only :attr:`~OnDup.val` is used.
|
|
|
|
|
|
|
|
*See also* :ref:`basic-usage:Values Must Be Unique`
|
|
|
|
(https://bidict.rtfd.io/basic-usage.html#values-must-be-unique)
|
|
|
|
"""
|
|
|
|
|
|
|
|
key: OnDupAction = DROP_OLD
|
|
|
|
val: OnDupAction = RAISE
|
|
|
|
|
|
|
|
|
|
|
|
#: Default :class:`OnDup` used for the
|
|
|
|
#: :meth:`~bidict.bidict.__init__`,
|
|
|
|
#: :meth:`~bidict.bidict.__setitem__`, and
|
|
|
|
#: :meth:`~bidict.bidict.update` methods.
|
|
|
|
ON_DUP_DEFAULT: t.Final[OnDup] = OnDup(key=DROP_OLD, val=RAISE)
|
|
|
|
#: An :class:`OnDup` whose members are all :obj:`RAISE`.
|
|
|
|
ON_DUP_RAISE: t.Final[OnDup] = OnDup(key=RAISE, val=RAISE)
|
|
|
|
#: An :class:`OnDup` whose members are all :obj:`DROP_OLD`.
|
|
|
|
ON_DUP_DROP_OLD: t.Final[OnDup] = OnDup(key=DROP_OLD, val=DROP_OLD)
|