refactor and add tests of guild converting

This commit is contained in:
grey-cat-1908 2022-03-20 16:41:11 +03:00
parent 8f39ee9948
commit b8faa2df8a
3 changed files with 108 additions and 100 deletions

View file

@ -10,5 +10,3 @@ __title__ = "Melisa"
__description__ = "Cache-configurable module to interact with the Discord API." __description__ = "Cache-configurable module to interact with the Discord API."
__author__ = "MelisaDev" __author__ = "MelisaDev"
__license__ = "MIT" __license__ = "MIT"

View file

@ -4,8 +4,8 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from enum import IntEnum, Enum, Flag from enum import IntEnum, Enum
from typing import Optional, Tuple, List, Literal from typing import List, Any
from ...utils import Snowflake from ...utils import Snowflake
from ...utils import APIModelBase from ...utils import APIModelBase
@ -27,7 +27,7 @@ class ExplicitContentFilterLevel(IntEnum):
DISABLED = 0 DISABLED = 0
MEMBERS_WITHOUT_ROLES = 1 MEMBERS_WITHOUT_ROLES = 1
ALL_MEMBERS = 2 ALL_MEMBERS = 2
def __int__(self): def __int__(self):
return self.value return self.value
@ -46,10 +46,10 @@ class MFALevel(IntEnum):
class VerificationLevel(IntEnum): class VerificationLevel(IntEnum):
"""""" """"""
NONE = 0 NONE = 0
LOW = 1 LOW = 1
MEDIUM = 2 MEDIUM = 2
HIGH = 3 HIGH = 3
VERY_HIGH = 4 VERY_HIGH = 4
def __int__(self): def __int__(self):
@ -71,10 +71,10 @@ class GuildNSFWLevel(IntEnum):
class PremiumTier(IntEnum): class PremiumTier(IntEnum):
"""""" """"""
NONE = 0 NONE = 0
TIER_1 = 1 TIER_1 = 1
TIER_2 = 2 TIER_2 = 2
TIER_3 = 3 TIER_3 = 3
def __int__(self): def __int__(self):
return self.value return self.value
@ -84,9 +84,9 @@ class SystemChannelFlags(IntEnum):
"""""" """"""
SUPPRESS_JOIN_NOTIFICATIONS = 1 << 0 SUPPRESS_JOIN_NOTIFICATIONS = 1 << 0
SUPPRESS_PREMIUM_SUBSCRIPTIONS = 1 << 1 SUPPRESS_PREMIUM_SUBSCRIPTIONS = 1 << 1
SUPPRESS_GUILD_REMINDER_NOTIFICATIONS = 1 << 2 SUPPRESS_GUILD_REMINDER_NOTIFICATIONS = 1 << 2
SUPPRESS_JOIN_NOTIFICATION_REPLIES = 1 << 3 SUPPRESS_JOIN_NOTIFICATION_REPLIES = 1 << 3
def __int__(self): def __int__(self):
return self.value return self.value
@ -141,19 +141,27 @@ class Guild(APIModelBase):
default_message_notifications: APINullable[int] = None default_message_notifications: APINullable[int] = None
explicit_content_filter: APINullable[int] = None explicit_content_filter: APINullable[int] = None
features: APINullable[List[GuildFeatures]] = None features: APINullable[List[GuildFeatures]] = None
#TODO: Make a structure for emoji and role roles: APINullable[List[Any]] = None
emojis: APINullable[List[Any]] = None
# TODO: Make a structures of emoji and role
mfa_level: APINullable[int] = None mfa_level: APINullable[int] = None
application_id: APINullable[Snowflake] = None application_id: APINullable[Snowflake] = None
system_channel_id: APINullable[Snowflake] = None system_channel_id: APINullable[Snowflake] = None
system_channel_flags: APINullable[int] = None system_channel_flags: APINullable[int] = None
rules_channel_id: APINullable[Snowflake] = None rules_channel_id: APINullable[Snowflake] = None
#TODO: Deal with joined_at joined_at: APINullable[int] = None
# TODO: Deal with joined_at
large: APINullable[bool] = None large: APINullable[bool] = None
unavailable: APINullable[bool] = None unavailable: APINullable[bool] = None
member_count: APINullable[int] = None member_count: APINullable[int] = None
#TODO: Make a structure for voice_states, members, channels, threads, presences(?) voice_states: APINullable[List[Any]] = None
members: APINullable[List[Any]] = None
channels: APINullable[List[Any]] = None
threads: APINullable[List[Any]] = None
presences: APINullable[List[Any]] = None
# TODO: Make a structure for voice_states, members, channels, threads, presences(?)
max_presences: APINullable[int] = None max_presences: APINullable[int] = None
max_members: APINullable[int] = None max_members: APINullable[int] = None
@ -169,90 +177,16 @@ class Guild(APIModelBase):
approximate_presence_count: APINullable[int] = None approximate_presence_count: APINullable[int] = None
nsfw_level: APINullable[int] = None nsfw_level: APINullable[int] = None
premium_progress_bar_enabled: APINullable[bool] = None premium_progress_bar_enabled: APINullable[bool] = None
#TODO: Make a structure for welcome_screen, stage_instances, stickers and guild_scheduled_events stage_instances: APINullable[List[Any]] = None
stickers: APINullable[List[Any]] = None
welcome_screen: APINullable[Any] = None
guild_scheduled_events: APINullable[List[Any]] = None
# TODO: Make a structure for welcome_screen, stage_instances,
async def get_guild(self, _id: id, with_counts: bool = False ): # stickers and guild_scheduled_events
""""""
return await self._http.get(
f"/guild/{_id}", params = {"with_counts": "true" if with_counts else None})
@property
def default_message_notifications(self) -> Optional[DefaultMessageNotificationLevel]:
""""""
return(
None
if self.default_message_notifications is None
else DefaultMessageNotificationLevel(self.default_message_notifications)
)
@property
def explicit_content_filter(self) -> Optional[ExplicitContentFilterLevel]:
""""""
return(
None
if self.explicit_content_filter is None
else ExplicitContentFilterLevel(self.explicit_content_filter)
)
@property
def mfa_level(self) -> Optional[MFALevel]:
""""""
return(
None
if self.mfa_level is None
else MFALevel(self.mfa_level)
)
@property
def verification_level(self) -> Optional[VerificationLevel]:
""""""
return(
None
if self.verification_level is None
else VerificationLevel(self.verification_level)
)
@property
def nsfw_level(self) -> Optional[GuildNSFWLevel]:
""""""
return(
None
if self.nsfw_level is None
else GuildNSFWLevel(self.nsfw_level)
)
@property
def premium_tier(self) -> Optional(PremiumTier):
""""""
return(
None
if self.premium_tier is None
else PremiumTier(self.premium_tier)
)
@property
def system_channel_flags(self) -> Optional[SystemChannelFlags]:
""""""
return(
None
if self.system_channel_flags is None
else SystemChannelFlags(self.system_channel_flags)
)
@dataclass(repr=False) @dataclass(repr=False)
class UnavailableGuild(APIModelBase): class UnavailableGuild(APIModelBase):
id: APINullable[Snowflake] = None id: APINullable[Snowflake] = None
unavailable: APINullable[bool] = True unavailable: APINullable[bool] = True

