Skip to content

Instantly share code, notes, and snippets.

@harendra21
Created January 6, 2022 05:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save harendra21/bed66a86eefb55227ade71fdaf41867c to your computer and use it in GitHub Desktop.
Save harendra21/bed66a86eefb55227ade71fdaf41867c to your computer and use it in GitHub Desktop.
import click
@click.group()
@click.pass_context
def todo(ctx):
'''Simple CLI Todo App'''
ctx.ensure_object(dict)
#Open todo.txt – first line contains latest ID, rest contain tasks and IDs
with open('./todo.txt') as f:
content = f.readlines()
#Transfer data from todo.txt to the context
ctx.obj['LATEST'] = int(content[:1][0])
ctx.obj['TASKS'] = {en.split('```')[0]:en.split('```')[1][:-1] for en in content[1:]}
@todo.command()
@click.pass_context
def tasks(ctx):
'''Display tasks'''
if ctx.obj['TASKS']:
click.echo('YOUR TASKS\n**********')
#Iterate through all the tasks stored in the context
for i, task in ctx.obj['TASKS'].items():
click.echo('• ' + task + ' (ID: ' + i + ')')
click.echo('')
else:
click.echo('No tasks yet! Use ADD to add one.\n')
@todo.command()
@click.pass_context
@click.option('-add', '--add_task', prompt='Enter task to add')
def add(ctx, add_task):
'''Add a task'''
if add_task:
#Add task to list in context
ctx.obj['TASKS'][ctx.obj['LATEST']] = add_task
click.echo('Added task "' + add_task + '" with ID ' + str(ctx.obj['LATEST']))
#Open todo.txt and write current index and tasks with IDs (separated by " ``` ")
curr_ind = [str(ctx.obj['LATEST'] + 1)]
tasks = [str(i) + '```' + t for (i, t) in ctx.obj['TASKS'].items()]
with open('./todo.txt', 'w') as f:
f.writelines(['%s\n' % en for en in curr_ind + tasks])
@todo.command()
@click.pass_context
@click.option('-fin', '--fin_taskid', prompt='Enter ID of task to finish', type=int)
def done(ctx, fin_taskid):
'''Delete a task by ID'''
#Find task with associated ID
if str(fin_taskid) in ctx.obj['TASKS'].keys():
task = ctx.obj['TASKS'][str(fin_taskid)]
#Delete task from task list in context
del ctx.obj['TASKS'][str(fin_taskid)]
click.echo('Finished and removed task "' + task + '" with id ' + str(fin_taskid))
#Open todo.txt and write current index and tasks with IDs (separated by " ``` ")
if ctx.obj['TASKS']:
curr_ind = [str(ctx.obj['LATEST'] + 1)]
tasks = [str(i) + '```' + t for (i, t) in ctx.obj['TASKS'].items()]
with open('./todo.txt', 'w') as f:
f.writelines(['%s\n' % en for en in curr_ind + tasks])
else:
#Resets ID tracker to 0 if list is empty
with open('./todo.txt', 'w') as f:
f.writelines([str(0) + '\n'])
else:
click.echo('Error: no task with id ' + str(fin_taskid))
if __name__ == '__main__':
todo()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment