1
- import time ,os ,sys
1
+ #!/usr/bin/env python3
2
+ # Python todo list
2
3
3
- 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 )"
4
-
5
- def func ():
6
- try :
7
-
8
- # printing help
9
- if sys .argv [1 ]== "help" :
10
- print (usage )
11
- return usage
12
-
13
- # lisiting all the task
14
- if sys .argv [1 ]== "ls" :
15
- try :
16
- f = open ("path/to/plans/task.txt" ,'r' )
17
- data = f .read ()
18
- datalist = data .split ("\n " )
19
- datalist = sorted (datalist )
20
- datalist = datalist [1 :]
21
- # print(datalist)
22
- for i in range (len (datalist )):
23
- print (f"{ i + 1 } . { datalist [i ][2 :]} [{ datalist [i ][0 :1 ]} ]" )
24
-
25
- except :
26
- print ("Error: Missing file" )
4
+ import os
5
+ from argparse import ArgumentParser as aparse
27
6
7
+ # change the path of the files here to the actual desired paths
8
+ taskTxt = "task.txt"
9
+ completedTxt = "completed.txt"
28
10
11
+ def create_parser ():
12
+ parser = aparse (description = """Command Line task list""" )
13
+ parser .add_argument ("toDo" , default = "ls" , choices = ['usage' , 'ls' , 'add' , 'del' , 'done' , 'report' ], help = "Enter command: usage, ls, add, del, done, report." )
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
29
17
30
- # adding the task
31
- if sys .argv [1 ]== "add" :
32
- try :
33
- with open ("path/to/plans/task.txt" ,'a' ,encoding = 'utf-8' ) as f :
34
- res = f .write (f"{ sys .argv [2 ]} { sys .argv [3 ]} \n " )
35
- except :
36
- print ("Error: Missing tasks string. Nothing added!" )
37
- else :
38
- print (f"Added task: \" { sys .argv [3 ]} \" with priority { sys .argv [2 ]} " )
39
-
40
-
41
-
42
- # deleting the task
43
- if sys .argv [1 ]== "del" :
44
- lineno = int (sys .argv [2 ])
45
- try :
46
- with open ("path/to/plans/task.txt" ,"r+" ) as f :
47
- new_f = f .readlines ()
48
- new_f = sorted (new_f )
49
- # print(new_f)
50
- del_f = new_f .pop (lineno - 1 )
51
- # print(new_f)
52
-
53
- f .seek (0 )
54
- for line in new_f :
55
- if del_f not in line :
56
- f .write (line )
57
- f .truncate ()
58
- except :
59
- print (f"Error: item with index { lineno } does not exist. Nothing deleted." )
60
-
61
-
62
-
63
- # marking done
64
- if sys .argv [1 ]== "done" :
65
- lineno = int (sys .argv [2 ])
18
+ def func ():
19
+ args = create_parser ().parse_args ()
20
+
21
+ # check if files exist, create if not
22
+ if not os .path .exists (taskTxt ):
23
+ with open (taskTxt , "w" ) as filet :
24
+ pass
25
+
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 ())
32
+
33
+ # adding the task
34
+ if args .toDo == "add" :
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 )
52
+ else :
66
53
try :
67
- with open ("path/to/plans/task.txt" ,"r+" ) as f :
68
- new_f = f .readlines ()
69
- new_f = sorted (new_f )
70
- # print(new_f)
71
- del_f = new_f .pop (lineno - 1 )
72
- # print(new_f)
73
-
74
- f .seek (0 )
75
- for line in new_f :
76
- if del_f not in line :
77
- f .write (line )
78
- with open ("path/to/plans/completed.txt" ,"a" ) as r :
79
- r .write (del_f )
80
- f .truncate ()
81
-
82
-
83
-
84
- except :
85
- print (f"Error: no incomplete item with index #0 exists." )
86
- else :
87
- print (f"Marked item as done." )
88
-
89
-
90
- # generating the report
91
- 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 :
92
70
try :
93
- task = open ("path/to/plans/task.txt" ,'r' )
94
- data = task .read ()
95
- datalist = data .split ("\n " )
96
- datalist = sorted (datalist )
97
- datalist = datalist [1 :]
98
- print (f"Pending : { len (datalist )} " )
99
- for i in range (len (datalist )):
100
- print (f"{ i + 1 } . { datalist [i ][2 :]} [{ datalist [i ][0 :1 ]} ]" )
101
-
102
- compt = open ("path/to/plans/completed.txt" ,'r' )
103
- data = compt .read ()
104
- datalist = data .split ("\n " )
105
- datalist = sorted (datalist )
106
- datalist = datalist [1 :]
107
- print (f"Completed : { len (datalist )} " )
108
- for i in range (len (datalist )):
109
- print (f"{ i + 1 } . { datalist [i ][2 :]} [{ datalist [i ][0 :1 ]} ]" )
110
- except :
111
- print ("Error: Missing file" )
112
-
113
- except :
114
- print (usage )
115
- return usage .encode ('utf8' )
116
-
117
- func ()
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 ()} " )
143
+
144
+ if __name__ == "__main__" :
145
+ func ()
0 commit comments