Browse Source

More __slots__ where it counts

pull/6/head
Andrei 9 years ago
parent
commit
da95141b8f
  1. 6
      disco/gateway/events.py
  2. 5
      disco/state.py
  3. 15
      disco/types/base.py
  4. 16
      disco/types/channel.py
  5. 41
      disco/types/guild.py
  6. 4
      disco/types/invite.py
  7. 8
      disco/types/message.py
  8. 16
      disco/types/user.py
  9. 16
      disco/types/voice.py

6
disco/gateway/events.py

@ -92,6 +92,7 @@ def wraps_model(model, alias=None):
def deco(cls): def deco(cls):
cls._fields[alias] = Field(model) cls._fields[alias] = Field(model)
cls._fields[alias].set_name(alias) cls._fields[alias].set_name(alias)
cls.__slots__ = cls.__slots__ + (alias, )
cls._wraps_model = (alias, model) cls._wraps_model = (alias, model)
return cls return cls
return deco return deco
@ -247,11 +248,12 @@ class GuildRoleUpdate(GuildRoleCreate):
pass pass
class GuildRoleDelete(GuildRoleCreate): class GuildRoleDelete(GatewayEvent):
""" """
Sent when a role is deleted. Sent when a role is deleted.
""" """
pass guild_id = Field(snowflake)
role_id = Field(snowflake)
@wraps_model(Message) @wraps_model(Message)

5
disco/state.py

@ -276,7 +276,10 @@ class State(object):
if event.guild_id not in self.guilds: if event.guild_id not in self.guilds:
return return
del self.guilds[event.guild_id].roles[event.role.id] if event.role_id not in self.guilds[event.guild_id].roles:
return
del self.guilds[event.guild_id].roles[event.role_id]
def on_presence_update(self, event): def on_presence_update(self, event):
if event.user.id in self.users: if event.user.id in self.users:

15
disco/types/base.py

