Source code for jacinle.cli.keyboard
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# File : keyboard.py
# Author : Jiayuan Mao
# Email : maojiayuan@gmail.com
# Date : 01/18/2018
#
# This file is part of Jacinle.
# Distributed under terms of the MIT license.
"""Uiltity functions to parse keyboard inputs."""
import os
import sys
import os.path as osp
from typing import Optional
__all__ = ['str2bool', 'yn2bool', 'str2bool_long', 'yes_or_no', 'maybe_mkdir']
[docs]
def str2bool(s: str) -> bool:
"""Convert a string to boolean value.
Args:
s: the string to be converted.
Returns:
True if the string is "yes", "true", "y", "t", "1";
False if the string is "no", "false", "n", "f", "0";
otherwise, raise ValueError.
"""
if s.lower() in ('yes', 'true', 't', 'y', '1'):
return True
elif s.lower() in ('no', 'false', 'f', 'n', '0'):
return False
else:
raise ValueError('str2bool is undefined for: "{}".'.format(s))
[docs]
def yn2bool(s: str) -> bool:
"""Convert a string to boolean value.
Args:
s: the string to be converted.
Returns:
True if the string is "y" or "yes";
False if the string is "n" or "no";
otherwise, raise ValueError.
"""
if s.lower() in ('yes', 'y'):
return True
elif s.lower() in ('no', 'n'):
return False
else:
raise ValueError('yn2bool is undefined for: "{}".'.format(s))
[docs]
def str2bool_long(s: str) -> bool:
"""Convert a string to boolean value.
Args:
s: the string to be converted.
Returns:
True if the string is "yes", "true";
False if the string is "no", "false";
otherwise, raise ValueError.
"""
if s.lower() in ('yes', 'true'):
return True
elif s.lower() in ('no', 'false'):
return False
else:
raise ValueError('str2bool_long is undefined for: "{}".'.format(s))
[docs]
def yes_or_no(question: str, default: Optional[str] = "yes") -> bool:
"""Ask a yes/no question via input() and return their answer.
Args:
question: the question to be asked.
default: the default answer. It must be "yes" (the default), "no" or None (meaning that an answer is required from the user).
"""
valid = {
"yes": True, "y": True, "ye": True,
"no": False, "n": False,
"default": None, "def": None, "d": None
}
quiet = os.getenv('JAC_QUIET', '')
if quiet != '':
quiet = quiet.lower()
assert quiet in valid, 'Invalid JAC_QUIET environ: {}.'.format(quiet)
choice = valid[quiet]
sys.stdout.write('Jacinle Quiet run:\n\tQuestion: {}\n\tChoice: {}\n'.format(question, 'Default' if choice is None else 'Yes' if choice else 'No'))
return choice if choice is not None else default
if default is None:
prompt = " [y/n] "
elif default == "yes":
prompt = " [Y/n] "
elif default == "no":
prompt = " [y/N] "
else:
raise ValueError("Invalid default answer: '%s'." % default)
while True:
sys.stdout.write(question + prompt)
choice = input().lower()
if default is not None and choice == '':
return valid[default]
elif choice in valid:
return valid[choice]
else:
sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n")
[docs]
def maybe_mkdir(dirname):
"""Make a directory if it does not exist.
Args:
dirname: the directory to be created.
"""
if osp.isdir(dirname):
return
if osp.isfile(dirname):
return
import jacinle.io as io
if yes_or_no('Creating directory "{}"?'.format(dirname)):
io.mkdir(dirname)