Skip to content

Commit ce84096

Browse files
committed
closes #17, #18, #19
1 parent 20fed8f commit ce84096

File tree

3 files changed

+38
-13
lines changed

3 files changed

+38
-13
lines changed

enum_properties/__init__.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@
1818
import enum
1919
# pylint: disable=protected-access
2020
import unicodedata
21-
from collections.abc import Generator, Hashable, Iterable
21+
from collections.abc import ( # pylint: disable=E0611
22+
Generator,
23+
Hashable,
24+
Iterable,
25+
)
2226

2327
try:
2428
from functools import cached_property
25-
except ImportError:
29+
except ImportError: # pragma: no cover
2630
# todo remove when python 3.7 support is dropped
27-
cached_property = property # pragma: no cover
31+
cached_property = property # pylint: disable=C0103
2832

2933

3034
VERSION = (1, 3, 0)
@@ -120,7 +124,7 @@ class SymmetricMixin: # pylint: disable=R0903
120124

121125
_ep_symmetric_map_ = {}
122126
_ep_isymmetric_map_ = {}
123-
_symmetric_builtins_ = ['name']
127+
_symmetric_builtins_ = []
124128

125129
def __eq__(self, value):
126130
"""Symmetric equality - try to coerce value before failure"""
@@ -369,11 +373,12 @@ def __new__( # pylint: disable=W0221
369373
classdict
370374
)
371375
cls._ep_coerce_types_ = []
372-
cls._ep_symmetric_map_ = {}
376+
cls._ep_symmetric_map_ = cls._member_map_
373377
cls._ep_isymmetric_map_ = {}
374378
cls.enum_properties = list(classdict._ep_properties_.keys())
375379

376380
def add_sym_lookup(prop, p_val, enum_inst):
381+
print(prop, p_val, enum_inst)
377382
if not isinstance(p_val, Hashable):
378383
raise ValueError(
379384
f'{cls}.{prop}:{p_val} is not hashable. Symmetrical '
@@ -516,19 +521,22 @@ def flagged(self):
516521
"""
517522
Returns the list of flags that are active.
518523
"""
519-
# do import here to keep lib less brittle b/c this is a private
520-
# include and may change, rely on CI to find issues
521-
from enum import _decompose # pylint: disable=C0415
522-
return [
523-
flag for flag in _decompose(self.__class__, self._value_)[0]
524-
if flag != 0
525-
]
524+
return list(flag for flag in iter(self))
526525

527526
def __iter__(self):
528527
"""
529528
Return a generator for the active flags.
530529
"""
531-
return (flag for flag in self.flagged)
530+
return (
531+
member for member in self.__class__
532+
if (
533+
(member.value != 0) and
534+
# make sure member is a power of 2, composites are included in
535+
# iteration < 3.11
536+
((member.value & (member.value - 1)) == 0) and
537+
(self.value & member.value == member.value)
538+
)
539+
)
532540

533541
def __len__(self):
534542
"""

enum_properties/tests/tests.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,10 @@ class Perm(
931931
X = 4, 'execute'
932932
RWX = 7, 'all'
933933

934+
@property
935+
def custom_prop(self):
936+
return self.label.upper()
937+
934938
self.assertEqual(Perm.R.label, 'read')
935939
self.assertEqual(Perm.W.label, 'write')
936940
self.assertEqual(Perm.X.label, 'execute')
@@ -941,6 +945,9 @@ class Perm(
941945
self.assertTrue(Perm.X is Perm('execute'))
942946
self.assertTrue(Perm.RWX is Perm('all'))
943947

948+
self.assertEqual(Perm.W.custom_prop, 'WRITE')
949+
self.assertEqual(Perm.RWX.custom_prop, 'ALL')
950+
944951
self.assertTrue((Perm.R | Perm.W | Perm.X) is Perm('RWX'))
945952
self.assertTrue(Perm([Perm.R, Perm.W, Perm.X]) is Perm('RWX'))
946953
self.assertTrue(Perm({'read', 'write', 'execute'}) is Perm('RWX'))
@@ -987,6 +994,10 @@ class Perm(
987994
X = auto(), 'execute'
988995
RWX = R | W | X, 'all'
989996

997+
@property
998+
def custom_prop(self):
999+
return self.label.upper()
1000+
9901001
self.assertEqual(Perm.R.label, 'read')
9911002
self.assertEqual(Perm.W.label, 'write')
9921003
self.assertEqual(Perm.X.label, 'execute')
@@ -997,6 +1008,9 @@ class Perm(
9971008
self.assertTrue(Perm.X is Perm('execute'))
9981009
self.assertTrue(Perm.RWX is Perm('all'))
9991010

1011+
self.assertEqual(Perm.W.custom_prop, 'WRITE')
1012+
self.assertEqual(Perm.RWX.custom_prop, 'ALL')
1013+
10001014
self.assertTrue((Perm.R | Perm.W | Perm.X) is Perm('RWX'))
10011015
self.assertTrue(Perm([Perm.R, Perm.W, Perm.X]) is Perm('RWX'))
10021016
self.assertTrue(Perm({'read', 'write', 'execute'}) is Perm('RWX'))

setup.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ valid-metaclass-classmethod-first-arg = mcs
1515
[pylint.DESIGN]
1616
max-branches=15
1717

18+
[pylint.MESSAGES CONTROL]
19+
disable=W0511
20+
1821
[darglint]
1922
# Darglint integrates with flake8
2023
# https://github.com/terrencepreilly/darglint

0 commit comments

Comments
 (0)