Files
ppit/pits.py
Maxence G. de Montauzan 438eb2c677 Pits help
Basic report of original Pit help. Need review
2018-07-21 15:26:43 +02:00

166 lines
4.9 KiB
Python

import sqlite3
import os
import argparse
import json
import getpass
import datetime
import logging
import sys
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')
logging.basicConfig(level=logging.ERROR, format='%(asctime)s :: {%(filename)10s:%(lineno)3d} :: %(funcName)s :: %(levelname)s :: %(message)s')
DB_FILENAME = 'pits.db'
SCHEMA_FILENAME = 'pits_schema.sql'
PIT_VERSION = '0.0.1'
SCHEMA_VERSION = 1
def get_file_path(file_name):
return os.path.join(os.path.dirname(os.path.realpath(__file__)), file_name)
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:]
def create_connection(db_filename):
db_path = get_file_path(db_filename)
logging.debug("Try to connect to {}".format(db_path))
try:
conn = sqlite3.connect(db_path)
return conn
except sqlite3.Error as sqlite3_error:
print(sqlite3_error)
return None
def init():
db_path = get_file_path(DB_FILENAME)
logging.debug('Search database in {}'.format(db_path))
if os.path.exists(db_path):
valid = {"yes": True, "y": True, "ye": True}
print('{} already exists, do you want to override it? [y/N]:'.format(db_path), end='')
choice = input().lower()
if choice in valid:
os.remove(db_path)
else:
sys.exit(0)
with sqlite3.connect(db_path) as conn:
logging.info('Creating schema')
schema_path = get_file_path(SCHEMA_FILENAME)
logging.debug('Schema file path: {}'.format(schema_path))
with open(schema_path, 'rt') as f:
schema = f.read()
conn.executescript(schema)
action_query = '''
INSERT INTO action (username, action, message)
VALUES (?, ?, ?);
'''
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')""")
def info(_1, _2, conn):
print('Pit version: {}'.format(PIT_VERSION))
print('Pit file name: {}'.format(get_file_path(DB_FILENAME)))
print('Created by: {} on {}'.format(*action.get_first_action(conn)))
print('Last updated by: {} on {}'.format(*action.get_last_action(conn)))
print('Schema version: {}'.format(SCHEMA_VERSION))
print('Projects: {}'.format(count_object(conn, 'project')))
print('Tasks: {}'.format(count_object(conn, 'task')))
print('Notes: {}'.format(count_object(conn, 'note')))
print('Log entries: {}'.format(count_object(conn, 'action')))
def count_object(conn, table_name):
query = "SELECT count(*) FROM " + table_name
cursor = conn.cursor()
cursor.execute(query)
return cursor.fetchone()[0]
def version(*_):
print('pit version 0.1.0')
def main():
cmd_handler = [
('project', project.handle_project),
('task', task.handle_task),
('note', note.handle_note),
('log', action.handle_action),
('info', info),
('help', phelp.handle_help),
('version', version),
('init', init)
]
candidate = -1
argv = sys.argv
if len(argv) == 1:
argv.append('help')
argv.append(None)
for i in range(len(cmd_handler)):
if strstr(cmd_handler[i][0], argv[1]) == cmd_handler[i][0]:
if candidate < 0:
candidate = i
else:
print('Ambiguous command ({})'.format(argv[1]))
sys.exit(1)
if candidate < 0:
print("Invalid command ({}), run '{} help' for help".format(argv[1], os.path.basename(__file__)))
sys.exit(1)
if candidate == (len(cmd_handler) -1):
init()
sys.exit(0)
conn = create_connection(DB_FILENAME)
last_action = action.read_current(conn)
logging.debug('Last action: {}'.format(last_action))
logging.debug(argv)
logging.debug(argv[2:])
cmd_handler[candidate][1](argv[2:], last_action, conn)
conn.commit()
conn.close()
if __name__ == '__main__':
main()