Skip to content

Commit 570ca0a

Browse files
authored
refactor: use new Python syntax for Optional typing (#1624)
1 parent b0624a6 commit 570ca0a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+298
-327
lines changed

robotoff/app/api.py

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import uuid
1111
from collections import defaultdict
1212
from pathlib import Path
13-
from typing import Literal, Optional, cast
13+
from typing import Literal, cast
1414

1515
import falcon
1616
import orjson
@@ -119,9 +119,9 @@ def get_server_type_from_req(
119119
COUNTRY_NAME_TO_ENUM = {COUNTRY_CODE_TO_NAME[item]: item for item in Country}
120120

121121

122-
def get_countries_from_req(req: falcon.Request) -> Optional[list[Country]]:
122+
def get_countries_from_req(req: falcon.Request) -> list[Country] | None:
123123
"""Parse `countries` query string from request."""
124-
countries_str: Optional[list[str]] = req.get_param_as_list("countries")
124+
countries_str: list[str] | None = req.get_param_as_list("countries")
125125
if countries_str is None:
126126
return None
127127

@@ -202,12 +202,12 @@ def on_get(self, req: falcon.Request, resp: falcon.Response):
202202
response: JSONType = {}
203203
count: int = req.get_param_as_int("count", min_value=1, default=25)
204204
page: int = req.get_param_as_int("page", min_value=1, default=1)
205-
keep_types: Optional[list[str]] = req.get_param_as_list(
205+
keep_types: list[str] | None = req.get_param_as_list(
206206
"insight_types", required=False
207207
)
208-
barcode: Optional[str] = normalize_req_barcode(req.get_param("barcode"))
209-
annotated: Optional[bool] = req.get_param_as_bool("annotated")
210-
annotation: Optional[int] = req.get_param_as_int("annotation")
208+
barcode: str | None = normalize_req_barcode(req.get_param("barcode"))
209+
annotated: bool | None = req.get_param_as_bool("annotated")
210+
annotation: int | None = req.get_param_as_int("annotation")
211211
value_tag: str = req.get_param("value_tag")
212212
brands = req.get_param_as_list("brands") or None
213213
predictor = req.get_param("predictor")
@@ -272,8 +272,8 @@ class RandomInsightResource:
272272
def on_get(self, req: falcon.Request, resp: falcon.Response):
273273
response: JSONType = {}
274274

275-
insight_type: Optional[str] = req.get_param("type")
276-
value_tag: Optional[str] = req.get_param("value_tag")
275+
insight_type: str | None = req.get_param("type")
276+
value_tag: str | None = req.get_param("value_tag")
277277
count: int = req.get_param_as_int("count", min_value=1, default=25)
278278
predictor = req.get_param("predictor")
279279
server_type = get_server_type_from_req(req)
@@ -303,7 +303,7 @@ def on_get(self, req: falcon.Request, resp: falcon.Response):
303303
resp.media = response
304304

305305

306-
def parse_auth(req: falcon.Request) -> Optional[OFFAuthentication]:
306+
def parse_auth(req: falcon.Request) -> OFFAuthentication | None:
307307
session_cookie = req.get_cookie_values("session")
308308

309309
if session_cookie:
@@ -917,13 +917,13 @@ def on_get(self, req: falcon.Request, resp: falcon.Response):
917917
count: int = req.get_param_as_int(
918918
"count", min_value=1, max_value=2000, default=25
919919
)
920-
type_: Optional[str] = req.get_param("type")
921-
barcode: Optional[str] = normalize_req_barcode(req.get_param("barcode"))
922-
value: Optional[str] = req.get_param("value")
923-
taxonomy_value: Optional[str] = req.get_param("taxonomy_value")
924-
min_confidence: Optional[float] = req.get_param_as_float("min_confidence")
920+
type_: str | None = req.get_param("type")
921+
barcode: str | None = normalize_req_barcode(req.get_param("barcode"))
922+
value: str | None = req.get_param("value")
923+
taxonomy_value: str | None = req.get_param("taxonomy_value")
924+
min_confidence: float | None = req.get_param_as_float("min_confidence")
925925
random: bool = req.get_param_as_bool("random", default=False)
926-
annotated: Optional[bool] = req.get_param_as_bool("annotated")
926+
annotated: bool | None = req.get_param_as_bool("annotated")
927927

928928
if type_ is None and (value is not None or taxonomy_value is not None):
929929
raise falcon.HTTPBadRequest(
@@ -1031,7 +1031,7 @@ def on_put(self, req: falcon.Request, resp: falcon.Response, logo_id: int):
10311031
)
10321032

10331033
with db.atomic():
1034-
logo: Optional[LogoAnnotation] = LogoAnnotation.get_or_none(id=logo_id)
1034+
logo: LogoAnnotation | None = LogoAnnotation.get_or_none(id=logo_id)
10351035
if logo is None:
10361036
resp.status = falcon.HTTP_404
10371037
return
@@ -1201,7 +1201,7 @@ def on_post(self, req: falcon.Request, resp: falcon.Response):
12011201

12021202
class ANNResource:
12031203
def on_get(
1204-
self, req: falcon.Request, resp: falcon.Response, logo_id: Optional[int] = None
1204+
self, req: falcon.Request, resp: falcon.Response, logo_id: int | None = None
12051205
):
12061206
"""Search for nearest neighbors of:
12071207
- a random logo (if logo_id not provided)
@@ -1311,9 +1311,9 @@ def on_get(self, req: falcon.Request, resp: falcon.Response, barcode: str):
13111311
# hash of the IPs as a backup.
13121312
device_id = device_id_from_request(req)
13131313

1314-
auth: Optional[OFFAuthentication] = parse_auth(req)
1314+
auth: OFFAuthentication | None = parse_auth(req)
13151315

1316-
keep_types: Optional[list[str]] = req.get_param_as_list(
1316+
keep_types: list[str] | None = req.get_param_as_list(
13171317
"insight_types", required=False
13181318
)
13191319
keep_types = filter_question_insight_types(keep_types)
@@ -1379,23 +1379,23 @@ def get_questions_resource_on_get(
13791379
page: int = req.get_param_as_int("page", min_value=1, default=1)
13801380
count: int = req.get_param_as_int("count", min_value=1, default=25)
13811381
lang: str = req.get_param("lang", default="en")
1382-
keep_types: Optional[list[str]] = req.get_param_as_list(
1382+
keep_types: list[str] | None = req.get_param_as_list(
13831383
"insight_types", required=False
13841384
)
13851385
keep_types = filter_question_insight_types(keep_types)
13861386
value_tag: str = req.get_param("value_tag")
13871387
brands = req.get_param_as_list("brands") or None
1388-
reserved_barcode: Optional[bool] = req.get_param_as_bool(
1388+
reserved_barcode: bool | None = req.get_param_as_bool(
13891389
"reserved_barcode", default=False
13901390
)
13911391
server_type = get_server_type_from_req(req)
13921392
countries = get_countries_from_req(req)
13931393
# filter by annotation campaigns
1394-
campaigns: Optional[list[str]] = req.get_param_as_list("campaigns") or None
1394+
campaigns: list[str] | None = req.get_param_as_list("campaigns") or None
13951395

13961396
if campaigns is None:
13971397
# `campaign` is a deprecated field, use campaigns now instead
1398-
campaign: Optional[str] = req.get_param("campaign")
1398+
campaign: str | None = req.get_param("campaign")
13991399
campaigns = [campaign] if campaign is not None else None
14001400

14011401
predictor = req.get_param("predictor")
@@ -1404,7 +1404,7 @@ def get_questions_resource_on_get(
14041404
# hash of the IPs as a backup.
14051405
device_id = device_id_from_request(req)
14061406

1407-
auth: Optional[OFFAuthentication] = parse_auth(req)
1407+
auth: OFFAuthentication | None = parse_auth(req)
14081408

14091409
if reserved_barcode:
14101410
# Include all results, including non reserved barcodes
@@ -1542,10 +1542,10 @@ def on_get(self, req: falcon.Request, resp: falcon.Response):
15421542
response: JSONType = {}
15431543
count: int = req.get_param_as_int("count", min_value=1, default=25)
15441544
page: int = req.get_param_as_int("page", min_value=1, default=1)
1545-
with_predictions: Optional[bool] = req.get_param_as_bool(
1545+
with_predictions: bool | None = req.get_param_as_bool(
15461546
"with_predictions", default=False
15471547
)
1548-
barcode: Optional[str] = normalize_req_barcode(req.get_param("barcode"))
1548+
barcode: str | None = normalize_req_barcode(req.get_param("barcode"))
15491549
server_type = get_server_type_from_req(req)
15501550

15511551
get_images_ = functools.partial(
@@ -1573,9 +1573,9 @@ class PredictionCollection:
15731573
def on_get(self, req: falcon.Request, resp: falcon.Response):
15741574
page: int = req.get_param_as_int("page", min_value=1, default=1)
15751575
count: int = req.get_param_as_int("count", min_value=1, default=25)
1576-
barcode: Optional[str] = normalize_req_barcode(req.get_param("barcode"))
1576+
barcode: str | None = normalize_req_barcode(req.get_param("barcode"))
15771577
value_tag: str = req.get_param("value_tag")
1578-
keep_types: Optional[list[str]] = req.get_param_as_list("types", required=False)
1578+
keep_types: list[str] | None = req.get_param_as_list("types", required=False)
15791579
server_type = get_server_type_from_req(req)
15801580

15811581
if keep_types:
@@ -1614,15 +1614,15 @@ def on_get(self, req: falcon.Request, resp: falcon.Response):
16141614
count: int = req.get_param_as_int("count", min_value=1, default=25)
16151615
insight_type: str = req.get_param("type")
16161616
countries = get_countries_from_req(req)
1617-
reserved_barcode: Optional[bool] = req.get_param_as_bool(
1617+
reserved_barcode: bool | None = req.get_param_as_bool(
16181618
"reserved_barcode", default=False
16191619
)
16201620
server_type = get_server_type_from_req(req)
16211621
# filter by annotation campaigns
1622-
campaigns: Optional[list[str]] = req.get_param_as_list("campaigns") or None
1622+
campaigns: list[str] | None = req.get_param_as_list("campaigns") or None
16231623
if campaigns is None:
16241624
# `campaign` is a deprecated field, use campaigns now instead
1625-
campaign: Optional[str] = req.get_param("campaign")
1625+
campaign: str | None = req.get_param("campaign")
16261626
campaigns = [campaign] if campaign is not None else None
16271627

16281628
predictor = req.get_param("predictor")
@@ -1660,9 +1660,9 @@ def on_get(self, req: falcon.Request, resp: falcon.Response):
16601660
response: JSONType = {}
16611661
count: int = req.get_param_as_int("count", min_value=1, default=25)
16621662
page: int = req.get_param_as_int("page", min_value=1, default=1)
1663-
with_logo: Optional[bool] = req.get_param_as_bool("with_logo", default=False)
1664-
barcode: Optional[str] = normalize_req_barcode(req.get_param("barcode"))
1665-
type: Optional[str] = req.get_param("type")
1663+
with_logo: bool | None = req.get_param_as_bool("with_logo", default=False)
1664+
barcode: str | None = normalize_req_barcode(req.get_param("barcode"))
1665+
type: str | None = req.get_param("type")
16661666
server_type = get_server_type_from_req(req)
16671667

16681668
query_parameters = {
@@ -1695,9 +1695,9 @@ def on_get(self, req: falcon.Request, resp: falcon.Response):
16951695
class LogoAnnotationCollection:
16961696
def on_get(self, req: falcon.Request, resp: falcon.Response):
16971697
response: JSONType = {}
1698-
barcode: Optional[str] = normalize_req_barcode(req.get_param("barcode"))
1698+
barcode: str | None = normalize_req_barcode(req.get_param("barcode"))
16991699
server_type = get_server_type_from_req(req)
1700-
keep_types: Optional[list[str]] = req.get_param_as_list("types", required=False)
1700+
keep_types: list[str] | None = req.get_param_as_list("types", required=False)
17011701
value_tag: str = req.get_param("value_tag")
17021702
page: int = req.get_param_as_int("page", min_value=1, default=1)
17031703
count: int = req.get_param_as_int("count", min_value=1, default=25)

robotoff/app/core.py

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import datetime
22
import functools
33
from enum import Enum
4-
from typing import Iterable, Literal, NamedTuple, Optional, Union
4+
from typing import Iterable, Literal, NamedTuple, Union
55

66
import falcon
77
import peewee
@@ -65,27 +65,27 @@ def _add_vote_exclusion_clause(exclusion: SkipVotedOn) -> peewee.Expression:
6565

6666

6767
def get_insights(
68-
barcode: Optional[str] = None,
68+
barcode: str | None = None,
6969
server_type: ServerType = ServerType.off,
70-
keep_types: Optional[list[str]] = None,
71-
countries: Optional[list[Country]] = None,
72-
brands: Optional[list[str]] = None,
73-
annotated: Optional[bool] = False,
74-
annotation: Optional[int] = None,
75-
order_by: Optional[Literal["random", "popularity", "n_votes", "confidence"]] = None,
76-
value_tag: Optional[str] = None,
77-
reserved_barcode: Optional[bool] = None,
70+
keep_types: list[str] | None = None,
71+
countries: list[Country] | None = None,
72+
brands: list[str] | None = None,
73+
annotated: bool | None = False,
74+
annotation: int | None = None,
75+
order_by: Literal["random", "popularity", "n_votes", "confidence"] | None = None,
76+
value_tag: str | None = None,
77+
reserved_barcode: bool | None = None,
7878
as_dict: bool = False,
79-
limit: Optional[int] = 25,
80-
offset: Optional[int] = None,
79+
limit: int | None = 25,
80+
offset: int | None = None,
8181
count: bool = False,
82-
max_count: Optional[int] = None,
83-
avoid_voted_on: Optional[SkipVotedOn] = None,
84-
group_by_value_tag: Optional[bool] = False,
85-
automatically_processable: Optional[bool] = None,
86-
campaigns: Optional[list[str]] = None,
87-
predictor: Optional[str] = None,
88-
lc: Optional[list[str]] = None,
82+
max_count: int | None = None,
83+
avoid_voted_on: SkipVotedOn | None = None,
84+
group_by_value_tag: bool | None = False,
85+
automatically_processable: bool | None = None,
86+
campaigns: list[str] | None = None,
87+
predictor: str | None = None,
88+
lc: list[str] | None = None,
8989
) -> Iterable[ProductInsight]:
9090
"""Fetch insights that meet the criteria passed as parameters.
9191
@@ -237,11 +237,11 @@ def get_insights(
237237

238238
def get_images(
239239
server_type: ServerType,
240-
with_predictions: Optional[bool] = False,
241-
barcode: Optional[str] = None,
242-
offset: Optional[int] = None,
240+
with_predictions: bool | None = False,
241+
barcode: str | None = None,
242+
offset: int | None = None,
243243
count: bool = False,
244-
limit: Optional[int] = None,
244+
limit: int | None = None,
245245
) -> Iterable[ImageModel]:
246246
where_clauses = [ImageModel.server_type == server_type.name]
247247

@@ -273,11 +273,11 @@ def get_images(
273273

274274
def get_predictions(
275275
server_type: ServerType,
276-
barcode: Optional[str] = None,
277-
keep_types: Optional[list[str]] = None,
278-
value_tag: Optional[str] = None,
279-
limit: Optional[int] = None,
280-
offset: Optional[int] = None,
276+
barcode: str | None = None,
277+
keep_types: list[str] | None = None,
278+
value_tag: str | None = None,
279+
limit: int | None = None,
280+
offset: int | None = None,
281281
count: bool = False,
282282
) -> Iterable[Prediction]:
283283
where_clauses = [Prediction.server_type == server_type.name]
@@ -374,8 +374,8 @@ def save_annotation(
374374
annotation: InsightAnnotation,
375375
device_id: str,
376376
update: bool = True,
377-
data: Optional[dict] = None,
378-
auth: Optional[OFFAuthentication] = None,
377+
data: dict | None = None,
378+
auth: OFFAuthentication | None = None,
379379
trusted_annotator: bool = False,
380380
) -> AnnotationResult:
381381
"""Saves annotation either by using a single response as ground truth or
@@ -493,11 +493,11 @@ def save_annotation(
493493

494494
def get_logo_annotation(
495495
server_type: ServerType,
496-
barcode: Optional[str] = None,
497-
keep_types: Optional[list[str]] = None,
498-
value_tag: Optional[str] = None,
499-
limit: Optional[int] = 25,
500-
offset: Optional[int] = None,
496+
barcode: str | None = None,
497+
keep_types: list[str] | None = None,
498+
value_tag: str | None = None,
499+
limit: int | None = 25,
500+
offset: int | None = None,
501501
count: bool = False,
502502
) -> Iterable[LogoAnnotation]:
503503
"""Return logos that fit the criteria passed as parameters.
@@ -550,7 +550,7 @@ def get_logo_annotation(
550550

551551

552552
def update_logo_annotations(
553-
annotation_logos: list[tuple[str, Optional[str], LogoAnnotation]],
553+
annotation_logos: list[tuple[str, str | None, LogoAnnotation]],
554554
username: str,
555555
completed_at: datetime.datetime,
556556
) -> list[LogoAnnotation]:
@@ -582,7 +582,7 @@ def update_logo_annotations(
582582
return updated_logos
583583

584584

585-
def filter_question_insight_types(keep_types: Optional[list[str]]):
585+
def filter_question_insight_types(keep_types: list[str] | None):
586586
"""Utility function to validate `insight_types` parameters in /questions/*
587587
queries.
588588

robotoff/app/events.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from multiprocessing import Process, SimpleQueue
2-
from typing import Optional
32

43
import requests
54

@@ -49,8 +48,8 @@ def send_event(
4948
event_type: str,
5049
user_id: str,
5150
device_id: str,
52-
barcode: Optional[str] = None,
53-
server_type: Optional[str] = None,
51+
barcode: str | None = None,
52+
server_type: str | None = None,
5453
):
5554
event = {
5655
"event_type": event_type,

robotoff/batch/launch.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import datetime
22
import re
33
from pathlib import Path
4-
from typing import Dict, List, Optional
4+
from typing import Dict, List
55

66
import yaml
77
from google.cloud import batch_v1
@@ -26,7 +26,7 @@ class GoogleBatchJobConfig(BaseModel):
2626
container_image_uri: str = Field(
2727
description="The URI of the container image to use for the job. SHould be a valid Image URI.",
2828
)
29-
entrypoint: Optional[str] = Field(
29+
entrypoint: str | None = Field(
3030
default=None,
3131
description="The entrypoint for the container. If None, use default entrypoint.",
3232
examples=["python main.py"],
@@ -46,7 +46,7 @@ class GoogleBatchJobConfig(BaseModel):
4646
description="The amount of RAM in MiB to allocate to each CPU core.",
4747
le=64000,
4848
)
49-
boot_disk_mib: Optional[int] = Field(
49+
boot_disk_mib: int | None = Field(
5050
default=None,
5151
description="The size of the boot disk in MiB. It is deleted once the job finished. If None, no bootDisk is added.",
5252
le=200000, # 200 GB

0 commit comments

Comments
 (0)