Skip to content

Instantly share code, notes, and snippets.

@nockstarr
Last active December 29, 2019 16:16
Show Gist options
  • Save nockstarr/2be5ff22d25c9243cd53aab080af29e9 to your computer and use it in GitHub Desktop.
Save nockstarr/2be5ff22d25c9243cd53aab080af29e9 to your computer and use it in GitHub Desktop.
Which method
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