summaryrefslogtreecommitdiff
path: root/overlays/worktime
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2025-01-28 13:07:06 +0100
committerGregor Kleen <gkleen@yggdrasil.li>2025-01-28 13:07:06 +0100
commit96f1e073cd1aa6b7579256cbb6d42fa604a551b5 (patch)
tree24a296408053afa0baf1b8fc6ba9a059074d3b05 /overlays/worktime
parent60c3de142e238a3b5563e0f9d7dec047e1e56931 (diff)
downloadnixos-96f1e073cd1aa6b7579256cbb6d42fa604a551b5.tar
nixos-96f1e073cd1aa6b7579256cbb6d42fa604a551b5.tar.gz
nixos-96f1e073cd1aa6b7579256cbb6d42fa604a551b5.tar.bz2
nixos-96f1e073cd1aa6b7579256cbb6d42fa604a551b5.tar.xz
nixos-96f1e073cd1aa6b7579256cbb6d42fa604a551b5.zip
...
Diffstat (limited to 'overlays/worktime')
-rwxr-xr-xoverlays/worktime/worktime/__main__.py43
1 files changed, 39 insertions, 4 deletions
diff --git a/overlays/worktime/worktime/__main__.py b/overlays/worktime/worktime/__main__.py
index 362c8da4..4c623acd 100755
--- a/overlays/worktime/worktime/__main__.py
+++ b/overlays/worktime/worktime/__main__.py
@@ -518,7 +518,7 @@ def format_days(worktime, days, date_format=None):
518 return ', '.join(map(lambda group: ','.join(map(format_group, group)), groups)) 518 return ', '.join(map(lambda group: ','.join(map(format_group, group)), groups))
519 519
520 520
521def worktime(**args): 521def worktime(pull_forward_cutoff, **args):
522 worktime = Worktime(**args) 522 worktime = Worktime(**args)
523 523
524 def format_worktime(worktime): 524 def format_worktime(worktime):
@@ -562,7 +562,7 @@ def worktime(**args):
562 else: 562 else:
563 return f"({difference_string})" 563 return f"({difference_string})"
564 564
565 if worktime.time_pulled_forward >= timedelta(minutes = 15): 565 if worktime.time_pulled_forward >= pull_forward_cutoff:
566 worktime_no_pulled_forward = deepcopy(worktime) 566 worktime_no_pulled_forward = deepcopy(worktime)
567 worktime_no_pulled_forward.time_to_work -= worktime_no_pulled_forward.time_pulled_forward 567 worktime_no_pulled_forward.time_to_work -= worktime_no_pulled_forward.time_pulled_forward
568 worktime_no_pulled_forward.time_pulled_forward = timedelta() 568 worktime_no_pulled_forward.time_pulled_forward = timedelta()
@@ -798,6 +798,38 @@ def classification(classification_name, table, table_format, **args):
798def main(): 798def main():
799 def isotime(s): 799 def isotime(s):
800 return datetime.fromisoformat(s).replace(tzinfo=tzlocal()) 800 return datetime.fromisoformat(s).replace(tzinfo=tzlocal())
801 def duration_minutes(s):
802 return timedelta(minutes = float(s))
803
804 def set_default_subparser(self, name, args=None, positional_args=0):
805 """default subparser selection. Call after setup, just before parse_args()
806 name: is the name of the subparser to call by default
807 args: if set is the argument list handed to parse_args()
808
809 , tested with 2.7, 3.2, 3.3, 3.4
810 it works with 2.6 assuming argparse is installed
811 """
812 subparser_found = False
813 for arg in sys.argv[1:]:
814 if arg in ['-h', '--help']: # global help if no subparser
815 break
816 else:
817 for x in self._subparsers._actions:
818 if not isinstance(x, argparse._SubParsersAction):
819 continue
820 for sp_name in x._name_parser_map.keys():
821 if sp_name in sys.argv[1:]:
822 subparser_found = True
823 if not subparser_found:
824 # insert default in last position before global positional
825 # arguments, this implies no global options are specified after
826 # first positional argument
827 if args is None:
828 sys.argv.insert(len(sys.argv) - positional_args, name)
829 else:
830 args.insert(len(args) - positional_args, name)
831
832 argparse.ArgumentParser.set_default_subparser = set_default_subparser
801 833
802 config = Worktime.config() 834 config = Worktime.config()
803 835
@@ -807,8 +839,10 @@ def main():
807 parser.add_argument('--no-running', dest = 'include_running', action = 'store_false') 839 parser.add_argument('--no-running', dest = 'include_running', action = 'store_false')
808 parser.add_argument('--no-force-day-to-work', dest = 'force_day_to_work', action = 'store_false') 840 parser.add_argument('--no-force-day-to-work', dest = 'force_day_to_work', action = 'store_false')
809 subparsers = parser.add_subparsers(help = 'Subcommands') 841 subparsers = parser.add_subparsers(help = 'Subcommands')
810 parser.set_defaults(cmd = worktime) 842 worktime_parser = subparsers.add_parser('time_worked', aliases = ['time', 'worked'])
811 time_worked_parser = subparsers.add_parser('time_worked', aliases = ['time', 'worked', 'today']) 843 worktime_parser.add_argument('--pull-forward-cutoff', dest = 'pull_forward_cutoff', metavar = 'MINUTES', type = duration_minutes, default = timedelta(minutes = 15))
844 worktime_parser.set_defaults(cmd = worktime)
845 time_worked_parser = subparsers.add_parser('today')
812 time_worked_parser.add_argument('--no-round', dest = 'do_round', action = 'store_false') 846 time_worked_parser.add_argument('--no-round', dest = 'do_round', action = 'store_false')
813 time_worked_parser.set_defaults(cmd = time_worked) 847 time_worked_parser.set_defaults(cmd = time_worked)
814 diff_parser = subparsers.add_parser('diff') 848 diff_parser = subparsers.add_parser('diff')
@@ -827,6 +861,7 @@ def main():
827 classification_parser.add_argument('--table', action = 'store_true') 861 classification_parser.add_argument('--table', action = 'store_true')
828 classification_parser.add_argument('--table-format', dest='table_format', type=str, default='fancy_grid') 862 classification_parser.add_argument('--table-format', dest='table_format', type=str, default='fancy_grid')
829 classification_parser.set_defaults(cmd = partial(classification, classification_name=classification_name)) 863 classification_parser.set_defaults(cmd = partial(classification, classification_name=classification_name))
864 parser.set_default_subparser('time_worked')
830 args = parser.parse_args() 865 args = parser.parse_args()
831 866
832 args.cmd(**vars(args)) 867 args.cmd(**vars(args))