Source code for pymap.parsing.response.code
from __future__ import annotations
from collections.abc import Iterable, Sequence
from . import ResponseCode
from ..primitives import List
from ..specials import SequenceSet, ObjectId
from ...bytes import MaybeBytes, BytesFormat
__all__ = ['Capability', 'PermanentFlags', 'UidNext', 'UidValidity', 'Unseen',
'AppendUid', 'CopyUid', 'MailboxId']
[docs]
class Capability(ResponseCode):
"""Lists the capabilities the server advertises to the client.
Args:
server_capabilities: The list of capabilities to advertise.
"""
def __init__(self, server_capabilities: Iterable[MaybeBytes]) -> None:
super().__init__()
self.capabilities = [bytes(cap) for cap in server_capabilities]
self._raw: bytes | None = None
def __contains__(self, capability: MaybeBytes) -> bool:
return capability in self.capabilities
@property
def string(self) -> bytes:
"""The capabilities string without the enclosing square brackets."""
if self._raw is not None:
return self._raw
self._raw = raw = BytesFormat(b' ').join(
[b'CAPABILITY', b'IMAP4rev1'] + self.capabilities)
return raw
def __bytes__(self) -> bytes:
return BytesFormat(b'[%b]') % self.string
[docs]
class PermanentFlags(ResponseCode):
"""Indicates the permanent flags available in a mailbox.
Args:
flags: The flags to return.
"""
def __init__(self, flags: Iterable[MaybeBytes]) -> None:
super().__init__()
self.flags: Sequence[MaybeBytes] = list(flags)
self._raw = BytesFormat(b'[PERMANENTFLAGS %b]') \
% List(self.flags, sort=True)
def __bytes__(self) -> bytes:
return self._raw
[docs]
class UidNext(ResponseCode):
"""Indicates the next unique identifier value of the mailbox.
Args:
next_: The next available message UID.
"""
def __init__(self, next_: int) -> None:
super().__init__()
self._raw = b'[UIDNEXT %i]' % next_
def __bytes__(self) -> bytes:
return self._raw
[docs]
class UidValidity(ResponseCode):
"""Indicates the mailbox unique identifier validity value.
Args:
validity: The UID validity value.
"""
def __init__(self, validity: int) -> None:
super().__init__()
self.validity = validity
self._raw = b'[UIDVALIDITY %i]' % validity
def __bytes__(self) -> bytes:
return self._raw
[docs]
class Unseen(ResponseCode):
"""Indicates the message sequence ID of the first message without the
``\\Seen`` flag.
Args:
next_: The sequence ID of the message.
"""
def __init__(self, next_: int) -> None:
super().__init__()
self._raw = b'[UNSEEN %i]' % next_
def __bytes__(self) -> bytes:
return self._raw
[docs]
class AppendUid(ResponseCode):
"""Indicates the newly assigned UIDs and UIDVALIDITY of messages appended
to a mailbox.
Args:
validity: The UID validity value.
uids: The UIDs of the appended messages.
See Also:
`RFC 4315 3. <https://tools.ietf.org/html/rfc4315#section-3>`_
"""
def __init__(self, validity: int, uids: Iterable[int]) -> None:
super().__init__()
self.validity = validity
self.uids = frozenset(uids)
self._raw = BytesFormat(b'[APPENDUID %i %b]') \
% (validity, SequenceSet.build(self.uids))
def __bytes__(self) -> bytes:
return self._raw
[docs]
class CopyUid(ResponseCode):
"""Indicates the original and newly assigned UIDs and UIDVALIDITY of
messages appended to the mailbox.
Args:
validity: The UID validity value.
uids: The pairs of source UID mapped to destination UID.
See Also:
`RFC 4315 3. <https://tools.ietf.org/html/rfc4315#section-3>`_
"""
def __init__(self, validity: int, uids: Iterable[tuple[int, int]]) -> None:
super().__init__()
source_uids, dest_uids = zip(*uids, strict=True)
source_uid_set = SequenceSet.build(source_uids)
dest_uid_set = SequenceSet.build(dest_uids)
self._raw = b'[COPYUID %i %b %b]' \
% (validity, bytes(source_uid_set), bytes(dest_uid_set))
def __bytes__(self) -> bytes:
return self._raw
[docs]
class MailboxId(ResponseCode):
"""Indicates the mailbox ID, which can be used to correlate mailboxes
between renames.
Args:
object_id: The mailbox ID bytestring.
See Also:
`RFC 8474 4.1. <https://tools.ietf.org/html/rfc8474#section-4.1>`_,
`RFC 8474 4.2. <https://tools.ietf.org/html/rfc8474#section-4.2>`_
"""
def __init__(self, object_id: ObjectId) -> None:
super().__init__()
self._raw = BytesFormat(b'[MAILBOXID %b]') % (object_id.parens, )
def __bytes__(self) -> bytes:
return self._raw