Skip to content

Commit 503a47c

Browse files
tpellissierclaude
andcommitted
Fix black formatting and _FunctionFilter type annotation
- Run black on 5 files that failed formatting check - Fix _FunctionFilter.__init__ value param: str -> Any (matches _format_value which handles int, float, datetime, etc.) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c7ae7a2 commit 503a47c

5 files changed

Lines changed: 50 additions & 77 deletions

File tree

examples/advanced/walkthrough.py

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -264,62 +264,66 @@ def _run_walkthrough(client):
264264
# Basic fluent query: active records sorted by amount (flat iteration)
265265
log_call("client.query.builder(...).select().filter_eq().order_by().execute()")
266266
print("Querying incomplete records ordered by amount (fluent builder)...")
267-
qb_records = list(backoff(
268-
lambda: client.query.builder(table_name)
269-
.select("new_Title", "new_Amount", "new_Priority")
270-
.filter_eq("new_Completed", False)
271-
.order_by("new_Amount", descending=True)
272-
.top(10)
273-
.execute()
274-
))
267+
qb_records = list(
268+
backoff(
269+
lambda: client.query.builder(table_name)
270+
.select("new_Title", "new_Amount", "new_Priority")
271+
.filter_eq("new_Completed", False)
272+
.order_by("new_Amount", descending=True)
273+
.top(10)
274+
.execute()
275+
)
276+
)
275277
print(f"[OK] QueryBuilder found {len(qb_records)} incomplete records:")
276278
for rec in qb_records[:5]:
277279
print(f" - '{rec.get('new_title')}' Amount={rec.get('new_amount')}")
278280

279281
# filter_in: records with specific priorities
280282
log_call("client.query.builder(...).filter_in('new_Priority', [HIGH, LOW]).execute()")
281283
print("Querying records with HIGH or LOW priority (filter_in)...")
282-
priority_records = list(backoff(
283-
lambda: client.query.builder(table_name)
284-
.select("new_Title", "new_Priority")
285-
.filter_in("new_Priority", [Priority.HIGH, Priority.LOW])
286-
.execute()
287-
))
284+
priority_records = list(
285+
backoff(
286+
lambda: client.query.builder(table_name)
287+
.select("new_Title", "new_Priority")
288+
.filter_in("new_Priority", [Priority.HIGH, Priority.LOW])
289+
.execute()
290+
)
291+
)
288292
print(f"[OK] Found {len(priority_records)} records with HIGH or LOW priority")
289293
for rec in priority_records[:5]:
290294
print(f" - '{rec.get('new_title')}' Priority={rec.get('new_priority')}")
291295

292296
# filter_between: amount in a range
293297
log_call("client.query.builder(...).filter_between('new_Amount', 500, 1500).execute()")
294298
print("Querying records with amount between 500 and 1500 (filter_between)...")
295-
range_records = list(backoff(
296-
lambda: client.query.builder(table_name)
297-
.select("new_Title", "new_Amount")
298-
.filter_between("new_Amount", 500, 1500)
299-
.execute()
300-
))
299+
range_records = list(
300+
backoff(
301+
lambda: client.query.builder(table_name)
302+
.select("new_Title", "new_Amount")
303+
.filter_between("new_Amount", 500, 1500)
304+
.execute()
305+
)
306+
)
301307
print(f"[OK] Found {len(range_records)} records with amount in [500, 1500]")
302308
for rec in range_records:
303309
print(f" - '{rec.get('new_title')}' Amount={rec.get('new_amount')}")
304310

