PK! qhello_todo/__init__.py__version__ = '0.1.0' PK!V3hello_todo/cli.pyimport click import os if __name__ == '__main__': from hello_todo import db else: from . import db @click.command() def todo_lists(): results = db.get_all_todolist() print("%s|%s" % ("name".center(20), "description".center(20))) print("%s+%s" % ("-" * 20, "-" * 20)) for r in results: name = r["name"] desc = r["description"] or "" print("%s|%s" % (name.center(20), desc.center(20))) @click.command() @click.option("-l", "--todolist_id", help="Todo list id") def todo_list(todolist_id): todolist_name = db.get_todolist(todolist_id)["name"] results = db.get_todos(todolist_id) print("** %s **" % todolist_name.upper()) print( "%s|%s|%s|%s" % ("status".center(6), "deadline".center(25), "name".center(20), "description".center(20)) ) print("%s+%s+%s+%s" % ("-" * 6, "-" * 25, "-" * 20, "-" * 20)) for r in results: status = "x" if r["status"] else " " deadline = r["deadline"] or "" name = r["name"] description = r["description"] or "" print( "%s|%s|%s|%s" % (status.center(6), deadline.center(25), name.center(20), description.center(20)) ) @click.command() def init_todo(): db.init_db() click.echo("initialized db at %s", os.path.join(os.environ["HOME"], ".todolist.db")) @click.command() @click.option("-n", "--name", help="Todo list name") @click.option("-d", "--description", default=None, help="Todo list description") def add_todolist(name, description): db.add_todolist(name, description) @click.command() @click.option("-n", "--name", help="Todo name") @click.option("-l", "--todolist_id", help="Todo list id") @click.option("-x", "--deadline", default=None, help="Deadline in format YYYY-MM-dd hh:mm:ss.sss") @click.option("-d", "--description", default=None, help="Todo description") def add_todo(name, todolist_id, deadline, description): db.add_todo(name, todolist_id, description, deadline) if __name__ == "__main__": todo_list() PK!ǑAhello_todo/db.pyimport sqlite3 import os import pkg_resources def get_db(db_path=None): """ returns a connection to the database """ db_path = db_path or os.path.join(os.environ["HOME"], ".todolist.db") conn = sqlite3.connect(db_path) conn.row_factory = sqlite3.Row return conn def init_db(): """ initialize database """ conn = get_db() query = pkg_resources.resource_string(__name__, "init_db.sql") conn.executescript(query.decode("utf-8")) def add_todolist(name, description=None): """ add a todolist """ conn = get_db() with conn: conn.execute("INSERT INTO todolist (name, description) values (?, ?)", (name, description)) def add_todo(name, todolist_id, description=None, deadline=None, status=0): """ add a todo to a todolist """ conn = get_db() query = """ INSERT INTO todo (name, description, deadline, status, todolist_id) values (?, ?, ?, ?, ?) """ with conn: conn.execute(query, (name, description, deadline, status, todolist_id)) def get_all_todolist(): conn = get_db() with conn: results = conn.execute("SELECT * FROM todolist") return results def get_todos(todolist_id): conn = get_db() with conn: results = conn.execute("SELECT * FROM todo where todolist_id = ?", (todolist_id,)) return results def get_todolist(todolist_id): conn = get_db() with conn: return conn.execute("SELECT * FROM todolist where id = ?", (todolist_id, )).fetchone() PK!u2hello_todo/init_db.sqlDROP TABLE IF EXISTS todolist ; DROP TABLE IF EXISTS todo ; CREATE TABLE todolist ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(50) UNIQUE NOT NULL, description VARCHAR(150) ); CREATE TABLE todo( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(50) UNIQUE NOT NULL, description VARCHAR(150), deadline VARCHAR(23), status INTEGER, todolist_id INTEGER NOT NULL, FOREIGN KEY (todolist_id) REFERENCES todolist (id) ); PK!HFP+hello_todo-0.1.5.dist-info/entry_points.txtN+I/N.,()JLI/OɷH3s2`p9%22Kbtep.\`S.PK!H WX hello_todo-0.1.5.dist-info/WHEEL A н#Z."jm)Afb~ڠO68oF04UhoAf f4=4h0k::wXPK!H ]#hello_todo-0.1.5.dist-info/METADATAN1 2pHo݌A{ș%n|_yZuhEj6F/^wY=P.FoyrsRwPK!H͇g!hello_todo-0.1.5.dist-info/RECORD}r@{[怂 ;x" k-H'5U8_vh e&zxw4!VNՐV#Yi9Ŕ֦(kajV$ YNGS~)otxVd jA5)heӒ|G{m_r5ciPѦ=\@z\eu 49&ѫQ4e80e;*~udb7yD4\} $Ѭs 9GHMuqOF@ާ餳Ha?\HofjйwZuq袲W4V}a;3aD)+1BMy!yvoӍ='levǝdP@x7SPK! qhello_todo/__init__.pyPK!V3Jhello_todo/cli.pyPK!ǑAqhello_todo/db.pyPK!u2hello_todo/init_db.sqlPK!HFP+hello_todo-0.1.5.dist-info/entry_points.txtPK!H WX #hello_todo-0.1.5.dist-info/WHEELPK!H ]#hello_todo-0.1.5.dist-info/METADATAPK!H͇g!hello_todo-0.1.5.dist-info/RECORDPKL