1# -------------------------------------------------------------------------- 
    2# 
    3# Copyright (c) Microsoft Corporation. All rights reserved. 
    4# 
    5# The MIT License (MIT) 
    6# 
    7# Permission is hereby granted, free of charge, to any person obtaining a copy 
    8# of this software and associated documentation files (the ""Software""), to 
    9# deal in the Software without restriction, including without limitation the 
    10# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
    11# sell copies of the Software, and to permit persons to whom the Software is 
    12# furnished to do so, subject to the following conditions: 
    13# 
    14# The above copyright notice and this permission notice shall be included in 
    15# all copies or substantial portions of the Software. 
    16# 
    17# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
    18# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
    19# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
    20# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
    21# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
    22# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 
    23# IN THE SOFTWARE. 
    24# 
    25# -------------------------------------------------------------------------- 
    26from typing import Any 
    27from enum import EnumMeta, Enum 
    28 
    29 
    30class CaseInsensitiveEnumMeta(EnumMeta): 
    31    """Enum metaclass to allow for interoperability with case-insensitive strings. 
    32 
    33    Consuming this metaclass in an SDK should be done in the following manner: 
    34 
    35    .. code-block:: python 
    36 
    37        from enum import Enum 
    38        from azure.core import CaseInsensitiveEnumMeta 
    39 
    40        class MyCustomEnum(str, Enum, metaclass=CaseInsensitiveEnumMeta): 
    41            FOO = 'foo' 
    42            BAR = 'bar' 
    43 
    44    """ 
    45 
    46    def __getitem__(cls, name: str) -> Any: 
    47        # disabling pylint bc of pylint bug https://github.com/PyCQA/astroid/issues/713 
    48        return super(CaseInsensitiveEnumMeta, cls).__getitem__(name.upper()) 
    49 
    50    def __getattr__(cls, name: str) -> Enum: 
    51        """Return the enum member matching `name`. 
    52 
    53        We use __getattr__ instead of descriptors or inserting into the enum 
    54        class' __dict__ in order to support `name` and `value` being both 
    55        properties for enum members (which live in the class' __dict__) and 
    56        enum members themselves. 
    57 
    58        :param str name: The name of the enum member to retrieve. 
    59        :rtype: ~azure.core.CaseInsensitiveEnumMeta 
    60        :return: The enum member matching `name`. 
    61        :raises AttributeError: If `name` is not a valid enum member. 
    62        """ 
    63        try: 
    64            return cls._member_map_[name.upper()] 
    65        except KeyError as err: 
    66            raise AttributeError(name) from err