@@ -120,6 +120,22 @@ def test_is_dunder(self):
120
120
'__' , '___' , '____' , '_____' ,):
121
121
self .assertFalse (enum ._is_dunder (s ))
122
122
123
+ # for subclassing tests
124
+
125
+ class classproperty :
126
+
127
+ def __init__ (self , fget = None , fset = None , fdel = None , doc = None ):
128
+ self .fget = fget
129
+ self .fset = fset
130
+ self .fdel = fdel
131
+ if doc is None and fget is not None :
132
+ doc = fget .__doc__
133
+ self .__doc__ = doc
134
+
135
+ def __get__ (self , instance , ownerclass ):
136
+ return self .fget (ownerclass )
137
+
138
+
123
139
# tests
124
140
125
141
class TestEnum (unittest .TestCase ):
@@ -1701,6 +1717,102 @@ class Dupes(Enum):
1701
1717
third = auto ()
1702
1718
self .assertEqual ([Dupes .first , Dupes .second , Dupes .third ], list (Dupes ))
1703
1719
1720
+ def test_multiple_mixin (self ):
1721
+ class MaxMixin :
1722
+ @classproperty
1723
+ def MAX (cls ):
1724
+ max = len (cls )
1725
+ cls .MAX = max
1726
+ return max
1727
+ class StrMixin :
1728
+ def __str__ (self ):
1729
+ return self ._name_ .lower ()
1730
+ class SomeEnum (Enum ):
1731
+ def behavior (self ):
1732
+ return 'booyah'
1733
+ class AnotherEnum (Enum ):
1734
+ def behavior (self ):
1735
+ return 'nuhuh!'
1736
+ def social (self ):
1737
+ return "what's up?"
1738
+ class Color (MaxMixin , Enum ):
1739
+ RED = auto ()
1740
+ GREEN = auto ()
1741
+ BLUE = auto ()
1742
+ self .assertEqual (Color .RED .value , 1 )
1743
+ self .assertEqual (Color .GREEN .value , 2 )
1744
+ self .assertEqual (Color .BLUE .value , 3 )
1745
+ self .assertEqual (Color .MAX , 3 )
1746
+ self .assertEqual (str (Color .BLUE ), 'Color.BLUE' )
1747
+ class Color (MaxMixin , StrMixin , Enum ):
1748
+ RED = auto ()
1749
+ GREEN = auto ()
1750
+ BLUE = auto ()
1751
+ self .assertEqual (Color .RED .value , 1 )
1752
+ self .assertEqual (Color .GREEN .value , 2 )
1753
+ self .assertEqual (Color .BLUE .value , 3 )
1754
+ self .assertEqual (Color .MAX , 3 )
1755
+ self .assertEqual (str (Color .BLUE ), 'blue' )
1756
+ class Color (StrMixin , MaxMixin , Enum ):
1757
+ RED = auto ()
1758
+ GREEN = auto ()
1759
+ BLUE = auto ()
1760
+ self .assertEqual (Color .RED .value , 1 )
1761
+ self .assertEqual (Color .GREEN .value , 2 )
1762
+ self .assertEqual (Color .BLUE .value , 3 )
1763
+ self .assertEqual (Color .MAX , 3 )
1764
+ self .assertEqual (str (Color .BLUE ), 'blue' )
1765
+ class CoolColor (StrMixin , SomeEnum , Enum ):
1766
+ RED = auto ()
1767
+ GREEN = auto ()
1768
+ BLUE = auto ()
1769
+ self .assertEqual (CoolColor .RED .value , 1 )
1770
+ self .assertEqual (CoolColor .GREEN .value , 2 )
1771
+ self .assertEqual (CoolColor .BLUE .value , 3 )
1772
+ self .assertEqual (str (CoolColor .BLUE ), 'blue' )
1773
+ self .assertEqual (CoolColor .RED .behavior (), 'booyah' )
1774
+ class CoolerColor (StrMixin , AnotherEnum , Enum ):
1775
+ RED = auto ()
1776
+ GREEN = auto ()
1777
+ BLUE = auto ()
1778
+ self .assertEqual (CoolerColor .RED .value , 1 )
1779
+ self .assertEqual (CoolerColor .GREEN .value , 2 )
1780
+ self .assertEqual (CoolerColor .BLUE .value , 3 )
1781
+ self .assertEqual (str (CoolerColor .BLUE ), 'blue' )
1782
+ self .assertEqual (CoolerColor .RED .behavior (), 'nuhuh!' )
1783
+ self .assertEqual (CoolerColor .RED .social (), "what's up?" )
1784
+ class CoolestColor (StrMixin , SomeEnum , AnotherEnum ):
1785
+ RED = auto ()
1786
+ GREEN = auto ()
1787
+ BLUE = auto ()
1788
+ self .assertEqual (CoolestColor .RED .value , 1 )
1789
+ self .assertEqual (CoolestColor .GREEN .value , 2 )
1790
+ self .assertEqual (CoolestColor .BLUE .value , 3 )
1791
+ self .assertEqual (str (CoolestColor .BLUE ), 'blue' )
1792
+ self .assertEqual (CoolestColor .RED .behavior (), 'booyah' )
1793
+ self .assertEqual (CoolestColor .RED .social (), "what's up?" )
1794
+ class ConfusedColor (StrMixin , AnotherEnum , SomeEnum ):
1795
+ RED = auto ()
1796
+ GREEN = auto ()
1797
+ BLUE = auto ()
1798
+ self .assertEqual (ConfusedColor .RED .value , 1 )
1799
+ self .assertEqual (ConfusedColor .GREEN .value , 2 )
1800
+ self .assertEqual (ConfusedColor .BLUE .value , 3 )
1801
+ self .assertEqual (str (ConfusedColor .BLUE ), 'blue' )
1802
+ self .assertEqual (ConfusedColor .RED .behavior (), 'nuhuh!' )
1803
+ self .assertEqual (ConfusedColor .RED .social (), "what's up?" )
1804
+ class ReformedColor (StrMixin , IntEnum , SomeEnum , AnotherEnum ):
1805
+ RED = auto ()
1806
+ GREEN = auto ()
1807
+ BLUE = auto ()
1808
+ self .assertEqual (ReformedColor .RED .value , 1 )
1809
+ self .assertEqual (ReformedColor .GREEN .value , 2 )
1810
+ self .assertEqual (ReformedColor .BLUE .value , 3 )
1811
+ self .assertEqual (str (ReformedColor .BLUE ), 'blue' )
1812
+ self .assertEqual (ReformedColor .RED .behavior (), 'booyah' )
1813
+ self .assertEqual (ConfusedColor .RED .social (), "what's up?" )
1814
+ self .assertTrue (issubclass (ReformedColor , int ))
1815
+
1704
1816
1705
1817
class TestOrder (unittest .TestCase ):
1706
1818
@@ -2064,6 +2176,49 @@ class Bizarre(Flag):
2064
2176
d = 6
2065
2177
self .assertEqual (repr (Bizarre (7 )), '<Bizarre.d|c|b: 7>' )
2066
2178
2179
+ def test_multiple_mixin (self ):
2180
+ class AllMixin :
2181
+ @classproperty
2182
+ def ALL (cls ):
2183
+ members = list (cls )
2184
+ all_value = None
2185
+ if members :
2186
+ all_value = members [0 ]
2187
+ for member in members [1 :]:
2188
+ all_value |= member
2189
+ cls .ALL = all_value
2190
+ return all_value
2191
+ class StrMixin :
2192
+ def __str__ (self ):
2193
+ return self ._name_ .lower ()
2194
+ class Color (AllMixin , Flag ):
2195
+ RED = auto ()
2196
+ GREEN = auto ()
2197
+ BLUE = auto ()
2198
+ self .assertEqual (Color .RED .value , 1 )
2199
+ self .assertEqual (Color .GREEN .value , 2 )
2200
+ self .assertEqual (Color .BLUE .value , 4 )
2201
+ self .assertEqual (Color .ALL .value , 7 )
2202
+ self .assertEqual (str (Color .BLUE ), 'Color.BLUE' )
2203
+ class Color (AllMixin , StrMixin , Flag ):
2204
+ RED = auto ()
2205
+ GREEN = auto ()
2206
+ BLUE = auto ()
2207
+ self .assertEqual (Color .RED .value , 1 )
2208
+ self .assertEqual (Color .GREEN .value , 2 )
2209
+ self .assertEqual (Color .BLUE .value , 4 )
2210
+ self .assertEqual (Color .ALL .value , 7 )
2211
+ self .assertEqual (str (Color .BLUE ), 'blue' )
2212
+ class Color (StrMixin , AllMixin , Flag ):
2213
+ RED = auto ()
2214
+ GREEN = auto ()
2215
+ BLUE = auto ()
2216
+ self .assertEqual (Color .RED .value , 1 )
2217
+ self .assertEqual (Color .GREEN .value , 2 )
2218
+ self .assertEqual (Color .BLUE .value , 4 )
2219
+ self .assertEqual (Color .ALL .value , 7 )
2220
+ self .assertEqual (str (Color .BLUE ), 'blue' )
2221
+
2067
2222
@support .reap_threads
2068
2223
def test_unique_composite (self ):
2069
2224
# override __eq__ to be identity only
@@ -2439,6 +2594,49 @@ def test_bool(self):
2439
2594
for f in Open :
2440
2595
self .assertEqual (bool (f .value ), bool (f ))
2441
2596
2597
+ def test_multiple_mixin (self ):
2598
+ class AllMixin :
2599
+ @classproperty
2600
+ def ALL (cls ):
2601
+ members = list (cls )
2602
+ all_value = None
2603
+ if members :
2604
+ all_value = members [0 ]
2605
+ for member in members [1 :]:
2606
+ all_value |= member
2607
+ cls .ALL = all_value
2608
+ return all_value
2609
+ class StrMixin :
2610
+ def __str__ (self ):
2611
+ return self ._name_ .lower ()
2612
+ class Color (AllMixin , IntFlag ):
2613
+ RED = auto ()
2614
+ GREEN = auto ()
2615
+ BLUE = auto ()
2616
+ self .assertEqual (Color .RED .value , 1 )
2617
+ self .assertEqual (Color .GREEN .value , 2 )
2618
+ self .assertEqual (Color .BLUE .value , 4 )
2619
+ self .assertEqual (Color .ALL .value , 7 )
2620
+ self .assertEqual (str (Color .BLUE ), 'Color.BLUE' )
2621
+ class Color (AllMixin , StrMixin , IntFlag ):
2622
+ RED = auto ()
2623
+ GREEN = auto ()
2624
+ BLUE = auto ()
2625
+ self .assertEqual (Color .RED .value , 1 )
2626
+ self .assertEqual (Color .GREEN .value , 2 )
2627
+ self .assertEqual (Color .BLUE .value , 4 )
2628
+ self .assertEqual (Color .ALL .value , 7 )
2629
+ self .assertEqual (str (Color .BLUE ), 'blue' )
2630
+ class Color (StrMixin , AllMixin , IntFlag ):
2631
+ RED = auto ()
2632
+ GREEN = auto ()
2633
+ BLUE = auto ()
2634
+ self .assertEqual (Color .RED .value , 1 )
2635
+ self .assertEqual (Color .GREEN .value , 2 )
2636
+ self .assertEqual (Color .BLUE .value , 4 )
2637
+ self .assertEqual (Color .ALL .value , 7 )
2638
+ self .assertEqual (str (Color .BLUE ), 'blue' )
2639
+
2442
2640
@support .reap_threads
2443
2641
def test_unique_composite (self ):
2444
2642
# override __eq__ to be identity only
@@ -2524,6 +2722,7 @@ class Sillier(IntEnum):
2524
2722
value = 4
2525
2723
2526
2724
2725
+
2527
2726
expected_help_output_with_docs = """\
2528
2727
Help on class Color in module %s:
2529
2728
0 commit comments