@ -5,6 +5,8 @@ import functools
from holster.enum import BaseEnumMeta from holster.enum import BaseEnumMeta
from datetime import datetime as real_datetime from datetime import datetime as real_datetime
from disco.util.functional import CachedSlotProperty
DATETIME_FORMATS = [ DATETIME_FORMATS = [
'%Y-%m-%dT%H:%M:%S.%f', '%Y-%m-%dT%H:%M:%S.%f',
'%Y-%m-%dT%H:%M:%S' '%Y-%m-%dT%H:%M:%S'
@ -24,6 +26,8 @@ class FieldType(object):
self.typ = typ self.typ = typ
elif isinstance(typ, BaseEnumMeta): elif isinstance(typ, BaseEnumMeta):
self.typ = lambda raw, _: typ.get(raw) self.typ = lambda raw, _: typ.get(raw)
elif typ is None:
self.typ = lambda x, y: None
else: else:
self.typ = lambda raw, _: typ(raw) self.typ = lambda raw, _: typ(raw)
@ -192,11 +196,12 @@ class ModelMeta(type):
dct = {k: v for k, v in six.iteritems(dct) if k not in fields} dct = {k: v for k, v in six.iteritems(dct) if k not in fields}
if SlottedModel in parents and '__slots__' not in dct: if SlottedModel and any(map(lambda k: issubclass(k, SlottedModel), parents)):
dct['__slots__'] = tuple(fields.keys()) bases = set(k for k, v in six.iteritems(dct) if isinstance(v, CachedSlotProperty))
elif '__slots__' in dct and Model in parents and SlottedModel: if '__slots__' in dct:
dct['__slots__'] = tuple(dct['__slots__']) dct['__slots__'] = tuple(set(dct['__slots__']) | set(fields.keys()) | bases)
parents = tuple([SlottedModel] + [i for i in parents if i != Model]) else:
dct['__slots__'] = tuple(fields.keys()) + tuple(bases)
dct['_fields'] = fields dct['_fields'] = fields
return super(ModelMeta, cls).__new__(cls, name, parents, dct) return super(ModelMeta, cls).__new__(cls, name, parents, dct)

16
disco/types/channel.py

@ -5,7 +5,7 @@ from holster.enum import Enum
from disco.util.snowflake import to_snowflake from disco.util.snowflake import to_snowflake
from disco.util.functional import cached_property, one_or_many, chunks from disco.util.functional import cached_property, one_or_many, chunks
from disco.types.user import User from disco.types.user import User
from disco.types.base import Model, Field, snowflake, enum, listof, dictof, text from disco.types.base import SlottedModel, Field, snowflake, enum, listof, dictof, text
from disco.types.permissions import Permissions, Permissible, PermissionValue from disco.types.permissions import Permissions, Permissible, PermissionValue
from disco.voice.client import VoiceClient from disco.voice.client import VoiceClient
@ -23,7 +23,15 @@ PermissionOverwriteType = Enum(
) )
class PermissionOverwrite(Model): class ChannelSubType(SlottedModel):
channel_id = Field(None)
@cached_property
def channel(self):
return self.client.state.channels.get(self.channel_id)
class PermissionOverwrite(ChannelSubType):
""" """
A PermissionOverwrite for a :class:`Channel` A PermissionOverwrite for a :class:`Channel`
@ -39,8 +47,6 @@ class PermissionOverwrite(Model):
denied : :class:`PermissionValue` denied : :class:`PermissionValue`
All denied permissions All denied permissions
""" """
__slots__ = ['id', 'type', 'allow', 'deny', 'channel', 'channel_id']
id = Field(snowflake) id = Field(snowflake)
type = Field(enum(PermissionOverwriteType)) type = Field(enum(PermissionOverwriteType))
allow = Field(PermissionValue) allow = Field(PermissionValue)
@ -53,7 +59,7 @@ class PermissionOverwrite(Model):
return self.channel.delete_overwrite(self) return self.channel.delete_overwrite(self)
class Channel(Model, Permissible): class Channel(SlottedModel, Permissible):
""" """
Represents a Discord Channel Represents a Discord Channel

41
disco/types/guild.py

@ -6,7 +6,7 @@ from disco.gateway.packets import OPCode
from disco.api.http import APIException from disco.api.http import APIException
from disco.util.snowflake import to_snowflake from disco.util.snowflake import to_snowflake
from disco.util.functional import cached_property from disco.util.functional import cached_property
from disco.types.base import Model, Field, snowflake, listof, dictof, lazy_datetime, text, binary, enum from disco.types.base import SlottedModel, Field, snowflake, listof, dictof, lazy_datetime, text, binary, enum
from disco.types.user import User from disco.types.user import User
from disco.types.voice import VoiceState from disco.types.voice import VoiceState
from disco.types.channel import Channel from disco.types.channel import Channel
@ -22,7 +22,15 @@ VerificationLevel = Enum(
) )
class Emoji(Model): class GuildSubType(SlottedModel):
guild_id = Field(None)
@cached_property
def guild(self):
return self.client.state.guilds.get(self.guild_id)
class Emoji(GuildSubType):
""" """
An emoji object An emoji object
@ -39,8 +47,6 @@ class Emoji(Model):
roles : list(snowflake) roles : list(snowflake)
Roles this emoji is attached to. Roles this emoji is attached to.
""" """
__slots__ = ['id', 'name', 'require_colons', 'managed', 'roles', 'guild', 'guild_id']
id = Field(snowflake) id = Field(snowflake)
name = Field(text) name = Field(text)
require_colons = Field(bool) require_colons = Field(bool)
@ -48,7 +54,7 @@ class Emoji(Model):
roles = Field(listof(snowflake)) roles = Field(listof(snowflake))
class Role(Model): class Role(GuildSubType):
""" """
A role object A role object
@ -69,11 +75,6 @@ class Role(Model):
position : int position : int
The position of this role in the hierarchy. The position of this role in the hierarchy.
""" """
__slots__ = [
'id', 'name', 'hoist', 'managed', 'color', 'permissions', 'position', 'mentionable',
'guild', 'guild_id'
]
id = Field(snowflake) id = Field(snowflake)
name = Field(text) name = Field(text)
hoist = Field(bool) hoist = Field(bool)
@ -90,12 +91,8 @@ class Role(Model):
def mention(self): def mention(self):
return '<@{}>'.format(self.id) return '<@{}>'.format(self.id)
@cached_property
def guild(self):
return self.client.state.guilds.get(self.id)
class GuildMember(Model): class GuildMember(GuildSubType):
""" """
A GuildMember object A GuildMember object
@ -116,10 +113,6 @@ class GuildMember(Model):
roles : list(snowflake) roles : list(snowflake)
Roles this member is part of. Roles this member is part of.
""" """
__slots__ = [
'user', 'guild_id', 'nick', 'mute', 'deaf', 'joined_at', 'roles', 'guild'
]
user = Field(User) user = Field(User)
guild_id = Field(snowflake) guild_id = Field(snowflake)
nick = Field(text) nick = Field(text)
@ -170,21 +163,17 @@ class GuildMember(Model):
roles = self.roles + [role.id] roles = self.roles + [role.id]
self.client.api.guilds_members_modify(self.guild.id, self.user.id, roles=roles) self.client.api.guilds_members_modify(self.guild.id, self.user.id, roles=roles)
@property @cached_property
def owner(self): def owner(self):
return self.guild.owner_id == self.id return self.guild.owner_id == self.id
@property @cached_property
def mention(self): def mention(self):
if self.nick: if self.nick:
return '<@!{}>'.format(self.id) return '<@!{}>'.format(self.id)
return self.user.mention return self.user.mention
@cached_property @cached_property
def guild(self):
return self.client.state.guilds.get(self.guild_id)
@property
def id(self): def id(self):
""" """
Alias to the guild members user id Alias to the guild members user id
@ -192,7 +181,7 @@ class GuildMember(Model):
return self.user.id return self.user.id
class Guild(Model, Permissible): class Guild(SlottedModel, Permissible):
""" """
A guild object A guild object

