Skip to content

Commit cde249b

Browse files
authored
Type fixes for util modules (#322)
* fix typing for utils * fix typing for main
1 parent f268181 commit cde249b

15 files changed

+123
-105
lines changed

main.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from phenoback.utils import glogging
1616

1717

18-
def sentry_environment() -> tuple[str, float]:
18+
def sentry_environment() -> tuple[str, float, float]:
1919
project = g.get_project()
2020
if project == "phaenonet":
2121
return ("production", 1.0, 0.0)
@@ -38,11 +38,11 @@ def sentry_environment() -> tuple[str, float]:
3838
options={"storageBucket": os.environ.get("storageBucket")}
3939
)
4040

41-
log: logging.Logger = None # pylint: disable=invalid-name
41+
log: logging.Logger = None # type: ignore # pylint: disable=invalid-name
4242

4343

4444
@contextmanager # workaround as stackdriver fails to capture stackstraces
45-
def setup(data: dict | Request | None, context=None, level=logging.DEBUG):
45+
def setup(data: str | dict | Request | None, context=None, level=logging.DEBUG):
4646
"""
4747
Setup logging and and capture exceptions.
4848
:param data: May be a dict, a http request or None.
@@ -56,8 +56,10 @@ def setup(data: dict | Request | None, context=None, level=logging.DEBUG):
5656
log.debug(context)
5757
if data:
5858
if isinstance(data, Request):
59-
data = data.json if data.is_json else data.data
60-
log.debug(data)
59+
data_logged = data.json if data.is_json else data.data
60+
else:
61+
data_logged = data
62+
log.debug(data_logged)
6163
yield
6264
except Exception:
6365
log.exception("Fatal error in cloud function")

phenoback/functions/iot/app.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import logging
33
from zoneinfo import ZoneInfo
44

5-
import google
5+
import google.api_core.exceptions
66

77
import phenoback.utils.data as d
88
import phenoback.utils.firestore as f
@@ -27,7 +27,7 @@ def main_individual_updated(data, context):
2727
if g.get_field(data, "deveui", expected=False):
2828
individual = g.get_field(data, "individual")
2929
deveui = g.get_field(data, "deveui")
30-
sensor_set(individual_id, individual, deveui)
30+
sensor_set(individual_id, individual, deveui) # type: ignore
3131
else:
3232
remove_sensor(individual_id)
3333

phenoback/functions/iot/decoder.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ def get_value(self, start, length, signed=False):
1414
return value
1515

1616
@property
17-
def data(self):
17+
def data(self) -> dict:
1818
return self._data
1919

2020
@property
21-
def uplink(self) -> dict:
21+
def uplink(self) -> dict | None:
2222
return self.data.get("DevEUI_uplink")
2323

2424
@property
@@ -30,7 +30,7 @@ def payload(self) -> str:
3030
return self.data.get("DevEUI_uplink", {}).get("payload_hex")
3131

3232
@property
33-
def decoded_payload(self) -> str:
33+
def decoded_payload(self) -> dict:
3434
return self.data.get("DevEUI_uplink", {}).get("decoded_payload")
3535

3636
def _set_decoded_payload(self, data: dict) -> None:

phenoback/functions/iot/dragino.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818

1919

2020
def main(request: Request):
21-
if request.is_json:
21+
if request.is_json and request.json:
2222
process_dragino(request.json)
2323
else: # pragma: no cover
24-
log.error("No json headers found")
24+
log.error("No json headers set or payload is None")
2525
return Response("No json payload", HTTPStatus.BAD_REQUEST)
2626
return Response("ok", HTTPStatus.OK)
2727

@@ -52,7 +52,7 @@ def process_dragino(data: dict) -> None:
5252
log.debug("No uplink data, skip")
5353

5454

55-
def set_uplink_frequency(deveui: str, interval: int, at: datetime = None):
55+
def set_uplink_frequency(deveui: str, interval: int, at: datetime | None = None):
5656
log.info("set uplink frequency to %is for %s at %s", interval, deveui, at)
5757
task_client().send(
5858
"",
@@ -61,7 +61,7 @@ def set_uplink_frequency(deveui: str, interval: int, at: datetime = None):
6161
"Payload": f"{16777216 + interval:{0}8x}",
6262
"FPort": 1,
6363
},
64-
at=at,
64+
at=at, # type: ignore
6565
)
6666

6767

phenoback/utils/data.py

+26-15
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def get_phenoyear(reset_cache=False) -> int:
5656
return _get_dynamic_config()["phenoyear"]
5757

5858

59-
def update_phenoyear(year: int, transaction: Transaction = None) -> None:
59+
def update_phenoyear(year: int, transaction: Transaction | None = None) -> None:
6060
write_document(
6161
"definitions",
6262
"config_dynamic",
@@ -67,11 +67,15 @@ def update_phenoyear(year: int, transaction: Transaction = None) -> None:
6767
_get_dynamic_config.cache_clear()
6868

6969

70-
def get_individual(individual_id: str, transaction: Transaction = None) -> dict:
70+
def get_individual(
71+
individual_id: str, transaction: Transaction | None = None
72+
) -> dict | None:
7173
return get_document("individuals", individual_id, transaction=transaction)
7274

7375

74-
def delete_individual(individual_id: str, transaction: Transaction = None) -> None:
76+
def delete_individual(
77+
individual_id: str, transaction: Transaction | None = None
78+
) -> None:
7579
delete_document("individuals", individual_id, transaction=transaction)
7680

7781

@@ -84,7 +88,7 @@ def query_individuals(field_path: str, op_string: str, value: Any) -> Query:
8488

8589

8690
def write_individuals(
87-
individuals: list[dict], key: str, transaction: Transaction = None
91+
individuals: list[dict], key: str, transaction: Transaction | None = None
8892
) -> None:
8993
if transaction is not None:
9094
write_batch("individuals", key, individuals, transaction=transaction)
@@ -93,35 +97,42 @@ def write_individuals(
9397

9498

9599
def write_individual(
96-
individual_id: str, data: dict, merge: bool = False, transaction: Transaction = None
100+
individual_id: str,
101+
data: dict,
102+
merge: bool = False,
103+
transaction: Transaction | None = None,
97104
) -> None:
98105
write_document(
99106
"individuals", individual_id, data, merge=merge, transaction=transaction
100107
)
101108

102109

103110
def update_individual(
104-
individual_id: str, data: dict, transaction: Transaction = None
111+
individual_id: str, data: dict, transaction: Transaction | None = None
105112
) -> None:
106113
update_document("individuals", individual_id, data, transaction=transaction)
107114

108115

109-
def get_observation(observation_id: str, transaction: Transaction = None) -> dict:
116+
def get_observation(
117+
observation_id: str, transaction: Transaction | None = None
118+
) -> dict | None:
110119
return get_document("observations", observation_id, transaction=transaction)
111120

112121

113122
def update_observation(
114-
observation_id: str, data: dict, transaction: Transaction = None
123+
observation_id: str, data: dict, transaction: Transaction | None = None
115124
) -> None:
116125
update_document("observations", observation_id, data, transaction=transaction)
117126

118127

119-
def delete_observation(observation_id: str, transaction: Transaction = None) -> None:
128+
def delete_observation(
129+
observation_id: str, transaction: Transaction | None = None
130+
) -> None:
120131
delete_document("observations", observation_id, transaction=transaction)
121132

122133

123134
def write_observation(
124-
observation_id: str, data: dict, transaction: Transaction = None
135+
observation_id: str | None, data: dict, transaction: Transaction | None = None
125136
) -> None:
126137
write_document("observations", observation_id, data, transaction=transaction)
127138

@@ -145,7 +156,7 @@ def create_user(
145156
)
146157

147158

148-
def get_user(user_id: str, transaction: Transaction = None) -> dict:
159+
def get_user(user_id: str, transaction: Transaction | None = None) -> dict | None:
149160
return get_document("users", user_id, transaction=transaction)
150161

151162

@@ -166,7 +177,7 @@ def get_user_id_by_email(email: str) -> str: # pragma: no cover
166177

167178

168179
def follow_user(
169-
follower_id: str, followee_id: str, transaction: Transaction = None
180+
follower_id: str, followee_id: str, transaction: Transaction | None = None
170181
) -> bool:
171182
user = get_user(follower_id, transaction=transaction)
172183
if not user:
@@ -192,17 +203,17 @@ def has_sensor(individual: dict) -> bool:
192203
return individual.get("sensor") is not None
193204

194205

195-
def localtime(timestamp: datetime = None):
206+
def localtime(timestamp: datetime | None = None):
196207
if not timestamp:
197208
timestamp = datetime.now(tz=tzlocal.get_localzone())
198209
return timestamp.astimezone(ZoneInfo("Europe/Zurich"))
199210

200211

201-
def localdate(timestamp: datetime = None):
212+
def localdate(timestamp: datetime | None = None):
202213
return localtime(timestamp).date()
203214

204215

205-
def to_id_array(data: dict[dict], key="id") -> list[dict]:
216+
def to_id_array(data: dict[str, dict], key="id") -> list[dict]:
206217
"""
207218
Convert a dictionary to an array of dictionaries with an additional key.
208219
Useful for writing data in batch mode.