View file

@ -0,0 +1,76 @@
from melisa.models import Guild
guild_data = {
"id": "197038439483310086",
"name": "Discord Testers",
"icon": "f64c482b807da4f539cff778d174971c",
"description": "The official place to report Discord Bugs!",
"splash": None,
"discovery_splash": None,
"features": [
"ANIMATED_ICON",
"VERIFIED",
"NEWS",
"VANITY_URL",
"DISCOVERABLE",
"MORE_EMOJI",
"INVITE_SPLASH",
"BANNER",
"COMMUNITY"
],
"emojis": [],
"banner": "9b6439a7de04f1d26af92f84ac9e1e4a",
"owner_id": "73193882359173120",
"application_id": None,
"region": None,
"afk_channel_id": None,
"afk_timeout": 300,
"system_channel_id": None,
"widget_enabled": None,
"widget_channel_id": None,
"verification_level": 3,
"roles": [],
"default_message_notifications": 1,
"mfa_level": 1,
"explicit_content_filter": 2,
"max_presences": 40000,
"max_members": 250000,
"vanity_url_code": "discord-testers",
"premium_tier": 3,
"premium_subscription_count": 33,
"system_channel_flags": 0,
"preferred_locale": "en-US",
"rules_channel_id": "441688182833020939",
"public_updates_channel_id": "281283303326089216"
}
parsed_model = Guild.from_dict(guild_data)
class TestGuildParsing:
def test_dict_to_model(self):
assert int(parsed_model.id) == 197038439483310086
assert parsed_model.name == "Discord Testers"
assert parsed_model.features == [
"ANIMATED_ICON",
"VERIFIED",
"NEWS",
"VANITY_URL",
"DISCOVERABLE",
"MORE_EMOJI",
"INVITE_SPLASH",
"BANNER",
"COMMUNITY"
]
def test_model_to_dict_without_none(self):
data = parsed_model.to_dict()
new_guild_data = guild_data
for i in data.keys():
del new_guild_data[i]
for j in new_guild_data.values():
if j is not None:
raise TypeError