todo/cli.py
riley ed0cb5ebc6 Refactor for CLI
General:
+ Improved documentation
cli.py:
+ added basic CLI, will likely be rewritten later.
TodoObject:
~ improved type-hinting for get_children
+ added get_parents method
+ moved get_md method from Todo
+ added get_* methods to get Tasks, Categories, and Notes from children
+ added property has_children
Todo:
~ changed string output to "File: {self.data_file.name}"
- moved get_md method to TodoObject
+ added write_data method
Task:
- removed get_* methods
+ added task_category method to get parent category.
+ added toggle_complete method.
- removed __add__ method.
Note:
- removed get_* methods.
- removed __add__ method.
Category:
- removed get_* methods.
- removed __add__ method.
2021-09-28 00:20:20 -04:00

78 lines
2.9 KiB
Python
Executable file

#!/bin/python3
import argparse
import re
from todo.TodoObject import TodoObject
from todo import Todo, Category, Task
parser = argparse.ArgumentParser("Todo.md CLI Application", description="Access your todos via the command line!")
parser.add_argument("-md", "--markdown", action="store_true", help="Show markdown.")
parser.add_argument("-cat", "--category", action="store", help="Category the command should target.")
parser.add_argument("-t", "--task", action="store", help="Target a specific task in a category.")
parser.add_argument("-i", "--info", action="store_true", help="Print information about the given object.")
parser.add_argument("-x", "--complete", action="store_true", help="Toggle a task's completed status.") # x = done, right?
todo = Todo()
args = parser.parse_args()
def print_incomplete_tasks(data: TodoObject):
if len(data.get_tasks(complete=False)) > 0:
print("\n--- Incomplete Task(s) ---")
for category in [data, *data.get_categories()]: # allows us to catch tasks in subcategories and the main data object.
if len(category.get_tasks(immediate=False, complete=False)) > 0:
print(f"\n{category}")
for task in category.get_tasks(immediate=True, complete=False):
print(task)
if task.has_children:
print(task.get_md())
data = todo # start with base todo object as input data.
# --category handler
if args.category is not None:
args.category = f".*{args.category}"
data = data.get_category(args.category)
# --task handler
if args.task is not None:
for i in data.get_tasks():
if re.match(args.task, i.text, re.IGNORECASE):
data = i
# --done handler
if args.complete:
if isinstance(data, Task):
data.toggle_complete()
print(f"Set complete status for '{data.text}' to '{data.complete}'.")
todo.write_data()
else:
print("-d is only applicable to tasks.")
## --markdown handler
if args.markdown:
print(data)
print(data.get_md())
## --info handler
if args.info:
task_count = len(data.get_tasks())
incomplete_count = len(data.get_tasks(complete=False))
if isinstance(data, Todo):
print(data)
print("Categories: ", ", ".join([x.text for x in data.get_children(obj_type=Category)]))
print(f"Tasks: \n\tTotal: {task_count}\n\tIncomplete: {incomplete_count}")
print_incomplete_tasks(data)
elif isinstance(data, Category):
print("Category:", data.text)
print(f"Tasks: \n\tTotal: {task_count}\n\tIncomplete: {incomplete_count}")
print_incomplete_tasks(data)
elif isinstance(data, Task):
print("Category: ", data.task_category().text)
print("Task:", data.text)
print("Due Date:", data.date.strftime("%b %d %Y"))
print("Complete:", data.complete)
else:
print("Don't know how we ended up here. :/")