305311
# Composable expression tree with where()
306312
log_call("client.query.builder(...).where((eq(...) | eq(...)) & gt(...)).execute()")
307313
print("Querying with composable expression tree (where)...")
308-
expr_records = list(backoff(
309-
lambda: client.query.builder(table_name)
310-
.select("new_Title", "new_Amount", "new_Quantity")
311-
.where(
312-
(eq("new_Completed", False) & gt("new_Amount", 100))
314+
expr_records = list(
315+
backoff(
316+
lambda: client.query.builder(table_name)
317+
.select("new_Title", "new_Amount", "new_Quantity")
318+
.where((eq("new_Completed", False) & gt("new_Amount", 100)))
319+
.order_by("new_Amount", descending=True)
320+
.top(5)
321+
.execute()
313322
)
314-
.order_by("new_Amount", descending=True)
315-
.top(5)
316-
.execute()
317-
))
323+
)
318324
print(f"[OK] Expression tree query found {len(expr_records)} records:")
319325
for rec in expr_records:
320-
print(
321-
f" - '{rec.get('new_title')}' Amount={rec.get('new_amount')} Qty={rec.get('new_quantity')}"
322-
)
326+
print(f" - '{rec.get('new_title')}' Amount={rec.get('new_amount')} Qty={rec.get('new_quantity')}")
323327

324328
# Combined: fluent filters + expression tree + paging (by_page=True)
325329
log_call("client.query.builder(...).filter_eq().where(between()).page_size().execute(by_page=True)")
@@ -339,9 +343,7 @@ def _run_walkthrough(client):
339343
combined_record_count += len(page)
340344
titles = [r.get("new_title", "?") for r in page]
341345
print(f" Page {combined_page_count}: {len(page)} records - {titles}")
342-
print(
343-
f"[OK] Combined query: {combined_record_count} records across {combined_page_count} page(s)"
344-
)
346+
print(f"[OK] Combined query: {combined_record_count} records across {combined_page_count} page(s)")
345347

346348
# ============================================================================
347349
# 8. SQL QUERY

src/PowerPlatform/Dataverse/models/filters.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
from datetime import date, datetime, timezone
3737
from typing import Any, Sequence
3838

39-
4039
__all__ = [
4140
"FilterExpression",
4241
"eq",
@@ -160,7 +159,7 @@ class _FunctionFilter(FilterExpression):
160159

161160
__slots__ = ("func_name", "column", "value")
162161

163-
def __init__(self, func_name: str, column: str, value: str) -> None:
162+
def __init__(self, func_name: str, column: str, value: Any) -> None:
164163
self.func_name = func_name
165164
self.column = column.lower()
166165
self.value = value

src/PowerPlatform/Dataverse/models/query_builder.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343

4444
from .filters import FilterExpression, _format_value
4545

46-
4746
__all__ = ["QueryBuilder"]
4847

4948

@@ -249,9 +248,7 @@ def filter_between(self, column: str, low: Any, high: Any) -> QueryBuilder:
249248
# Produces: (revenue ge 100000 and revenue le 500000)
250249
"""
251250
col = column.lower()
252-
self._filter_parts.append(
253-
f"({col} ge {_format_value(low)} and {col} le {_format_value(high)})"
254-
)
251+
self._filter_parts.append(f"({col} ge {_format_value(low)} and {col} le {_format_value(high)})")
255252
return self
256253

257254
def filter_raw(self, filter_string: str) -> QueryBuilder:
@@ -298,9 +295,7 @@ def where(self, expression: FilterExpression) -> QueryBuilder:
298295
& gt("revenue", 100000)))
299296
"""
300297
if not isinstance(expression, FilterExpression):
301-
raise TypeError(
302-
f"where() requires a FilterExpression, got {type(expression).__name__}"
303-
)
298+
raise TypeError(f"where() requires a FilterExpression, got {type(expression).__name__}")
304299
self._filter_parts.append(expression)
305300
return self
306301

tests/unit/models/test_query_builder.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,7 @@ def test_filter_between_returns_self(self):
191191
self.assertIs(qb.filter_between("revenue", 100, 500), qb)
192192

193193
def test_filter_between_combined_with_other_filters(self):
194-
qb = (
195-
QueryBuilder("account")
196-
.filter_eq("statecode", 0)
197-
.filter_between("revenue", 100000, 500000)
198-
)
194+
qb = QueryBuilder("account").filter_eq("statecode", 0).filter_between("revenue", 100000, 500000)
199195
self.assertEqual(
200196
qb.build()["filter"],
201197
"statecode eq 0 and (revenue ge 100000 and revenue le 500000)",
@@ -249,12 +245,7 @@ def test_where_preserves_call_order(self):
249245
"""Interleaved filter_*() and where() should preserve call order."""
250246
from PowerPlatform.Dataverse.models.filters import eq, gt
251247

252-
qb = (
253-
QueryBuilder("account")
254-
.where(eq("a", 1))
255-
.filter_eq("b", 2)
256-
.where(gt("c", 3))
257-
)
248+
qb = QueryBuilder("account").where(eq("a", 1)).filter_eq("b", 2).where(gt("c", 3))
258249
self.assertEqual(qb.build()["filter"], "a eq 1 and b eq 2 and c gt 3")
259250

260251
def test_where_returns_self(self):
@@ -436,9 +427,9 @@ def test_execute_calls_get_multiple(self):
436427

437428
qb = QueryBuilder("account")
438429
qb._query_ops = mock_query_ops
439-
qb.select("name", "revenue").filter_eq("statecode", 0).order_by(
440-
"revenue", descending=True
441-
).top(100).page_size(50).expand("primarycontactid")
430+
qb.select("name", "revenue").filter_eq("statecode", 0).order_by("revenue", descending=True).top(100).page_size(
431+
50
432+
).expand("primarycontactid")
442433

443434
result = list(qb.execute())
444435

@@ -459,9 +450,7 @@ def test_execute_returns_flat_records_by_default(self):
459450
mock_client._scoped_odata.return_value.__enter__ = MagicMock(return_value=mock_odata)
460451
mock_client._scoped_odata.return_value.__exit__ = MagicMock(return_value=False)
461452

462-
mock_odata._get_multiple.return_value = iter(
463-
[[{"name": "A"}, {"name": "B"}], [{"name": "C"}]]
464-
)
453+
mock_odata._get_multiple.return_value = iter([[{"name": "A"}, {"name": "B"}], [{"name": "C"}]])
465454

466455
qb = QueryBuilder("account")
467456
qb._query_ops = mock_query_ops

tests/unit/test_query_operations.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,9 @@ def test_builder_returns_query_builder(self):
6969

7070
def test_builder_execute_flat_default(self):
7171
"""builder().execute() should return flat records by default."""
72-
self.client._odata._get_multiple.return_value = iter(
73-
[[{"accountid": "1", "name": "Test"}]]
74-
)
72+
self.client._odata._get_multiple.return_value = iter([[{"accountid": "1", "name": "Test"}]])
7573

76-
records = list(
77-
self.client.query.builder("account")
78-
.select("name")
79-
.filter_eq("statecode", 0)
80-
.top(10)
81-
.execute()
82-
)
74+
records = list(self.client.query.builder("account").select("name").filter_eq("statecode", 0).top(10).execute())
8375

8476
self.client._odata._get_multiple.assert_called_once_with(
8577
"account",
@@ -95,9 +87,7 @@ def test_builder_execute_flat_default(self):
9587

9688
def test_builder_execute_flat_multiple_pages(self):
9789
"""execute() should flatten records from multiple pages."""
98-
self.client._odata._get_multiple.return_value = iter(
99-
[[{"accountid": "1"}], [{"accountid": "2"}]]
100-
)
90+
self.client._odata._get_multiple.return_value = iter([[{"accountid": "1"}], [{"accountid": "2"}]])
10191

10292
records = list(self.client.query.builder("account").execute())
10393

@@ -111,9 +101,7 @@ def test_builder_execute_by_page(self):
111101
page2 = [{"accountid": "2"}]
112102
self.client._odata._get_multiple.return_value = iter([page1, page2])
113103

114-
pages = list(
115-
self.client.query.builder("account").execute(by_page=True)
116-
)
104+
pages = list(self.client.query.builder("account").execute(by_page=True))
117105

118106
self.assertEqual(len(pages), 2)
119107
self.assertEqual(pages[0], page1)

0 commit comments

Comments
 (0)