Spaces:
Sleeping
Sleeping
3.1.13 | |
====== | |
- remove Python 2.6 code | |
- add Python 3.12 enhancements | |
- split source code into separate files | |
- Enum and Flag inherit from stdlib versions | |
3.1.12 | |
====== | |
support inheriting from empty NamedTuples | |
3.1.10 | |
====== | |
prevent test_v3.py from being run as main | |
3.1.9 | |
===== | |
Move Py2/3 specific code to dedicated files | |
3.1.8 | |
===== | |
recalculate bits used after all flags created (sometimes needed when a custom | |
`__new__` is in place. | |
3.1.7 | |
===== | |
update flag creation to (possibly) add bitwise operator methods to newly | |
created flags | |
update extend_enum() to work with 3.11 flags | |
3.1.6 | |
===== | |
Update `dir()` on mixed enums to include mixed data type methods and | |
attributes. | |
Rename `enum_property` to `property` to match stdlib. Recommended usage is | |
`aenum.property` (prefix with module name). | |
Remove quadritic creation behavior. | |
BREAKING CHANGE BUG FIX that won't affect most people | |
Enums with a custom `__new__` that: | |
- use the enum machinery to generate the values; AND | |
- have keyword arguments set to a default (like `None`) | |
will fail to generate a missing value. To fix: remove the default value and | |
instead specify it on the member creation line. | |
BREAKING CHANGE | |
In Python 3.11 the `str()` of mixed enums will now match its `format()` which | |
will be the normal `str()` of the data type -- so for an IntEnum you'll see | |
`5` instead of `Perm.R|X`. This affects IntEnum, StrEnum, and IntFlag. | |
3.1.5 | |
===== | |
fix support of `auto()` kwds | |
3.1.3 | |
===== | |
rename `aenum.property` to `aenum.enum_property` | |
fix `enum_property` to work with `_init_` attributes | |
3.1.2 | |
===== | |
fix `extend_enum()` for unhashable values | |
3.1.1 | |
===== | |
fix `extend_enum()` for most cases | |
3.1.0 | |
===== | |
AddValue is similar to the old AutoNumber: it will always activate, but | |
uses _generate_next_value_ to get the next value (so the user has some | |
control over the return data type instead of always getting an int). | |
BREAKING CHANGES | |
AutoValue is gone. It was superflous and its removal simplified the code. | |
Simply put the fields needed in an `_init_` and `_generate_next_value_` | |
will be called to supply the missing values (this is probably already what | |
is happening). | |
3.0.0 | |
===== | |
standard Enum usage is unchanged | |
BREAKING CHANGES | |
Enum | |
- the more esoteric method of creating Enums have been modified or removed | |
- AutoNumber setting is gone, inherit from AutoNumberEnum instead | |
- creating members without specifying anything is removed (if you don't | |
know what this means, you weren't doing it) | |
Flag | |
- unique flags are canonical (i.e. flags with powers of two values such as | |
1, 2, 4, 8, 16, etc.) | |
- non-unique flags are aliases (i.e. values such as 3 or 7) | |
- iteration of Flag and flag members only uses canonical flags | |
ENHANCEMENTS | |
Member creation has been redone to match Python 3.10's methods. This also | |
allows all supported Pythons (2.7, 3.3+) to use the __set_name__ and | |
__init_subclass__ protocols (more robustly than in aenum 2.2.5) | |
CHANGES | |
enum_property() has been renamed to property() (old name still available, but | |
deprecated). | |
bin() replacement shows negative integers in twos-complement | |
2.2.5 | |
===== | |
call __init_subclass__ after members have been added, and in Pythons < 3.6 | |
call __set_name__ in Pythons < 3.6 | |
do not convert/disallow private names | |
add iteration/len support to NamedConstant | |
2.2.4 | |
===== | |
add support to Constant to retrieve members by value | |
--> class K(Constant): | |
... one = 1 | |
... two = 2 | |
--> K.one | |
<K.one: 1> | |
--> K(1) | |
<K.one: 1> | |
add pickle/deepcopy support to Constant | |
add support for Constant to use other Constant values | |
(resulting members /are not/ the same) | |
--> class C(Constant) | |
... one = K.one | |
... three = 3 | |
--> C.one == K.one | |
True | |
--> C.one is K.one | |
False | |
AutoNumber and auto() now work together | |
Enum members are now added to the class as enum_property, which supports | |
unshadowing of parent class attributes when called on an Enum member: | |
--> class StrEnum(str, Enum): | |
... lower = 'lower' | |
... upper = 'upper' | |
... mixed = 'mixed' | |
--> StrEnum.lower | |
<StrEnum.lower: 'lower'> | |
--> StrEnum.lower.upper() | |
'LOWER' | |
--> StrEnum.upper | |
<StrEnum.upper: 'upper'> | |
--> StrEnum.upper.upper() | |
'UPPER' | |
2.2.3 | |
===== | |
use members' type's methods __str__, __repr__, __format__, and | |
__reduce_ex__ if directly assigned in Enum class body; i.e.: | |
--> class Color(str, Enum): | |
... red = 'red' | |
... green = 'green' | |
... blue = 'blue' | |
... __str__ = str.__str__ | |
--> print(repr(Color.green)) | |
<Color.green: 'green'> | |
--> print(Color.green) | |
green | |
2.2.2 | |
===== | |
replace _RouteClassAttributeToGetattr with enum_property (it is still | |
available as an alias) | |
support constant() and auto() being used together: | |
--> class Fruit(Flag): | |
... _order_ = 'apple banana lemon orange' | |
... apple = auto() | |
... banana = auto() | |
... lemon = auto() | |
... orange = auto() | |
... CitrusTypes = constant(lemon | orange) | |
--> list(Fruit) | |
[Fruit.apple, Fruit.banana, Fruit.lemon, Fruit.orange] | |
--> list(Fruit.CitrusTypes) | |
[Fruit.orange, Fruit.lemon] | |
--> Fruit.orange in Fruit.CitrusTypes | |
True | |
2.2.1 | |
===== | |
allow Enums to be called without a value | |
class Color(Enum): | |
black = 0 | |
red = 1 | |
green = 2 | |
blue = 3 | |
# | |
@classmethod | |
def _missing_value_(cls, value): | |
if value is no_arg: | |
return cls.black | |
>>> Color() | |
<Color.black: 0> | |
allow Enum name use while constructing Enum (Python 3.4+ only) | |
--> class Color(Enum): | |
... _order_ = 'BLACK WHITE' | |
... BLACK = Color('black', '#000') | |
... WHITE = Color('white', '#fff') | |
... # | |
... def __init__(self, label, hex): | |
... self.label = label | |
... self.hex = hex | |
2.2.0 | |
===== | |
BREAKING CHANGE | |
--------------- | |
In Python 3+ classes defined inside an Enum no longer become members by | |
default; in Python 2 they still become members, but see below. | |
For cross-compatibility and full control two decorators are provided: | |
- @member --> forces item to become a member | |
- @nonmember --> excludes item from becoming a member | |
So to have an Enum that behaves the same in Python 2 and 3, use the | |
decorators (and other compatibility shims): | |
class Color(Enum): | |
_order_ = 'red green blue' | |
red = 1 | |
green = 2 | |
blue = 3 | |
@nonmember | |
class Shades(Enum): | |
_order_ = 'light medium dark' | |
light = 1 | |
medium = 2 | |
dark = 3 | |
2.1.4 | |
===== | |
EnumMeta: | |
- change __member_new__ to __new_member__ (as the stdlib enum does) | |
- assign member name to enum() instances (an Enum helper for defining members) | |
- handle empty iterables when using functional API | |
- make auto() work with previous enum members | |
- keep searching mixins until base class is found | |
Enum: | |
- fix bug in Flag checks (ensure it is a Flag before checking the name) | |
- add multiple mixin support | |
- do not allow blank names (functional API) | |
- raise TypeError if _missing_* returns wrong type | |
- fix __format__ to honor custom __str__ | |
extend_enum: | |
- support stdlib Enums | |
- use _generate_next_value_ if value not provided | |
general: | |
- standardize exception formatting | |
- use getfullargspec() in Python 3 (avoids deprecation warnings) | |
2.1.2 | |
===== | |
when order is callable, save it for subclass use | |
2.1.1 | |
===== | |
correctly raise TypeError for non-Enum containment checks | |
support combining names with | for Flag key access | |
support _order_ being a callable | |
2.1.0 | |
===== | |
support Flags being combined with other data types: | |
- add _create_pseudo_member_values_ | |
- add default __new__ and temporary _init_ | |
2.0.10 | |
====== | |
ensure _ignore_ is set when _settings_ specified in body which includes | |
AutoValue | |
make Flag members iterable | |
2.0.9 | |
===== | |
fix missing comma in __all__ | |
fix extend_enum with custom __new__ methods | |
fix MultiValue with AutoNumber without _init_ | |
2.0.8 | |
===== | |
extend_enum now handles aliases and multivalues correctly | |
2.0.7 | |
===== | |
support mixin types with extend_enum | |
init and AutoNumber can now work together | |
add test for new Enum using EnumMeta | |
add tests for variations of multivalue and init | |
prevent deletion of NamedConstant.constant | |
2.0.6 | |
===== | |
constants cannot be deleted (they already couldn't be changed) | |
constants can be used to define other constants | |
2.0.5 | |
===== | |
_init_ and MultiValue can now work together | |
2.0.4 | |
===== | |
_init_ and AutoValue (and _generate_next_value_) can now work together to | |
supply missing values even when some of the required values per member are | |
absent | |
2.0.3 | |
===== | |
add _missing_value_ and _missing_name_ methods, deprecate _missing_ | |
make enum instances comparable | |
2.0.2 | |
===== | |
both EnumMeta.__getattr__ and Enum.__new__ fall back to _missing_ | |
2.0.1 | |
===== | |
auto() now works with other data types | |
AutoNumber supports legacy Enums (fixed regression) | |
2.0.0 | |
===== | |
Flag and IntFlag added. | |
1.4.7 | |
===== | |
fix %-interpolation bug | |
defined SqlLiteEnum only if sqlite exists | |
support pyflakes | |
1.4.6 | |
===== | |
version numbering error | |
1.4.5 | |
===== | |
revert AutoNumberEnum to custom __new__ instead of AutoNumber | |
use _ignore_ to shield against AutoNumber magic | |
inherit start and init settings from base Enums | |
1.4.4 | |
===== | |
enabled export as a decorator | |
enabled _order_ to replace __order__ | |
enabled python2 support for settings, init, and start | |
1.4.3 | |
===== | |
support _ignore_ for dynamically creating class bodies | |
1.4.2 | |
===== | |
MultiValue, NoAlias, Unique, and init now work with Python 2 | |
1.4.1 | |
===== | |
Py3: added Enum creation flags: Auto, MultiValue, NoAlias, Unique | |
fixed extend_enum to honor Enum flags | |
1.4.0 | |
===== | |
When possible aenum inherits from Python's own enum. | |
Breaking change: enum members now default to evaluating as True to maintain | |
compatibility with the stdlib. | |
Add your own __bool__ (__nonzero__ in Python 2) if need this behavior: | |
def __bool__(self): | |
return bool(self.value) | |
__nonzero__ = __bool__ | |