Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
586f5a8
feat: drop python 38 support
onerandomusername Sep 15, 2025
974b84d
typehint update
onerandomusername Sep 15, 2025
6c0aa52
fix: still have to test old annotations
onerandomusername Sep 20, 2025
fc1b782
chore: add changelog
onerandomusername Sep 21, 2025
a7a87c1
revert typing changes
onerandomusername Sep 21, 2025
a0e1c9c
style: re-enable py39 rules
onerandomusername Sep 21, 2025
40a41b7
style: run autofix
onerandomusername Sep 21, 2025
e1a0bab
style: manual 3.9 fixes
onerandomusername Sep 21, 2025
e9b8ee4
docs: add changelog entries
onerandomusername Sep 21, 2025
1ae91c9
Merge branch 'master' into refactor/update-to-py39-typehints
onerandomusername Sep 23, 2025
b4d63c0
fix: tests
onerandomusername Sep 23, 2025
45336cf
Merge branch 'master' into refactor/update-to-py39-typehints
onerandomusername Sep 26, 2025
f6e1c1b
fix: List to list
onerandomusername Sep 26, 2025
223f480
Merge branch 'master' into refactor/update-to-py39-typehints
onerandomusername Oct 4, 2025
066286a
Merge branch 'master' into refactor/update-to-py39-typehints
onerandomusername Oct 9, 2025
18c8900
chore: modernize comments in flag converter
shiftinv Oct 13, 2025
917a38f
Update changelog/1396.misc.rst
onerandomusername Oct 13, 2025
fa2de56
Update disnake/message.py
onerandomusername Oct 13, 2025
d23e519
fix: don't double assign self.endpoint
onerandomusername Oct 13, 2025
ca6deeb
Merge branch 'master' into refactor/update-to-py39-typehints
onerandomusername Oct 13, 2025
754e8cf
Merge branch 'master' into refactor/update-to-py39-typehints
onerandomusername Oct 18, 2025
bd30e4e
docs: reword changelog
onerandomusername Oct 18, 2025
94614f5
Merge branch 'master' into refactor/update-to-py39-typehints
onerandomusername Oct 18, 2025
7151da0
apply suggestions from @Enegg
onerandomusername Oct 19, 2025
a1d4389
fix RET errors
onerandomusername Oct 19, 2025
53048bb
Merge branch 'master' into refactor/update-to-py39-typehints
onerandomusername Oct 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/1396.misc.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Update all standard library types to use built-in generics (such as ``list[int]`` instead of ``List[int]``) where applicable.
6 changes: 3 additions & 3 deletions disnake/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
import platform
import sys
from pathlib import Path
from typing import List, Tuple, Union
from typing import Union

import aiohttp

import disnake


def show_version() -> None:
entries: List[str] = []
entries: list[str] = []

