def dispatch( log: Log, parser: ArgumentParser, cli_args: Namespace, cfg: ConfigParser ) -> None: """ Dispatch request to Log instance based on CLI arguments and configuration values. """ if cli_args.subcmd == wc.SUBCMD_SESSION: if cli_args.type in [wc.TOKEN_START, wc.TOKEN_STOP]: log.commit( wc.TOKEN_SESSION, cli_args.type, cli_args.offset_minutes, cli_args.time, force=cli_args.force, ) elif cli_args.subcmd == wc.SUBCMD_TASK: if cli_args.type in [wc.TOKEN_START, wc.TOKEN_STOP]: if cli_args.type == wc.TOKEN_START and cli_args.auto_stop: commit_dt = calc_log_time(cli_args.offset_minutes, cli_args.time) log.stop_active_tasks(commit_dt) log.commit( wc.TOKEN_TASK, cli_args.type, cli_args.offset_minutes, cli_args.time, identifier=cli_args.id, ) elif cli_args.type == "list": log.list_tasks() elif cli_args.type == "report": log.task_report(cli_args.id) elif cli_args.subcmd == wc.SUBCMD_STATUS: hours_target = float(cfg.get("workday", "hours_target")) hours_max = float(cfg.get("workday", "hours_max")) fmt = cli_args.fmt query_date = date.today() if cli_args.yesterday: query_date -= timedelta(days=1) elif cli_args.date: query_date = cli_args.date.date() log.status(hours_target, hours_max, query_date=query_date, fmt=fmt) elif cli_args.subcmd == wc.SUBCMD_DOCTOR: log.doctor() elif cli_args.subcmd == wc.SUBCMD_LOG: n = cli_args.number no_pager_max_entries = int(cfg.get("worklog", "no_pager_max_entries")) use_pager = not cli_args.no_pager and (cli_args.all or n > no_pager_max_entries) categories = cli_args.category if not cli_args.all: log.log(cli_args.number, use_pager, categories) else: log.log(-1, use_pager, categories) elif cli_args.subcmd == wc.SUBCMD_REPORT: log.report(cli_args.date_from, cli_args.date_to)
def test_session_start(self, mock_now): mock_now.return_value = datetime(2020, 1, 1, tzinfo=timezone.utc) with tempfile.NamedTemporaryFile() as fh: instance = Log(fh.name) instance.commit(wc.TOKEN_SESSION, wc.TOKEN_START, time="2020-01-01T00:00:00+00:00") fh.seek(0) content = fh.read().decode() self.assertMatchSnapshot(content)
def test_stop_session_with_running_task_force(self, mock_now): mock_now.return_value = datetime(2020, 1, 1, tzinfo=timezone.utc) with tempfile.NamedTemporaryFile() as fh: instance = Log(fh.name) instance.commit(wc.TOKEN_SESSION, wc.TOKEN_START, time="2020-01-01T00:00:00+00:00") instance.commit( wc.TOKEN_TASK, wc.TOKEN_START, time="2020-01-01T00:00:00+00:00", identifier="task1", ) instance.commit( wc.TOKEN_SESSION, wc.TOKEN_STOP, time="2020-01-01T01:00:00+00:00", force=True, ) fh.seek(0) content = fh.read().decode() self.assertMatchSnapshot(content)
def test_stop_session_with_running_task(self, mock_now): mock_now.return_value = datetime(2020, 1, 1, tzinfo=timezone.utc) with tempfile.NamedTemporaryFile() as fh: instance = Log(fh.name) instance.commit(wc.TOKEN_SESSION, wc.TOKEN_START, time="2020-01-01T00:00:00+00:00") instance.commit( wc.TOKEN_TASK, wc.TOKEN_START, time="2020-01-01T00:00:00+00:00", identifier="task1", ) with self.assertRaises(SystemExit) as err: instance.commit( wc.TOKEN_SESSION, wc.TOKEN_STOP, time="2020-01-01T01:00:00+00:00", ) _, stderr = self._capsys.readouterr() self.assertEqual( stderr, ErrMsg.STOP_SESSION_TASKS_RUNNING.value.format( active_tasks=["task1"]) + "\n", ) self.assertTrue(err.exception.code, 1)
def test_invalid_category(self): with tempfile.NamedTemporaryFile() as fh: instance = Log(fh.name) with self.assertRaises(ValueError): instance.commit("foobar", wc.TOKEN_START)
def test_invalid_type(self): with tempfile.NamedTemporaryFile() as fh: instance = Log(fh.name) with self.assertRaises(ValueError): instance.commit(wc.TOKEN_SESSION, "foobar")