240 lines
6.1 KiB
Python
240 lines
6.1 KiB
Python
import os
|
|
import sys
|
|
|
|
|
|
def strstr(haystack, needle):
|
|
"""
|
|
Return a sub-string of haystack, going from first occurence of needle until the end.
|
|
Return None if not found.
|
|
|
|
Arguments:
|
|
haystack {string} -- the entry string
|
|
needle {string} -- the part of string searched
|
|
|
|
Returns:
|
|
string -- sub-string of haystack, starting from needle. None if not exist.
|
|
|
|
Examples:
|
|
email = 'name@example.com'
|
|
domain = strstr(email, '@');
|
|
print(domain) // Display : @example.com
|
|
"""
|
|
pos = haystack.find(needle)
|
|
if pos < 0: # not found
|
|
return None
|
|
|
|
return haystack[pos:]
|
|
|
|
# TODO Review help message / output / usage
|
|
|
|
def handle_help(args, *_):
|
|
if not args:
|
|
help_help()
|
|
sys.exit(0)
|
|
|
|
cmd_handler = [
|
|
('init', help_init),
|
|
('project', help_project),
|
|
('task', help_task),
|
|
('note', help_note),
|
|
('log', help_action),
|
|
('info', help_info),
|
|
('help', help_help),
|
|
('version', help_version)
|
|
]
|
|
candidate = -1
|
|
|
|
for i in range(len(cmd_handler)):
|
|
if strstr(cmd_handler[i][0], args[0]) == cmd_handler[i][0]:
|
|
if candidate < 0:
|
|
candidate = i
|
|
else:
|
|
print('Ambiguous command ({})'.format(args[0]))
|
|
sys.exit(1)
|
|
|
|
if candidate < 0:
|
|
print("Invalid command ({}), run '{} help' for help".format(args[0], os.path.basename(__file__)))
|
|
sys.exit(1)
|
|
|
|
cmd_handler[candidate][1]()
|
|
|
|
def help_project():
|
|
print('''Pits project is basic entity used to group related tasks together. A project has name and status.
|
|
|
|
Creating a project:
|
|
|
|
$ pits project -c name [-s status]
|
|
|
|
Editing a project:
|
|
|
|
$ pits project -e [number] [-n name] [-s status]
|
|
|
|
Deleting a project:
|
|
|
|
$ pits project -d [number]
|
|
|
|
Viewing a project:
|
|
|
|
$ pits project [[-q] number]
|
|
|
|
Searching projects:
|
|
|
|
$ pits project -q [number | [-n name] [-s status]]
|
|
|
|
Examples:
|
|
|
|
$ pits project -c 'My Tasks'
|
|
created project 1: My Tasks (status: active)
|
|
|
|
$ pits project -c 'Feature Requests' -s backlog
|
|
created project 2: Feature Requests (status: backlog)
|
|
|
|
$ pits pro
|
|
1: (username) [active ] My Tasks (0 tasks)
|
|
* 2: (username) [backlog] Feature Requests (0 tasks)
|
|
|
|
$ pits p 1 -e -n 'Task and Bugs' -s current
|
|
1: Task and Bugs (current, 0 tasks)
|
|
|
|
$ pits p
|
|
1: (username) [current] Task and Bugs (0 tasks)
|
|
* 2: (username) [backlog] Feature Requests (0 tasks)
|
|
|
|
$ pits p -d
|
|
deleted project 2: Feature Requests
|
|
|
|
$ pits p
|
|
* 1: (username) [current] Task and Bugs (0 tasks)
|
|
''')
|
|
|
|
def help_task():
|
|
print('''In Pits a task belongs to a project and projects can have many tasks. Task attributes include name, status,
|
|
priority, date, and time. All attributes except the name are optional.
|
|
|
|
Creating a task:
|
|
|
|
pits task -c name [-s status] [-p priority] [-d date] [-t time]
|
|
|
|
Editing a task:
|
|
|
|
pits task -e [number] [-n name] [-s status] [-p priority] [-d date] [-t time]
|
|
|
|
Moving a task:
|
|
|
|
pits task -m [number] -p number
|
|
|
|
Deleting a task:
|
|
|
|
pits task -d [number]
|
|
|
|
Viewing a task:
|
|
|
|
pits task [[-q] number]
|
|
|
|
Searching tasks:
|
|
|
|
pits task -q [number | [-n name] [-s status] [-p priority] [-d date-from] [-D date-to] [-t time-min] [-T time-max]]
|
|
|
|
Supported date formats:
|
|
|
|
none, 4/26, 4/26/2012, 4/26/12, '4/26 3pm', '4/26 19:30', '4/26/2012 3:15am', '4/26/12 17:00'
|
|
'Apr 26', 'Apr 26, 2012', 'Apr 26 3pm', 'Apr 26 19:30', 'Apr 26, 12 3:15am', 'Apr 26, 2012 17:00'
|
|
|
|
Supported time formats:
|
|
|
|
none, 17, 17:00, 17:30, 5pm, 1:15am
|
|
|
|
Examples:
|
|
|
|
$ pits task -c 'Hack this'
|
|
created task 1/1: Hack this (status: open, priority: normal)
|
|
|
|
$ pits task -c 'And hack that' -s new -p urgent -d 'Dec 31'
|
|
created task 2/1: And hack that (status: new, priority: urgent, date: Dec 31, 2010)
|
|
|
|
$ pits t
|
|
1: (username) [open] [normal] Hack this (0 notes)
|
|
* 2: (username) [new ] [urgent] Dec 31, 2010 And hack that (0 notes)
|
|
|
|
$ pits t -e 1 -s done -d 10/10 -t 4:30
|
|
updated task 1: Hack that (status: done, date: Oct 10, 2010, time: 4:30)
|
|
|
|
$ pits t
|
|
1: (username) [done] [normal] Oct 10, 2010 4:30 Hack this (0 notes)
|
|
* 2: (username) [new] [urgent] Dec 31, 2010 And hack that (0 notes)
|
|
|
|
$ pits t -d
|
|
deleted task 2: And hack that
|
|
|
|
$ pits t
|
|
1: (username) [done] [normal] Oct 10, 2010 4:30 Hack this (0 notes)
|
|
''')
|
|
|
|
def help_note():
|
|
print('''Pits notes are attached to a task. The only attribute is the note's message body.
|
|
|
|
Creating a note:
|
|
|
|
$ pits note -c message
|
|
|
|
Editing a note:
|
|
|
|
$ pits note -e [number] message
|
|
|
|
Deleting a note:
|
|
|
|
$ pits note -d [number]
|
|
|
|
Listing notes:
|
|
|
|
$ pits note
|
|
''')
|
|
|
|
def help_action():
|
|
print('''Show summary information about your Pits database. This command is as simple as:
|
|
|
|
pits log
|
|
''')
|
|
|
|
def help_info():
|
|
print('''Show summary information about your Pits database. This command is as simple as:
|
|
|
|
pits info
|
|
''')
|
|
|
|
def help_help():
|
|
print('''Pits is highly experimental software. Use it at your own risk. See LICENSE file for details.
|
|
usage: pits command [args]
|
|
|
|
The commands are:
|
|
init Create empty Pits database or reinitialize an existing one
|
|
project Create, search, and manage Pits projects
|
|
task Create, search, and manage Pits tasks
|
|
note Create, search, and manage Pits notes
|
|
log Show chronological Pits activity log
|
|
info Show summary information about your Pits database
|
|
help Show help information about Pit
|
|
version Show Pits version number
|
|
|
|
All commands might be shortened as long as they remain unambiguous. See 'pits help <command>' for more
|
|
information on a specific command.
|
|
''')
|
|
|
|
def help_version():
|
|
print('todo')
|
|
|
|
def help_init():
|
|
print('''Create empty Pits database or reinitialize an existing one. Default file name for the Pits database
|
|
is ~/.pits.db -- you can override the default by setting PITFILE environment variable.
|
|
|
|
$ pits init [-f]
|
|
|
|
-f force initialization without prompt
|
|
|
|
Example:
|
|
|
|
$ pits init
|
|
/home/user/.pits.db already exists, do you want to override it [y/N]: y
|
|
Created database /home/user/.pit
|
|
''')
|