Skip to content

Commit

Permalink
Add custom types and filters registration
Browse files Browse the repository at this point in the history
  • Loading branch information
dukkee committed Nov 25, 2022
1 parent c4340c4 commit 763bc98
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 7 deletions.
25 changes: 18 additions & 7 deletions filterify/filters/base.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from typing import Any
from typing import Any, Dict, List, Type


__all__ = [
'Filter', 'Equal', 'NotEqual', 'GreaterThan', 'LessThan',
'GreaterThanOrEqual', 'LessThanOrEqual', 'In', 'NotIn',
'register_base_filter',
]


Expand Down Expand Up @@ -102,10 +103,20 @@ def name(self) -> str:
return 'Not in'


FILTER_MAPPING = {
int: (Equal, NotEqual, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn),
float: (Equal, NotEqual, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn),
bool: (Equal, NotEqual),
str: (Equal, NotEqual, In, NotIn),
list: (Equal, NotEqual, In, NotIn),
FILTER_MAPPING: Dict[Any, List[Type[Filter]]] = {
int: [Equal, NotEqual, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn],
float: [Equal, NotEqual, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn],
bool: [Equal, NotEqual],
str: [Equal, NotEqual, In, NotIn],
list: [Equal, NotEqual, In, NotIn],
}


def register_base_filter(type_list: List[Any], *filters: Type[Filter]) -> None:
for type_ in type_list:
if type_ not in FILTER_MAPPING:
FILTER_MAPPING[type_] = []

for filter_ in filters:
if filter_ not in FILTER_MAPPING[type_]:
FILTER_MAPPING[type_].append(filter_)
59 changes: 59 additions & 0 deletions tests/test_customs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
from typing import Type
from copy import deepcopy

import pytest
from pydantic import BaseModel

from filterify import Filterify
from filterify.filters import base as filters_base
from filterify.filters.base import register_base_filter


@pytest.fixture
def refresh_filter_types() -> None:
filter_mapping = deepcopy(filters_base.FILTER_MAPPING)
yield
filters_base.FILTER_MAPPING = filter_mapping


@pytest.fixture
def custom_type() -> Type:
class MyType(int):
pass

return MyType


@pytest.fixture
def custom_filter() -> Type[filters_base.Filter]:
class MyFilter(filters_base.Filter):
@classmethod
def operation(cls) -> str:
return 'filter'

@classmethod
def name(cls) -> str:
return 'Custom Filter'

return MyFilter


def test_custom_filter(refresh_filter_types: None, custom_filter: Type[filters_base.Filter]):
class User(BaseModel):
name: str

register_base_filter([str], custom_filter)

model_filter = Filterify(User)
result = model_filter('name__filter=example')
assert result[0]['operation'] == custom_filter.operation()


def test_custom_type(refresh_filter_types: None, custom_type: Type):
class User(BaseModel):
name: custom_type

register_base_filter([custom_type], filters_base.Equal)

model_filter = Filterify(User)
assert model_filter('name=15') == [{'field': ['name'], 'value': 15, 'operation': 'eq'}]

0 comments on commit 763bc98

Please sign in to comment.