Skip to content

Commit 8e0533f

Browse files
committed
fix type hint on EnumField, add lots of documentation and example tests
1 parent cb0bb86 commit 8e0533f

File tree

18 files changed

+440
-30
lines changed

18 files changed

+440
-30
lines changed

README.rst

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ accessible as their enumeration type rather than by-value:*
8282
)
8383
instance.refresh_from_db()
8484
85-
instance.txt_enum == MyModel.TextEnum('V1')
86-
instance.txt_enum.label == 'Value 1'
85+
assert instance.txt_enum == MyModel.TextEnum('V1')
86+
assert instance.txt_enum.label == 'Value 1'
8787
88-
instance.int_enum == MyModel.IntEnum['THREE']
89-
instance.int_enum.value == 3
88+
assert instance.int_enum == MyModel.IntEnum['THREE']
89+
assert instance.int_enum.value == 3
9090
9191
9292
`django-enum <https://django-enum.readthedocs.io/en/latest/>`_ also provides
@@ -116,12 +116,17 @@ possible very rich enumeration fields.
116116
color = EnumField(Color)
117117
118118
instance = MyModel.objects.create(color=MyModel.Color('FF0000'))
119-
instance.color == MyModel.Color('Red') == MyModel.Color('R') == MyModel.Color((1, 0, 0))
119+
assert instance.color == MyModel.Color('Red') == MyModel.Color('R') == MyModel.Color((1, 0, 0))
120120
121-
# save back by any symmetric value
121+
# direct comparison to any symmetric value also works
122+
assert instance.color == 'Red'
123+
assert instance.color == 'R'
124+
assert instance.color == (1, 0, 0)
125+
126+
# save by any symmetric value
122127
instance.color = 'FF0000'
123128
instance.full_clean()
124-
instance.color.hex == 'ff0000'
129+
assert instance.color.hex == 'ff0000'
125130
instance.save()
126131
127132

django_enum/fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ def __new__(mcs, enum: Choices) -> Field: # pylint: disable=R0911
311311

312312

313313
def EnumField( # pylint: disable=C0103
314-
enum: Choices,
314+
enum: Type[Choices],
315315
*field_args,
316316
**field_kwargs
317317
) -> Field:

django_enum/tests/djenum/migrations/0001_initial.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 3.2.14 on 2022-07-26 03:42
1+
# Generated by Django 3.2.14 on 2022-08-09 00:32
22

33
import django_enum.fields
44
from django.db import migrations, models
@@ -32,6 +32,7 @@ class Migration(migrations.Migration):
3232
('dj_int_enum', django_enum.fields.EnumPositiveSmallIntegerField(choices=[(1, 'One'), (2, 'Two'), (3, 'Three')], default=1)),
3333
('dj_text_enum', django_enum.fields.EnumCharField(choices=[('A', 'Label A'), ('B', 'Label B'), ('C', 'Label C')], default='A', max_length=1)),
3434
('non_strict_int', django_enum.fields.EnumPositiveSmallIntegerField(blank=True, choices=[(0, 'Value 1'), (2, 'Value 2'), (32767, 'Value 32767')], default=None, null=True)),
35+
('non_strict_text', django_enum.fields.EnumCharField(blank=True, choices=[('V1', 'Value1'), ('V22', 'Value2'), ('V333', 'Value3'), ('D', 'Default')], default='', max_length=12)),
3536
],
3637
options={
3738
'ordering': ('id',),

django_enum/tests/djenum/models.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,15 @@ class EnumTester(models.Model):
7878
blank=True
7979
)
8080

81+
non_strict_text = EnumField(
82+
TextEnum,
83+
max_length=12,
84+
strict=False,
85+
null=False,
86+
default='',
87+
blank=True
88+
)
89+
8190
def get_absolute_url(self):
8291
return reverse('django_enum_tests_djenum:enum-detail', kwargs={'pk': self.pk})
8392

django_enum/tests/examples/__init__.py

Whitespace-only changes.

django_enum/tests/examples/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class ExamplesConfig(AppConfig):
5+
name = 'django_enum.tests.examples'
6+
label = name.replace('.', '_')
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Generated by Django 3.2.14 on 2022-08-09 02:32
2+
3+
import django_enum.fields
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
initial = True
10+
11+
dependencies = [
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='Map',
17+
fields=[
18+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19+
('style', django_enum.fields.EnumPositiveSmallIntegerField(choices=[(1, 'Streets'), (2, 'Outdoors'), (3, 'Light'), (4, 'Dark'), (5, 'Satellite'), (6, 'Satellite Streets'), (7, 'Navigation Day'), (8, 'Navigation Night')], default=1)),
20+
],
21+
),
22+
]

django_enum/tests/examples/migrations/__init__.py

Whitespace-only changes.

django_enum/tests/examples/models.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from django.db import models
2+
from django_enum import EnumField, IntegerChoices
3+
from enum_properties import p, s
4+
5+
6+
class Map(models.Model):
7+
8+
class MapBoxStyle(
9+
IntegerChoices,
10+
s('slug', case_fold=True),
11+
s('label', case_fold=True),
12+
p('version')
13+
):
14+
"""
15+
https://docs.mapbox.com/api/maps/styles/
16+
"""
17+
_symmetric_builtins_ = ['name', 'uri']
18+
19+
# name value slug label version
20+
STREETS = 1, 'streets', 'Streets', 11
21+
OUTDOORS = 2, 'outdoors', 'Outdoors', 11
22+
LIGHT = 3, 'light', 'Light', 10
23+
DARK = 4, 'dark', 'Dark', 10
24+
SATELLITE = 5, 'satellite', 'Satellite', 9
25+
SATELLITE_STREETS = 6, 'satellite-streets', 'Satellite Streets', 11
26+
NAVIGATION_DAY = 7, 'navigation-day', 'Navigation Day', 1
27+
NAVIGATION_NIGHT = 8, 'navigation-night', 'Navigation Night', 1
28+
29+
@property
30+
def uri(self):
31+
return f'mapbox://styles/mapbox/{self.slug}-v{self.version}'
32+
33+
def __str__(self):
34+
return self.uri
35+
36+
style = EnumField(MapBoxStyle, default=MapBoxStyle.STREETS)

django_enum/tests/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import enum_properties
5858
INSTALLED_APPS.insert(0, 'django_enum.tests.enum_prop')
5959
INSTALLED_APPS.insert(0, 'django_enum.tests.edit_tests')
60+
INSTALLED_APPS.insert(0, 'django_enum.tests.examples')
6061
except (ImportError, ModuleNotFoundError): # pragma: no cover
6162
pass
6263

0 commit comments

Comments
 (0)