Python's Enum with extra powers to play nice with labels and choices fields
Project description
Choices Enum
Python’s Enum with extra powers to play nice with labels and choices fields.
Free software: BSD license
Documentation: https://python-choicesenum.readthedocs.io.
Installation
Install choicesenum using pip:
$ pip install choicesenum
Features
An ChoicesEnum that can be used to create constant groups.
ChoicesEnum can define labels to be used in choices fields.
Django fields included: EnumCharField and EnumIntegerField.
Support (tested) for Python 2.7, 3.4, 3.5 and 3.6.
Support (tested) for Django 1.6.1 (with south), 1.7, 1.8, 1.9, 1.10 and 1.11.
Usage examples
Example with HttpStatuses:
class HttpStatuses(ChoicesEnum):
OK = 200
BAD_REQUEST = 400
UNAUTHORIZED = 401
FORBIDDEN = 403
All Enum types can be compared against their values:
assert HttpStatuses.OK == 200
assert HttpStatuses.BAD_REQUEST == 400
assert HttpStatuses.UNAUTHORIZED == 401
assert HttpStatuses.FORBIDDEN == 403
status_code = HttpStatuses.OK
assert 200 <= status_code <= 300
All Enum types have by default a display derived from the enum identifier:
assert HttpStatuses.OK.display == 'Ok'
assert HttpStatuses.BAD_REQUEST.display == 'Bad request'
assert HttpStatuses.UNAUTHORIZED.display == 'Unauthorized'
assert HttpStatuses.FORBIDDEN.display == 'Forbidden'
You can easily define your own custom display for an Enum item using a tuple:
class HttpStatuses(ChoicesEnum):
OK = 200, 'Everything is fine'
BAD_REQUEST = 400, 'You did a mistake'
UNAUTHORIZED = 401, 'I know your IP'
FORBIDDEN = 403
assert HttpStatuses.OK.display == 'Everything is fine'
assert HttpStatuses.BAD_REQUEST.display == 'You did a mistake'
assert HttpStatuses.UNAUTHORIZED.display == 'I know your IP'
assert HttpStatuses.FORBIDDEN.display == 'Forbidden'
You can declare custom properties and methods:
class HttpStatuses(ChoicesEnum):
OK = 200, 'Everything is fine'
BAD_REQUEST = 400, 'You did a mistake'
UNAUTHORIZED = 401, 'I know your IP'
FORBIDDEN = 403
@property
def is_error(self):
return self >= self.BAD_REQUEST
assert HttpStatuses.OK.is_error is False
assert HttpStatuses.BAD_REQUEST.is_error is True
assert HttpStatuses.UNAUTHORIZED.is_error is True
Example with Colors:
from choicesenum import ChoicesEnum
class Colors(ChoicesEnum):
# For fixed order in py2.7, py3.4+ are ordered by default
_order_ = 'RED GREEN BLUE'
RED = '#f00', 'Vermelho'
GREEN = '#0f0', 'Verde'
BLUE = '#00f', 'Azul'
assert Colors.RED == '#f00'
assert Colors.GREEN == '#0f0'
assert Colors.BLUE == '#00f'
assert Colors.RED.display == 'Vermelho'
assert Colors.GREEN.display == 'Verde'
assert Colors.BLUE.display == 'Azul'
Use .choices() method to receive a list of tuples (item, display):
# choices
assert list(Colors.choices()) == [
('#f00', 'Vermelho'),
('#0f0', 'Verde'),
('#00f', 'Azul'),
]
For each enum item, a dynamic property is_<enum_item> is generated to allow quick boolean checks:
color = Colors.RED
assert color.is_red
assert not color.is_blue
assert not color.is_green
if color.is_red:
print 'Is red!'
The enum item can be used whenever the value is needed:
assert u'Currrent color is {c} ({c.display})'.format(c=color) ==\
u'Currrent color is #f00 (Vermelho)'
Usage with the custom Django fields:
from django.db import models
from choicesenum.django.fields import EnumCharField
class ColorModel(models.Model):
color = EnumCharField(
max_length=100,
enum=Colors,
default=Colors.GREEN,
)
instance = ColorModel()
assert instance.color == Colors.GREEN
assert instance.color.is_green is True
assert instance.color.value == Colors.GREEN.value == '#0f0'
assert instance.color.display == Colors.GREEN.display
instance.color = '#f00'
assert instance.color == '#f00'
assert instance.color.value == '#f00'
assert instance.color.display == 'Vermelho'
Is guaranteed that the field value is always a ChoicesEnum item. Pay attention that the field will only accept valid values for the Enum in use, so if your field allow null, your enum should also:
from django.db import models
from choicesenum import ChoicesEnum
from choicesenum.django.fields import EnumIntegerField
class UserStatus(ChoicesEnum):
UNDEFINED = None
PENDING = 1
ACTIVE = 2
INACTIVE = 3
DELETED = 4
class User(models.Model):
status = EnumIntegerField(enum=UserStatus, null=True, )
instance = User()
assert instance.status.is_undefined is True
assert instance.status.value is None
assert instance.status == UserStatus.UNDEFINED
assert instance.status.display == 'Undefined'
# again...
instance.status = None
assert instance.status.is_undefined is True
Usage with Graphene Enums:
UserStatusEnum = graphene.Enum.from_enum(UserStatus)
History
0.2.2 (2017-12-01)
Fix: Support queries through select_related with no None value defined (thanks @klette).
0.2.1 (2017-09-30)
Fix South migrations for Django 1.6.
0.2.0 (2017-09-11)
ChoicesEnum items are comparable by their values (==, !=, >, >=, <, <=) (thanks @jodal).
+``ChoicesEnum.values``: Returns all the Enum’s raw values (eq: [x.value for x in Enum]).
0.1.7 (2017-09-10)
Fix: ChoicesEnum is now hashable (thanks @jodal).
0.1.6 (2017-09-08)
Fix: Proxy __len__ calls to the inner enum value.
0.1.5 (2017-09-05)
+ChoicesEnum.description: Alias for label, allow enum descriptors to be used by Graphene.
0.1.4 (2017-08-28)
Fix South migrations for Django 1.6.
ChoicesEnum repr can be used to reconstruct an instance (item == eval(repr(item))).
0.1.3 (2017-08-28)
Fix sdist not including sub-modules (django contrib).
0.1.2 (2017-08-27)
README fixes and improvements.
0.1.0 (2017-08-27)
First release on PyPI.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file choicesenum-0.2.2.tar.gz
.
File metadata
- Download URL: choicesenum-0.2.2.tar.gz
- Upload date:
- Size: 22.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e16f45c3fe9ea9978260eee7440950b58e5766570cbfc9af4886f77a504637dc |
|
MD5 | aa26be366042676636133fe34565ddac |
|
BLAKE2b-256 | 703058d725d11e5cd37c3831e2793355c02480c31b3859d773f44fee9d2901ec |
File details
Details for the file choicesenum-0.2.2-py2.py3-none-any.whl
.
File metadata
- Download URL: choicesenum-0.2.2-py2.py3-none-any.whl
- Upload date:
- Size: 10.7 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c8ca7c21a61e5df9b0c6c4cefe3a6de516925f5a510bdbc2c7349122e6707e26 |
|
MD5 | a2ffda9dca31e0b01d6240882addf5d9 |
|
BLAKE2b-256 | 48fa9c2ac0753958ca7c195f3089087acf8e291808aa90ae4f09a0be5fbb8425 |