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
Lines changed: 2 additions & 0 deletions
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

Lines changed: 125 additions & 101 deletions
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
take a shower

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy