1
1
from datetime import date , datetime , time , timedelta
2
- from decimal import Decimal , DecimalException
3
-
2
+ from decimal import Decimal
3
+ import typing as t
4
+ from typing_extensions import Annotated
4
5
from django .db .models import IntegerChoices as DjangoIntegerChoices
5
6
from django .db .models import TextChoices as DjangoTextChoices
6
7
from django .utils .translation import gettext as _
7
- from enum_properties import (
8
- EnumProperties ,
9
- IntEnumProperties ,
10
- IntFlagProperties ,
11
- p ,
12
- s ,
13
- )
8
+ from enum_properties import EnumProperties , IntEnumProperties , Symmetric , s
14
9
15
10
from django_enum import FlagChoices , FloatChoices , IntegerChoices , TextChoices
16
11
from tests .utils import try_convert
@@ -28,7 +23,11 @@ class DJTextEnum(DjangoTextChoices):
28
23
C = "C" , "Label C"
29
24
30
25
31
- class TextEnum (TextChoices , p ("version" ), p ("help" ), s ("aliases" , case_fold = True )):
26
+ class TextEnum (TextChoices ):
27
+ version : int
28
+ help : str
29
+ aliases : Annotated [t .List [str ], Symmetric (case_fold = True )]
30
+
32
31
VALUE1 = (
33
32
"V1" ,
34
33
"Value1" ,
@@ -59,7 +58,9 @@ class TextEnum(TextChoices, p("version"), p("help"), s("aliases", case_fold=True
59
58
)
60
59
61
60
62
- class Constants (FloatChoices , s ("symbol" )):
61
+ class Constants (FloatChoices ):
62
+ symbol : Annotated [str , Symmetric ()]
63
+
63
64
PI = 3.14159265358979323846264338327950288 , "Pi" , "π"
64
65
e = 2.71828 , "Euler's Number" , "e"
65
66
GOLDEN_RATIO = 1.61803398874989484820458683436563811 , "Golden Ratio" , "φ"
@@ -101,7 +102,10 @@ class BigPosIntEnum(IntegerChoices):
101
102
VAL3 = 2147483648 , "Value 2147483648"
102
103
103
104
104
- class BigIntEnum (IntegerChoices , s ("pos" ), p ("help" )):
105
+ class BigIntEnum (IntegerChoices ):
106
+ pos : Annotated [BigPosIntEnum , Symmetric ()]
107
+ help : str
108
+
105
109
VAL0 = (
106
110
- 2147483649 ,
107
111
"Value -2147483649" ,
@@ -118,7 +122,9 @@ class BigIntEnum(IntegerChoices, s("pos"), p("help")):
118
122
)
119
123
120
124
121
- class DateEnum (EnumProperties , s ("label" )):
125
+ class DateEnum (EnumProperties ):
126
+ label : Annotated [str , Symmetric ()]
127
+
122
128
BRIAN = date (1984 , 8 , 7 ), "Brian"
123
129
EMMA = date (1989 , 7 , 27 ), "Emma"
124
130
HUGO = date (2016 , 9 , 9 ), "Hugo"
@@ -141,7 +147,9 @@ def __hash__(self):
141
147
return super ().__hash__ ()
142
148
143
149
144
- class DateTimeEnum (EnumProperties , s ("label" )):
150
+ class DateTimeEnum (EnumProperties ):
151
+ label : Annotated [str , Symmetric ()]
152
+
145
153
ST_HELENS = datetime (1980 , 5 , 18 , 8 , 32 , 0 ), "Mount St. Helens"
146
154
PINATUBO = datetime (1991 , 6 , 15 , 20 , 9 , 0 ), "Pinatubo"
147
155
KATRINA = datetime (2005 , 8 , 29 , 5 , 10 , 0 ), "Katrina"
@@ -164,7 +172,9 @@ def __hash__(self):
164
172
return super ().__hash__ ()
165
173
166
174
167
- class TimeEnum (EnumProperties , s ("label" )):
175
+ class TimeEnum (EnumProperties ):
176
+ label : Annotated [str , Symmetric ()]
177
+
168
178
COB = time (17 , 0 , 0 ), "Close of Business"
169
179
LUNCH = time (12 , 30 , 0 ), "Lunch"
170
180
MORNING = time (9 , 0 , 0 ), "Morning"
@@ -187,7 +197,9 @@ def __hash__(self):
187
197
return super ().__hash__ ()
188
198
189
199
190
- class DurationEnum (EnumProperties , s ("label" , case_fold = True )):
200
+ class DurationEnum (EnumProperties ):
201
+ label : Annotated [str , Symmetric (case_fold = True )]
202
+
191
203
DAY = timedelta (days = 1 ), "DAY"
192
204
WEEK = timedelta (weeks = 1 ), "WEEK"
193
205
FORTNIGHT = timedelta (weeks = 2 ), "FORTNIGHT"
@@ -210,7 +222,9 @@ def __hash__(self):
210
222
return super ().__hash__ ()
211
223
212
224
213
- class DecimalEnum (EnumProperties , s ("label" , case_fold = True )):
225
+ class DecimalEnum (EnumProperties ):
226
+ label : Annotated [str , Symmetric (case_fold = True )]
227
+
214
228
ONE = Decimal ("0.99" ), "One"
215
229
TWO = Decimal ("0.999" ), "Two"
216
230
THREE = Decimal ("0.9999" ), "Three"
@@ -237,20 +251,21 @@ def __hash__(self):
237
251
return super ().__hash__ ()
238
252
239
253
240
- class PrecedenceTest (
241
- s ("prop1" ),
242
- s ("prop2" ),
243
- IntegerChoices ,
244
- s ("prop3" , case_fold = False ),
245
- s ("prop4" , case_fold = True ),
246
- ):
254
+ class PrecedenceTest (IntegerChoices ):
255
+ prop1 : Annotated [t .Union [int , str ], Symmetric ()]
256
+ prop2 : Annotated [float , Symmetric ()]
257
+ prop3 : Annotated [str , Symmetric (case_fold = False )]
258
+ prop4 : Annotated [t .List [t .Union [str , float , int ]], Symmetric (case_fold = True )]
259
+
247
260
P1 = 0 , "Precedence 1" , 3 , 0.1 , _ ("First" ), ["0.4" , "Fourth" , 1 ]
248
- P2 = 1 , "Precedence 2" , 2 , 0.2 , _ ("Second" ), { "0.3" , "Third" , 2 }
261
+ P2 = 1 , "Precedence 2" , 2 , 0.2 , _ ("Second" ), [ "0.3" , "Third" , 2 ]
249
262
P3 = 2 , "Precedence 3" , "1" , 0.3 , _ ("Third" ), [0.2 , "Second" , 3 ]
250
- P4 = 3 , "Precedence 4" , 0 , 0.4 , _ ("Fourth" ), { 0.1 , "First" , 4 }
263
+ P4 = 3 , "Precedence 4" , 0 , 0.4 , _ ("Fourth" ), [ 0.1 , "First" , 4 ]
251
264
252
265
253
- class CarrierFrequency (FlagChoices , p ("mhz" )):
266
+ class CarrierFrequency (FlagChoices ):
267
+ mhz : float
268
+
254
269
L1 = 1 , 1575.420
255
270
L2 = 2 , 1227.600
256
271
L5 = 4 , 1176.450
@@ -269,8 +284,12 @@ class CarrierFrequency(FlagChoices, p("mhz")):
269
284
B3 = 4096 , 1268.520
270
285
271
286
272
- class GNSSConstellation (FlagChoices , s ("country" ), p ("satellites" ), p ("frequencies" )):
273
- _symmetric_builtins_ = [s ("label" , case_fold = True )]
287
+ class GNSSConstellation (FlagChoices ):
288
+ _symmetric_builtins_ = ["name" , s ("label" , Symmetric (case_fold = True ))]
289
+
290
+ country : Annotated [str , Symmetric ()]
291
+ satellites : int
292
+ frequencies : CarrierFrequency
274
293
275
294
GPS = (
276
295
1 ,
@@ -313,12 +332,14 @@ class LargeNegativeField(IntegerChoices):
313
332
ZERO = - 1 , "ZERO"
314
333
315
334
316
- class ExternEnum (IntEnumProperties , s ( "label" , case_fold = True ) ):
335
+ class ExternEnum (IntEnumProperties ):
317
336
"""
318
337
Tests that externally defined (i.e. not deriving from choices enums
319
338
are supported.
320
339
"""
321
340
341
+ label : Annotated [str , Symmetric (case_fold = True )]
342
+
322
343
ONE = 1 , "One"
323
344
TWO = 2 , "Two"
324
345
THREE = 3 , "Three"
0 commit comments