From f3e36be9316298072f88f1a7d03ec96ca20be507 Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 25 Jun 2019 13:36:53 -0700 Subject: [PATCH] fix: correct behavior of PermissionValue for new enums --- disco/types/permissions.py | 21 +++++++++++---------- tests/types/permissions.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 tests/types/permissions.py diff --git a/disco/types/permissions.py b/disco/types/permissions.py index e4728a4..2554b5c 100644 --- a/disco/types/permissions.py +++ b/disco/types/permissions.py @@ -32,16 +32,14 @@ class Permissions(object): @classmethod def keys(cls): for k, v in six.iteritems(cls.__dict__): - yield k + if k.isupper(): + yield k class PermissionValue(object): __slots__ = ['value'] def __init__(self, value=0): - if isinstance(value, PermissionValue): - value = value.value - self.value = value def can(self, *perms): @@ -79,19 +77,22 @@ class PermissionValue(object): return self.sub(other) def __getattribute__(self, name): - if name in list(Permissions.keys()): - return (self.value & Permissions[name].value) == Permissions[name].value - else: + try: + perm_value = getattr(Permissions, name.upper()) + return (self.value & perm_value) == perm_value + except AttributeError: return object.__getattribute__(self, name) def __setattr__(self, name, value): - if name not in list(Permissions.keys()): + try: + perm_value = getattr(Permissions, name.upper()) + except AttributeError: return super(PermissionValue, self).__setattr__(name, value) if value: - self.value |= Permissions[name].value + self.value |= perm_value else: - self.value &= ~Permissions[name].value + self.value &= ~perm_value def __int__(self): return self.value diff --git a/tests/types/permissions.py b/tests/types/permissions.py new file mode 100644 index 0000000..4e83743 --- /dev/null +++ b/tests/types/permissions.py @@ -0,0 +1,28 @@ +from disco.types.permissions import Permissions, PermissionValue + + +def test_permission_value_can(): + admin_perms = PermissionValue( + Permissions.ADMINISTRATOR + ) + + assert admin_perms.administrator + + # Admin can do everything + for key in Permissions.keys(): + assert admin_perms.can(getattr(Permissions, key)) + + manage_channels_perms = PermissionValue( + Permissions.MANAGE_CHANNELS, + ) + + assert not manage_channels_perms.administrator + assert manage_channels_perms.manage_channels + + +def test_permission_value_mutation(): + no_perms = PermissionValue() + assert not no_perms.can(Permissions.SEND_MESSAGES) + + no_perms.send_messages = True + assert no_perms.can(Permissions.SEND_MESSAGES)