Skip to content

Commit c29cdc2

Browse files
committed
♻️ move SnowflakeList to private.py
1 parent c6f7914 commit c29cdc2

File tree

4 files changed

+44
-45
lines changed

4 files changed

+44
-45
lines changed

discord/emoji.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
from .asset import Asset, AssetMixin
3131
from .partial_emoji import PartialEmoji, _EmojiTag
3232
from .user import User
33-
from .utils import MISSING, SnowflakeList, Undefined, snowflake_time
33+
from .utils import MISSING, Undefined, snowflake_time
34+
from .utils.private import SnowflakeList
3435

3536
__all__ = (
3637
"Emoji",

discord/member.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from typing import TYPE_CHECKING, Any, TypeVar, Union
3434

3535
import discord.abc
36-
from .utils.private import parse_time
36+
3737

3838
from . import utils
3939
from .activity import ActivityTypes, create_activity
@@ -45,6 +45,7 @@
4545
from .permissions import Permissions
4646
from .user import BaseUser, User, _UserTag
4747
from .utils import MISSING
48+
from .utils.private import parse_time, SnowflakeList
4849

4950
__all__ = (
5051
"VoiceState",
@@ -312,7 +313,7 @@ def __init__(self, *, data: MemberWithUserPayload, guild: Guild, state: Connecti
312313
self.guild: Guild = guild
313314
self.joined_at: datetime.datetime | None = parse_time(data.get("joined_at"))
314315
self.premium_since: datetime.datetime | None = parse_time(data.get("premium_since"))
315-
self._roles: utils.SnowflakeList = utils.SnowflakeList(map(int, data["roles"]))
316+
self._roles: SnowflakeList = SnowflakeList(map(int, data["roles"]))
316317
self._client_status: dict[str | None, str] = {None: "offline"}
317318
self.activities: tuple[ActivityTypes, ...] = ()
318319
self.nick: str | None = data.get("nick", None)
@@ -362,7 +363,7 @@ def _from_message(cls: type[M], *, message: Message, data: MemberPayload) -> M:
362363
def _update_from_message(self, data: MemberPayload) -> None:
363364
self.joined_at = parse_time(data.get("joined_at"))
364365
self.premium_since = parse_time(data.get("premium_since"))
365-
self._roles = utils.SnowflakeList(map(int, data["roles"]))
366+
self._roles = SnowflakeList(map(int, data["roles"]))
366367
self.nick = data.get("nick", None)
367368
self.pending = data.get("pending", False)
368369

@@ -387,7 +388,7 @@ def _try_upgrade(
387388
def _copy(cls: type[M], member: M) -> M:
388389
self: M = cls.__new__(cls) # to bypass __init__
389390

390-
self._roles = utils.SnowflakeList(member._roles, is_sorted=True)
391+
self._roles = SnowflakeList(member._roles, is_sorted=True)
391392
self.joined_at = member.joined_at
392393
self.premium_since = member.premium_since
393394
self._client_status = member._client_status.copy()
@@ -424,7 +425,7 @@ def _update(self, data: MemberPayload) -> None:
424425
pass
425426

426427
self.premium_since = parse_time(data.get("premium_since"))
427-
self._roles = utils.SnowflakeList(map(int, data["roles"]))
428+
self._roles = SnowflakeList(map(int, data["roles"]))
428429
self._avatar = data.get("avatar")
429430
self._banner = data.get("banner")
430431
self.communication_disabled_until = parse_time(data.get("communication_disabled_until"))

discord/utils/__init__.py

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,8 @@
2525

2626
from __future__ import annotations
2727

28-
import array
2928
import collections.abc
30-
import datetime
3129
import json
32-
import re
33-
from bisect import bisect_left
3430
from inspect import signature as _signature
3531
from typing import (
3632
TYPE_CHECKING,
@@ -40,7 +36,6 @@
4036
Generic,
4137
Iterable,
4238
Iterator,
43-
Literal,
4439
Mapping,
4540
Protocol,
4641
Sequence,
@@ -322,37 +317,3 @@ def get_slots(cls: type[Any]) -> Iterator[str]:
322317
yield from mro.__slots__
323318
except AttributeError:
324319
continue
325-
326-
327-
class SnowflakeList(array.array):
328-
"""Internal data storage class to efficiently store a list of snowflakes.
329-
330-
This should have the following characteristics:
331-
332-
- Low memory usage
333-
- O(n) iteration (obviously)
334-
- O(n log n) initial creation if data is unsorted
335-
- O(log n) search and indexing
336-
- O(n) insertion
337-
"""
338-
339-
__slots__ = ()
340-
341-
if TYPE_CHECKING:
342-
343-
def __init__(self, data: Iterable[int], *, is_sorted: bool = False): ...
344-
345-
def __new__(cls, data: Iterable[int], *, is_sorted: bool = False):
346-
return array.array.__new__(cls, "Q", data if is_sorted else sorted(data)) # type: ignore
347-
348-
def add(self, element: int) -> None:
349-
i = bisect_left(self, element)
350-
self.insert(i, element)
351-
352-
def get(self, element: int) -> int | None:
353-
i = bisect_left(self, element)
354-
return self[i] if i != len(self) and self[i] == element else None
355-
356-
def has(self, element: int) -> bool:
357-
i = bisect_left(self, element)
358-
return i != len(self) and self[i] == element

discord/utils/private.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import array
34
import asyncio
45
import datetime
56
import functools
@@ -8,6 +9,7 @@
89
import types
910
import unicodedata
1011
import warnings
12+
from _bisect import bisect_left
1113
from base64 import b64encode
1214
from inspect import isawaitable
1315
from typing import (
@@ -411,3 +413,37 @@ async def sane_wait_for(futures: Iterable[Awaitable[T]], *, timeout: float) -> s
411413
raise asyncio.TimeoutError()
412414

413415
return done
416+
417+
418+
class SnowflakeList(array.array):
419+
"""Internal data storage class to efficiently store a list of snowflakes.
420+
421+
This should have the following characteristics:
422+
423+
- Low memory usage
424+
- O(n) iteration (obviously)
425+
- O(n log n) initial creation if data is unsorted
426+
- O(log n) search and indexing
427+
- O(n) insertion
428+
"""
429+
430+
__slots__ = ()
431+
432+
if TYPE_CHECKING:
433+
434+
def __init__(self, data: Iterable[int], *, is_sorted: bool = False): ...
435+
436+
def __new__(cls, data: Iterable[int], *, is_sorted: bool = False):
437+
return array.array.__new__(cls, "Q", data if is_sorted else sorted(data)) # type: ignore
438+
439+
def add(self, element: int) -> None:
440+
i = bisect_left(self, element)
441+
self.insert(i, element)
442+
443+
def get(self, element: int) -> int | None:
444+
i = bisect_left(self, element)
445+
return self[i] if i != len(self) and self[i] == element else None
446+
447+
def has(self, element: int) -> bool:
448+
i = bisect_left(self, element)
449+
return i != len(self) and self[i] == element

0 commit comments

Comments
 (0)