Documented PycordGuild and partially documented PycordEventStage (#4)

This commit is contained in:
2025-05-04 01:07:28 +02:00
parent 134533e342
commit 6b5a276f00
3 changed files with 104 additions and 73 deletions

View File

@@ -317,7 +317,7 @@ class PycordEvent:
async def update( async def update(
self, self,
cache: Optional[Cache] = None, cache: Optional[Cache] = None,
**kwargs, **kwargs: Any,
) -> None: ) -> None:
"""Update attribute(s) on the object and save the updated entry into the database. """Update attribute(s) on the object and save the updated entry into the database.
@@ -332,7 +332,7 @@ class PycordEvent:
async def reset( async def reset(
self, self,
*args, *args: str,
cache: Optional[Cache] = None, cache: Optional[Cache] = None,
) -> None: ) -> None:
"""Remove attribute(s) on the object, replace them with a default value and save the updated entry into the database. """Remove attribute(s) on the object, replace them with a default value and save the updated entry into the database.

View File

@@ -45,17 +45,18 @@ class PycordEventStage:
@classmethod @classmethod
async def from_id(cls, stage_id: str | ObjectId, cache: Optional[Cache] = None) -> "PycordEventStage": async def from_id(cls, stage_id: str | ObjectId, cache: Optional[Cache] = None) -> "PycordEventStage":
"""Find event stage in the database. """Find the event stage by its ID and construct PycordEventStage from database entry.
Args: Args:
stage_id (str | ObjectId): Stage's ID stage_id (str | ObjectId): ID of the event stage to look up.
cache (:obj:`Cache`, optional): Cache engine to get the cache from cache (:obj:`Cache`, optional): Cache engine that will be used to fetch and update the cache.
Returns: Returns:
PycordEventStage: Event stage object PycordEventStage: Object of the found event stage.
Raises: Raises:
EventStageNotFoundError: Event stage was not found EventStageNotFoundError: Event stage with such ID does not exist.
InvalidId: Provided event stage ID is of invalid format.
""" """
cached_entry: Dict[str, Any] | None = restore_from_cache(cls.__short_name__, stage_id, cache=cache) cached_entry: Dict[str, Any] | None = restore_from_cache(cls.__short_name__, stage_id, cache=cache)
@@ -172,13 +173,13 @@ class PycordEventStage:
cache.delete(self._get_cache_key()) cache.delete(self._get_cache_key())
def to_dict(self, json_compatible: bool = False) -> Dict[str, Any]: def to_dict(self, json_compatible: bool = False) -> Dict[str, Any]:
"""Convert PycordEventStage object to a JSON representation. """Convert the object to a JSON representation.
Args: Args:
json_compatible (bool): Whether the JSON-incompatible objects like ObjectId need to be converted json_compatible (bool): Whether the JSON-incompatible objects like ObjectId need to be converted.
Returns: Returns:
Dict[str, Any]: JSON representation of PycordEventStage Dict[str, Any]: JSON representation of the object.
""" """
return { return {
"_id": self._id if not json_compatible else str(self._id), "_id": self._id if not json_compatible else str(self._id),
@@ -192,9 +193,13 @@ class PycordEventStage:
"media": self.media, "media": self.media,
} }
# TODO Add documentation
@staticmethod @staticmethod
def get_defaults() -> Dict[str, Any]: def get_defaults() -> Dict[str, Any]:
"""Get default values for the object attributes.
Returns:
Dict[str, Any]: Mapping of attributes and their respective values in format `{"attribute_name:" attribute_value}`.
"""
return { return {
"event_id": None, "event_id": None,
"guild_id": None, "guild_id": None,
@@ -206,29 +211,55 @@ class PycordEventStage:
"media": [], "media": [],
} }
# TODO Add documentation
@staticmethod @staticmethod
def get_default_value(key: str) -> Any: def get_default_value(key: str) -> Any:
"""Get default value of the attribute for the object.
Args:
key (str): Name of the attribute.
Returns:
Any: Default value of the attribute.
Raises:
KeyError: There's no default value for the provided attribute.
"""
if key not in PycordEventStage.get_defaults(): if key not in PycordEventStage.get_defaults():
raise KeyError(f"There's no default value for key '{key}' in PycordEventStage") raise KeyError(f"There's no default value for key '{key}' in PycordEventStage")
return PycordEventStage.get_defaults()[key] return PycordEventStage.get_defaults()[key]
# TODO Add documentation
async def update( async def update(
self, self,
cache: Optional[Cache] = None, cache: Optional[Cache] = None,
**kwargs, **kwargs: Any,
): ) -> None:
"""Update attribute(s) on the object and save the updated entry into the database.
Args:
cache (:obj:`Cache`, optional): Cache engine that will be used to update the cache.
**kwargs (Any): Mapping of attributes in format `attribute_name=attribute_value` to update.
Raises:
AttributeError: Provided attribute does not exist in the class.
"""
await self._set(cache=cache, **kwargs) await self._set(cache=cache, **kwargs)
# TODO Add documentation
async def reset( async def reset(
self, self,
*args: str,
cache: Optional[Cache] = None, cache: Optional[Cache] = None,
*args, ) -> None:
): """Remove attribute(s) on the object, replace them with a default value and save the updated entry into the database.
await self._remove(cache, *args)
Args:
*args (str): List of attributes to remove.
cache (:obj:`Cache`, optional): Cache engine that will be used to update the cache.
Raises:
AttributeError: Provided attribute does not exist in the class.
"""
await self._remove(*args, cache=cache)
async def purge(self, cache: Optional[Cache] = None) -> None: async def purge(self, cache: Optional[Cache] = None) -> None:
"""Completely remove event stage data from database. Currently only removes the event stage record from events collection. """Completely remove event stage data from database. Currently only removes the event stage record from events collection.

View File

@@ -32,18 +32,18 @@ class PycordGuild:
async def from_id( async def from_id(
cls, guild_id: int, allow_creation: bool = True, cache: Optional[Cache] = None cls, guild_id: int, allow_creation: bool = True, cache: Optional[Cache] = None
) -> "PycordGuild": ) -> "PycordGuild":
"""Find guild in database and create new record if guild does not exist. """Find the guild by its ID and construct PycordEventStage from database entry.
Args: Args:
guild_id (int): User's Discord ID guild_id (int): ID of the guild to look up.
allow_creation (:obj:`bool`, optional): Create new guild record if none found in the database allow_creation (:obj:`bool`, optional): Create a new record if none found in the database.
cache (:obj:`Cache`, optional): Cache engine to get the cache from cache (:obj:`Cache`, optional): Cache engine that will be used to fetch and update the cache.
Returns: Returns:
PycordGuild: User object PycordGuild: Object of the found or newly created guild.
Raises: Raises:
GuildNotFoundError: User was not found and creation was not allowed GuildNotFoundError: Guild with such ID does not exist and creation was not allowed.
""" """
cached_entry: Dict[str, Any] | None = restore_from_cache(cls.__short_name__, guild_id, cache=cache) cached_entry: Dict[str, Any] | None = restore_from_cache(cls.__short_name__, guild_id, cache=cache)
@@ -68,12 +68,6 @@ class PycordGuild:
return cls(**db_entry) return cls(**db_entry)
async def _set(self, cache: Optional[Cache] = None, **kwargs: Any) -> None: async def _set(self, cache: Optional[Cache] = None, **kwargs: Any) -> None:
"""Set attribute data and save it into the database.
Args:
cache (:obj:`Cache`, optional): Cache engine to write the update into
**kwargs (Any): Mapping of attribute names and respective values to be set
"""
for key, value in kwargs.items(): for key, value in kwargs.items():
if not hasattr(self, key): if not hasattr(self, key):
raise AttributeError() raise AttributeError()
@@ -87,12 +81,6 @@ class PycordGuild:
logger.info("Set attributes of guild %s to %s", self.id, kwargs) logger.info("Set attributes of guild %s to %s", self.id, kwargs)
async def _remove(self, *args: str, cache: Optional[Cache] = None) -> None: async def _remove(self, *args: str, cache: Optional[Cache] = None) -> None:
"""Remove attribute data and save it into the database.
Args:
cache (:obj:`Cache`, optional): Cache engine to write the update into
*args (str): List of attributes to remove
"""
attributes: Dict[str, Any] = {} attributes: Dict[str, Any] = {}
for key in args: for key in args:
@@ -132,13 +120,13 @@ class PycordGuild:
cache.delete(self._get_cache_key()) cache.delete(self._get_cache_key())
def to_dict(self, json_compatible: bool = False) -> Dict[str, Any]: def to_dict(self, json_compatible: bool = False) -> Dict[str, Any]:
"""Convert PycordGuild object to a JSON representation. """Convert the object to a JSON representation.
Args: Args:
json_compatible (bool): Whether the JSON-incompatible objects like ObjectId need to be converted json_compatible (bool): Whether the JSON-incompatible objects like ObjectId need to be converted.
Returns: Returns:
Dict[str, Any]: JSON representation of PycordGuild Dict[str, Any]: JSON representation of the object.
""" """
return { return {
"_id": self._id if not json_compatible else str(self._id), "_id": self._id if not json_compatible else str(self._id),
@@ -149,9 +137,13 @@ class PycordGuild:
"prefer_emojis": self.prefer_emojis, "prefer_emojis": self.prefer_emojis,
} }
# TODO Add documentation
@staticmethod @staticmethod
def get_defaults(guild_id: Optional[int] = None) -> Dict[str, Any]: def get_defaults(guild_id: Optional[int] = None) -> Dict[str, Any]:
"""Get default values for the object attributes.
Returns:
Dict[str, Any]: Mapping of attributes and their respective values in format `{"attribute_name:" attribute_value}`.
"""
return { return {
"id": guild_id, "id": guild_id,
"channel_id": None, "channel_id": None,
@@ -162,26 +154,53 @@ class PycordGuild:
@staticmethod @staticmethod
def get_default_value(key: str) -> Any: def get_default_value(key: str) -> Any:
"""Get default value of the attribute for the object.
Args:
key (str): Name of the attribute.
Returns:
Any: Default value of the attribute.
Raises:
KeyError: There's no default value for the provided attribute.
"""
if key not in PycordGuild.get_defaults(): if key not in PycordGuild.get_defaults():
raise KeyError(f"There's no default value for key '{key}' in PycordGuild") raise KeyError(f"There's no default value for key '{key}' in PycordGuild")
return PycordGuild.get_defaults()[key] return PycordGuild.get_defaults()[key]
# TODO Add documentation
async def update( async def update(
self, self,
cache: Optional[Cache] = None, cache: Optional[Cache] = None,
**kwargs, **kwargs: Any,
): ) -> None:
"""Update attribute(s) on the object and save the updated entry into the database.
Args:
cache (:obj:`Cache`, optional): Cache engine that will be used to update the cache.
**kwargs (Any): Mapping of attributes in format `attribute_name=attribute_value` to update.
Raises:
AttributeError: Provided attribute does not exist in the class.
"""
await self._set(cache=cache, **kwargs) await self._set(cache=cache, **kwargs)
# TODO Add documentation
async def reset( async def reset(
self, self,
*args: str,
cache: Optional[Cache] = None, cache: Optional[Cache] = None,
*args, ) -> None:
): """Remove attribute(s) on the object, replace them with a default value and save the updated entry into the database.
await self._remove(cache, *args)
Args:
*args (str): List of attributes to remove.
cache (:obj:`Cache`, optional): Cache engine that will be used to update the cache.
Raises:
AttributeError: Provided attribute does not exist in the class.
"""
await self._remove(*args, cache=cache)
async def purge(self, cache: Optional[Cache] = None) -> None: async def purge(self, cache: Optional[Cache] = None) -> None:
"""Completely remove guild data from database. Currently only removes the guild record from guilds collection. """Completely remove guild data from database. Currently only removes the guild record from guilds collection.
@@ -195,35 +214,16 @@ class PycordGuild:
logger.info("Purged guild %s (%s) from the database", self.id, self._id) logger.info("Purged guild %s (%s) from the database", self.id, self._id)
# TODO Add documentation
def is_configured(self) -> bool: def is_configured(self) -> bool:
"""Return whether all attributes required for bot's use on the server are set.
Returns:
bool: `True` if yes and `False` if not.
"""
return ( return (
(self.id is not None) (self.id is not None)
and (self.channel_id is not None) and (self.channel_id is not None)
and (self.category_id is not None) and (self.category_id is not None)
and (self.timezone is not None) and (self.timezone is not None)
and (self.prefer_emojis is not None)
) )
# TODO Add documentation
async def set_channel(self, channel_id: Optional[int] = None, cache: Optional[Cache] = None) -> None:
await self._set(cache, channel_id=channel_id)
# TODO Add documentation
async def reset_channel(self, cache: Optional[Cache] = None) -> None:
await self._remove(cache, "channel_id")
# TODO Add documentation
async def set_category(self, category_id: Optional[int] = None, cache: Optional[Cache] = None) -> None:
await self._set(cache, category_id=category_id)
# TODO Add documentation
async def reset_category(self, cache: Optional[Cache] = None) -> None:
await self._remove(cache, "category_id")
# TODO Add documentation
async def set_timezone(self, timezone: str, cache: Optional[Cache] = None) -> None:
await self._set(cache, timezone=timezone)
# TODO Add documentation
async def reset_timezone(self, cache: Optional[Cache] = None) -> None:
await self._remove(cache, "timezone")