Skip to content

Commit 150de43

Browse files
committed
fix: updated examples (#25)
1 parent 4e48f97 commit 150de43

File tree

4 files changed

+100
-14
lines changed

4 files changed

+100
-14
lines changed

README.md

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,10 @@ from dataclasses import dataclass, asdict
7575

7676
@dataclass
7777
class CustomDataclass(SqlAlchemyOrderConverterMixin):
78-
order_by: typing.Optional[typing.Optional[str, typing.List[str]]] = None
78+
order_by: typing.Optional[typing.Union[str, typing.List[str]]] = None
7979

8080
class ConverterConfig:
8181
model = SomeModel
82-
83-
def dict(self):
84-
return {k: str(v) for k, v in asdict(self).items() if v is not None}
8582

8683
custom_dataclass = CustomDataclass(
8784
order_by=['id', '-name']
@@ -107,19 +104,19 @@ class CustomBaseModel(SqlAlchemyFilterBaseModel):
107104
model = SomeModel
108105

109106

110-
custom_dataclass = CustomBaseModel(
107+
custom_basemodel = CustomBaseModel(
111108
id__gte=1,
112109
name__in=['abc', 'def'],
113110
object__place=1,
114111
)
115112

116-
binary_expression = custom_dataclass.to_binary_expressions()
113+
binary_expression = custom_basemodel.to_binary_expressions()
117114

118115
query = query.filter(*binary_expression)
119116

120117
# or
121118

122-
query = query.apply_filters(query=query)
119+
query = custom_basemodel.apply_filters(query=query)
123120
```
124121

125122
Sometimes, it is necessary to manipulate sent data before applying filters.
@@ -139,23 +136,23 @@ class CustomBaseModel(SqlAlchemyFilterBaseModel):
139136
model = SomeModel
140137

141138

142-
custom_dataclass = CustomBaseModel(
139+
custom_basemodel = CustomBaseModel(
143140
id__gte=1,
144141
name__in=['abc', 'def'],
145142
filter_to_exclude="filter_value",
146143
)
147144

148145
# filter_to_exclude field will be excluded from converting basemodel to sqlalchemy filters
149146

150-
binary_expression = custom_dataclass.to_binary_expressions(
147+
binary_expression = custom_basemodel.to_binary_expressions(
151148
export_params={'exclude': {'filter_to_exclude'}, }
152149
)
153150

154151
query = query.filter(*binary_expression)
155152

156153
# or
157154

158-
query = query.apply_filters(
155+
query = custom_basemodel.apply_filters(
159156
query=query,
160157
export_params={'exclude': {'filter_to_exclude'}, }
161158
)
@@ -173,17 +170,17 @@ class CustomBaseModel(SqlAlchemyOrderBaseModel):
173170
class ConverterConfig:
174171
model = SomeModel
175172

176-
custom_dataclass = CustomBaseModel(
173+
custom_basemodel = CustomBaseModel(
177174
order_by=['id', '-name']
178175
)
179176

180-
unary_expressions = custom_dataclass.get_unary_expressions(custom_dataclass.order_by)
177+
unary_expressions = custom_basemodel.get_unary_expressions(custom_dataclass.order_by)
181178

182179
query = query.order_by(*unary_expressions)
183180

184181
# or
185182

186-
query = query.apply_order_by(query)
183+
query = custom_basemodel.apply_order_by(query)
187184
```
188185
____
189186
### FastApi support

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "dataclass-sqlalchemy-mixins"
3-
version = "0.1.3"
3+
version = "0.1.4"
44
description = "Allows to convert dataclasses to sqlalchemy filters and orderings."
55
authors = ["ViAchKoN"]
66
readme = "README.md"

tests/filtering/test_fields_filters.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,57 @@
11
import datetime
22
import datetime as dt
33
import typing as tp
4+
from dataclasses import asdict, dataclass
45

56
import pytest
67
from sqlalchemy import select
78

9+
from dataclass_sqlalchemy_mixins.base.mixins import SqlAlchemyFilterConverterMixin
810
from dataclass_sqlalchemy_mixins.pydantic_mixins.sqlalchemy_base_models import (
911
BaseModelConverterExtraParams,
1012
)
1113
from tests import models, models_factory
1214

1315

16+
def test_filter__dataclass__eq__ok(
17+
db_session,
18+
get_sqlalchemy_filter_base_model,
19+
):
20+
expected_item_name = "expected_item_name"
21+
22+
# Create expected item
23+
expected_item = models_factory.ItemFactory.create(name=expected_item_name)
24+
25+
# Create unexpected items
26+
models_factory.ItemFactory.create_batch(size=4)
27+
28+
@dataclass
29+
class CustomDataclass(SqlAlchemyFilterConverterMixin):
30+
name: str = None
31+
32+
class ConverterConfig:
33+
model = models.Item
34+
35+
def dict(self):
36+
return {k: str(v) for k, v in asdict(self).items() if v is not None}
37+
38+
custom_dataclass = CustomDataclass(name=expected_item_name)
39+
40+
assert db_session.query(models.Item).count() == 5
41+
42+
results = (
43+
db_session.query(models.Item)
44+
.filter(*custom_dataclass.get_binary_expressions(custom_dataclass.dict()))
45+
.all()
46+
)
47+
48+
assert len(results) == 1
49+
50+
result = results[0]
51+
52+
assert result.as_dict() == expected_item.as_dict()
53+
54+
1455
@pytest.mark.parametrize(
1556
"apply_filters",
1657
[

tests/ordering/test_fields_orderings.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,59 @@
11
import datetime as dt
2+
import typing as tp
3+
from dataclasses import dataclass
24

35
import pytest
46
from sqlalchemy import select
57

8+
from dataclass_sqlalchemy_mixins.base.mixins import SqlAlchemyOrderConverterMixin
69
from tests import models, models_factory
710

811

12+
def test_order_by_id__dataclass__ok(
13+
db_session,
14+
):
15+
items = models_factory.ItemFactory.create_batch(size=5)
16+
17+
@dataclass
18+
class CustomDataclass(SqlAlchemyOrderConverterMixin):
19+
order_by: tp.Optional[tp.Union[str, tp.List[str]]] = None
20+
21+
class ConverterConfig:
22+
model = models.Item
23+
24+
for order_by in [
25+
"id",
26+
[
27+
"id",
28+
],
29+
"-id",
30+
[
31+
"-id",
32+
],
33+
]:
34+
custom_dataclass = CustomDataclass(order_by=order_by)
35+
36+
expected_items = items
37+
if order_by in [
38+
"-id",
39+
[
40+
"-id",
41+
],
42+
]:
43+
expected_items = list(reversed(items))
44+
45+
results = (
46+
db_session.query(models.Item)
47+
.order_by(
48+
*custom_dataclass.get_unary_expressions(custom_dataclass.order_by)
49+
)
50+
.all()
51+
)
52+
53+
for expected_item, result in zip(expected_items, results):
54+
assert result.as_dict() == expected_item.as_dict()
55+
56+
957
@pytest.mark.parametrize(
1058
"apply_order_by",
1159
[

0 commit comments

Comments
 (0)