4
disco/types/invite.py

@ -1,10 +1,10 @@
from disco.types.base import Model, Field, lazy_datetime from disco.types.base import SlottedModel, Field, lazy_datetime
from disco.types.user import User from disco.types.user import User
from disco.types.guild import Guild from disco.types.guild import Guild
from disco.types.channel import Channel from disco.types.channel import Channel
class Invite(Model): class Invite(SlottedModel):
""" """
An invite object An invite object

8
disco/types/message.py

@ -2,7 +2,7 @@ import re
from holster.enum import Enum from holster.enum import Enum
from disco.types.base import Model, Field, snowflake, text, lazy_datetime, dictof, listof, enum from disco.types.base import SlottedModel, Field, snowflake, text, lazy_datetime, dictof, listof, enum
from disco.util.snowflake import to_snowflake from disco.util.snowflake import to_snowflake
from disco.util.functional import cached_property from disco.util.functional import cached_property
from disco.types.user import User from disco.types.user import User
@ -19,7 +19,7 @@ MessageType = Enum(
) )
class MessageEmbed(Model): class MessageEmbed(SlottedModel):
""" """
Message embed object Message embed object
@ -40,7 +40,7 @@ class MessageEmbed(Model):
url = Field(str) url = Field(str)
class MessageAttachment(Model): class MessageAttachment(SlottedModel):
""" """
Message attachment object Message attachment object
@ -70,7 +70,7 @@ class MessageAttachment(Model):
width = Field(int) width = Field(int)
class Message(Model): class Message(SlottedModel):
""" """
Represents a Message created within a Channel on Discord. Represents a Message created within a Channel on Discord.

16
disco/types/user.py

@ -1,11 +1,9 @@
from holster.enum import Enum from holster.enum import Enum
from disco.types.base import Model, Field, snowflake, text, binary, with_equality, with_hash from disco.types.base import SlottedModel, Field, snowflake, text, binary, with_equality, with_hash
class User(Model, with_equality('id'), with_hash('id')): class User(SlottedModel, with_equality('id'), with_hash('id')):
__slots__ = ['id', 'username', 'discriminator', 'avatar', 'verified', 'email', 'presence']
id = Field(snowflake) id = Field(snowflake)
username = Field(text) username = Field(text)
discriminator = Field(str) discriminator = Field(str)
@ -13,7 +11,7 @@ class User(Model, with_equality('id'), with_hash('id')):
verified = Field(bool) verified = Field(bool)
email = Field(str) email = Field(str)
presence = None presence = Field(None)
@property @property
def mention(self): def mention(self):
@ -43,17 +41,13 @@ Status = Enum(
) )
class Game(Model): class Game(SlottedModel):
__slots__ = ['type', 'name', 'url']
type = Field(GameType) type = Field(GameType)
name = Field(text) name = Field(text)
url = Field(text) url = Field(text)
class Presence(Model): class Presence(SlottedModel):
__slots__ = ['user', 'game', 'status']
user = Field(User) user = Field(User)
game = Field(Game) game = Field(Game)
status = Field(Status) status = Field(Status)

16
disco/types/voice.py

@ -1,7 +1,8 @@
from disco.types.base import Model, Field, snowflake from disco.types.base import SlottedModel, Field, snowflake
from disco.util.functional import cached_property
class VoiceState(Model): class VoiceState(SlottedModel):
session_id = Field(str) session_id = Field(str)
guild_id = Field(snowflake) guild_id = Field(snowflake)
channel_id = Field(snowflake) channel_id = Field(snowflake)
@ -12,19 +13,14 @@ class VoiceState(Model):
self_mute = Field(bool) self_mute = Field(bool)
suppress = Field(bool) suppress = Field(bool)
__slots__ = [ @cached_property
'session_id', 'guild_id', 'channel_id', 'user_id', 'deaf', 'mute', 'self_deaf',
'self_mute', 'suppress'
]
@property
def guild(self): def guild(self):
return self.client.state.guilds.get(self.guild_id) return self.client.state.guilds.get(self.guild_id)
@property @cached_property
def channel(self): def channel(self):
return self.client.state.channels.get(self.channel_id) return self.client.state.channels.get(self.channel_id)
@property @cached_property
def user(self): def user(self):
return self.client.state.users.get(self.user_id) return self.client.state.users.get(self.user_id)

Loading…
Cancel
Save