change Hostmask __init__, move tokenisation to Hostmask.from_source(

This commit is contained in:
jesopo 2020-03-15 19:46:33 +00:00
parent 17b5fb124d
commit 572c1e9b98
2 changed files with 22 additions and 14 deletions

View File

@ -17,15 +17,17 @@ def _escape_tag(value: str):
return value
class Hostmask(object):
def __init__(self, source: str):
self._raw = source
username, _, hostname = source.partition("@")
self.nickname, _, username = username.partition("!")
self.username = username or None
self.hostname = hostname or None
def __init__(self, source: str,
nickname: str,
username: Optional[str],
hostname: Optional[str]):
self._source = source
self.nickname = nickname
self.username = username
self.hostname = hostname
def __str__(self) -> str:
return self._raw
return self._source
def __repr__(self) -> str:
return (f"Hostmask(nick={self.nickname!r}, user={self.username!r}"
f", host={self.hostname!r})")
@ -35,6 +37,12 @@ class Hostmask(object):
else:
return False
@staticmethod
def from_source(source: str):
username, _, hostname = source.partition("@")
nickname, _, username = username.partition("!")
return Hostmask(source, nickname, username or None, hostname or None)
class Line(object):
def __init__(self,
tags: Optional[Dict[str, Optional[str]]]=None,
@ -58,8 +66,8 @@ class Line(object):
_hostmask: Optional[Hostmask] = None
@property
def hostmask(self):
if self.source:
self._hostmask = self._hostmask or Hostmask(self.source)
if self.source and not self._hostmask:
self._hostmask = Hostmask.from_source(self.source)
return self._hostmask
def format(self) -> str:

View File

@ -3,32 +3,32 @@ import irctokens
class HostmaskTest(unittest.TestCase):
def test_all(self):
hostmask = irctokens.Hostmask("nick!user@host")
hostmask = irctokens.Hostmask.from_source("nick!user@host")
self.assertEqual(hostmask.nickname, "nick")
self.assertEqual(hostmask.username, "user")
self.assertEqual(hostmask.hostname, "host")
def test_no_hostname(self):
hostmask = irctokens.Hostmask("nick!user")
hostmask = irctokens.Hostmask.from_source("nick!user")
self.assertEqual(hostmask.nickname, "nick")
self.assertEqual(hostmask.username, "user")
self.assertIsNone(hostmask.hostname)
def test_no_ident(self):
hostmask = irctokens.Hostmask("nick@host")
hostmask = irctokens.Hostmask.from_source("nick@host")
self.assertEqual(hostmask.nickname, "nick")
self.assertIsNone(hostmask.username)
self.assertEqual(hostmask.hostname, "host")
def test_only_nickname(self):
hostmask = irctokens.Hostmask("nick")
hostmask = irctokens.Hostmask.from_source("nick")
self.assertEqual(hostmask.nickname, "nick")
self.assertIsNone(hostmask.username)
self.assertIsNone(hostmask.hostname)
def test_line(self):
line = irctokens.tokenise(":nick!user@host PRIVMSG #channel hello")
hostmask = irctokens.Hostmask("nick!user@host")
hostmask = irctokens.Hostmask.from_source("nick!user@host")
self.assertEqual(line.hostmask, hostmask)
self.assertEqual(line.hostmask.nickname, "nick")
self.assertEqual(line.hostmask.username, "user")