From e7db94a986f411e1a86b9a6cc2af21a7e74e1fcf Mon Sep 17 00:00:00 2001 From: Duda Dornelles Date: Tue, 12 Aug 2014 13:30:24 -0300 Subject: adding mails query, tags and contacts to py-fake-service --- py-fake-service/app/search/search_query.py | 65 ++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 py-fake-service/app/search/search_query.py (limited to 'py-fake-service/app/search/search_query.py') diff --git a/py-fake-service/app/search/search_query.py b/py-fake-service/app/search/search_query.py new file mode 100644 index 00000000..cb8d5f57 --- /dev/null +++ b/py-fake-service/app/search/search_query.py @@ -0,0 +1,65 @@ +from scanner import StringScanner, StringRegexp +import re + + +def _next_token(): + return StringRegexp('[^\s]+') + + +def _separators(): + return StringRegexp('[\s&]+') + + +def _compile_tag(compiled, token): + tag = token.split(":").pop() + if token[0] == "-": + compiled["not_tags"].append(tag) + else: + compiled["tags"].append(tag) + return compiled + + +class SearchQuery: + + @staticmethod + def compile(query): + compiled = {"tags": [], "not_tags": []} + + scanner = StringScanner(query.encode('utf8').replace("\"", "")) + first_token = True + while not scanner.is_eos: + token = scanner.scan(_next_token()) + + if not token: + scanner.skip(_separators()) + continue + + if ":" in token: + compiled = _compile_tag(compiled, token) + elif first_token: + compiled["general"] = token + + if not first_token: + first_token = True + + return SearchQuery(compiled) + + def __init__(self, compiled): + self.compiled = compiled + + def test(self, mail): + if set(self.compiled.get('tags')).intersection(mail.tags) or 'all' in self.compiled.get('tags'): + return True + + if self.compiled.get('general'): + search_terms = re.compile(self.compiled['general']) + if search_terms.match(mail.body) or search_terms.match(mail.subject): + return True + + if not self.compiled.get('tags') and not self.compiled.get('not_tags'): + return True + + return False + + + -- cgit v1.2.3