Last active
December 29, 2019 16:16
-
-
Save nockstarr/2be5ff22d25c9243cd53aab080af29e9 to your computer and use it in GitHub Desktop.
Which method
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from dataclasses import dataclass | |
from typing import Callable, List | |
import re | |
class ListOfFilters(list): | |
""" Adds additional functionality to a List[Filter]""" | |
@staticmethod | |
def _validate_regex(pattern, filter_name: str): | |
try: | |
return re.compile(pattern) | |
except re.error as e: | |
print(e) | |
print(f"<Invalid regular expression '{pattern}' in filter '{filter_name}'>") | |
# Log error here plz..! | |
# exit(1) | |
# else: | |
# return validated | |
def compile_regex(self): | |
#print(self) | |
print(" Validate and compile regex ") | |
for _filter in self: | |
_filter: Filter | |
for rule in _filter.rules: | |
if rule.func == "regex": | |
rule.value = self._validate_regex(rule.value, _filter.filter_name) | |
def create_filter_list(self, filters: list): | |
for f in filters: | |
self.append( | |
Filter( | |
filter_name=f["filter_name"], | |
date_added=f["date_added"], | |
date_modified=f["date_modified"], | |
hit_count=f["hit_count"], | |
rules=list(Rule(**r) for r in f["rules"]) | |
) | |
) | |
@dataclass | |
class Rule: | |
field: str | |
func: str # Name of callable filter function | |
value: str | |
@dataclass | |
class Filter: | |
filter_name: str | |
date_added: str | |
date_modified: str | |
# rule_count: int | |
rules: List[Rule] | |
hit_count: int = 0 | |
filters_from_db = [ | |
{ | |
"filter_name": "test1", | |
"date_added": "date_added1", | |
"date_modified": "date_modified1", | |
"hit_count": 0, | |
"rules": [{"func": "func1", "field": "field1", "value": "value1"}] | |
}, | |
{ | |
"filter_name": "test2", | |
"date_added": "date_added2", | |
"date_modified": "date_modified2", | |
"hit_count": 0, | |
"rules": [{"func": "regex", "field": "field2", "value": "[a-zA-Z]{1,2}"}] | |
} | |
] | |
def gen_filter_list(filters: list) -> List[Filter]: | |
""" Generates ListOfFilters """ | |
return list( | |
Filter( | |
filter_name=f["filter_name"], | |
date_added=f["date_added"], | |
date_modified=f["date_modified"], | |
hit_count=f["hit_count"], | |
rules=list(Rule(**r) for r in f["rules"]) | |
) for f in filters | |
) | |
# Method 1 ? | |
# filter_list = gen_filter_list(filters_from_db) | |
# | |
# compile and validate regex must be done either before or after "filter_list" (List[Filter]) is created, in standers funcs. | |
# | |
print("USING Method 1!") | |
print(filter_list) | |
for i in filter_list: | |
print(i) | |
filter_list | |
################# | |
# Method 2? | |
print("USING Method 2!") | |
# Compile and validate regex can be done after 'self population' of ListOfFilters with method "ListOfFilters.create_filter_list(..)" | |
# is done (as shown below), | |
# or everything can be done at once in a "dunder set method" if the raw list if passed as arg during instantiation like ListOfFilters(filters_from_db) | |
################# | |
filter_list = ListOfFilters() | |
filter_list.create_filter_list(filters_from_db) | |
print(filter_list) | |
for i in filter_list: | |
print(i) | |
print("#"*20) | |
filter_list.compile_regex() | |
for k in filter_list: | |
print(k) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment