5 changed files with 95 additions and 49 deletions
@ -0,0 +1,57 @@ |
|||||
|
import six |
||||
|
import unicodedata |
||||
|
|
||||
|
from disco.types.message import Sendable |
||||
|
|
||||
|
|
||||
|
class MessageTable(Sendable): |
||||
|
def __init__(self, sep=' | ', codeblock=True, header_break=True, language=None): |
||||
|
self.header = [] |
||||
|
self.entries = [] |
||||
|
self.size_index = {} |
||||
|
self.sep = sep |
||||
|
self.codeblock = codeblock |
||||
|
self.header_break = header_break |
||||
|
self.language = language |
||||
|
|
||||
|
def recalculate_size_index(self, cols): |
||||
|
for idx, col in enumerate(cols): |
||||
|
size = len(unicodedata.normalize('NFC', col)) |
||||
|
if idx not in self.size_index or size > self.size_index[idx]: |
||||
|
self.size_index[idx] = size |
||||
|
|
||||
|
def set_header(self, *args): |
||||
|
args = list(map(six.text_type, args)) |
||||
|
self.header = args |
||||
|
self.recalculate_size_index(args) |
||||
|
|
||||
|
def add(self, *args): |
||||
|
args = list(map(six.text_type, args)) |
||||
|
self.entries.append(args) |
||||
|
self.recalculate_size_index(args) |
||||
|
|
||||
|
def compile_one(self, cols): |
||||
|
data = self.sep.lstrip() |
||||
|
|
||||
|
for idx, col in enumerate(cols): |
||||
|
padding = ' ' * (self.size_index[idx] - len(col)) |
||||
|
data += col + padding + self.sep |
||||
|
|
||||
|
return data.rstrip() |
||||
|
|
||||
|
def compile(self): |
||||
|
data = [] |
||||
|
if self.header: |
||||
|
data = [self.compile_one(self.header)] |
||||
|
|
||||
|
if self.header and self.header_break: |
||||
|
data.append('-' * (sum(self.size_index.values()) + (len(self.header) * len(self.sep)) + 1)) |
||||
|
|
||||
|
for row in self.entries: |
||||
|
data.append(self.compile_one(row)) |
||||
|
|
||||
|
if self.codeblock: |
||||
|
return self.fit((self.lanague if self.language else '') + '\n'.join(data)) |
||||
|
|
||||
|
# TODO: truncate by line |
||||
|
return self.truncate('\n'.join(data), tail='') |
@ -1,5 +1,5 @@ |
|||||
gevent==1.2.2 |
gevent==1.2.2 |
||||
holster==1.0.15 |
holster==1.0.15 |
||||
requests==2.13.0 |
requests==2.18.1 |
||||
six==1.10.0 |
six==1.10.0 |
||||
websocket-client==0.40.0 |
websocket-client==0.44.0 |
||||
|
@ -0,0 +1,17 @@ |
|||||
|
from unittest import TestCase |
||||
|
|
||||
|
from disco.types.message import Sendable |
||||
|
|
||||
|
|
||||
|
class TestSendable(TestCase): |
||||
|
def test_sendable_truncate(self): |
||||
|
self.assertEqual(Sendable.truncate('*' * 2001), ('*' * 1997) + '...') |
||||
|
self.assertEqual(Sendable.truncate('*' * 1999), '*' * 1999) |
||||
|
self.assertEqual(Sendable.truncate(u'\U0001F947' * 20), u'\U0001F947' * 20) |
||||
|
self.assertEqual(Sendable.truncate(u'\U0001F947' * 3000, tail=''), u'\U0001F947' * 2000) |
||||
|
|
||||
|
def test_sendable_fit(self): |
||||
|
self.assertEqual(Sendable.fit('*' * 3000), '```{}```'.format('*' * 1994)) |
||||
|
self.assertEqual(Sendable.fit('test'), '```test```') |
||||
|
self.assertEqual(Sendable.fit('test', '`', '`'), '`test`') |
||||
|
self.assertEqual(Sendable.fit(u'\U0001F947'), u'```\U0001F947```') |
Loading…
Reference in new issue