Source code for greatday.runners

"""Contains this project's clack runners."""

from __future__ import annotations

from typing import Final, List

from clack.types import ClackRunner
from logrus import Logger
import metaman
from vimala import vim

from . import tui
from .common import CTX_INBOX, drop_words
from .config import AddConfig, ListConfig, TUIConfig
from .repo import SQLRepo
from .session import GreatSession
from .tag import GreatTag
from .todo import GreatTodo


RUNNERS: List[ClackRunner] = []
runner = metaman.register_function_factory(RUNNERS)

logger = Logger(__name__)

CTX_X: Final = "x"


[docs]@runner def run_add(cfg: AddConfig) -> int: """Runner for the 'add' subcommand.""" log = logger.bind_fargs(locals()) repo = SQLRepo(cfg.database_url, verbose=cfg.verbose) todo = GreatTodo.from_line(cfg.todo_line).unwrap() x_found = False if CTX_X in todo.contexts: x_found = True desc = drop_words(todo.desc, f"@{CTX_X}") contexts = [ctx for ctx in todo.contexts if ctx != CTX_X] todo = todo.new(desc=desc, contexts=contexts) if cfg.add_inbox_context == "y" or ( cfg.add_inbox_context == "default" and not x_found and CTX_INBOX not in todo.contexts ): contexts = list(todo.contexts) + [CTX_INBOX] todo = todo.new(contexts=contexts) key = repo.add(todo).unwrap() log.info("Added new todo to inbox.", id=repr(key)) print(todo.to_line()) return 0
[docs]@runner def run_list(cfg: ListConfig) -> int: """Runner for the 'list' subcommand.""" repo = SQLRepo(cfg.database_url, verbose=cfg.verbose) query: str if cfg.query is None: query = "" else: query = cfg.query tag = GreatTag.from_query(query) todos = repo.get_by_tag(tag).unwrap() for todo in sorted(todos): print(todo.to_line()) return 0
[docs]@runner def run_tui(cfg: TUIConfig) -> int: """Runer for the 'tui' subcommand.""" repo = SQLRepo(cfg.database_url) # get default active query query = tui.get_default_query( cfg.saved_query_groups, cfg.default_query_group ) ctx = tui.Context(query, cfg.default_query_group) def run_app() -> None: app = tui.GreatApp( repo=repo, ctx=ctx, saved_query_group_map=cfg.saved_query_groups ) app.run() run_app() while ctx.edit_todos: tag = GreatTag.from_query(ctx.query) with GreatSession( cfg.database_url, tag, verbose=cfg.verbose ) as session: vim(session.path).unwrap() session.commit() ctx.edit_todos = False run_app() return 0