aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/quarg/actions.py
diff options
context:
space:
mode:
Diffstat (limited to 'quarg/actions.py')
-rw-r--r--quarg/actions.py63
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))