From 438eb2c677fef6724fbffedbeeb38d30cbe6d68a Mon Sep 17 00:00:00 2001 From: "Maxence G. de Montauzan" Date: Sat, 21 Jul 2018 15:26:23 +0200 Subject: [PATCH] Pits help Basic report of original Pit help. Need review --- phelp.py | 239 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ pits.py | 9 +-- 2 files changed, 243 insertions(+), 5 deletions(-) create mode 100644 phelp.py diff --git a/phelp.py b/phelp.py new file mode 100644 index 0000000..2e37467 --- /dev/null +++ b/phelp.py @@ -0,0 +1,239 @@ +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 ' 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 +''') diff --git a/pits.py b/pits.py index 77d13f4..9c49c14 100644 --- a/pits.py +++ b/pits.py @@ -11,6 +11,7 @@ import project import action import task import note +import phelp # logging.basicConfig(level=logging.ERROR, format='%(levelname)7s :: %(message)s') # logging.basicConfig(level=logging.DEBUG, format='%(asctime)s :: %(levelname)s :: %(message)s') @@ -90,6 +91,8 @@ def init(): action_msg = 'Initialized pits database - DB Schema version: {}'.format(SCHEMA_VERSION) conn.execute(action_query, (getpass.getuser(), 'init', action_msg,)) + print('Created database ' + db_path) + # logging.info('Inserting initial data') # conn.executescript(""" # insert into project values(1, 'me', 'test', 'in progress', 'now', 'now')""") @@ -114,10 +117,6 @@ def count_object(conn, table_name): def version(*_): print('pit version 0.1.0') -def pit_help(args, *_): - print('TODO help') - # TODO help - def main(): cmd_handler = [ ('project', project.handle_project), @@ -125,7 +124,7 @@ def main(): ('note', note.handle_note), ('log', action.handle_action), ('info', info), - ('help', pit_help), + ('help', phelp.handle_help), ('version', version), ('init', init) ]