Skip to content

Commit e4e885f

Browse files
committed
tested and working
1 parent 5525fb8 commit e4e885f

File tree

3 files changed

+128
-101
lines changed

3 files changed

+128
-101
lines changed
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
paint the fence
2+
shave the cat

PYTHON APPS/CLI-Based-TODO/task.py

+125-101
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,145 @@
11
#!/usr/bin/env python3
2-
import sys
2+
# Python todo list
3+
4+
import os
35
from argparse import ArgumentParser as aparse
46

5-
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 )"
7+
# change the path of the files here to the actual desired paths
8+
taskTxt = "task.txt"
9+
completedTxt = "completed.txt"
610

711
def create_parser():
812
parser = aparse(description="""Command Line task list""")
913
parser.add_argument("toDo", default="ls", choices=['usage', 'ls', 'add', 'del', 'done', 'report'], help="Enter command: usage, ls, add, del, done, report.")
10-
parser.add_argument("-p", required=False, help="item priority")
11-
parser.add_argument("-i", required=False, help="List item to add, remove, or mark done.")
14+
parser.add_argument("-p", required=False, type=int, help="item priority")
15+
parser.add_argument("-i", required=False, type=str, help="List item to add, remove, or mark done.")
16+
return parser
1217

1318
def func():
1419
args = create_parser().parse_args()
15-
16-
# lisiting all the task
17-
if args.toDo == "ls":
18-
try:
19-
f = open("path/to/plans/task.txt",'r')
20-
data = f.read()
21-
datalist = data.split("\n")
22-
datalist = sorted(datalist)
23-
datalist = datalist[1:]
24-
# print(datalist)
25-
for i in range(len(datalist)):
26-
print(f"{i+1}. {datalist[i][2:]} [{datalist[i][0:1]}]")
27-
28-
except:
29-
print("Error: Missing file")
3020

21+
# check if files exist, create if not
22+
if not os.path.exists(taskTxt):
23+
with open(taskTxt, "w") as filet:
24+
pass
3125

26+
if not os.path.exists(completedTxt):
27+
with open(completedTxt, "w") as filec:
28+
pass
29+
30+
if args.toDo == "ls":
31+
lister(read_list())
3232

