Fix string issues related to switch to python3
safe_str is no longer relevant after unicode strings are no longer explicit string types. Popen takes bytes by default now, not strings, which is fixed by setting an encoding sys.stdout.write should work with strings on linux at least. We only use it for the buy menu timeout, which already only works on linux, so it shouldn't be a problem.
This commit is contained in:
parent
0ea9042820
commit
1675f26080
12
helpers.py
12
helpers.py
|
@ -113,14 +113,6 @@ def argmax(d, all=False, value=None):
|
|||
return [k for k in list(d.keys()) if d[k] == d[maxarg]]
|
||||
return maxarg
|
||||
|
||||
def safe_str(obj):
|
||||
'''
|
||||
Ugly hack to avoid Python complaining about encodings.
|
||||
|
||||
Call this on any object to turn it into a string which is
|
||||
(hopefully) safe for printing.
|
||||
'''
|
||||
return obj
|
||||
|
||||
def less(string):
|
||||
'''
|
||||
|
@ -131,6 +123,6 @@ def less(string):
|
|||
int_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
|
||||
env = dict(os.environ)
|
||||
env['LESSSECURE'] = '1'
|
||||
proc = subprocess.Popen('less', env=env, stdin=subprocess.PIPE)
|
||||
proc.communicate(safe_str(string))
|
||||
proc = subprocess.Popen('less', env=env, encoding='utf-8', stdin=subprocess.PIPE)
|
||||
proc.communicate(string)
|
||||
signal.signal(signal.SIGINT, int_handler)
|
||||
|
|
|
@ -160,6 +160,10 @@ When finished, write an empty line to confirm the purchase.\n'''
|
|||
print(f'USER {t.user.name} HAS LOWER CREDIT THAN {conf.low_credit_warning_limit:d},',
|
||||
'AND SHOULD CONSIDER PUTTING SOME MONEY IN THE BOX.')
|
||||
|
||||
# Superfast mode skips a linebreak for some reason. This looks ugly.
|
||||
# TODO: Figure out why this happens, and fix it in a less hacky way.
|
||||
if self.superfast_mode:
|
||||
print("")
|
||||
return True
|
||||
|
||||
def complete_input(self):
|
||||
|
|
|
@ -9,7 +9,7 @@ from select import select
|
|||
|
||||
import conf
|
||||
from db import User, Session
|
||||
from helpers import search_user, search_product, safe_str, guess_data_type, argmax
|
||||
from helpers import search_user, search_product, guess_data_type, argmax
|
||||
from text_interface import context_commands, local_help_commands, help_commands, \
|
||||
exit_commands
|
||||
|
||||
|
@ -118,11 +118,9 @@ class Menu(object):
|
|||
return result
|
||||
while True:
|
||||
try:
|
||||
# result = None
|
||||
# It is replaced either way
|
||||
if timeout:
|
||||
# assuming line buffering
|
||||
sys.stdout.write(safe_str(prompt))
|
||||
sys.stdout.write(prompt)
|
||||
sys.stdout.flush()
|
||||
rlist, _, _ = select([sys.stdin], [], [], timeout)
|
||||
if not rlist:
|
||||
|
@ -131,7 +129,7 @@ class Menu(object):
|
|||
else:
|
||||
result = input().strip()
|
||||
else:
|
||||
result = input(safe_str(prompt)).strip()
|
||||
result = input(prompt).strip()
|
||||
except EOFError:
|
||||
print('quit')
|
||||
self.exit_menu()
|
||||
|
@ -207,6 +205,7 @@ class Menu(object):
|
|||
print('Please enter a valid choice.')
|
||||
|
||||
def input_int(self, prompt=None, allowed_range=(None, None), null_allowed=False, default=None):
|
||||
# TODO: Proper default handling
|
||||
if prompt is None:
|
||||
prompt = self.prompt
|
||||
while True:
|
||||
|
|
Loading…
Reference in New Issue