Skip to content

Commit 0907700

Browse files
authored
MPT-12584 Fix use of private arguments in RQL Query constructor (#8)
2 parents eaf2a99 + b2617be commit 0907700

File tree

2 files changed

+76
-22
lines changed

2 files changed

+76
-22
lines changed

mpt_api_client/rql/query_builder.py

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -148,29 +148,43 @@ class RQLQuery: # noqa: WPS214
148148

149149
def __init__( # noqa: WPS211
150150
self,
151-
_field: str | None = None,
152-
*,
153-
_op: str = EXPRESSION,
154-
_children: list["RQLQuery"] | set["RQLQuery"] | None = None,
155-
_negated: bool = False,
156-
_expr: str | None = None,
151+
namespace_: str | None = None, # noqa: WPS120
157152
**kwargs: QueryValue,
158153
) -> None:
159-
self.op = _op
160-
self.children: list[RQLQuery] = list(_children) if _children else []
161-
self.negated = _negated
162-
self.expr = _expr
154+
self.op: str = self.EXPRESSION
155+
self.children: list[RQLQuery] = []
156+
self.negated: bool = False
157+
self.expr: str | None = None
163158
self._path: list[str] = []
164159
self._field: str | None = None
165-
if _field:
166-
self.n(_field)
160+
if namespace_:
161+
self.n(namespace_)
167162
if len(kwargs) == 1:
168163
self.op = self.EXPRESSION
169164
self.expr = parse_kwargs(kwargs)[0]
170165
if len(kwargs) > 1:
171166
self.op = self.AND
172167
for token in parse_kwargs(kwargs):
173-
self.children.append(self.__class__(_expr=token))
168+
self.children.append(self.new(expr=token))
169+
170+
@classmethod
171+
def new(
172+
cls,
173+
expr: str | None = None,
174+
*,
175+
negated: bool = False,
176+
op: str | None = None,
177+
children: list["RQLQuery"] | set["RQLQuery"] | None = None,
178+
) -> Self:
179+
"""Create a new RQLQuery object from a expression or from a set of op and children."""
180+
if isinstance(children, set):
181+
children = list(children)
182+
query = cls()
183+
query.op = op or cls.EXPRESSION
184+
query.children = children or []
185+
query.negated = negated
186+
query.expr = expr
187+
return query
174188

175189
def __len__(self) -> int:
176190
if self.op == self.EXPRESSION:
@@ -221,10 +235,10 @@ def __or__(self, other: object) -> Self:
221235
return self._join(other, self.OR)
222236

223237
def __invert__(self) -> Self:
224-
inverted_query = self.__class__(
225-
_op=self.AND,
226-
_expr=self.expr,
227-
_negated=True,
238+
inverted_query = self.new(
239+
op=self.AND,
240+
expr=self.expr,
241+
negated=True,
228242
)
229243
inverted_query._append(self) # noqa: SLF001
230244
return inverted_query
@@ -449,10 +463,10 @@ def _to_string(self, query: "RQLQuery") -> str:
449463
return f"{query.op}({str_tokens})"
450464

451465
def _copy(self, other: "RQLQuery") -> Self:
452-
return self.__class__(
453-
_op=other.op,
454-
_children=other.children.copy(),
455-
_expr=other.expr,
466+
return self.new(
467+
op=other.op,
468+
children=other.children.copy(),
469+
expr=other.expr,
456470
)
457471

458472
def _join(self, other: "RQLQuery", op: str) -> Self:
@@ -463,7 +477,7 @@ def _join(self, other: "RQLQuery", op: str) -> Self:
463477
if not self:
464478
return self._copy(other)
465479

466-
query = self.__class__(_op=op)
480+
query = self.new(op=op)
467481
query._append(self) # noqa: SLF001
468482
query._append(other) # noqa: SLF001
469483
return query

tests/rql/query_builder/test_create_rql.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,24 @@
33

44
def test_create():
55
query = RQLQuery()
6+
67
assert query.op == RQLQuery.EXPRESSION
78
assert query.children == []
89
assert query.negated is False
910

1011

1112
def test_create_with_field():
1213
query = RQLQuery("field")
14+
1315
query.eq("value")
16+
1417
assert query.op == RQLQuery.EXPRESSION
1518
assert str(query) == "eq(field,value)"
1619

1720

1821
def test_create_single_kwarg():
1922
query = RQLQuery(id="ID")
23+
2024
assert query.op == RQLQuery.EXPRESSION
2125
assert str(query) == "eq(id,ID)"
2226
assert query.children == []
@@ -25,6 +29,7 @@ def test_create_single_kwarg():
2529

2630
def test_create_multiple_kwargs(): # noqa: WPS218
2731
query = RQLQuery(id="ID", status__in=("a", "b"), ok=True)
32+
2833
assert query.op == RQLQuery.AND
2934
assert str(query) == "and(eq(id,ID),in(status,(a,b)),eq(ok,true))"
3035
assert len(query.children) == 3
@@ -37,3 +42,38 @@ def test_create_multiple_kwargs(): # noqa: WPS218
3742
assert query.children[2].op == RQLQuery.EXPRESSION
3843
assert query.children[2].children == []
3944
assert str(query.children[2]) == "eq(ok,true)"
45+
46+
47+
def test_new_empty():
48+
query = RQLQuery.new()
49+
50+
assert query.op == RQLQuery.EXPRESSION
51+
assert query.children == []
52+
assert query.negated is False
53+
54+
55+
def test_new_with_parameters():
56+
project_rql = RQLQuery.new("project=rql")
57+
status_not_done = RQLQuery.new("status=done", negated=True)
58+
59+
query = RQLQuery.new(
60+
op=RQLQuery.AND,
61+
children=[project_rql, status_not_done],
62+
)
63+
64+
assert str(query) == "and(project=rql,not(status=done))"
65+
66+
67+
def test_new_with_set():
68+
project_rql = RQLQuery.new("project=rql")
69+
status_not_done = RQLQuery.new("status=done", negated=True)
70+
71+
query = RQLQuery.new(
72+
op=RQLQuery.AND,
73+
children={project_rql, status_not_done},
74+
)
75+
76+
assert isinstance(query.children, list)
77+
assert len(query.children) == 2
78+
assert project_rql in query.children
79+
assert status_not_done in query.children

0 commit comments

Comments
 (0)