mirror of
https://github.com/metafy-social/python-scripts.git
synced 2024-11-23 20:11:10 +00:00
Adding ToDo CLI program
This commit is contained in:
parent
46c3c6b88a
commit
f328e7a902
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -127,3 +127,5 @@ dmypy.json
|
||||||
|
|
||||||
# Pyre type checker
|
# Pyre type checker
|
||||||
.pyre/
|
.pyre/
|
||||||
|
|
||||||
|
.idea
|
||||||
|
|
14
scripts/todo_cli/README.md
Normal file
14
scripts/todo_cli/README.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
## ToDo CLI program
|
||||||
|
####Main Script -
|
||||||
|
todo.py
|
||||||
|
#### Files to store ToDos -
|
||||||
|
1. todo.txt
|
||||||
|
2. done.txt
|
||||||
|
3. archive.txt
|
||||||
|
|
||||||
|
#### Note -
|
||||||
|
todo.bat is a bash script, add its path to OS environment variables and change path in python and bash files
|
||||||
|
to absolute path to use this using CMD from anywhere.
|
||||||
|
|
||||||
|
#### Dependency -
|
||||||
|
None
|
1
scripts/todo_cli/archive.txt
Normal file
1
scripts/todo_cli/archive.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2022-10-05 hacktoberfestpython
|
1
scripts/todo_cli/done.txt
Normal file
1
scripts/todo_cli/done.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2021-10-05 hackoctober 2021
|
3
scripts/todo_cli/todo.bat
Normal file
3
scripts/todo_cli/todo.bat
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
python "scripts/todo_cli/todo.py" %*
|
180
scripts/todo_cli/todo.py
Normal file
180
scripts/todo_cli/todo.py
Normal file
|
@ -0,0 +1,180 @@
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
arg = sys.argv
|
||||||
|
todo_file = "todo.txt"
|
||||||
|
done_file = "done.txt"
|
||||||
|
archive_file = "archive.txt"
|
||||||
|
|
||||||
|
|
||||||
|
def option_help():
|
||||||
|
sys.stdout.buffer.write('''
|
||||||
|
Commands :
|
||||||
|
add \"todo item\"\t\t\tAdd a new todo.
|
||||||
|
ls\t\t\t\tShow remaining todos.
|
||||||
|
del NUMBER\t\t\tDelete a todo.
|
||||||
|
done NUMBER\t\t\tComplete a todo.
|
||||||
|
help\t\t\t\tShow usage.
|
||||||
|
report\t\t\t\tStatistics.
|
||||||
|
archive\t\t\t\tArchives all the completed task
|
||||||
|
|
||||||
|
General Options
|
||||||
|
-h, --help\t\t\tShow help.
|
||||||
|
-v, --version\t\t\tShow version and exit.
|
||||||
|
-p, --print <file>\t\tPrints the file: (t)odo, (d)one, (a)rchive
|
||||||
|
'''.encode('utf8'))
|
||||||
|
|
||||||
|
|
||||||
|
def option_add(todo_to_add):
|
||||||
|
todo_add = " ".join(todo_to_add)
|
||||||
|
with open(todo_file, "a") as f1:
|
||||||
|
f1.write(todo_add + '\n')
|
||||||
|
print(f"Added todo: \"{todo_add}\"")
|
||||||
|
|
||||||
|
|
||||||
|
def option_ls():
|
||||||
|
todo = []
|
||||||
|
try:
|
||||||
|
with open(todo_file, "r") as f1:
|
||||||
|
for i in f1:
|
||||||
|
todo.append(i)
|
||||||
|
for i in range(len(todo) - 1, -1, -1):
|
||||||
|
sys.stdout.buffer.write("[{}] {}\n".format(i + 1, todo[i][:-1]).encode('utf8'))
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("There are no pending todos!")
|
||||||
|
|
||||||
|
|
||||||
|
def option_del(todo_to_delete):
|
||||||
|
try:
|
||||||
|
with open(todo_file, "r") as f1:
|
||||||
|
todo = f1.readlines()
|
||||||
|
if todo_to_delete > len(todo) or todo_to_delete == 0:
|
||||||
|
print(f"Error: todo #{todo_to_delete} does not exist. Nothing deleted.")
|
||||||
|
else:
|
||||||
|
todo.remove(todo[todo_to_delete - 1])
|
||||||
|
with open(todo_file, "w") as f1:
|
||||||
|
for i in todo:
|
||||||
|
f1.write(i)
|
||||||
|
print("Deleted todo #{}".format(todo_to_delete))
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("There are no pending todos! Nothing deleted.")
|
||||||
|
except ValueError:
|
||||||
|
print("Error: Enter a NUMBER. Nothing deleted.")
|
||||||
|
|
||||||
|
|
||||||
|
def option_done(mark_done):
|
||||||
|
try:
|
||||||
|
with open(todo_file, "r") as f1:
|
||||||
|
todo = f1.readlines()
|
||||||
|
if mark_done > len(todo) or mark_done == 0:
|
||||||
|
print("Error: todo #{} does not exist.".format(mark_done))
|
||||||
|
return
|
||||||
|
|
||||||
|
dodo = todo[mark_done - 1]
|
||||||
|
todo.remove(dodo)
|
||||||
|
with open(todo_file, "w") as f1, open(done_file, "a") as f2:
|
||||||
|
for i in todo:
|
||||||
|
f1.write(i)
|
||||||
|
t = time.localtime()
|
||||||
|
f2.write(f"{t.tm_year}-{t.tm_mon:02}-{t.tm_mday:02} {dodo}")
|
||||||
|
print(f"Marked todo #{mark_done} as done.")
|
||||||
|
print(f"Yay! Only {len(todo)} task(s) are left.")
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("There are no pending todos! Nothing marked Done.")
|
||||||
|
except ValueError:
|
||||||
|
print("Error: Enter a NUMBER. Nothing marked Done.")
|
||||||
|
|
||||||
|
|
||||||
|
def option_report():
|
||||||
|
len_todo = 0
|
||||||
|
len_done = 0
|
||||||
|
t = time.localtime()
|
||||||
|
try:
|
||||||
|
with open(todo_file, "r") as f1:
|
||||||
|
len_todo = len(f1.readlines())
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
with open(done_file, "r") as f2:
|
||||||
|
len_done = len(f2.readlines())
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
print(f"{t.tm_year}-{t.tm_mon:02}-{t.tm_mday:02} Pending : {len_todo} Completed : {len_done}")
|
||||||
|
|
||||||
|
|
||||||
|
def option_archive():
|
||||||
|
try:
|
||||||
|
with open(done_file, 'r') as f2:
|
||||||
|
todo = f2.readlines()
|
||||||
|
os.remove(done_file)
|
||||||
|
with open(archive_file, 'a') as f3:
|
||||||
|
for i in todo:
|
||||||
|
f3.write(i)
|
||||||
|
print("All task completed are archived")
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("Error: No task done to archive. Complete the pending task now!")
|
||||||
|
|
||||||
|
|
||||||
|
def option_print(file_code):
|
||||||
|
|
||||||
|
if file_code == 't':
|
||||||
|
try:
|
||||||
|
with open(todo_file, 'r') as f1:
|
||||||
|
print('\nToDo List:')
|
||||||
|
for i in f1:
|
||||||
|
print(i[:-1])
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("There are no pending todos!")
|
||||||
|
elif file_code == 'd':
|
||||||
|
try:
|
||||||
|
with open(done_file, 'r') as f2:
|
||||||
|
print('\nDone List:')
|
||||||
|
for i in f2:
|
||||||
|
print(i[:10], '\t', i[10:-1])
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("Nothing has been marked as done")
|
||||||
|
elif file_code == 'a':
|
||||||
|
try:
|
||||||
|
with open(archive_file, 'r') as f3:
|
||||||
|
print('\nArchive List:')
|
||||||
|
for i in f3:
|
||||||
|
print(i[:10], '\t', i[10:-1])
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("Nothing in archives")
|
||||||
|
else:
|
||||||
|
print("Enter the correct argument")
|
||||||
|
|
||||||
|
|
||||||
|
if len(arg) == 1 or arg[1] in ["help", '-h', "--help"]:
|
||||||
|
option_help()
|
||||||
|
elif arg[1] == "add":
|
||||||
|
if len(arg) == 2:
|
||||||
|
print("Error: Missing todo string. Nothing added!")
|
||||||
|
else:
|
||||||
|
option_add(arg[2:])
|
||||||
|
elif arg[1] == "ls":
|
||||||
|
option_ls()
|
||||||
|
elif arg[1] == "del":
|
||||||
|
if len(arg) < 3:
|
||||||
|
print("Error: Missing NUMBER for deleting todo.")
|
||||||
|
else:
|
||||||
|
option_del(int(arg[2]))
|
||||||
|
elif arg[1] == "done":
|
||||||
|
if len(arg) == 2:
|
||||||
|
print("Error: Missing NUMBER for marking todo as done.")
|
||||||
|
else:
|
||||||
|
option_done(int(arg[2]))
|
||||||
|
elif arg[1] == "report":
|
||||||
|
option_report()
|
||||||
|
elif arg[1] == "--version" or arg[1] == '-v':
|
||||||
|
print("ToDo 1.0")
|
||||||
|
elif arg[1] == "archive":
|
||||||
|
option_archive()
|
||||||
|
elif arg[1] == "--print" or arg[1] == '-p':
|
||||||
|
if len(arg) < 3:
|
||||||
|
print("No file name entered!")
|
||||||
|
else:
|
||||||
|
option_print(arg[2])
|
||||||
|
else:
|
||||||
|
print("ERROR: unknown command \"{}\"".format(arg[1]))
|
1
scripts/todo_cli/todo.txt
Normal file
1
scripts/todo_cli/todo.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
hackoctberfest 2022
|
Loading…
Reference in New Issue
Block a user