From 5525fb812e0afc1dffb6c57995d8d3edc9cf9524 Mon Sep 17 00:00:00 2001 From: "Patrick M. Covert" Date: Sat, 11 May 2024 10:31:07 -0400 Subject: [PATCH 1/3] tests --- PYTHON APPS/CLI-Based-TODO/task.py | 70 ++++++++++++++------------ PYTHON APPS/CLI-Based-TODO/time,os,sys | 0 file.txt | 0 3 files changed, 37 insertions(+), 33 deletions(-) mode change 100644 => 100755 PYTHON APPS/CLI-Based-TODO/task.py create mode 100644 PYTHON APPS/CLI-Based-TODO/time,os,sys create mode 100644 file.txt diff --git a/PYTHON APPS/CLI-Based-TODO/task.py b/PYTHON APPS/CLI-Based-TODO/task.py old mode 100644 new mode 100755 index aff9a122..c9b189ca --- a/PYTHON APPS/CLI-Based-TODO/task.py +++ b/PYTHON APPS/CLI-Based-TODO/task.py @@ -1,41 +1,44 @@ -import time,os,sys +#!/usr/bin/env python3 +import sys +from argparse import ArgumentParser as aparse usage = "Usage :-\n$ ./task add 2 'hello world' # Add a new item with priority 2 and text \"hello world\" to the list\n$ ./task ls # Show incomplete priority list items sorted by priority in ascending order\n$ ./task del INDEX # Delete the incomplete item with the given index\n$ ./task done INDEX # Mark the incomplete item with the given index as complete\n$ ./task help # Show usage\n$ ./task report # Statistics ( list complete/incomplete task )" -def func(): - try: - - # printing help - if sys.argv[1]=="help": - print(usage) - return usage +def create_parser(): + parser = aparse(description="""Command Line task list""") + parser.add_argument("toDo", default="ls", choices=['usage', 'ls', 'add', 'del', 'done', 'report'], help="Enter command: usage, ls, add, del, done, report.") + parser.add_argument("-p", required=False, help="item priority") + parser.add_argument("-i", required=False, help="List item to add, remove, or mark done.") +def func(): + args = create_parser().parse_args() + # lisiting all the task - if sys.argv[1]=="ls": - try: - f = open("path/to/plans/task.txt",'r') - data = f.read() - datalist = data.split("\n") - datalist = sorted(datalist) - datalist = datalist[1:] - # print(datalist) - for i in range(len(datalist)): - print(f"{i+1}. {datalist[i][2:]} [{datalist[i][0:1]}]") + if args.toDo == "ls": + try: + f = open("path/to/plans/task.txt",'r') + data = f.read() + datalist = data.split("\n") + datalist = sorted(datalist) + datalist = datalist[1:] + # print(datalist) + for i in range(len(datalist)): + print(f"{i+1}. {datalist[i][2:]} [{datalist[i][0:1]}]") - except: - print("Error: Missing file") + except: + print("Error: Missing file") - # adding the task - if sys.argv[1]=="add": - try: - with open("path/to/plans/task.txt",'a',encoding = 'utf-8') as f: - res = f.write(f"{sys.argv[2]} {sys.argv[3]}\n") - except: - print("Error: Missing tasks string. Nothing added!") - else: - print(f"Added task: \"{sys.argv[3]}\" with priority {sys.argv[2]}") + # adding the task + if args.toDo == "add": + try: + with open("path/to/plans/task.txt",'a',encoding = 'utf-8') as f: + res = f.write(f"{sys.argv[2]} {sys.argv[3]}\n") + except: + print("Error: Missing tasks string. Nothing added!") + else: + print(f"Added task: \"{sys.argv[3]}\" with priority {sys.argv[2]}") @@ -110,8 +113,9 @@ def func(): except: print("Error: Missing file") - except: - print(usage) - return usage.encode('utf8') + # except: + # print(usage) + # return usage.encode('utf8') -func() \ No newline at end of file +if __name__ == "__main__": + func() \ No newline at end of file diff --git a/PYTHON APPS/CLI-Based-TODO/time,os,sys b/PYTHON APPS/CLI-Based-TODO/time,os,sys new file mode 100644 index 00000000..e69de29b diff --git a/file.txt b/file.txt new file mode 100644 index 00000000..e69de29b From e4e885f298e52bc4c83408edd97dfa46be60f4b7 Mon Sep 17 00:00:00 2001 From: "Patrick M. Covert" Date: Mon, 13 May 2024 11:58:05 -0400 Subject: [PATCH 2/3] tested and working --- PYTHON APPS/CLI-Based-TODO/completed.txt | 2 + PYTHON APPS/CLI-Based-TODO/task.py | 226 +++++++++++++---------- PYTHON APPS/CLI-Based-TODO/task.txt | 1 + 3 files changed, 128 insertions(+), 101 deletions(-) create mode 100644 PYTHON APPS/CLI-Based-TODO/completed.txt create mode 100644 PYTHON APPS/CLI-Based-TODO/task.txt diff --git a/PYTHON APPS/CLI-Based-TODO/completed.txt b/PYTHON APPS/CLI-Based-TODO/completed.txt new file mode 100644 index 00000000..378597d3 --- /dev/null +++ b/PYTHON APPS/CLI-Based-TODO/completed.txt @@ -0,0 +1,2 @@ +paint the fence +shave the cat diff --git a/PYTHON APPS/CLI-Based-TODO/task.py b/PYTHON APPS/CLI-Based-TODO/task.py index c9b189ca..07cacb4c 100755 --- a/PYTHON APPS/CLI-Based-TODO/task.py +++ b/PYTHON APPS/CLI-Based-TODO/task.py @@ -1,121 +1,145 @@ #!/usr/bin/env python3 -import sys +# Python todo list + +import os from argparse import ArgumentParser as aparse -usage = "Usage :-\n$ ./task add 2 'hello world' # Add a new item with priority 2 and text \"hello world\" to the list\n$ ./task ls # Show incomplete priority list items sorted by priority in ascending order\n$ ./task del INDEX # Delete the incomplete item with the given index\n$ ./task done INDEX # Mark the incomplete item with the given index as complete\n$ ./task help # Show usage\n$ ./task report # Statistics ( list complete/incomplete task )" +# change the path of the files here to the actual desired paths +taskTxt = "task.txt" +completedTxt = "completed.txt" def create_parser(): parser = aparse(description="""Command Line task list""") parser.add_argument("toDo", default="ls", choices=['usage', 'ls', 'add', 'del', 'done', 'report'], help="Enter command: usage, ls, add, del, done, report.") - parser.add_argument("-p", required=False, help="item priority") - parser.add_argument("-i", required=False, help="List item to add, remove, or mark done.") + parser.add_argument("-p", required=False, type=int, help="item priority") + parser.add_argument("-i", required=False, type=str, help="List item to add, remove, or mark done.") + return parser def func(): args = create_parser().parse_args() - - # lisiting all the task - if args.toDo == "ls": - try: - f = open("path/to/plans/task.txt",'r') - data = f.read() - datalist = data.split("\n") - datalist = sorted(datalist) - datalist = datalist[1:] - # print(datalist) - for i in range(len(datalist)): - print(f"{i+1}. {datalist[i][2:]} [{datalist[i][0:1]}]") - - except: - print("Error: Missing file") + # check if files exist, create if not + if not os.path.exists(taskTxt): + with open(taskTxt, "w") as filet: + pass + if not os.path.exists(completedTxt): + with open(completedTxt, "w") as filec: + pass + + if args.toDo == "ls": + lister(read_list()) # adding the task if args.toDo == "add": - try: - with open("path/to/plans/task.txt",'a',encoding = 'utf-8') as f: - res = f.write(f"{sys.argv[2]} {sys.argv[3]}\n") - except: - print("Error: Missing tasks string. Nothing added!") + if args.i == '' or args.p == '': + raise ValueError('An item and priority must be entered') + taskList = read_list() + taskList.insert((args.p - 1), args.i) + with open(taskTxt, "w") as f: + for line in taskList: + f.write(line + "\n") + + + # deleting the task + if args.toDo == "del": + if args.i == '' or args.p == '': + raise ValueError('An item or priority must be entered') + taskList = read_list() + if args.p: + index = args.p - 1 + delete_item(index, taskList) else: - print(f"Added task: \"{sys.argv[3]}\" with priority {sys.argv[2]}") - - - - # deleting the task - if sys.argv[1]=="del": - lineno = int(sys.argv[2]) try: - with open("path/to/plans/task.txt","r+") as f: - new_f = f.readlines() - new_f = sorted(new_f) - # print(new_f) - del_f = new_f.pop(lineno-1) - # print(new_f) - - f.seek(0) - for line in new_f: - if del_f not in line: - f.write(line) - f.truncate() - except: - print(f"Error: item with index {lineno} does not exist. Nothing deleted.") - - - - # marking done - if sys.argv[1]=="done": - lineno = int(sys.argv[2]) - try: - with open("path/to/plans/task.txt","r+") as f: - new_f = f.readlines() - new_f = sorted(new_f) - # print(new_f) - del_f = new_f.pop(lineno-1) - # print(new_f) - - f.seek(0) - for line in new_f: - if del_f not in line: - f.write(line) - with open("path/to/plans/completed.txt","a") as r: - r.write(del_f) - f.truncate() - - - - except: - print(f"Error: no incomplete item with index #0 exists.") - else: - print(f"Marked item as done.") - - - # generating the report - if sys.argv[1]=="report": + index = taskList.index(args.i) + delete_item(index, taskList) + exit(0) + except(ValueError): + print(f"Item {args.i} not found. Maybe run ls and try again?") + exit(0) + + # marking done + if args.toDo == "done": + if args.i == '' or args.p == '': + raise ValueError('An item or priority must be entered') + taskList = read_list() + if args.p: + index = args.p - 1 + do_item(index, taskList) + else: try: - task = open("path/to/plans/task.txt",'r') - data = task.read() - datalist = data.split("\n") - datalist = sorted(datalist) - datalist = datalist[1:] - print(f"Pending : {len(datalist)}") - for i in range(len(datalist)): - print(f"{i+1}. {datalist[i][2:]} [{datalist[i][0:1]}]") - - compt = open("path/to/plans/completed.txt",'r') - data = compt.read() - datalist = data.split("\n") - datalist = sorted(datalist) - datalist = datalist[1:] - print(f"Completed : {len(datalist)}") - for i in range(len(datalist)): - print(f"{i+1}. {datalist[i][2:]} [{datalist[i][0:1]}]") - except: - print("Error: Missing file") - - # except: - # print(usage) - # return usage.encode('utf8') + index = taskList.index(args.i) + do_item(index, taskList) + exit(0) + except(ValueError): + print(f"Item {args.i} not found. Maybe run ls and try again?") + exit(0) + + # generating the report + if args.toDo == "report": + print("\n") + print("To do:") + lister(read_list()) + print("\n") + print("Done:") + lister(read_complete()) + +def read_list(): + with open(taskTxt, "r") as file: + task_list = file.readlines() + # all the newlines added during file writing must be removed otherwise printing is messed up + strip_list = [] + for item in task_list: + strip_list.append(item.strip()) + filtered_list = [item for item in strip_list if item != ""] + return filtered_list + +def read_complete(): + with open(completedTxt, "r") as file: + completed_list = file.readlines() + # all the newlines added during file writing must be removed otherwise printing is messed up + strip_list = [] + for item in completed_list: + strip_list.append(item.strip()) + filtered_list = [item for item in strip_list if item != ""] + return filtered_list + +def delete_item(index, taskList): + print("\n") + print(f"Do you want to delete {taskList[index]}?") + answer = input("Enter y or n: ") + if answer == "y": + taskList.pop(index) + with open(taskTxt, "w") as f: + for line in taskList: + f.write(line + "\n") + print("Item Deleted") + exit(0) + print("No item deleted") + exit(0) + +def do_item(index, taskList): + print("\n") + print(f"Do you want to move {taskList[index]} to done?") + answer = input("Enter y or n: ") + if answer == "y": + task = taskList.pop(index) + with open(taskTxt, "w") as f: + for line in taskList: + f.write(line + "\n") + completed = read_complete() + completed.append(task) + with open(completedTxt, "w") as f: + for line in completed: + f.write(line + "\n") + print("Item marked done") + exit(0) + print("No item changed") + exit(0) + +def lister(items): + for item, line in enumerate(items, 1): + print(f"{item}: {line.strip()}") if __name__ == "__main__": - func() \ No newline at end of file + func() diff --git a/PYTHON APPS/CLI-Based-TODO/task.txt b/PYTHON APPS/CLI-Based-TODO/task.txt new file mode 100644 index 00000000..ebbf0ea9 --- /dev/null +++ b/PYTHON APPS/CLI-Based-TODO/task.txt @@ -0,0 +1 @@ +take a shower From 9a9136bc90eb91c85e774e68a154a37ccb468140 Mon Sep 17 00:00:00 2001 From: "Patrick M. Covert" Date: Mon, 13 May 2024 11:58:51 -0400 Subject: [PATCH 3/3] removing test files --- PYTHON APPS/CLI-Based-TODO/completed.txt | 2 -- PYTHON APPS/CLI-Based-TODO/task.txt | 1 - 2 files changed, 3 deletions(-) delete mode 100644 PYTHON APPS/CLI-Based-TODO/completed.txt delete mode 100644 PYTHON APPS/CLI-Based-TODO/task.txt diff --git a/PYTHON APPS/CLI-Based-TODO/completed.txt b/PYTHON APPS/CLI-Based-TODO/completed.txt deleted file mode 100644 index 378597d3..00000000 --- a/PYTHON APPS/CLI-Based-TODO/completed.txt +++ /dev/null @@ -1,2 +0,0 @@ -paint the fence -shave the cat diff --git a/PYTHON APPS/CLI-Based-TODO/task.txt b/PYTHON APPS/CLI-Based-TODO/task.txt deleted file mode 100644 index ebbf0ea9..00000000 --- a/PYTHON APPS/CLI-Based-TODO/task.txt +++ /dev/null @@ -1 +0,0 @@ -take a shower