diff options
author | Wolfgang Müller | 2021-04-27 18:00:47 +0200 |
---|---|---|
committer | Wolfgang Müller | 2021-04-28 20:15:53 +0200 |
commit | 1801fe5c5a5d42cb30de0803377ed4e682fcea3c (patch) | |
tree | dd0632aec1b581444f651a78d15e4c7ecff29408 /quarg/actions.py | |
parent | 5213365b42640d5f5dcba5adde071100d49fe2b0 (diff) | |
download | quarg-1801fe5c5a5d42cb30de0803377ed4e682fcea3c.tar.gz |
Move Actions to their own file
Diffstat (limited to 'quarg/actions.py')
-rw-r--r-- | quarg/actions.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/quarg/actions.py b/quarg/actions.py new file mode 100644 index 0000000..2b373b7 --- /dev/null +++ b/quarg/actions.py @@ -0,0 +1,63 @@ +import argparse +from abc import ABCMeta, abstractmethod + +import dateutil.relativedelta + +from quarg.quassel.types import BufferType, MessageFlag, MessageType +from quarg.utils import errx, parse_isodate + +# TODO Find out what to do about passing INVALID or GROUP as BufferType +# TODO Find out what to do about passing various message flags + +# pylint: disable=too-few-public-methods, unsupported-membership-test + +class ParseEnum(argparse.Action, metaclass=ABCMeta): + def __call__(self, parser, namespace, value, option_string=None): + key = value.upper() + if key not in self.enumclass.__members__: + errx(f'Not a valid {self.enumclass.describe()}: {value}') + + saved = getattr(namespace, self.dest) or [] + saved.append(self.enumclass[key]) + setattr(namespace, self.dest, saved) + + @property + @abstractmethod + def enumclass(self): + pass + +class ParseMessageType(ParseEnum): + @property + def enumclass(self): + return MessageType + +class ParseMessageFlag(ParseEnum): + @property + def enumclass(self): + return MessageFlag + +class ParseBufferType(ParseEnum): + @property + def enumclass(self): + return BufferType + +class ParseDate(argparse.Action): + def __call__(self, parser, namespace, datespec, option_string=None): + setattr(namespace, self.dest, parse_isodate(datespec)) + +class ParseAround(argparse.Action): + def __call__(self, parser, namespace, aroundspec, option_string=None): + if '/' in aroundspec: + # FIXME / fine here? + datespec, rangespec = aroundspec.split('/', 1) + try: + hour_range = int(rangespec) + except ValueError as err: + errx(err) + else: + datespec, hour_range = (aroundspec, 12) + + date = parse_isodate(datespec) + + offset = dateutil.relativedelta.relativedelta(hours=hour_range) + setattr(namespace, self.dest, (date - offset, date + offset)) |