3333
# adding the task
3434
if args.toDo == "add":
35-
try:
36-
with open("path/to/plans/task.txt",'a',encoding = 'utf-8') as f:
37-
res = f.write(f"{sys.argv[2]} {sys.argv[3]}\n")
38-
except:
39-
print("Error: Missing tasks string. Nothing added!")
35+
if args.i == '' or args.p == '':
36+
raise ValueError('An item and priority must be entered')
37+
taskList = read_list()
38+
taskList.insert((args.p - 1), args.i)
39+
with open(taskTxt, "w") as f:
40+
for line in taskList:
41+
f.write(line + "\n")
42+
43+
44+
# deleting the task
45+
if args.toDo == "del":
46+
if args.i == '' or args.p == '':
47+
raise ValueError('An item or priority must be entered')
48+
taskList = read_list()
49+
if args.p:
50+
index = args.p - 1
51+
delete_item(index, taskList)
4052
else:
41-
print(f"Added task: \"{sys.argv[3]}\" with priority {sys.argv[2]}")
42-
43-
44-
45-
# deleting the task
46-
if sys.argv[1]=="del":
47-
lineno = int(sys.argv[2])
4853
try:
49-
with open("path/to/plans/task.txt","r+") as f:
50-
new_f = f.readlines()
51-
new_f = sorted(new_f)
52-
# print(new_f)
53-
del_f = new_f.pop(lineno-1)
54-
# print(new_f)
55-
56-
f.seek(0)
57-
for line in new_f:
58-
if del_f not in line:
59-
f.write(line)
60-
f.truncate()
61-
except:
62-
print(f"Error: item with index {lineno} does not exist. Nothing deleted.")
63-
64-
65-
66-
# marking done
67-
if sys.argv[1]=="done":
68-
lineno = int(sys.argv[2])
69-
try:
70-
with open("path/to/plans/task.txt","r+") as f:
71-
new_f = f.readlines()
72-
new_f = sorted(new_f)
73-
# print(new_f)
74-
del_f = new_f.pop(lineno-1)
75-
# print(new_f)
76-
77-
f.seek(0)
78-
for line in new_f:
79-
if del_f not in line:
80-
f.write(line)
81-
with open("path/to/plans/completed.txt","a") as r:
82-
r.write(del_f)
83-
f.truncate()
84-
85-
86-
87-
except:
88-
print(f"Error: no incomplete item with index #0 exists.")
89-
else:
90-
print(f"Marked item as done.")
91-
92-
93-
# generating the report
94-
if sys.argv[1]=="report":
54+
index = taskList.index(args.i)
55+
delete_item(index, taskList)
56+
exit(0)
57+
except(ValueError):
58+
print(f"Item {args.i} not found. Maybe run ls and try again?")
59+
exit(0)
60+
61+
# marking done
62+
if args.toDo == "done":
63+
if args.i == '' or args.p == '':
64+
raise ValueError('An item or priority must be entered')
65+
taskList = read_list()
66+
if args.p:
67+
index = args.p - 1
68+
do_item(index, taskList)
69+
else:
9570
try:
96-
task = open("path/to/plans/task.txt",'r')
97-
data = task.read()
98-
datalist = data.split("\n")
99-
datalist = sorted(datalist)
100-
datalist = datalist[1:]
101-
print(f"Pending : {len(datalist)}")
102-
for i in range(len(datalist)):
103-
print(f"{i+1}. {datalist[i][2:]} [{datalist[i][0:1]}]")
104-
105-
compt = open("path/to/plans/completed.txt",'r')
106-
data = compt.read()
107-
datalist = data.split("\n")
108-
datalist = sorted(datalist)
109-
datalist = datalist[1:]
110-
print(f"Completed : {len(datalist)}")
111-
for i in range(len(datalist)):
112-
print(f"{i+1}. {datalist[i][2:]} [{datalist[i][0:1]}]")
113-
except:
114-
print("Error: Missing file")
115-
116-
# except:
117-
# print(usage)
118-
# return usage.encode('utf8')
71+
index = taskList.index(args.i)
72+
do_item(index, taskList)
73+
exit(0)
74+
except(ValueError):
75+
print(f"Item {args.i} not found. Maybe run ls and try again?")
76+
exit(0)
77+
78+
# generating the report
79+
if args.toDo == "report":
80+
print("\n")
81+
print("To do:")
82+
lister(read_list())
83+
print("\n")
84+
print("Done:")
85+
lister(read_complete())
86+
87+
def read_list():
88+
with open(taskTxt, "r") as file:
89+
task_list = file.readlines()
90+
# all the newlines added during file writing must be removed otherwise printing is messed up
91+
strip_list = []
92+
for item in task_list:
93+
strip_list.append(item.strip())
94+
filtered_list = [item for item in strip_list if item != ""]
95+
return filtered_list
96+
97+
def read_complete():
98+
with open(completedTxt, "r") as file:
99+
completed_list = file.readlines()
100+
# all the newlines added during file writing must be removed otherwise printing is messed up
101+
strip_list = []
102+
for item in completed_list:
103+
strip_list.append(item.strip())
104+
filtered_list = [item for item in strip_list if item != ""]
105+
return filtered_list
106+
107+
def delete_item(index, taskList):
108+
print("\n")
109+
print(f"Do you want to delete {taskList[index]}?")
110+
answer = input("Enter y or n: ")
111+
if answer == "y":
112+
taskList.pop(index)
113+
with open(taskTxt, "w") as f:
114+
for line in taskList:
115+
f.write(line + "\n")
116+
print("Item Deleted")
117+
exit(0)
118+
print("No item deleted")
119+
exit(0)
120+
121+
def do_item(index, taskList):
122+
print("\n")
123+
print(f"Do you want to move {taskList[index]} to done?")
124+
answer = input("Enter y or n: ")
125+
if answer == "y":
126+
task = taskList.pop(index)
127+
with open(taskTxt, "w") as f:
128+
for line in taskList:
129+
f.write(line + "\n")
130+
completed = read_complete()
131+
completed.append(task)
132+
with open(completedTxt, "w") as f:
133+
for line in completed:
134+
f.write(line + "\n")
135+
print("Item marked done")
136+
exit(0)
137+
print("No item changed")
138+
exit(0)
139+
140+
def lister(items):
141+
for item, line in enumerate(items, 1):
142+
print(f"{item}: {line.strip()}")
119143

120144
if __name__ == "__main__":
121-
func()
145+
func()

PYTHON APPS/CLI-Based-TODO/task.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
take a shower

0 commit comments

Comments
 (0)