sys_ver = sys.version_info
entries.append(
Expand Down Expand Up @@ -399,7 +399,7 @@ def add_newcog_args(subparser) -> None:
parser.add_argument("--full", help="add all special methods as well", action="store_true")


def parse_args() -> Tuple[argparse.ArgumentParser, argparse.Namespace]:
def parse_args() -> tuple[argparse.ArgumentParser, argparse.Namespace]:
parser = argparse.ArgumentParser(prog="disnake", description="Tools for helping with disnake")
parser.add_argument("-v", "--version", action="store_true", help="shows the library version")
parser.set_defaults(func=core)
Expand Down
52 changes: 24 additions & 28 deletions disnake/abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,13 @@
import asyncio
import copy
from abc import ABC
from collections.abc import Mapping, Sequence
from typing import (
TYPE_CHECKING,
Any,
Callable,
Dict,
List,
Mapping,
Optional,
Protocol,
Sequence,
Tuple,
TypeVar,
Union,
cast,
Expand Down Expand Up @@ -264,7 +260,7 @@ class GuildChannel(ABC):
category_id: Optional[int]
_flags: int
_state: ConnectionState
_overwrites: List[_Overwrites]
_overwrites: list[_Overwrites]

if TYPE_CHECKING:

Expand All @@ -279,7 +275,7 @@ def __str__(self) -> str:
def _sorting_bucket(self) -> int:
raise NotImplementedError

def _update(self, guild: Guild, data: Dict[str, Any]) -> None:
def _update(self, guild: Guild, data: dict[str, Any]) -> None:
raise NotImplementedError

async def _move(
Expand All @@ -297,7 +293,7 @@ async def _move(
http = self._state.http
bucket = self._sorting_bucket
channels = [c for c in self.guild.channels if c._sorting_bucket == bucket]
channels = cast("List[GuildChannel]", channels)
channels = cast("list[GuildChannel]", channels)

channels.sort(key=lambda c: c.position)

Expand All @@ -314,7 +310,7 @@ async def _move(
# add ourselves at our designated position
channels.insert(index, self)

payload: List[ChannelPositionUpdatePayload] = []
payload: list[ChannelPositionUpdatePayload] = []
for index, c in enumerate(channels):
d: ChannelPositionUpdatePayload = {"id": c.id, "position": index}
if parent_id is not MISSING and c.id == self.id:
Expand Down Expand Up @@ -380,7 +376,7 @@ async def _edit(

lock_permissions: bool = bool(sync_permissions)

overwrites_payload: List[PermissionOverwritePayload] = MISSING
overwrites_payload: list[PermissionOverwritePayload] = MISSING

if position is not MISSING:
await self._move(
Expand Down Expand Up @@ -430,7 +426,7 @@ async def _edit(
else:
flags_payload = MISSING

available_tags_payload: List[PartialForumTagPayload] = MISSING
available_tags_payload: list[PartialForumTagPayload] = MISSING
if available_tags is not MISSING:
available_tags_payload = [tag.to_dict() for tag in available_tags]

Expand All @@ -455,7 +451,7 @@ async def _edit(
if default_layout is not MISSING:
default_layout_payload = try_enum_to_int(default_layout)

options: Dict[str, Any] = {
options: dict[str, Any] = {
"name": name,
"parent_id": parent_id,
"topic": topic,
Expand Down Expand Up @@ -508,11 +504,11 @@ def _fill_overwrites(self, data: GuildChannelPayload) -> None:
tmp[everyone_index], tmp[0] = tmp[0], tmp[everyone_index]

@property
def changed_roles(self) -> List[Role]:
def changed_roles(self) -> list[Role]:
""":class:`list`\\[:class:`.Role`]: Returns a list of roles that have been overridden from
their default values in the :attr:`.Guild.roles` attribute.
"""
ret: List[Role] = []
ret: list[Role] = []
g = self.guild
for overwrite in filter(lambda o: o.is_role(), self._overwrites):
role = g.get_role(overwrite.id)
Expand Down Expand Up @@ -565,7 +561,7 @@ def overwrites_for(self, obj: Union[Role, User]) -> PermissionOverwrite:
return PermissionOverwrite()

@property
def overwrites(self) -> Dict[Union[Role, Member], PermissionOverwrite]:
def overwrites(self) -> dict[Union[Role, Member], PermissionOverwrite]:
"""Returns all of the channel's overwrites.

This is returned as a dictionary where the key contains the target which
Expand Down Expand Up @@ -1044,7 +1040,7 @@ async def set_permissions(

async def _clone_impl(
self,
base_attrs: Dict[str, Any],
base_attrs: dict[str, Any],
*,
name: Optional[str] = None,
category: Optional[Snowflake] = MISSING,
Expand All @@ -1053,7 +1049,7 @@ async def _clone_impl(
) -> Self:
# if the overwrites are MISSING, defaults to the
# original permissions of the channel
overwrites_payload: List[PermissionOverwritePayload]
overwrites_payload: list[PermissionOverwritePayload]
if overwrites is not MISSING:
if not isinstance(overwrites, dict):
msg = "overwrites parameter expects a dict."
Expand Down Expand Up @@ -1260,7 +1256,7 @@ async def move(self, **kwargs: Any) -> None:
]

channels.sort(key=lambda c: (c.position, c.id))
channels = cast("List[GuildChannel]", channels)
channels = cast("list[GuildChannel]", channels)

try:
# Try to remove ourselves from the channel list
Expand All @@ -1284,7 +1280,7 @@ async def move(self, **kwargs: Any) -> None:
raise ValueError(msg)

channels.insert(max((index + offset), 0), self)
payload: List[ChannelPositionUpdatePayload] = []
payload: list[ChannelPositionUpdatePayload] = []
lock_permissions = kwargs.get("sync_permissions", False)
reason = kwargs.get("reason")
for index, channel in enumerate(channels):
Expand Down Expand Up @@ -1390,7 +1386,7 @@ async def create_invite(
invite.guild_scheduled_event = guild_scheduled_event
return invite

async def invites(self) -> List[Invite]:
async def invites(self) -> list[Invite]:
"""|coro|

Returns a list of all active instant invites from this channel.
Expand Down Expand Up @@ -1466,7 +1462,7 @@ async def send(
*,
tts: bool = ...,
embed: Embed = ...,
files: List[File] = ...,
files: list[File] = ...,
stickers: Sequence[Union[GuildSticker, StandardSticker, StickerItem]] = ...,
delete_after: float = ...,
nonce: Union[str, int] = ...,
Expand All @@ -1486,7 +1482,7 @@ async def send(
content: Optional[str] = ...,
*,
tts: bool = ...,
embeds: List[Embed] = ...,
embeds: list[Embed] = ...,
file: File = ...,
stickers: Sequence[Union[GuildSticker, StandardSticker, StickerItem]] = ...,
delete_after: float = ...,
Expand All @@ -1507,8 +1503,8 @@ async def send(
content: Optional[str] = ...,
*,
tts: bool = ...,
embeds: List[Embed] = ...,
files: List[File] = ...,
embeds: list[Embed] = ...,
files: list[File] = ...,
stickers: Sequence[Union[GuildSticker, StandardSticker, StickerItem]] = ...,
delete_after: float = ...,
nonce: Union[str, int] = ...,
Expand All @@ -1528,9 +1524,9 @@ async def send(
*,
tts: bool = False,
embed: Optional[Embed] = None,
embeds: Optional[List[Embed]] = None,
embeds: Optional[list[Embed]] = None,
file: Optional[File] = None,
files: Optional[List[File]] = None,
files: Optional[list[File]] = None,
stickers: Optional[Sequence[Union[GuildSticker, StandardSticker, StickerItem]]] = None,
delete_after: Optional[float] = None,
nonce: Optional[Union[str, int]] = None,
Expand Down Expand Up @@ -2034,10 +2030,10 @@ class Connectable(Protocol):
guild: Guild
id: int

def _get_voice_client_key(self) -> Tuple[int, str]:
def _get_voice_client_key(self) -> tuple[int, str]:
raise NotImplementedError

def _get_voice_state_pair(self) -> Tuple[int, int]:
def _get_voice_state_pair(self) -> tuple[int, int]:
raise NotImplementedError

async def connect(
Expand Down
22 changes: 11 additions & 11 deletions disnake/activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from __future__ import annotations

import datetime
from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Union, overload
from typing import TYPE_CHECKING, Any, Literal, Optional, Union, overload

from .asset import Asset
from .colour import Colour
Expand Down Expand Up @@ -37,7 +37,7 @@
small_text: str (max: 128)
party: dict
id: str (max: 128),
size: List[int] (max-length: 2)
size: list[int] (max-length: 2)
elem: int (min: 1)
secrets: dict
match: str (max: 128)
Expand Down Expand Up @@ -289,7 +289,7 @@ class Activity(BaseActivity):
.. versionadded:: 2.0

.. versionchanged:: 2.6
Changed type to ``List[str]`` to match API types.
Changed type to ``list[str]`` to match API types.

emoji: :class:`PartialEmoji` | :data:`None`
The emoji that belongs to this activity.
Expand Down Expand Up @@ -340,7 +340,7 @@ def __init__(
party: Optional[ActivityParty] = None,
application_id: Optional[Union[str, int]] = None,
flags: Optional[int] = None,
buttons: Optional[List[str]] = None,
buttons: Optional[list[str]] = None,
emoji: Optional[Union[PartialEmojiPayload, ActivityEmojiPayload]] = None,
id: Optional[str] = None,
platform: Optional[str] = None,
Expand All @@ -361,7 +361,7 @@ def __init__(
self.name: Optional[str] = name
self.url: Optional[str] = url
self.flags: int = flags or 0
self.buttons: List[str] = buttons or []
self.buttons: list[str] = buttons or []

# undocumented fields:
self.id: Optional[str] = id
Expand Down Expand Up @@ -399,8 +399,8 @@ def __repr__(self) -> str:
inner = " ".join(f"{k!s}={v!r}" for k, v in attrs)
return f"<Activity {inner}>"

def to_dict(self) -> Dict[str, Any]:
ret: Dict[str, Any] = {}
def to_dict(self) -> dict[str, Any]:
ret: dict[str, Any] = {}
for attr in self.__slots__:
value = getattr(self, attr, None)
if value is None:
Expand Down Expand Up @@ -609,8 +609,8 @@ def twitch_name(self) -> Optional[str]:
name = self.assets["large_image"]
return name[7:] if name[:7] == "twitch:" else None

def to_dict(self) -> Dict[str, Any]:
ret: Dict[str, Any] = {
def to_dict(self) -> dict[str, Any]:
ret: dict[str, Any] = {
"type": ActivityType.streaming.value,
"name": str(self.name),
"url": str(self.url),
Expand Down Expand Up @@ -701,7 +701,7 @@ def color(self) -> Colour:
"""
return self.colour

def to_dict(self) -> Dict[str, Any]:
def to_dict(self) -> dict[str, Any]:
return {
"flags": 48, # SYNC | PLAY
"name": "Spotify",
Expand Down Expand Up @@ -745,7 +745,7 @@ def title(self) -> str:
return self._details

@property
def artists(self) -> List[str]:
def artists(self) -> list[str]:
""":class:`list`\\[:class:`str`]: The artists of the song being played."""
return self._state.split("; ")

Expand Down
Loading