aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar ToxicKidz <[email protected]>2022-02-13 14:32:50 -0500
committerGravatar ToxicKidz <[email protected]>2022-02-13 14:32:50 -0500
commitafdb2b4d5ebeda20d90e794711ca7e56244cfd6b (patch)
treea49414038338879a309698d35c4721570d8e3c83
parenttests: Add a test for timeit command codeblock preparation (diff)
docs: Document the timeit setup wrapper
-rw-r--r--bot/exts/utils/snekbox.py13
1 files changed, 11 insertions, 2 deletions
diff --git a/bot/exts/utils/snekbox.py b/bot/exts/utils/snekbox.py
index a932b96ff..3c1009d2a 100644
--- a/bot/exts/utils/snekbox.py
+++ b/bot/exts/utils/snekbox.py
@@ -31,26 +31,35 @@ from collections import deque
if not hasattr(sys, "_setup_finished"):
class Writer(deque):
+ '''A single-item deque wrapper for sys.stdout that will return the last line when read() is called.'''
+
def __init__(self):
super().__init__(maxlen=1)
def write(self, string):
+ '''Append the line to the queue if it is not empty.'''
if string.strip():
self.append(string)
def read(self):
+ '''This method will be called when print() is called.
+
+ The queue is emptied as we don't need the output later.
+ '''
return self.pop()
def flush(self):
+ '''This method will be called eventually, but we don't need to do anything here.'''
pass
sys.stdout = Writer()
def print_last_line():
- if sys.stdout:
+ if sys.stdout: # If the deque is empty (i.e. an error happened), calling read() will raise an error
+ # Use sys.__stdout__ here because sys.stdout is set to a Writer() instance
print(sys.stdout.read(), file=sys.__stdout__)
- atexit.register(print_last_line)
+ atexit.register(print_last_line) # When exiting, print the last line (hopefully it will be the timeit output)
sys._setup_finished = None
{setup}
"""