11#!/usr/bin/env python3
2- import sys
2+ # Python todo list
3+
4+ import os
35from 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
711def 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
1318def 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
120144if __name__ == "__main__" :
121- func ()
145+ func ()
0 commit comments