Source code for spade.template

import logging
from abc import ABCMeta

from .message import MessageBase

logger = logging.getLogger("spade.Template")


# TODO: Include regex in templates


[docs]class BaseTemplate(metaclass=ABCMeta): """Template operators""" def __and__(self, other): """Implementation of & operator""" if not issubclass(other.__class__, BaseTemplate): raise TypeError("Expressions must be of class Template") return ANDTemplate(self, other) def __iand__(self, other): """Implementation of &= operator""" return self & other def __or__(self, other): """Implementation of | operator""" if not issubclass(other.__class__, BaseTemplate): raise TypeError("Expressions must be of class Template") return ORTemplate(self, other) def __ior__(self, other): """Implementation of |= operator""" return self | other def __xor__(self, other): """Implementation of ^ operator""" if not issubclass(other.__class__, BaseTemplate): raise TypeError("Expressions must be of class Template") return XORTemplate(self, other) def __ixor__(self, other): """Implementation of ^= operator""" return self ^ other def __invert__(self): """Implementation of ~ operator""" return NOTTemplate(self)
[docs]class NOTTemplate(BaseTemplate): """ """ def __init__(self, expr): self.expr = expr
[docs] def match(self, message): """ """ return not (self.expr.match(message))
[docs]class ORTemplate(BaseTemplate): """ """ def __init__(self, expr1, expr2): self.expr1 = expr1 self.expr2 = expr2
[docs] def match(self, message): """ """ return self.expr1.match(message) | self.expr2.match(message)
[docs]class ANDTemplate(BaseTemplate): """ """ def __init__(self, expr1, expr2): self.expr1 = expr1 self.expr2 = expr2
[docs] def match(self, message): """ """ return self.expr1.match(message) & self.expr2.match(message)
[docs]class XORTemplate(BaseTemplate): """ """ def __init__(self, expr1, expr2): self.expr1 = expr1 self.expr2 = expr2
[docs] def match(self, message): """ """ return self.expr1.match(message) ^ self.expr2.match(message)
[docs]class Template(BaseTemplate, MessageBase): """Template for message matching""" def __str__(self) -> str: s = f'<template to="{self.to}" from="{self.sender}" thread="{self.thread}" metadata={self.metadata}>' if self.body: s += "\n" + self.body + "\n" s += "</template>" return s