diff --git a/docs/source/conf.py b/docs/source/conf.py index 819ecdb..4d13050 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -21,39 +21,36 @@ import sys import os sys.path.append(os.path.abspath("../..")) -sys.path.append(os.path.abspath('extensions')) +sys.path.append(os.path.abspath("extensions")) -project = 'Melisa' -copyright = '2022, MelisaDev' -author = 'MelisaDev' +project = "Melisa" +copyright = "2022, MelisaDev" +author = "MelisaDev" # The full version, including alpha/beta/rc tags -release = '0.0.1a' +release = "0.0.1a" # -- General configuration --------------------------------------------------- extensions = [ - 'sphinx_design', + "sphinx_design", "sphinx.ext.napoleon", "sphinx.ext.autodoc", "sphinx.ext.viewcode", "sphinx.ext.autosectionlabel", "sphinx.ext.extlinks", "sphinxcontrib_trio", - "attributable" + "attributable", ] -autodoc_default_options = { - 'members': True, - 'show-inheritance': True -} +autodoc_default_options = {"members": True, "show-inheritance": True} -autodoc_typehints = 'none' +autodoc_typehints = "none" # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] add_module_names = False @@ -67,13 +64,13 @@ intersphinx_mapping = { # -- Options for HTML output ------------------------------------------------- -html_theme = 'furo' +html_theme = "furo" html_theme_options = { "sidebar_hide_name": True, } -pygments_style = 'monokai' +pygments_style = "monokai" default_dark_mode = True -html_static_path = ['_static'] +html_static_path = ["_static"] html_css_files = ["custom.css"] rst_prolog = """ diff --git a/docs/source/extensions/attributable.py b/docs/source/extensions/attributable.py index c20eff1..4fc63cf 100644 --- a/docs/source/extensions/attributable.py +++ b/docs/source/extensions/attributable.py @@ -40,56 +40,50 @@ class attributetable_item(nodes.Part, nodes.Element): def visit_attributetable_node(self, node): class_ = node["python-class"] - self.body.append( - f'
' - ) + self.body.append(f'
') def visit_attributetablecolumn_node(self, node): - self.body.append(self.starttag( - node, 'div', CLASS='py-attribute-table-column') - ) + self.body.append(self.starttag(node, "div", CLASS="py-attribute-table-column")) def visit_attributetabletitle_node(self, node): - self.body.append(self.starttag(node, 'span')) + self.body.append(self.starttag(node, "span")) def visit_attributetablebadge_node(self, node): attributes = { - 'class': 'py-attribute-table-badge', - 'title': node['badge-type'], + "class": "py-attribute-table-badge", + "title": node["badge-type"], } - self.body.append(self.starttag(node, 'span', **attributes)) + self.body.append(self.starttag(node, "span", **attributes)) def visit_attributetable_item_node(self, node): - self.body.append(self.starttag( - node, 'li', CLASS='py-attribute-table-entry') - ) + self.body.append(self.starttag(node, "li", CLASS="py-attribute-table-entry")) def depart_attributetable_node(self, node): - self.body.append('
') + self.body.append("
") def depart_attributetablecolumn_node(self, node): - self.body.append('') + self.body.append("") def depart_attributetabletitle_node(self, node): - self.body.append('') + self.body.append("") def depart_attributetablebadge_node(self, node): - self.body.append('') + self.body.append("") def depart_attributetable_item_node(self, node): - self.body.append('') + self.body.append("") -_name_parser_regex = re.compile(r'(?P[\w.]+\.)?(?P\w+)') +_name_parser_regex = re.compile(r"(?P[\w.]+\.)?(?P\w+)") class PyAttributeTable(SphinxDirective): @@ -102,14 +96,15 @@ class PyAttributeTable(SphinxDirective): def parse_name(self, content): path, name = _name_parser_regex.match(content).groups() if path: - modulename = path.rstrip('.') + modulename = path.rstrip(".") else: - modulename = self.env.temp_data.get('autodoc:module') + modulename = self.env.temp_data.get("autodoc:module") if not modulename: - modulename = self.env.ref_context.get('py:module') + modulename = self.env.ref_context.get("py:module") if modulename is None: - raise RuntimeError('modulename somehow None for %s in %s.' % ( - content, self.env.docname)) + raise RuntimeError( + "modulename somehow None for %s in %s." % (content, self.env.docname) + ) return modulename, name @@ -139,12 +134,12 @@ class PyAttributeTable(SphinxDirective): replaced. """ content = self.arguments[0].strip() - node = attributetableplaceholder('') + node = attributetableplaceholder("") modulename, name = self.parse_name(content) - node['python-doc'] = self.env.docname - node['python-module'] = modulename - node['python-class'] = name - node['python-full-name'] = f'{modulename}.{name}' + node["python-doc"] = self.env.docname + node["python-module"] = modulename + node["python-class"] = name + node["python-full-name"] = f"{modulename}.{name}" return [node] @@ -152,17 +147,20 @@ def build_lookup_table(env): # Given an environment, load up a lookup table of # full-class-name: objects result = {} - domain = env.domains['py'] + domain = env.domains["py"] ignored = { - 'data', 'exception', 'module', 'class', + "data", + "exception", + "module", + "class", } for (fullname, _, objtype, docname, _, _) in domain.get_objects(): if objtype in ignored: continue - classname, _, child = fullname.rpartition('.') + classname, _, child = fullname.rpartition(".") try: result[classname].append(child) except KeyError: @@ -171,7 +169,7 @@ def build_lookup_table(env): return result -TableElement = namedtuple('TableElement', 'fullname label badge') +TableElement = namedtuple("TableElement", "fullname label badge") def process_attributetable(app, doctree, fromdocname): @@ -179,16 +177,21 @@ def process_attributetable(app, doctree, fromdocname): lookup = build_lookup_table(env) for node in doctree.traverse(attributetableplaceholder): - modulename, classname, fullname = node['python-module'], node['python-class'], node['python-full-name'] + modulename, classname, fullname = ( + node["python-module"], + node["python-class"], + node["python-full-name"], + ) groups = get_class_results(lookup, modulename, classname, fullname) - table = attributetable('') + table = attributetable("") for label, subitems in groups.items(): if not subitems: continue - table.append(class_results_to_node( - label, sorted(subitems, key=lambda c: c.label))) + table.append( + class_results_to_node(label, sorted(subitems, key=lambda c: c.label)) + ) - table['python-class'] = fullname + table["python-class"] = fullname node.replace_self([table] if table else []) @@ -197,10 +200,12 @@ def get_class_results(lookup, modulename, name, fullname): module = importlib.import_module(modulename) cls = getattr(module, name) - groups = OrderedDict([ - (_('Attributes'), []), - (_('Methods'), []), - ]) + groups = OrderedDict( + [ + (_("Attributes"), []), + (_("Methods"), []), + ] + ) try: members = lookup[fullname] @@ -208,8 +213,8 @@ def get_class_results(lookup, modulename, name, fullname): return groups for attr in members: - attrlookup = f'{fullname}.{attr}' - key = _('Attributes') + attrlookup = f"{fullname}.{attr}" + key = _("Attributes") badge = None label = attr value = None @@ -220,67 +225,76 @@ def get_class_results(lookup, modulename, name, fullname): break if value is not None: - doc = value.__doc__ or '' - if inspect.iscoroutinefunction(value) or doc.startswith('|coro|'): - key = _('Methods') - badge = attributetablebadge('async', 'async') - badge['badge-type'] = _('coroutine') + doc = value.__doc__ or "" + if inspect.iscoroutinefunction(value) or doc.startswith("|coro|"): + key = _("Methods") + badge = attributetablebadge("async", "async") + badge["badge-type"] = _("coroutine") elif isinstance(value, classmethod): - key = _('Methods') - label = f'{name}.{attr}' - badge = attributetablebadge('cls', 'cls') - badge['badge-type'] = _('classmethod') - elif ( - inspect.isfunction(value) - or isinstance(value, staticmethod) - ): - if ( - doc.startswith(('A decorator', 'A shortcut decorator')) - or label in ("event", "loop") + key = _("Methods") + label = f"{name}.{attr}" + badge = attributetablebadge("cls", "cls") + badge["badge-type"] = _("classmethod") + elif inspect.isfunction(value) or isinstance(value, staticmethod): + if doc.startswith(("A decorator", "A shortcut decorator")) or label in ( + "event", + "loop", ): # finicky but surprisingly consistent - badge = attributetablebadge('@', '@') - badge['badge-type'] = _('decorator') - key = _('Methods') + badge = attributetablebadge("@", "@") + badge["badge-type"] = _("decorator") + key = _("Methods") else: - key = _('Methods') - badge = attributetablebadge('def', 'def') - badge['badge-type'] = _('method') + key = _("Methods") + badge = attributetablebadge("def", "def") + badge["badge-type"] = _("method") - groups[key].append(TableElement( - fullname=attrlookup, label=label, badge=badge)) + groups[key].append(TableElement(fullname=attrlookup, label=label, badge=badge)) return groups def class_results_to_node(key, elements): title = attributetabletitle(key, key) - ul = nodes.bullet_list('') + ul = nodes.bullet_list("") for element in elements: - ref = nodes.reference('', '', internal=True, - refuri='#' + element.fullname, - anchorname='', - *[nodes.Text(element.label)]) - para = addnodes.compact_paragraph('', '', ref) + ref = nodes.reference( + "", + "", + internal=True, + refuri="#" + element.fullname, + anchorname="", + *[nodes.Text(element.label)], + ) + para = addnodes.compact_paragraph("", "", ref) if element.badge is not None: - ul.append(attributetable_item('', element.badge, para)) + ul.append(attributetable_item("", element.badge, para)) else: - ul.append(attributetable_item('', para)) + ul.append(attributetable_item("", para)) - return attributetablecolumn('', title, ul) + return attributetablecolumn("", title, ul) def setup(app): - app.add_directive('attributetable', PyAttributeTable) - app.add_node(attributetable, html=( - visit_attributetable_node, depart_attributetable_node)) - app.add_node(attributetablecolumn, html=( - visit_attributetablecolumn_node, depart_attributetablecolumn_node)) - app.add_node(attributetabletitle, html=( - visit_attributetabletitle_node, depart_attributetabletitle_node)) - app.add_node(attributetablebadge, html=( - visit_attributetablebadge_node, depart_attributetablebadge_node)) - app.add_node(attributetable_item, html=( - visit_attributetable_item_node, depart_attributetable_item_node)) + app.add_directive("attributetable", PyAttributeTable) + app.add_node( + attributetable, html=(visit_attributetable_node, depart_attributetable_node) + ) + app.add_node( + attributetablecolumn, + html=(visit_attributetablecolumn_node, depart_attributetablecolumn_node), + ) + app.add_node( + attributetabletitle, + html=(visit_attributetabletitle_node, depart_attributetabletitle_node), + ) + app.add_node( + attributetablebadge, + html=(visit_attributetablebadge_node, depart_attributetablebadge_node), + ) + app.add_node( + attributetable_item, + html=(visit_attributetable_item_node, depart_attributetable_item_node), + ) app.add_node(attributetableplaceholder) - app.connect('doctree-resolved', process_attributetable) + app.connect("doctree-resolved", process_attributetable) diff --git a/melisa/core/http.py b/melisa/core/http.py index e240aa2..dfe7aad 100644 --- a/melisa/core/http.py +++ b/melisa/core/http.py @@ -231,7 +231,12 @@ class HTTPClient: return await self.__send("DELETE", route, headers=headers) async def patch( - self, route: str, *, headers: dict = None, json: Optional[Dict] = None, data=None + self, + route: str, + *, + headers: dict = None, + json: Optional[Dict] = None, + data=None, ) -> Optional[Dict]: """|coro| Sends a PATCH request to a Discord REST API endpoint. diff --git a/melisa/models/guild/guild.py b/melisa/models/guild/guild.py index 3eb5630..187f0df 100644 --- a/melisa/models/guild/guild.py +++ b/melisa/models/guild/guild.py @@ -13,8 +13,7 @@ from .channel import ( Thread, _choose_channel_type, ) - - +from .emoji import Emoji from .member import GuildMember from .role import Role from ...utils import Snowflake, Timestamp @@ -24,7 +23,6 @@ from ...utils.types import APINullable if TYPE_CHECKING: from .channel import ChannelType, Channel - from .emoji import Emoji class DefaultMessageNotificationLevel(IntEnum): @@ -226,9 +224,9 @@ class Guild(APIModelBase): Explicit content filter level features: APINullable[List[:class:`str`]] Enabled guild features - roles: APINullable[:class:`typing.Any`] + roles: Dict[:class:`~melisa.utils.snowflake.Snowflake`, :class:`~melisa.models.guild.role.Role`] Roles in the guild - emojis: APINullable[:class:`typing.Any`] + emojis: Dict[:class:`~melisa.utils.snowflake.Snowflake`, :class:`~melisa.models.guild.emoji.Emoji`] Custom guild emojis mfa_level: :class:`int` Required MFA level for the guild @@ -327,8 +325,7 @@ class Guild(APIModelBase): default_message_notifications: APINullable[int] = None explicit_content_filter: APINullable[int] = None features: APINullable[List[str]] = None - emojis: APINullable[Emoji] = None - # TODO: Make a structures of emoji and role + emojis: APINullable[Dict[str, Emoji]] = None mfa_level: APINullable[MFALevel] = None application_id: APINullable[Snowflake] = None @@ -461,6 +458,7 @@ class Guild(APIModelBase): self.channels = {} self.members = {} self.roles = {} + self.emojis = {} for member in data.get("members", []): member = GuildMember.from_dict(member) @@ -477,6 +475,10 @@ class Guild(APIModelBase): role["guild_id"] = self.id self.roles[Snowflake(int(role["id"]))] = Role.from_dict(role) + for emoji in data.get("emojis", []): + emoji["guild_id"] = self.id + self.emojis[Snowflake(emoji["id"])] = Emoji.from_dict(emoji) + return self @property @@ -620,12 +622,10 @@ class Guild(APIModelBase): """ await self._client.rest.remove_guild_ban(self.id, user_id, reason=reason) - - async def fetch_emojis( - self - ): + + async def fetch_emojis(self) -> List[Emoji]: """|coro| - + Getting all emojis from guild Raises @@ -638,21 +638,18 @@ class Guild(APIModelBase): You provided a wrong guild """ - await self._client.rest.list_guild_emojis(self.id) + return await self._client.rest.list_guild_emojis(self.id) - async def fetch_emoji( - self, - emoji_id: Union[Snowflake, str, int] - ): + async def fetch_emoji(self, emoji_id: Union[Snowflake, str, int]) -> Emoji: """|coro| - + Get emoji from guild Parameters ---------- emoji_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] The ID of the emoji that we will get - + Raises ------- HTTPException @@ -663,20 +660,21 @@ class Guild(APIModelBase): You provided a wrong guild and emoji """ - await self._client.rest.get_guild_emoji(self.id, emoji_id) - + return await self._client.rest.get_guild_emoji(self.id, emoji_id) + async def create_emoji( self, - emoji_name: Optional[str], - emoji_image: Optional[str], + emoji_name: str, + emoji_image: Any, *, reason: Optional[str] = None, - role_id: Union[Snowflake, str, int] = None - ): + role_id: List[Union[Snowflake, str, int]] = None, + ) -> Emoji: + # FIXME: emoji_image != str, it works another way """|coro| - - Create a new emoji for the guild. - Requires the `MANAGE_EMOJIS_AND_STICKERS` permission. + + Create a new emoji for the guild. + Requires the `MANAGE_EMOJIS_AND_STICKERS` permission. Returns the new emoji object on success. Fires a Guild Emojis Update Gateway event. Parameters @@ -687,9 +685,9 @@ class Guild(APIModelBase): The 128x128 emoji image reason: Optional[:class:`str`] The reason of the action - role_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] + role_id: List[Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`]] Roles allowed to use this emoji - + Raises ------- HTTPException @@ -700,26 +698,26 @@ class Guild(APIModelBase): You provided a wrong guild """ - await self._client.rest.create_guild_emoji(self.id, emoji_name, emoji_image, reason=reason, role_id=role_id) - + return await self._client.rest.create_guild_emoji( + self.id, emoji_name, emoji_image, reason=reason, role_id=role_id + ) + async def edit_emoji( self, emoji_id: Union[Snowflake, str, int], emoji_name: Optional[str], *, reason: Optional[str] = None, - role_id: Union[Snowflake, str, int] = None + role_id: List[Union[Snowflake, str, int]] = None, ): """|coro| - - Modify the given emoji. - Requires the `MANAGE_EMOJIS_AND_STICKERS` permission. - Returns the updated emoji object on success. Fires a Guild Emojis Update Gateway event. + + Modify the given emoji. + Requires the `MANAGE_EMOJIS_AND_STICKERS` permission. + Returns the updated emoji object on success. Parameters ---------- - guild_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] - ID of the guild in which we will modify emoji emoji_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] The ID of the emoji that we will modify emoji_name: Optional[:class:`str`] @@ -728,7 +726,7 @@ class Guild(APIModelBase): The reason of the action role_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] Roles allowed to use this emoji - + Raises ------- HTTPException @@ -739,29 +737,26 @@ class Guild(APIModelBase): You provided a wrong guild and emoji """ - await self._client.rest.modify_guild_emoji(self.id, emoji_id, emoji_name, reason=reason, role_id=role_id) - + return await self._client.rest.modify_guild_emoji( + self.id, emoji_id, emoji_name, reason=reason, role_id=role_id + ) + async def delete_emoji( - self, - emoji_id: Union[Snowflake, str, int], - *, - reason: Optional[str] = None - ): + self, emoji_id: Union[Snowflake, str, int], *, reason: Optional[str] = None + ) -> None: """|coro| - - Delete the given emoji. - Requires the `MANAGE_EMOJIS_AND_STICKERS` permission. + + Delete the given emoji. + Requires the `MANAGE_EMOJIS_AND_STICKERS` permission. Returns `204 No Content` on success. Fires a Guild Emojis Update Gateway event. Parameters ---------- - guild_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] - ID of the guild in which we will delete emoji emoji_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] The ID of the emoji that we will delete reason: Optional[:class:`str`] The reason of the action - + Raises ------- HTTPException diff --git a/melisa/rest.py b/melisa/rest.py index d1dd625..03d3515 100644 --- a/melisa/rest.py +++ b/melisa/rest.py @@ -15,6 +15,7 @@ from .utils import json, UNDEFINED from .utils.snowflake import Snowflake from .models.guild.guild import Guild from .models.user.user import User +from .models.guild.emoji import Emoji from .models.guild.channel import _choose_channel_type, Channel @@ -671,14 +672,14 @@ class RESTApp: guild_id: Union[Snowflake, str, int], ): """|coro| - + [**REST API**] Getting all emojis from guild Parameters ---------- guild_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] - ID of the guild in which we will get the list emojis - + ID of the guild in which we will get the list of emojis + Raises ------- HTTPException @@ -688,18 +689,16 @@ class RESTApp: BadRequestError You provided a wrong guild """ + return [ + Emoji.from_dict(emoji) + for emoji in await self._http.get(f"/guilds/{guild_id}/emojis") + ] - await self._http.get( - f"/guilds/{guild_id}/emojis" - ) - async def get_guild_emoji( - self, - guild_id: Union[Snowflake, str, int], - emoji_id: Union[Snowflake, str, int] + self, guild_id: Union[Snowflake, str, int], emoji_id: Union[Snowflake, str, int] ): """|coro| - + [**REST API**] Get emoji from guild Parameters @@ -708,7 +707,7 @@ class RESTApp: The ID of the guild in which we will receive emoji emoji_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] The ID of the emoji that we will get - + Raises ------- HTTPException @@ -719,23 +718,22 @@ class RESTApp: You provided a wrong guild and emoji """ - await self._http.get( - f"/guilds/{guild_id}/emojis/{emoji_id}" - ) + await self._http.get(f"/guilds/{guild_id}/emojis/{emoji_id}") async def create_guild_emoji( self, guild_id: Union[int, str, Snowflake], - emoji_name: Optional[str], - emoji_image: Optional[str], + emoji_name: str, + emoji_image: Any, *, reason: Optional[str] = None, - role_id: Union[int, str, Snowflake] = None + role_id: Union[int, str, Snowflake] = None, ): + # FIXME: emoji_image != str, it works another way """|coro| - - [**REST API**] Create a new emoji for the guild. - **Required permissions:** ``MANAGE_EMOJIS_AND_STICKERS``. + + [**REST API**] Create a new emoji for the guild. + **Required permissions:** ``MANAGE_EMOJIS_AND_STICKERS``. Parameters ---------- @@ -749,7 +747,7 @@ class RESTApp: The reason of the action role_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] Roles allowed to use this emoji - + Raises ------- HTTPException @@ -760,18 +758,16 @@ class RESTApp: You provided a wrong guild """ - data = { - "name": emoji_name, - "image": emoji_image, - "roles": role_id - } + data = {"name": emoji_name, "image": emoji_image, "roles": role_id} + + return Emoji.from_dict( + await self._http.post( + f"/guilds/{guild_id}/emojis", + json=data, + headers={"X-Audit-Log-Reason": reason}, + ) + ) - await self._http.post( - f"/guilds/{guild_id}/emojis", - json = data, - headers={"X-Audit-Log-Reason": reason} - ) - async def modify_guild_emoji( self, guild_id: Union[int, str, Snowflake], @@ -779,12 +775,12 @@ class RESTApp: emoji_name: Optional[str], *, reason: Optional[str] = None, - role_id: Union[int, str, Snowflake] = None + role_id: Union[int, str, Snowflake] = None, ): """|coro| - + [**REST API**] Modify the given emoji. - **Required permissions:** ``MANAGE_EMOJIS_AND_STICKERS``. + **Required permissions:** ``MANAGE_EMOJIS_AND_STICKERS``. Parameters ---------- @@ -798,7 +794,7 @@ class RESTApp: The reason of the action role_id: Union[:class:`int`, :class:`str`, :class:`~.melisa.utils.snowflake.Snowflake`] Roles allowed to use this emoji - + Raises ------- HTTPException @@ -809,15 +805,14 @@ class RESTApp: You provided a wrong guild and emoji """ - data = { - "name": emoji_name, - "roles": role_id - } + data = {"name": emoji_name, "roles": role_id} - await self._http.patch( - f"/guilds/{guild_id}/emojis/{emoji_id}", - json = data, - headers={"X-Audit-Log-Reason": reason} + return Emoji.from_dict( + await self._http.patch( + f"/guilds/{guild_id}/emojis/{emoji_id}", + json=data, + headers={"X-Audit-Log-Reason": reason}, + ) ) async def delete_guild_emoji( @@ -825,12 +820,12 @@ class RESTApp: guild_id: Union[int, str, Snowflake], emoji_id: Union[int, str, Snowflake], *, - reason: Optional[str] = None + reason: Optional[str] = None, ): """|coro| - + [**REST API**] Delete the given emoji - **Required permissions:** ``MANAGE_EMOJIS_AND_STICKERS``. + **Required permissions:** ``MANAGE_EMOJIS_AND_STICKERS``. Parameters ---------- @@ -840,7 +835,7 @@ class RESTApp: The ID of the emoji that we will delete reason: Optional[:class:`str`] The reason of the action - + Raises ------- HTTPException @@ -853,7 +848,7 @@ class RESTApp: await self._http.delete( f"/guilds/{guild_id}/emojis/{emoji_id}", - headers={"X-Audit-Log-Reason": reason} + headers={"X-Audit-Log-Reason": reason}, ) async def get_global_application_commands( @@ -1101,7 +1096,9 @@ class RESTApp: data["default_permission"] = default_permission return ApplicationCommand.from_dict( - await self._http.patch(f"/applications/{application_id}/commands/{command_id}", json=data) + await self._http.patch( + f"/applications/{application_id}/commands/{command_id}", json=data + ) ) async def delete_global_application_command( @@ -1130,9 +1127,7 @@ class RESTApp: You provided a wrong arguments """ - await self._http.delete( - f"/applications/{application_id}/commands/{command_id}" - ) + await self._http.delete(f"/applications/{application_id}/commands/{command_id}") return None diff --git a/setup.py b/setup.py index 1f6f44d..88dcaeb 100644 --- a/setup.py +++ b/setup.py @@ -8,29 +8,24 @@ README = (HERE / "README.md").read_text(encoding="utf8") with open(HERE / "melisa/__init__.py") as file: version = re.search( - r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', file.read(), re.MULTILINE).group(1) + r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', file.read(), re.MULTILINE + ).group(1) setuptools.setup( - name='melisa', - author='MelisaDev', - url='https://github.com/MelisaDev/melisa', + name="melisa", + author="MelisaDev", + url="https://github.com/MelisaDev/melisa", version=version, packages=setuptools.find_packages(), - license='MIT', - description='Cache-optimized Discord microframework for Python 3', + license="MIT", + description="Cache-optimized Discord microframework for Python 3", long_description=README, long_description_content_type="text/markdown", include_package_data=True, - python_requires='>=3.8,<3.11', + python_requires=">=3.8,<3.11", zip_safe=False, - install_requires=[ - "aiohttp", "typing_extensions" - ], - extras_require={ - "speedup": [ - "orjson==3.7.3" - ] - }, + install_requires=["aiohttp", "typing_extensions"], + extras_require={"speedup": ["orjson==3.7.3"]}, test_suite="tests", project_urls={ "Documentation": "https://docs.melisapy.site/", @@ -54,5 +49,5 @@ setuptools.setup( "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities", "Typing :: Typed", - ] + ], )