2018-02-24 17:43:29 +01:00
|
|
|
import sys
|
2014-04-27 05:31:13 +02:00
|
|
|
import os
|
|
|
|
import shutil
|
|
|
|
|
2016-07-19 13:37:18 +02:00
|
|
|
from cheat import sheets
|
2016-10-12 22:16:26 +02:00
|
|
|
from cheat.utils import die, open_with_editor
|
2014-04-27 05:31:13 +02:00
|
|
|
|
|
|
|
def copy(current_sheet_path, new_sheet_path):
|
|
|
|
""" Copies a sheet to a new path """
|
|
|
|
|
|
|
|
# attempt to copy the sheet to DEFAULT_CHEAT_DIR
|
|
|
|
try:
|
|
|
|
shutil.copy(current_sheet_path, new_sheet_path)
|
|
|
|
|
|
|
|
# fail gracefully if the cheatsheet cannot be copied. This can happen if
|
|
|
|
# DEFAULT_CHEAT_DIR does not exist
|
|
|
|
except IOError:
|
2016-07-19 13:37:18 +02:00
|
|
|
die('Could not copy cheatsheet for editing.')
|
2014-04-27 05:31:13 +02:00
|
|
|
|
|
|
|
|
|
|
|
def create_or_edit(sheet):
|
|
|
|
""" Creates or edits a cheatsheet """
|
|
|
|
|
|
|
|
# if the cheatsheet does not exist
|
|
|
|
if not exists(sheet):
|
|
|
|
create(sheet)
|
|
|
|
|
2015-02-12 03:02:45 +01:00
|
|
|
# if the cheatsheet exists but not in the default_path, copy it to the
|
|
|
|
# default path before editing
|
|
|
|
elif exists(sheet) and not exists_in_default_path(sheet):
|
2015-02-11 01:35:14 +01:00
|
|
|
copy(path(sheet), os.path.join(sheets.default_path(), sheet))
|
|
|
|
edit(sheet)
|
2014-04-27 05:31:13 +02:00
|
|
|
|
2015-02-12 03:45:32 +01:00
|
|
|
# if it exists and is in the default path, then just open it
|
|
|
|
else:
|
|
|
|
edit(sheet)
|
|
|
|
|
2014-04-27 05:31:13 +02:00
|
|
|
|
|
|
|
def create(sheet):
|
|
|
|
""" Creates a cheatsheet """
|
|
|
|
new_sheet_path = os.path.join(sheets.default_path(), sheet)
|
2016-10-12 22:16:26 +02:00
|
|
|
open_with_editor(new_sheet_path)
|
2014-04-27 05:31:13 +02:00
|
|
|
|
|
|
|
|
|
|
|
def edit(sheet):
|
|
|
|
""" Opens a cheatsheet for editing """
|
2016-10-12 22:16:26 +02:00
|
|
|
open_with_editor(path(sheet))
|
2014-04-27 05:31:13 +02:00
|
|
|
|
|
|
|
|
|
|
|
def exists(sheet):
|
|
|
|
""" Predicate that returns true if the sheet exists """
|
|
|
|
return sheet in sheets.get() and os.access(path(sheet), os.R_OK)
|
|
|
|
|
|
|
|
|
2015-02-12 03:02:45 +01:00
|
|
|
def exists_in_default_path(sheet):
|
|
|
|
""" Predicate that returns true if the sheet exists in default_path"""
|
|
|
|
default_path_sheet = os.path.join(sheets.default_path(), sheet)
|
|
|
|
return sheet in sheets.get() and os.access(default_path_sheet, os.R_OK)
|
|
|
|
|
|
|
|
|
2014-04-27 05:31:13 +02:00
|
|
|
def is_writable(sheet):
|
|
|
|
""" Predicate that returns true if the sheet is writeable """
|
|
|
|
return sheet in sheets.get() and os.access(path(sheet), os.W_OK)
|
|
|
|
|
|
|
|
|
|
|
|
def path(sheet):
|
|
|
|
""" Returns a sheet's filesystem path """
|
|
|
|
return sheets.get()[sheet]
|
|
|
|
|
|
|
|
|
|
|
|
def read(sheet):
|
|
|
|
""" Returns the contents of the cheatsheet as a String """
|
|
|
|
if not exists(sheet):
|
2018-02-24 17:43:29 +01:00
|
|
|
die('\033[1;31mNo\033[0m cheatsheet found for \033[1;31m' + sheet + '\033[0m')
|
2014-04-27 05:31:13 +02:00
|
|
|
|
2016-07-19 13:37:18 +02:00
|
|
|
with open(path(sheet)) as cheatfile:
|
|
|
|
return cheatfile.read()
|
2018-02-24 17:43:29 +01:00
|
|
|
|
|
|
|
def remove(sheet, default="yes"):
|
|
|
|
"""Ask a yes/no/quit sheet via raw_input() and return their answer.
|
|
|
|
|
|
|
|
"sheet" is a string that is presented to the user.
|
|
|
|
"default" is the presumed answer if the user just hits <Enter>.
|
|
|
|
It must be "yes" (the default), "no", "quit" or None (meaning
|
|
|
|
an answer is required of the user).
|
|
|
|
The "answer" return value is one of "yes", "no" or "quit".
|
|
|
|
"""
|
|
|
|
|
|
|
|
if not exists(sheet):
|
|
|
|
die('\033[1;31mNo\033[0m cheatsheet found for \033[1;31m' + sheet + '\033[0m')
|
|
|
|
|
|
|
|
sheet = sheets.get()[sheet]
|
|
|
|
|
|
|
|
valid = {"yes":"yes", "y":"yes", "ye":"yes",
|
|
|
|
"no":"no", "n":"no",
|
|
|
|
"quit":"quit", "qui":"quit", "qu":"quit", "q":"quit"}
|
|
|
|
if default == None:
|
|
|
|
prompt = " [y/n/q] "
|
|
|
|
elif default == "yes":
|
|
|
|
prompt = " [Y/n/q] "
|
|
|
|
elif default == "no":
|
|
|
|
prompt = " [y/N/q] "
|
|
|
|
elif default == "quit":
|
|
|
|
prompt = " [y/n/Q] "
|
|
|
|
else:
|
|
|
|
raise ValueError("invalid default answer: '%s'" % default)
|
|
|
|
while 1:
|
|
|
|
sys.stdout.write(sheet + prompt)
|
|
|
|
choice = input().lower()
|
|
|
|
if default is not None and choice == '':
|
|
|
|
print("Delete\033[1;31m %s \033[0mfile " % sheet)
|
|
|
|
os.remove(sheet)
|
|
|
|
return default
|
|
|
|
elif choice in valid.keys():
|
|
|
|
print("Delete\033[1;31m %s \033[0mfile " % sheet)
|
|
|
|
os.remove(sheet)
|
|
|
|
return valid[choice]
|
|
|
|
else:
|
|
|
|
sys.stdout.write("Please respond with 'yes', 'no' or 'quit'.\n")
|
|
|
|
|
|
|
|
|
|
|
|
|