phenoback/utils/firestore.py

+11-16
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def transaction_commit():
5555

5656

5757
def delete_document(
58-
collection: str, document_id: str, transaction: Transaction = None
58+
collection: str, document_id: str, transaction: Transaction | None = None
5959
) -> None:
6060
log.debug("Delete document %s from %s", document_id, collection)
6161
ref = firestore_client().collection(collection).document(document_id)
@@ -80,8 +80,8 @@ def _delete_batch(coll_ref, batch_size: int = 1000):
8080
return None
8181

8282

83-
def delete_collection(collection: str, batch_size: int = 1000) -> None:
84-
_delete_batch(get_collection(collection), batch_size)
83+
def delete_collection(collection_name: str, batch_size: int = 1000) -> None:
84+
_delete_batch(collection(collection_name), batch_size)
8585

8686

8787
def delete_batch(
@@ -125,8 +125,8 @@ def write_batch(
125125
data: list[dict],
126126
*,
127127
merge: bool = False,
128-
commit_size: int = None,
129-
transaction: Transaction = None,
128+
commit_size: int | None = None,
129+
transaction: Transaction | None = None,
130130
commit_sleep: float = 0,
131131
) -> int:
132132
if transaction is not None:
@@ -168,7 +168,7 @@ def write_document(
168168
document_id: str | None,
169169
data: dict,
170170
merge: bool = False,
171-
transaction: Transaction = None,
171+
transaction: Transaction | None = None,
172172
) -> None:
173173
log.debug(
174174
"Write document %s to %s (%s)",
@@ -187,7 +187,7 @@ def update_document(
187187
collection: str,
188188
document_id: str,
189189
data: dict,
190-
transaction: Transaction = None,
190+
transaction: Transaction | None = None,
191191
) -> None:
192192
log.debug(
193193
"Update document %s in %s (%s)",
@@ -203,7 +203,7 @@ def update_document(
203203

204204

205205
def get_document(
206-
collection: str, document_id: str, transaction: Transaction = None
206+
collection: str, document_id: str, transaction: Transaction | None = None
207207
) -> dict | None:
208208
log.debug(
209209
"Get document %s in %s (%s)",
@@ -220,7 +220,7 @@ def get_document(
220220
)
221221

222222

223-
def collection(collection: str) -> Query:
223+
def collection(collection: str) -> CollectionReference:
224224
log.debug("Query %s", collection)
225225
return firestore_client().collection(collection)
226226

@@ -236,13 +236,8 @@ def query_collection(
236236
)
237237

238238

239-
def get_collection(collection: str) -> CollectionReference:
240-
log.debug("Query collection %s", collection)
241-
return firestore_client().collection(collection)
242-
243-
244-
def get_collection_documents(collection: str) -> list[dict]:
245-
return [location.to_dict() for location in get_collection(collection).stream()]
239+
def get_collection_documents(collection_name: str) -> list[dict]:
240+
return [location.to_dict() for location in collection(collection_name).stream()]
246241

247242

248243
def docs2str(docs): # pragma: no cover

phenoback/utils/gcloud.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import json
44
import logging
55
import os
6-
from collections import namedtuple
76
from datetime import datetime
87

98
import dateparser
@@ -15,7 +14,7 @@
1514

1615
def get_field(
1716
data: dict, fieldname: str, old_value: bool = False, expected=True
18-
) -> str | int | datetime | None:
17+
) -> str | int | float | datetime | bool | dict | list | None:
1918
value_type = "oldValue" if old_value else "value"
2019
value_dict = data[value_type].get("fields", {}).get(fieldname)
2120
if value_dict is not None:
@@ -28,7 +27,9 @@ def get_field(
2827
return None
2928

3029

31-
def _get_field(value_dict: dict):
30+
def _get_field(
31+
value_dict: dict,
32+
) -> str | int | float | datetime | bool | dict | list | None:
3233
value = next(iter(value_dict.values()))
3334
value_type = next(iter(value_dict.keys()))
3435
if value_type == "stringValue":
@@ -63,7 +64,7 @@ def context2dict(context: Context) -> dict:
6364
return context.__dict__
6465

6566

66-
def dict2context(context_dict) -> namedtuple:
67+
def dict2context(context_dict) -> Context:
6768
return Context(
6869
eventId=context_dict.get("event_id"),
6970
timestamp=context_dict.get("timestamp"),

phenoback/utils/pubsub.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ def __init__(self, topic: str) -> None:
1717
self.topic_path = self.client.topic_path(self.project, self.topic)
1818
log.debug("Publisher created for topic %s", self.topic)
1919

20-
def send(
21-
self, payload: dict | str, metadata: dict[str, bytes | str] = None
22-
) -> None:
20+
def send(self, payload: dict | str, metadata: dict[str, str] | None = None) -> None:
2321
if metadata is None:
2422
metadata = {}
2523
if isinstance(payload, dict):

0 commit comments

Comments
 (0)