/
ui.py
178 lines (138 loc) · 4.99 KB
/
ui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
################################################################################
# Imports
import sys
import database
from data_report import DataReport
################################################################################
# Globals
PROGRAM_NAME = 'Homework Hacker'
PROGRAM_CMD = 'hwhack'
VERSION = 'Dev'
COMMAND_LIST = ['database', 'edit', 'help', 'list', 'new']
COMMAND_DESCRIPTION = {
'database': 'Manage the database file',
'edit': 'Edit an Assignment',
'help': 'Print all available commands',
'list': 'List all Assignments',
'new': 'Create a new Assignment'
}
PROMPT = '\U0001F4DA $ '
INDENT = ' ' * 4
################################################################################
# Generic Functions
def safe_input(prompt: str=''):
try:
return input(prompt)
except (KeyboardInterrupt, EOFError): # User aborted
print()
sys.exit(0)
################################################################################
# Primary Functions
def print_help(synopsis: bool, end: str = ''):
result = ''
if synopsis:
result += 'SYNOPSIS:\n {} [command]\n\n'.format(PROGRAM_CMD)
result += 'COMMANDS:\n'
for cmd in COMMAND_LIST:
result += ' {} - {}\n'.format(cmd, COMMAND_DESCRIPTION[cmd])
result = result[:-1] # strip last newline
result += end
print(result)
def print_greeting(synopsis: bool = True, end: str = ''):
title = '{} (v. {})'.format(PROGRAM_NAME, VERSION)
print('{}\n{}'.format(title, '~' * len(title)))
print_help(synopsis, end)
def check_database(verbose: bool) -> (dict, bool):
db_data = database.load()
if not db_data:
prompted = True
print('Database file could not be located at {}'
.format(database.DB_FILENAME))
if safe_input('Would you like to create a new one? (y/n) ').lower() == 'y':
database.save_new()
return (database.DEFAULT_DB, True)
return ({}, True)
elif verbose:
print('Database file located: {}'
.format(database.DB_FILENAME))
print(db_data)
return (db_data, False)
def prompt_edit():
pass
def print_list():
db_data = database.load()
print(DataReport(
[('Title', 'title'), ('Course', 'course'), ('Due Date', 'due_date')],
db_data['assignments']).ascii_table())
def prompt_new():
db_data, prompted = check_database(verbose = False)
if db_data:
if prompted:
print('')
print('NEW ASSIGNMENT:')
# Prompt title
title = safe_input(INDENT + 'Title: ')
# Prompt course
course_set = set()
for assignment in db_data['assignments']:
course_set.add(assignment['course'])
course_list = sorted(course_set)
print(INDENT + 'Course', end='')
for i, course in enumerate(course_list):
if i == 0:
print('')
print('{}[{}] {}'.format(INDENT * 2, i+1, course))
course = safe_input('{}: '.format(INDENT if course_list else ''))
globbed = False
try:
index = int(course)
assert 1 <= index <= len(course_list)
course = course_list[index-1]
globbed = True
except (ValueError, AssertionError) as e:
pass
# Prompt due date
due_date = safe_input(INDENT + 'Due Date: ')
# Confirm
if globbed and db_data['settings']['confirmOnGlob']:
print('\nCONFIRM:\n{0}Title: {1}\n{0}Course: {2}\n{0}Due Date: {3}\n'
.format(INDENT, title, course, due_date))
if safe_input('(y/n) ').lower() != 'y':
return
# Save
db_data['assignments'].append(
{'title': title, 'course': course, 'due_date': due_date})
database.save(db_data)
def print_unknown(cmd: str):
print('{}: Unknown command: '.format(PROGRAM_NAME), end='')
if type(cmd) == type(""): # str
print('{}'.format(cmd))
elif type(cmd) == type([]): # list
print(*cmd, sep=' ')
def parse_args(argv: [str]):
if not argv:
launch_interactive()
elif len(argv) == 1:
if argv[0] == 'database':
check_database(verbose=True)
elif argv[0] == 'edit':
prompt_edit()
elif argv[0] == 'help':
print_greeting()
elif argv[0] == 'list':
print_list()
elif argv[0] == 'new':
prompt_new()
else:
print_unknown(argv[0])
else:
print_unknown(argv)
def launch_interactive():
print_greeting(False)
while True:
user_input = safe_input('\n' + PROMPT)
parse_args(user_input.split())
################################################################################
# Main
if __name__ == '__main__':
parse_args([x.lower() for x in sys.argv[1:]])