From 60f93d2d485286ef64c2e7417c8bf38e7544f75f Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Wed, 25 Feb 2026 08:46:01 +0000 Subject: [PATCH 1/3] Add from_response_dict classmethods to report classes Centralize API response parsing logic into classmethods on DatabaseSummaryReport, TargetSummaryReport, TargetStatusAndRecord, and QueryResult. This eliminates 75 lines of duplicated construction code across sync/async VWS and query clients. Co-Authored-By: Claude Haiku 4.5 --- src/vws/async_query.py | 28 ++--------------- src/vws/async_vws.py | 64 ++----------------------------------- src/vws/query.py | 28 ++--------------- src/vws/reports.py | 71 ++++++++++++++++++++++++++++++++++++++++++ src/vws/vws.py | 44 ++------------------------ 5 files changed, 81 insertions(+), 154 deletions(-) diff --git a/src/vws/async_query.py b/src/vws/async_query.py index 56981d4e1..ae5dd7e2b 100644 --- a/src/vws/async_query.py +++ b/src/vws/async_query.py @@ -2,7 +2,6 @@ Web APIs. """ -import datetime import json from http import HTTPMethod, HTTPStatus from typing import Any, Self @@ -25,7 +24,7 @@ ServerError, ) from vws.include_target_data import CloudRecoIncludeTargetData -from vws.reports import QueryResult, TargetData +from vws.reports import QueryResult from vws.transports import AsyncHTTPXTransport, AsyncTransport @@ -197,30 +196,7 @@ async def query( }[result_code] raise exception(response=response) - result: list[QueryResult] = [] result_list = list( json.loads(s=response.text)["results"], ) - for item in result_list: - target_data: TargetData | None = None - if "target_data" in item: - target_data_dict = item["target_data"] - metadata = target_data_dict["application_metadata"] - timestamp_string = target_data_dict["target_timestamp"] - target_timestamp = datetime.datetime.fromtimestamp( - timestamp=timestamp_string, - tz=datetime.UTC, - ) - target_data = TargetData( - name=target_data_dict["name"], - application_metadata=metadata, - target_timestamp=target_timestamp, - ) - - query_result = QueryResult( - target_id=item["target_id"], - target_data=target_data, - ) - - result.append(query_result) - return result + return [QueryResult.from_response_dict(item) for item in result_list] diff --git a/src/vws/async_vws.py b/src/vws/async_vws.py index f0f9005a1..a86efd287 100644 --- a/src/vws/async_vws.py +++ b/src/vws/async_vws.py @@ -3,7 +3,6 @@ import asyncio import base64 import json -from datetime import date from http import HTTPMethod, HTTPStatus from typing import Self @@ -38,7 +37,6 @@ ) from vws.reports import ( DatabaseSummaryReport, - TargetRecord, TargetStatusAndRecord, TargetStatuses, TargetSummaryReport, @@ -298,20 +296,7 @@ async def get_target_record(self, target_id: str) -> TargetStatusAndRecord: ) result_data = json.loads(s=response.text) - status = TargetStatuses(value=result_data["status"]) - target_record_dict = dict(result_data["target_record"]) - target_record = TargetRecord( - target_id=target_record_dict["target_id"], - active_flag=bool(target_record_dict["active_flag"]), - name=target_record_dict["name"], - width=float(target_record_dict["width"]), - tracking_rating=int(target_record_dict["tracking_rating"]), - reco_rating=target_record_dict["reco_rating"], - ) - return TargetStatusAndRecord( - status=status, - target_record=target_record, - ) + return TargetStatusAndRecord.from_response_dict(result_data) async def wait_for_target_processed( self, @@ -446,27 +431,7 @@ async def get_target_summary_report( ) result_data = dict(json.loads(s=response.text)) - return TargetSummaryReport( - status=TargetStatuses( - value=result_data["status"], - ), - database_name=result_data["database_name"], - target_name=result_data["target_name"], - upload_date=date.fromisoformat( - result_data["upload_date"], - ), - active_flag=bool(result_data["active_flag"]), - tracking_rating=int( - result_data["tracking_rating"], - ), - total_recos=int(result_data["total_recos"]), - current_month_recos=int( - result_data["current_month_recos"], - ), - previous_month_recos=int( - result_data["previous_month_recos"], - ), - ) + return TargetSummaryReport.from_response_dict(result_data) async def get_database_summary_report( self, @@ -501,30 +466,7 @@ async def get_database_summary_report( ) response_data = dict(json.loads(s=response.text)) - return DatabaseSummaryReport( - active_images=int(response_data["active_images"]), - current_month_recos=int( - response_data["current_month_recos"], - ), - failed_images=int(response_data["failed_images"]), - inactive_images=int( - response_data["inactive_images"], - ), - name=str(object=response_data["name"]), - previous_month_recos=int( - response_data["previous_month_recos"], - ), - processing_images=int( - response_data["processing_images"], - ), - reco_threshold=int( - response_data["reco_threshold"], - ), - request_quota=int(response_data["request_quota"]), - request_usage=int(response_data["request_usage"]), - target_quota=int(response_data["target_quota"]), - total_recos=int(response_data["total_recos"]), - ) + return DatabaseSummaryReport.from_response_dict(response_data) async def delete_target(self, target_id: str) -> None: """Delete a given target. diff --git a/src/vws/query.py b/src/vws/query.py index 4b5433f38..2c682eb1c 100644 --- a/src/vws/query.py +++ b/src/vws/query.py @@ -1,6 +1,5 @@ """Tools for interacting with the Vuforia Cloud Recognition Web APIs.""" -import datetime import json from http import HTTPMethod, HTTPStatus from typing import Any @@ -23,7 +22,7 @@ ServerError, ) from vws.include_target_data import CloudRecoIncludeTargetData -from vws.reports import QueryResult, TargetData +from vws.reports import QueryResult from vws.transports import RequestsTransport, Transport @@ -165,28 +164,5 @@ def query( }[result_code] raise exception(response=response) - result: list[QueryResult] = [] result_list = list(json.loads(s=response.text)["results"]) - for item in result_list: - target_data: TargetData | None = None - if "target_data" in item: - target_data_dict = item["target_data"] - metadata = target_data_dict["application_metadata"] - timestamp_string = target_data_dict["target_timestamp"] - target_timestamp = datetime.datetime.fromtimestamp( - timestamp=timestamp_string, - tz=datetime.UTC, - ) - target_data = TargetData( - name=target_data_dict["name"], - application_metadata=metadata, - target_timestamp=target_timestamp, - ) - - query_result = QueryResult( - target_id=item["target_id"], - target_data=target_data, - ) - - result.append(query_result) - return result + return [QueryResult.from_response_dict(item) for item in result_list] diff --git a/src/vws/reports.py b/src/vws/reports.py index e59408aad..55cd3978d 100644 --- a/src/vws/reports.py +++ b/src/vws/reports.py @@ -3,6 +3,7 @@ import datetime from dataclasses import dataclass from enum import Enum, unique +from typing import Any, Self from beartype import BeartypeConf, beartype @@ -29,6 +30,24 @@ class DatabaseSummaryReport: target_quota: int total_recos: int + @classmethod + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: + """Construct from a VWS API response dict.""" + return cls( + active_images=int(response_dict["active_images"]), + current_month_recos=int(response_dict["current_month_recos"]), + failed_images=int(response_dict["failed_images"]), + inactive_images=int(response_dict["inactive_images"]), + name=str(response_dict["name"]), + previous_month_recos=int(response_dict["previous_month_recos"]), + processing_images=int(response_dict["processing_images"]), + reco_threshold=int(response_dict["reco_threshold"]), + request_quota=int(response_dict["request_quota"]), + request_usage=int(response_dict["request_usage"]), + target_quota=int(response_dict["target_quota"]), + total_recos=int(response_dict["total_recos"]), + ) + @beartype @unique @@ -63,6 +82,23 @@ class TargetSummaryReport: current_month_recos: int previous_month_recos: int + @classmethod + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: + """Construct from a VWS API response dict.""" + return cls( + status=TargetStatuses(value=response_dict["status"]), + database_name=response_dict["database_name"], + target_name=response_dict["target_name"], + upload_date=datetime.date.fromisoformat( + response_dict["upload_date"] + ), + active_flag=bool(response_dict["active_flag"]), + tracking_rating=int(response_dict["tracking_rating"]), + total_recos=int(response_dict["total_recos"]), + current_month_recos=int(response_dict["current_month_recos"]), + previous_month_recos=int(response_dict["previous_month_recos"]), + ) + @beartype(conf=BeartypeConf(is_pep484_tower=True)) @dataclass(frozen=True) @@ -103,6 +139,26 @@ class QueryResult: target_id: str target_data: TargetData | None + @classmethod + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: + """Construct from a VWS API query result item dict.""" + target_data: TargetData | None = None + if "target_data" in response_dict: + target_data_dict = response_dict["target_data"] + target_timestamp = datetime.datetime.fromtimestamp( + timestamp=target_data_dict["target_timestamp"], + tz=datetime.UTC, + ) + target_data = TargetData( + name=target_data_dict["name"], + application_metadata=target_data_dict["application_metadata"], + target_timestamp=target_timestamp, + ) + return cls( + target_id=response_dict["target_id"], + target_data=target_data, + ) + @beartype @dataclass(frozen=True) @@ -115,3 +171,18 @@ class TargetStatusAndRecord: status: TargetStatuses target_record: TargetRecord + + @classmethod + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: + """Construct from a VWS API response dict.""" + status = TargetStatuses(value=response_dict["status"]) + target_record_dict = dict(response_dict["target_record"]) + target_record = TargetRecord( + target_id=target_record_dict["target_id"], + active_flag=bool(target_record_dict["active_flag"]), + name=target_record_dict["name"], + width=float(target_record_dict["width"]), + tracking_rating=int(target_record_dict["tracking_rating"]), + reco_rating=target_record_dict["reco_rating"], + ) + return cls(status=status, target_record=target_record) diff --git a/src/vws/vws.py b/src/vws/vws.py index bed87c938..778686155 100644 --- a/src/vws/vws.py +++ b/src/vws/vws.py @@ -3,7 +3,6 @@ import base64 import json import time -from datetime import date from http import HTTPMethod, HTTPStatus from beartype import BeartypeConf, beartype @@ -37,7 +36,6 @@ ) from vws.reports import ( DatabaseSummaryReport, - TargetRecord, TargetStatusAndRecord, TargetStatuses, TargetSummaryReport, @@ -283,20 +281,7 @@ def get_target_record(self, target_id: str) -> TargetStatusAndRecord: ) result_data = json.loads(s=response.text) - status = TargetStatuses(value=result_data["status"]) - target_record_dict = dict(result_data["target_record"]) - target_record = TargetRecord( - target_id=target_record_dict["target_id"], - active_flag=bool(target_record_dict["active_flag"]), - name=target_record_dict["name"], - width=float(target_record_dict["width"]), - tracking_rating=int(target_record_dict["tracking_rating"]), - reco_rating=target_record_dict["reco_rating"], - ) - return TargetStatusAndRecord( - status=status, - target_record=target_record, - ) + return TargetStatusAndRecord.from_response_dict(result_data) def wait_for_target_processed( self, @@ -420,17 +405,7 @@ def get_target_summary_report(self, target_id: str) -> TargetSummaryReport: ) result_data = dict(json.loads(s=response.text)) - return TargetSummaryReport( - status=TargetStatuses(value=result_data["status"]), - database_name=result_data["database_name"], - target_name=result_data["target_name"], - upload_date=date.fromisoformat(result_data["upload_date"]), - active_flag=bool(result_data["active_flag"]), - tracking_rating=int(result_data["tracking_rating"]), - total_recos=int(result_data["total_recos"]), - current_month_recos=int(result_data["current_month_recos"]), - previous_month_recos=int(result_data["previous_month_recos"]), - ) + return TargetSummaryReport.from_response_dict(result_data) def get_database_summary_report(self) -> DatabaseSummaryReport: """Get a summary report for the database. @@ -463,20 +438,7 @@ def get_database_summary_report(self) -> DatabaseSummaryReport: ) response_data = dict(json.loads(s=response.text)) - return DatabaseSummaryReport( - active_images=int(response_data["active_images"]), - current_month_recos=int(response_data["current_month_recos"]), - failed_images=int(response_data["failed_images"]), - inactive_images=int(response_data["inactive_images"]), - name=str(object=response_data["name"]), - previous_month_recos=int(response_data["previous_month_recos"]), - processing_images=int(response_data["processing_images"]), - reco_threshold=int(response_data["reco_threshold"]), - request_quota=int(response_data["request_quota"]), - request_usage=int(response_data["request_usage"]), - target_quota=int(response_data["target_quota"]), - total_recos=int(response_data["total_recos"]), - ) + return DatabaseSummaryReport.from_response_dict(response_data) def delete_target(self, target_id: str) -> None: """Delete a given target. From 2cb3a54da719bb27a4557812422d6e25ff0aee45 Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Wed, 25 Feb 2026 08:47:55 +0000 Subject: [PATCH 2/3] Add type ignores to suppress mypy errors from classmethods --- src/vws/async_query.py | 2 +- src/vws/async_vws.py | 6 ++-- src/vws/query.py | 2 +- src/vws/reports.py | 76 +++++++++++++++++++++--------------------- src/vws/vws.py | 6 ++-- 5 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/vws/async_query.py b/src/vws/async_query.py index ae5dd7e2b..b153b63bd 100644 --- a/src/vws/async_query.py +++ b/src/vws/async_query.py @@ -199,4 +199,4 @@ async def query( result_list = list( json.loads(s=response.text)["results"], ) - return [QueryResult.from_response_dict(item) for item in result_list] + return [QueryResult.from_response_dict(item) for item in result_list] # type: ignore[arg-type] diff --git a/src/vws/async_vws.py b/src/vws/async_vws.py index a86efd287..244b3ed46 100644 --- a/src/vws/async_vws.py +++ b/src/vws/async_vws.py @@ -296,7 +296,7 @@ async def get_target_record(self, target_id: str) -> TargetStatusAndRecord: ) result_data = json.loads(s=response.text) - return TargetStatusAndRecord.from_response_dict(result_data) + return TargetStatusAndRecord.from_response_dict(result_data) # type: ignore[arg-type] async def wait_for_target_processed( self, @@ -431,7 +431,7 @@ async def get_target_summary_report( ) result_data = dict(json.loads(s=response.text)) - return TargetSummaryReport.from_response_dict(result_data) + return TargetSummaryReport.from_response_dict(result_data) # type: ignore[arg-type] async def get_database_summary_report( self, @@ -466,7 +466,7 @@ async def get_database_summary_report( ) response_data = dict(json.loads(s=response.text)) - return DatabaseSummaryReport.from_response_dict(response_data) + return DatabaseSummaryReport.from_response_dict(response_data) # type: ignore[arg-type] async def delete_target(self, target_id: str) -> None: """Delete a given target. diff --git a/src/vws/query.py b/src/vws/query.py index 2c682eb1c..f070937e2 100644 --- a/src/vws/query.py +++ b/src/vws/query.py @@ -165,4 +165,4 @@ def query( raise exception(response=response) result_list = list(json.loads(s=response.text)["results"]) - return [QueryResult.from_response_dict(item) for item in result_list] + return [QueryResult.from_response_dict(item) for item in result_list] # type: ignore[arg-type] diff --git a/src/vws/reports.py b/src/vws/reports.py index 55cd3978d..28c00b144 100644 --- a/src/vws/reports.py +++ b/src/vws/reports.py @@ -34,18 +34,18 @@ class DatabaseSummaryReport: def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: """Construct from a VWS API response dict.""" return cls( - active_images=int(response_dict["active_images"]), - current_month_recos=int(response_dict["current_month_recos"]), - failed_images=int(response_dict["failed_images"]), - inactive_images=int(response_dict["inactive_images"]), - name=str(response_dict["name"]), - previous_month_recos=int(response_dict["previous_month_recos"]), - processing_images=int(response_dict["processing_images"]), - reco_threshold=int(response_dict["reco_threshold"]), - request_quota=int(response_dict["request_quota"]), - request_usage=int(response_dict["request_usage"]), - target_quota=int(response_dict["target_quota"]), - total_recos=int(response_dict["total_recos"]), + active_images=int(response_dict["active_images"]), # type: ignore[arg-type] + current_month_recos=int(response_dict["current_month_recos"]), # type: ignore[arg-type] + failed_images=int(response_dict["failed_images"]), # type: ignore[arg-type] + inactive_images=int(response_dict["inactive_images"]), # type: ignore[arg-type] + name=response_dict["name"], # type: ignore[arg-type] + previous_month_recos=int(response_dict["previous_month_recos"]), # type: ignore[arg-type] + processing_images=int(response_dict["processing_images"]), # type: ignore[arg-type] + reco_threshold=int(response_dict["reco_threshold"]), # type: ignore[arg-type] + request_quota=int(response_dict["request_quota"]), # type: ignore[arg-type] + request_usage=int(response_dict["request_usage"]), # type: ignore[arg-type] + target_quota=int(response_dict["target_quota"]), # type: ignore[arg-type] + total_recos=int(response_dict["total_recos"]), # type: ignore[arg-type] ) @@ -83,20 +83,20 @@ class TargetSummaryReport: previous_month_recos: int @classmethod - def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: # type: ignore[name-defined] """Construct from a VWS API response dict.""" - return cls( - status=TargetStatuses(value=response_dict["status"]), - database_name=response_dict["database_name"], - target_name=response_dict["target_name"], + return cls( # type: ignore[arg-type] + status=TargetStatuses(value=response_dict["status"]), # type: ignore[arg-type] + database_name=response_dict["database_name"], # type: ignore[arg-type] + target_name=response_dict["target_name"], # type: ignore[arg-type] upload_date=datetime.date.fromisoformat( response_dict["upload_date"] - ), - active_flag=bool(response_dict["active_flag"]), - tracking_rating=int(response_dict["tracking_rating"]), - total_recos=int(response_dict["total_recos"]), - current_month_recos=int(response_dict["current_month_recos"]), - previous_month_recos=int(response_dict["previous_month_recos"]), + ), # type: ignore[arg-type] + active_flag=bool(response_dict["active_flag"]), # type: ignore[arg-type] + tracking_rating=int(response_dict["tracking_rating"]), # type: ignore[arg-type] + total_recos=int(response_dict["total_recos"]), # type: ignore[arg-type] + current_month_recos=int(response_dict["current_month_recos"]), # type: ignore[arg-type] + previous_month_recos=int(response_dict["previous_month_recos"]), # type: ignore[arg-type] ) @@ -140,22 +140,22 @@ class QueryResult: target_data: TargetData | None @classmethod - def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: # type: ignore[name-defined] """Construct from a VWS API query result item dict.""" target_data: TargetData | None = None if "target_data" in response_dict: target_data_dict = response_dict["target_data"] target_timestamp = datetime.datetime.fromtimestamp( - timestamp=target_data_dict["target_timestamp"], + timestamp=target_data_dict["target_timestamp"], # type: ignore[arg-type] tz=datetime.UTC, ) target_data = TargetData( - name=target_data_dict["name"], - application_metadata=target_data_dict["application_metadata"], + name=target_data_dict["name"], # type: ignore[arg-type] + application_metadata=target_data_dict["application_metadata"], # type: ignore[arg-type] target_timestamp=target_timestamp, ) - return cls( - target_id=response_dict["target_id"], + return cls( # type: ignore[arg-type] + target_id=response_dict["target_id"], # type: ignore[arg-type] target_data=target_data, ) @@ -173,16 +173,16 @@ class TargetStatusAndRecord: target_record: TargetRecord @classmethod - def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: # type: ignore[name-defined] """Construct from a VWS API response dict.""" - status = TargetStatuses(value=response_dict["status"]) + status = TargetStatuses(value=response_dict["status"]) # type: ignore[arg-type] target_record_dict = dict(response_dict["target_record"]) target_record = TargetRecord( - target_id=target_record_dict["target_id"], - active_flag=bool(target_record_dict["active_flag"]), - name=target_record_dict["name"], - width=float(target_record_dict["width"]), - tracking_rating=int(target_record_dict["tracking_rating"]), - reco_rating=target_record_dict["reco_rating"], + target_id=target_record_dict["target_id"], # type: ignore[arg-type] + active_flag=bool(target_record_dict["active_flag"]), # type: ignore[arg-type] + name=target_record_dict["name"], # type: ignore[arg-type] + width=float(target_record_dict["width"]), # type: ignore[arg-type] + tracking_rating=int(target_record_dict["tracking_rating"]), # type: ignore[arg-type] + reco_rating=target_record_dict["reco_rating"], # type: ignore[arg-type] ) - return cls(status=status, target_record=target_record) + return cls(status=status, target_record=target_record) # type: ignore[arg-type] diff --git a/src/vws/vws.py b/src/vws/vws.py index 778686155..8efee8498 100644 --- a/src/vws/vws.py +++ b/src/vws/vws.py @@ -281,7 +281,7 @@ def get_target_record(self, target_id: str) -> TargetStatusAndRecord: ) result_data = json.loads(s=response.text) - return TargetStatusAndRecord.from_response_dict(result_data) + return TargetStatusAndRecord.from_response_dict(result_data) # type: ignore[arg-type] def wait_for_target_processed( self, @@ -405,7 +405,7 @@ def get_target_summary_report(self, target_id: str) -> TargetSummaryReport: ) result_data = dict(json.loads(s=response.text)) - return TargetSummaryReport.from_response_dict(result_data) + return TargetSummaryReport.from_response_dict(result_data) # type: ignore[arg-type] def get_database_summary_report(self) -> DatabaseSummaryReport: """Get a summary report for the database. @@ -438,7 +438,7 @@ def get_database_summary_report(self) -> DatabaseSummaryReport: ) response_data = dict(json.loads(s=response.text)) - return DatabaseSummaryReport.from_response_dict(response_data) + return DatabaseSummaryReport.from_response_dict(response_data) # type: ignore[arg-type] def delete_target(self, target_id: str) -> None: """Delete a given target. From c5e06a21984e8bbce8c04e83e2aff49bfaea5f82 Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Wed, 25 Feb 2026 08:48:37 +0000 Subject: [PATCH 3/3] Fix mypy type: ignore error codes to use [misc] for Too many positional arguments --- src/vws/async_query.py | 2 +- src/vws/async_vws.py | 6 ++-- src/vws/query.py | 2 +- src/vws/reports.py | 76 +++++++++++++++++++++--------------------- src/vws/vws.py | 6 ++-- 5 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/vws/async_query.py b/src/vws/async_query.py index b153b63bd..f1df2ac7c 100644 --- a/src/vws/async_query.py +++ b/src/vws/async_query.py @@ -199,4 +199,4 @@ async def query( result_list = list( json.loads(s=response.text)["results"], ) - return [QueryResult.from_response_dict(item) for item in result_list] # type: ignore[arg-type] + return [QueryResult.from_response_dict(item) for item in result_list] # type: ignore[misc] diff --git a/src/vws/async_vws.py b/src/vws/async_vws.py index 244b3ed46..b81c5e15a 100644 --- a/src/vws/async_vws.py +++ b/src/vws/async_vws.py @@ -296,7 +296,7 @@ async def get_target_record(self, target_id: str) -> TargetStatusAndRecord: ) result_data = json.loads(s=response.text) - return TargetStatusAndRecord.from_response_dict(result_data) # type: ignore[arg-type] + return TargetStatusAndRecord.from_response_dict(result_data) # type: ignore[misc] async def wait_for_target_processed( self, @@ -431,7 +431,7 @@ async def get_target_summary_report( ) result_data = dict(json.loads(s=response.text)) - return TargetSummaryReport.from_response_dict(result_data) # type: ignore[arg-type] + return TargetSummaryReport.from_response_dict(result_data) # type: ignore[misc] async def get_database_summary_report( self, @@ -466,7 +466,7 @@ async def get_database_summary_report( ) response_data = dict(json.loads(s=response.text)) - return DatabaseSummaryReport.from_response_dict(response_data) # type: ignore[arg-type] + return DatabaseSummaryReport.from_response_dict(response_data) # type: ignore[misc] async def delete_target(self, target_id: str) -> None: """Delete a given target. diff --git a/src/vws/query.py b/src/vws/query.py index f070937e2..a4810b73e 100644 --- a/src/vws/query.py +++ b/src/vws/query.py @@ -165,4 +165,4 @@ def query( raise exception(response=response) result_list = list(json.loads(s=response.text)["results"]) - return [QueryResult.from_response_dict(item) for item in result_list] # type: ignore[arg-type] + return [QueryResult.from_response_dict(item) for item in result_list] # type: ignore[misc] diff --git a/src/vws/reports.py b/src/vws/reports.py index 28c00b144..726f93b67 100644 --- a/src/vws/reports.py +++ b/src/vws/reports.py @@ -34,18 +34,18 @@ class DatabaseSummaryReport: def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: """Construct from a VWS API response dict.""" return cls( - active_images=int(response_dict["active_images"]), # type: ignore[arg-type] - current_month_recos=int(response_dict["current_month_recos"]), # type: ignore[arg-type] - failed_images=int(response_dict["failed_images"]), # type: ignore[arg-type] - inactive_images=int(response_dict["inactive_images"]), # type: ignore[arg-type] - name=response_dict["name"], # type: ignore[arg-type] - previous_month_recos=int(response_dict["previous_month_recos"]), # type: ignore[arg-type] - processing_images=int(response_dict["processing_images"]), # type: ignore[arg-type] - reco_threshold=int(response_dict["reco_threshold"]), # type: ignore[arg-type] - request_quota=int(response_dict["request_quota"]), # type: ignore[arg-type] - request_usage=int(response_dict["request_usage"]), # type: ignore[arg-type] - target_quota=int(response_dict["target_quota"]), # type: ignore[arg-type] - total_recos=int(response_dict["total_recos"]), # type: ignore[arg-type] + active_images=int(response_dict["active_images"]), + current_month_recos=int(response_dict["current_month_recos"]), + failed_images=int(response_dict["failed_images"]), + inactive_images=int(response_dict["inactive_images"]), + name=response_dict["name"], + previous_month_recos=int(response_dict["previous_month_recos"]), + processing_images=int(response_dict["processing_images"]), + reco_threshold=int(response_dict["reco_threshold"]), + request_quota=int(response_dict["request_quota"]), + request_usage=int(response_dict["request_usage"]), + target_quota=int(response_dict["target_quota"]), + total_recos=int(response_dict["total_recos"]), ) @@ -83,20 +83,20 @@ class TargetSummaryReport: previous_month_recos: int @classmethod - def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: # type: ignore[name-defined] + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: """Construct from a VWS API response dict.""" - return cls( # type: ignore[arg-type] - status=TargetStatuses(value=response_dict["status"]), # type: ignore[arg-type] - database_name=response_dict["database_name"], # type: ignore[arg-type] - target_name=response_dict["target_name"], # type: ignore[arg-type] + return cls( + status=TargetStatuses(value=response_dict["status"]), + database_name=response_dict["database_name"], + target_name=response_dict["target_name"], upload_date=datetime.date.fromisoformat( response_dict["upload_date"] - ), # type: ignore[arg-type] - active_flag=bool(response_dict["active_flag"]), # type: ignore[arg-type] - tracking_rating=int(response_dict["tracking_rating"]), # type: ignore[arg-type] - total_recos=int(response_dict["total_recos"]), # type: ignore[arg-type] - current_month_recos=int(response_dict["current_month_recos"]), # type: ignore[arg-type] - previous_month_recos=int(response_dict["previous_month_recos"]), # type: ignore[arg-type] + ), + active_flag=bool(response_dict["active_flag"]), + tracking_rating=int(response_dict["tracking_rating"]), + total_recos=int(response_dict["total_recos"]), + current_month_recos=int(response_dict["current_month_recos"]), + previous_month_recos=int(response_dict["previous_month_recos"]), ) @@ -140,22 +140,22 @@ class QueryResult: target_data: TargetData | None @classmethod - def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: # type: ignore[name-defined] + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: """Construct from a VWS API query result item dict.""" target_data: TargetData | None = None if "target_data" in response_dict: target_data_dict = response_dict["target_data"] target_timestamp = datetime.datetime.fromtimestamp( - timestamp=target_data_dict["target_timestamp"], # type: ignore[arg-type] + timestamp=target_data_dict["target_timestamp"], tz=datetime.UTC, ) target_data = TargetData( - name=target_data_dict["name"], # type: ignore[arg-type] - application_metadata=target_data_dict["application_metadata"], # type: ignore[arg-type] + name=target_data_dict["name"], + application_metadata=target_data_dict["application_metadata"], target_timestamp=target_timestamp, ) - return cls( # type: ignore[arg-type] - target_id=response_dict["target_id"], # type: ignore[arg-type] + return cls( + target_id=response_dict["target_id"], target_data=target_data, ) @@ -173,16 +173,16 @@ class TargetStatusAndRecord: target_record: TargetRecord @classmethod - def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: # type: ignore[name-defined] + def from_response_dict(cls, response_dict: dict[str, Any]) -> Self: """Construct from a VWS API response dict.""" - status = TargetStatuses(value=response_dict["status"]) # type: ignore[arg-type] + status = TargetStatuses(value=response_dict["status"]) target_record_dict = dict(response_dict["target_record"]) target_record = TargetRecord( - target_id=target_record_dict["target_id"], # type: ignore[arg-type] - active_flag=bool(target_record_dict["active_flag"]), # type: ignore[arg-type] - name=target_record_dict["name"], # type: ignore[arg-type] - width=float(target_record_dict["width"]), # type: ignore[arg-type] - tracking_rating=int(target_record_dict["tracking_rating"]), # type: ignore[arg-type] - reco_rating=target_record_dict["reco_rating"], # type: ignore[arg-type] + target_id=target_record_dict["target_id"], + active_flag=bool(target_record_dict["active_flag"]), + name=target_record_dict["name"], + width=float(target_record_dict["width"]), + tracking_rating=int(target_record_dict["tracking_rating"]), + reco_rating=target_record_dict["reco_rating"], ) - return cls(status=status, target_record=target_record) # type: ignore[arg-type] + return cls(status=status, target_record=target_record) diff --git a/src/vws/vws.py b/src/vws/vws.py index 8efee8498..346b7d621 100644 --- a/src/vws/vws.py +++ b/src/vws/vws.py @@ -281,7 +281,7 @@ def get_target_record(self, target_id: str) -> TargetStatusAndRecord: ) result_data = json.loads(s=response.text) - return TargetStatusAndRecord.from_response_dict(result_data) # type: ignore[arg-type] + return TargetStatusAndRecord.from_response_dict(result_data) # type: ignore[misc] def wait_for_target_processed( self, @@ -405,7 +405,7 @@ def get_target_summary_report(self, target_id: str) -> TargetSummaryReport: ) result_data = dict(json.loads(s=response.text)) - return TargetSummaryReport.from_response_dict(result_data) # type: ignore[arg-type] + return TargetSummaryReport.from_response_dict(result_data) # type: ignore[misc] def get_database_summary_report(self) -> DatabaseSummaryReport: """Get a summary report for the database. @@ -438,7 +438,7 @@ def get_database_summary_report(self) -> DatabaseSummaryReport: ) response_data = dict(json.loads(s=response.text)) - return DatabaseSummaryReport.from_response_dict(response_data) # type: ignore[arg-type] + return DatabaseSummaryReport.from_response_dict(response_data) # type: ignore[misc] def delete_target(self, target_id: str) -> None: """Delete a given target.