diff options
| author | Brian Wellington <bwelling@xbill.org> | 2020-05-19 13:18:05 -0700 |
|---|---|---|
| committer | Brian Wellington <bwelling@xbill.org> | 2020-05-19 13:18:05 -0700 |
| commit | 044c8afd92070648f3e76ed054be69d264f114c2 (patch) | |
| tree | 075003f55cf0a034d52c183ed9f07b37f1000503 /dns/enum.py | |
| parent | 2df0596e9405049faae662b6cfcb687dae3eb001 (diff) | |
| download | dnspython-044c8afd92070648f3e76ed054be69d264f114c2.tar.gz | |
Enum refactoring.
Consolidate the common methods related to enum classes.
Diffstat (limited to 'dns/enum.py')
| -rw-r--r-- | dns/enum.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/dns/enum.py b/dns/enum.py new file mode 100644 index 0000000..62b4a44 --- /dev/null +++ b/dns/enum.py @@ -0,0 +1,77 @@ +# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license + +# Copyright (C) 2003-2017 Nominum, Inc. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose with or without fee is hereby granted, +# provided that the above copyright notice and this permission notice +# appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import enum + +class IntEnum(enum.IntEnum): + @classmethod + def _check_value(cls, value): + max = cls._maximum() + if value < 0 or value > max: + name = cls._short_name() + raise ValueError(f"{name} must be between >= 0 and <= {max}") + + @classmethod + def from_text(cls, text): + text = text.upper() + try: + return cls[text] + except KeyError: + pass + prefix = cls._prefix() + if text.startswith(prefix) and text[len(prefix):].isdigit(): + value = int(text[len(prefix):]) + cls._check_value(value) + try: + return cls(value) + except ValueError: + return value + raise cls._unknown_exception_class() + + @classmethod + def to_text(cls, value): + cls._check_value(value) + try: + return cls(value).name + except ValueError: + return f"{cls._prefix()}{value}" + + @classmethod + def to_enum(cls, value): + if isinstance(value, str): + return cls.from_text(value) + cls._check_value(value) + try: + return cls(value) + except ValueError: + return value + + @classmethod + def _maximum(cls): + raise NotImplemented + + @classmethod + def _short_name(cls): + return cls.__name__.lower() + + @classmethod + def _prefix(cls): + return '' + + @classmethod + def _unknown_exception_class(cls): + return ValueError |
