Skip to content

Commit 3ba9b3c

Browse files
committed
Add missing type annotations to updater
Add missing annotations and partially resolve mypy errors in updater.py and trusted_metadata_set.py Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
1 parent 2c164dd commit 3ba9b3c

2 files changed

Lines changed: 25 additions & 26 deletions

File tree

tuf/ngclient/_internal/trusted_metadata_set.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def __init__(self, root_data: bytes):
9292
RepositoryError: Metadata failed to load or verify. The actual
9393
error type and content will contain more details.
9494
"""
95-
self._trusted_set = {} # type: Dict[str: Metadata]
95+
self._trusted_set: Dict[str, Metadata] = {}
9696
self.reference_time = datetime.utcnow()
9797

9898
# Load and validate the local root metadata. Valid initial trusted root
@@ -134,7 +134,7 @@ def targets(self) -> Optional[Metadata]:
134134
return self._trusted_set.get("targets")
135135

136136
# Methods for updating metadata
137-
def update_root(self, data: bytes):
137+
def update_root(self, data: bytes) -> None:
138138
"""Verifies and loads 'data' as new root metadata.
139139
140140
Note that an expired intermediate root is considered valid: expiry is
@@ -175,7 +175,7 @@ def update_root(self, data: bytes):
175175
self._trusted_set["root"] = new_root
176176
logger.debug("Updated root")
177177

178-
def update_timestamp(self, data: bytes):
178+
def update_timestamp(self, data: bytes) -> None:
179179
"""Verifies and loads 'data' as new timestamp metadata.
180180
181181
Note that an expired intermediate timestamp is considered valid so it
@@ -237,7 +237,7 @@ def update_timestamp(self, data: bytes):
237237
self._trusted_set["timestamp"] = new_timestamp
238238
logger.debug("Updated timestamp")
239239

240-
def update_snapshot(self, data: bytes):
240+
def update_snapshot(self, data: bytes) -> None:
241241
"""Verifies and loads 'data' as new snapshot metadata.
242242
243243
Note that intermediate snapshot is considered valid even if it is
@@ -314,7 +314,9 @@ def update_snapshot(self, data: bytes):
314314
self._trusted_set["snapshot"] = new_snapshot
315315
logger.debug("Updated snapshot")
316316

317-
def _check_final_snapshot(self):
317+
def _check_final_snapshot(self) -> None:
318+
"""Check snapshot expiry and version before targets is updated"""
319+
318320
if self.snapshot.signed.is_expired(self.reference_time):
319321
raise exceptions.ExpiredMetadataError("snapshot.json is expired")
320322

@@ -328,7 +330,7 @@ def _check_final_snapshot(self):
328330
f"got {self.snapshot.signed.version}"
329331
)
330332

331-
def update_targets(self, data: bytes):
333+
def update_targets(self, data: bytes) -> None:
332334
"""Verifies and loads 'data' as new top-level targets metadata.
333335
334336
Args:
@@ -342,7 +344,7 @@ def update_targets(self, data: bytes):
342344

343345
def update_delegated_targets(
344346
self, data: bytes, role_name: str, delegator_name: str
345-
):
347+
) -> None:
346348
"""Verifies and loads 'data' as new metadata for target 'role_name'.
347349
348350
Args:

tuf/ngclient/updater.py

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
from securesystemslib import util as sslib_util
6969

7070
from tuf import exceptions
71-
from tuf.api.metadata import Targets
71+
from tuf.api.metadata import TargetFile, Targets
7272
from tuf.ngclient._internal import requests_fetcher, trusted_metadata_set
7373
from tuf.ngclient.config import UpdaterConfig
7474
from tuf.ngclient.fetcher import FetcherInterface
@@ -112,12 +112,7 @@ def __init__(
112112
# Read trusted local root metadata
113113
data = self._load_local_metadata("root")
114114
self._trusted_set = trusted_metadata_set.TrustedMetadataSet(data)
115-
116-
if fetcher is None:
117-
self._fetcher = requests_fetcher.RequestsFetcher()
118-
else:
119-
self._fetcher = fetcher
120-
115+
self._fetcher = fetcher or requests_fetcher.RequestsFetcher()
121116
self.config = config or UpdaterConfig()
122117

123118
def refresh(self) -> None:
@@ -205,7 +200,7 @@ def updated_targets(
205200
# 'destination_directory' if 'filepath' contains a leading path
206201
# separator (i.e., is treated as an absolute path).
207202
filepath = target["filepath"]
208-
target_fileinfo: "TargetFile" = target["fileinfo"]
203+
target_fileinfo: TargetFile = target["fileinfo"]
209204

210205
target_filepath = os.path.join(destination_directory, filepath)
211206

@@ -225,10 +220,10 @@ def updated_targets(
225220

226221
def download_target(
227222
self,
228-
targetinfo: Dict,
223+
targetinfo: Dict[str, Any],
229224
destination_directory: str,
230225
target_base_url: Optional[str] = None,
231-
):
226+
) -> None:
232227
"""Downloads the target file specified by 'targetinfo'.
233228
234229
Args:
@@ -244,18 +239,20 @@ def download_target(
244239
TODO: download-related errors
245240
TODO: file write errors
246241
"""
247-
if target_base_url is None and self._target_base_url is None:
248-
raise ValueError(
249-
"target_base_url must be set in either download_target() or "
250-
"constructor"
251-
)
242+
252243
if target_base_url is None:
244+
if self._target_base_url is None:
245+
raise ValueError(
246+
"target_base_url must be set in either "
247+
"download_target() or constructor"
248+
)
249+
253250
target_base_url = self._target_base_url
254251
else:
255252
target_base_url = _ensure_trailing_slash(target_base_url)
256253

257-
target_fileinfo: "TargetFile" = targetinfo["fileinfo"]
258-
target_filepath = targetinfo["filepath"]
254+
target_fileinfo: TargetFile = targetinfo["fileinfo"]
255+
target_filepath: str = targetinfo["filepath"]
259256
consistent_snapshot = self._trusted_set.root.signed.consistent_snapshot
260257
if consistent_snapshot and self.config.prefix_targets_with_hash:
261258
hashes = list(target_fileinfo.hashes.values())
@@ -293,7 +290,7 @@ def _load_local_metadata(self, rolename: str) -> bytes:
293290
with open(os.path.join(self._dir, f"{rolename}.json"), "rb") as f:
294291
return f.read()
295292

296-
def _persist_metadata(self, rolename: str, data: bytes):
293+
def _persist_metadata(self, rolename: str, data: bytes) -> None:
297294
with open(os.path.join(self._dir, f"{rolename}.json"), "wb") as f:
298295
f.write(data)
299296

@@ -454,6 +451,6 @@ def _preorder_depth_first_walk(
454451
return None
455452

456453

457-
def _ensure_trailing_slash(url: str):
454+
def _ensure_trailing_slash(url: str) -> str:
458455
"""Return url guaranteed to end in a slash"""
459456
return url if url.endswith("/") else f"{url}/"

0 commit comments

Comments
 (0)