Skip to content

Commit d01ce65

Browse files
Merge pull request #2882 from VWS-Python/adamtheturtle/reports-from-response-dict
Add from_response_dict classmethods to report classes
2 parents 90c3dc0 + c5e06a2 commit d01ce65

File tree

5 files changed

+81
-154
lines changed

5 files changed

+81
-154
lines changed

src/vws/async_query.py

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
Web APIs.
33
"""
44

5-
import datetime
65
import json
76
from http import HTTPMethod, HTTPStatus
87
from typing import Any, Self
@@ -25,7 +24,7 @@
2524
ServerError,
2625
)
2726
from vws.include_target_data import CloudRecoIncludeTargetData
28-
from vws.reports import QueryResult, TargetData
27+
from vws.reports import QueryResult
2928
from vws.transports import AsyncHTTPXTransport, AsyncTransport
3029

3130

@@ -197,30 +196,7 @@ async def query(
197196
}[result_code]
198197
raise exception(response=response)
199198

200-
result: list[QueryResult] = []
201199
result_list = list(
202200
json.loads(s=response.text)["results"],
203201
)
204-
for item in result_list:
205-
target_data: TargetData | None = None
206-
if "target_data" in item:
207-
target_data_dict = item["target_data"]
208-
metadata = target_data_dict["application_metadata"]
209-
timestamp_string = target_data_dict["target_timestamp"]
210-
target_timestamp = datetime.datetime.fromtimestamp(
211-
timestamp=timestamp_string,
212-
tz=datetime.UTC,
213-
)
214-
target_data = TargetData(
215-
name=target_data_dict["name"],
216-
application_metadata=metadata,
217-
target_timestamp=target_timestamp,
218-
)
219-
220-
query_result = QueryResult(
221-
target_id=item["target_id"],
222-
target_data=target_data,
223-
)
224-
225-
result.append(query_result)
226-
return result
202+
return [QueryResult.from_response_dict(item) for item in result_list] # type: ignore[misc]

src/vws/async_vws.py

Lines changed: 3 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import asyncio
44
import base64
55
import json
6-
from datetime import date
76
from http import HTTPMethod, HTTPStatus
87
from typing import Self
98

@@ -38,7 +37,6 @@
3837
)
3938
from vws.reports import (
4039
DatabaseSummaryReport,
41-
TargetRecord,
4240
TargetStatusAndRecord,
4341
TargetStatuses,
4442
TargetSummaryReport,
@@ -298,20 +296,7 @@ async def get_target_record(self, target_id: str) -> TargetStatusAndRecord:
298296
)
299297

300298
result_data = json.loads(s=response.text)
301-
status = TargetStatuses(value=result_data["status"])
302-
target_record_dict = dict(result_data["target_record"])
303-
target_record = TargetRecord(
304-
target_id=target_record_dict["target_id"],
305-
active_flag=bool(target_record_dict["active_flag"]),
306-
name=target_record_dict["name"],
307-
width=float(target_record_dict["width"]),
308-
tracking_rating=int(target_record_dict["tracking_rating"]),
309-
reco_rating=target_record_dict["reco_rating"],
310-
)
311-
return TargetStatusAndRecord(
312-
status=status,
313-
target_record=target_record,
314-
)
299+
return TargetStatusAndRecord.from_response_dict(result_data) # type: ignore[misc]
315300

316301
async def wait_for_target_processed(
317302
self,
@@ -446,27 +431,7 @@ async def get_target_summary_report(
446431
)
447432

448433
result_data = dict(json.loads(s=response.text))
449-
return TargetSummaryReport(
450-
status=TargetStatuses(
451-
value=result_data["status"],
452-
),
453-
database_name=result_data["database_name"],
454-
target_name=result_data["target_name"],
455-
upload_date=date.fromisoformat(
456-
result_data["upload_date"],
457-
),
458-
active_flag=bool(result_data["active_flag"]),
459-
tracking_rating=int(
460-
result_data["tracking_rating"],
461-
),
462-
total_recos=int(result_data["total_recos"]),
463-
current_month_recos=int(
464-
result_data["current_month_recos"],
465-
),
466-
previous_month_recos=int(
467-
result_data["previous_month_recos"],
468-
),
469-
)
434+
return TargetSummaryReport.from_response_dict(result_data) # type: ignore[misc]
470435

471436
async def get_database_summary_report(
472437
self,
@@ -501,30 +466,7 @@ async def get_database_summary_report(
501466
)
502467

503468
response_data = dict(json.loads(s=response.text))
504-
return DatabaseSummaryReport(
505-
active_images=int(response_data["active_images"]),
506-
current_month_recos=int(
507-
response_data["current_month_recos"],
508-
),
509-
failed_images=int(response_data["failed_images"]),
510-
inactive_images=int(
511-
response_data["inactive_images"],
512-
),
513-
name=str(object=response_data["name"]),
514-
previous_month_recos=int(
515-
response_data["previous_month_recos"],
516-
),
517-
processing_images=int(
518-
response_data["processing_images"],
519-
),
520-
reco_threshold=int(
521-
response_data["reco_threshold"],
522-
),
523-
request_quota=int(response_data["request_quota"]),
524-
request_usage=int(response_data["request_usage"]),
525-
target_quota=int(response_data["target_quota"]),
526-
total_recos=int(response_data["total_recos"]),
527-
)
469+
return DatabaseSummaryReport.from_response_dict(response_data) # type: ignore[misc]
528470

529471
async def delete_target(self, target_id: str) -> None:
530472
"""Delete a given target.

src/vws/query.py

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""Tools for interacting with the Vuforia Cloud Recognition Web APIs."""
22

3-
import datetime
43
import json
54
from http import HTTPMethod, HTTPStatus
65
from typing import Any
@@ -23,7 +22,7 @@
2322
ServerError,
2423
)
2524
from vws.include_target_data import CloudRecoIncludeTargetData
26-
from vws.reports import QueryResult, TargetData
25+
from vws.reports import QueryResult
2726
from vws.transports import RequestsTransport, Transport
2827

2928

@@ -165,28 +164,5 @@ def query(
165164
}[result_code]
166165
raise exception(response=response)
167166

168-
result: list[QueryResult] = []
169167
result_list = list(json.loads(s=response.text)["results"])
170-
for item in result_list:
171-
target_data: TargetData | None = None
172-
if "target_data" in item:
173-
target_data_dict = item["target_data"]
174-
metadata = target_data_dict["application_metadata"]
175-
timestamp_string = target_data_dict["target_timestamp"]
176-
target_timestamp = datetime.datetime.fromtimestamp(
177-
timestamp=timestamp_string,
178-
tz=datetime.UTC,
179-
)
180-
target_data = TargetData(
181-
name=target_data_dict["name"],
182-
application_metadata=metadata,
183-
target_timestamp=target_timestamp,
184-
)
185-
186-
query_result = QueryResult(
187-
target_id=item["target_id"],
188-
target_data=target_data,
189-
)
190-
191-
result.append(query_result)
192-
return result
168+
return [QueryResult.from_response_dict(item) for item in result_list] # type: ignore[misc]

src/vws/reports.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import datetime
44
from dataclasses import dataclass
55
from enum import Enum, unique
6+
from typing import Any, Self
67

78
from beartype import BeartypeConf, beartype
89

@@ -29,6 +30,24 @@ class DatabaseSummaryReport:
2930
target_quota: int
3031
total_recos: int
3132

33+
@classmethod
34+
def from_response_dict(cls, response_dict: dict[str, Any]) -> Self:
35+
"""Construct from a VWS API response dict."""
36+
return cls(
37+
active_images=int(response_dict["active_images"]),
38+
current_month_recos=int(response_dict["current_month_recos"]),
39+
failed_images=int(response_dict["failed_images"]),
40+
inactive_images=int(response_dict["inactive_images"]),
41+
name=response_dict["name"],
42+
previous_month_recos=int(response_dict["previous_month_recos"]),
43+
processing_images=int(response_dict["processing_images"]),
44+
reco_threshold=int(response_dict["reco_threshold"]),
45+
request_quota=int(response_dict["request_quota"]),
46+
request_usage=int(response_dict["request_usage"]),
47+
target_quota=int(response_dict["target_quota"]),
48+
total_recos=int(response_dict["total_recos"]),
49+
)
50+
3251

3352
@beartype
3453
@unique
@@ -63,6 +82,23 @@ class TargetSummaryReport:
6382
current_month_recos: int
6483
previous_month_recos: int
6584

85+
@classmethod
86+
def from_response_dict(cls, response_dict: dict[str, Any]) -> Self:
87+
"""Construct from a VWS API response dict."""
88+
return cls(
89+
status=TargetStatuses(value=response_dict["status"]),
90+
database_name=response_dict["database_name"],
91+
target_name=response_dict["target_name"],
92+
upload_date=datetime.date.fromisoformat(
93+
response_dict["upload_date"]
94+
),
95+
active_flag=bool(response_dict["active_flag"]),
96+
tracking_rating=int(response_dict["tracking_rating"]),
97+
total_recos=int(response_dict["total_recos"]),
98+
current_month_recos=int(response_dict["current_month_recos"]),
99+
previous_month_recos=int(response_dict["previous_month_recos"]),
100+
)
101+
66102

67103
@beartype(conf=BeartypeConf(is_pep484_tower=True))
68104
@dataclass(frozen=True)
@@ -103,6 +139,26 @@ class QueryResult:
103139
target_id: str
104140
target_data: TargetData | None
105141

142+
@classmethod
143+
def from_response_dict(cls, response_dict: dict[str, Any]) -> Self:
144+
"""Construct from a VWS API query result item dict."""
145+
target_data: TargetData | None = None
146+
if "target_data" in response_dict:
147+
target_data_dict = response_dict["target_data"]
148+
target_timestamp = datetime.datetime.fromtimestamp(
149+
timestamp=target_data_dict["target_timestamp"],
150+
tz=datetime.UTC,
151+
)
152+
target_data = TargetData(
153+
name=target_data_dict["name"],
154+
application_metadata=target_data_dict["application_metadata"],
155+
target_timestamp=target_timestamp,
156+
)
157+
return cls(
158+
target_id=response_dict["target_id"],
159+
target_data=target_data,
160+
)
161+
106162

107163
@beartype
108164
@dataclass(frozen=True)
@@ -115,3 +171,18 @@ class TargetStatusAndRecord:
115171

116172
status: TargetStatuses
117173
target_record: TargetRecord
174+
175+
@classmethod
176+
def from_response_dict(cls, response_dict: dict[str, Any]) -> Self:
177+
"""Construct from a VWS API response dict."""
178+
status = TargetStatuses(value=response_dict["status"])
179+
target_record_dict = dict(response_dict["target_record"])
180+
target_record = TargetRecord(
181+
target_id=target_record_dict["target_id"],
182+
active_flag=bool(target_record_dict["active_flag"]),
183+
name=target_record_dict["name"],
184+
width=float(target_record_dict["width"]),
185+
tracking_rating=int(target_record_dict["tracking_rating"]),
186+
reco_rating=target_record_dict["reco_rating"],
187+
)
188+
return cls(status=status, target_record=target_record)

src/vws/vws.py

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import base64
44
import json
55
import time
6-
from datetime import date
76
from http import HTTPMethod, HTTPStatus
87

98
from beartype import BeartypeConf, beartype
@@ -37,7 +36,6 @@
3736
)
3837
from vws.reports import (
3938
DatabaseSummaryReport,
40-
TargetRecord,
4139
TargetStatusAndRecord,
4240
TargetStatuses,
4341
TargetSummaryReport,
@@ -283,20 +281,7 @@ def get_target_record(self, target_id: str) -> TargetStatusAndRecord:
283281
)
284282

285283
result_data = json.loads(s=response.text)
286-
status = TargetStatuses(value=result_data["status"])
287-
target_record_dict = dict(result_data["target_record"])
288-
target_record = TargetRecord(
289-
target_id=target_record_dict["target_id"],
290-
active_flag=bool(target_record_dict["active_flag"]),
291-
name=target_record_dict["name"],
292-
width=float(target_record_dict["width"]),
293-
tracking_rating=int(target_record_dict["tracking_rating"]),
294-
reco_rating=target_record_dict["reco_rating"],
295-
)
296-
return TargetStatusAndRecord(
297-
status=status,
298-
target_record=target_record,
299-
)
284+
return TargetStatusAndRecord.from_response_dict(result_data) # type: ignore[misc]
300285

301286
def wait_for_target_processed(
302287
self,
@@ -420,17 +405,7 @@ def get_target_summary_report(self, target_id: str) -> TargetSummaryReport:
420405
)
421406

422407
result_data = dict(json.loads(s=response.text))
423-
return TargetSummaryReport(
424-
status=TargetStatuses(value=result_data["status"]),
425-
database_name=result_data["database_name"],
426-
target_name=result_data["target_name"],
427-
upload_date=date.fromisoformat(result_data["upload_date"]),
428-
active_flag=bool(result_data["active_flag"]),
429-
tracking_rating=int(result_data["tracking_rating"]),
430-
total_recos=int(result_data["total_recos"]),
431-
current_month_recos=int(result_data["current_month_recos"]),
432-
previous_month_recos=int(result_data["previous_month_recos"]),
433-
)
408+
return TargetSummaryReport.from_response_dict(result_data) # type: ignore[misc]
434409

435410
def get_database_summary_report(self) -> DatabaseSummaryReport:
436411
"""Get a summary report for the database.
@@ -463,20 +438,7 @@ def get_database_summary_report(self) -> DatabaseSummaryReport:
463438
)
464439

465440
response_data = dict(json.loads(s=response.text))
466-
return DatabaseSummaryReport(
467-
active_images=int(response_data["active_images"]),
468-
current_month_recos=int(response_data["current_month_recos"]),
469-
failed_images=int(response_data["failed_images"]),
470-
inactive_images=int(response_data["inactive_images"]),
471-
name=str(object=response_data["name"]),
472-
previous_month_recos=int(response_data["previous_month_recos"]),
473-
processing_images=int(response_data["processing_images"]),
474-
reco_threshold=int(response_data["reco_threshold"]),
475-
request_quota=int(response_data["request_quota"]),
476-
request_usage=int(response_data["request_usage"]),
477-
target_quota=int(response_data["target_quota"]),
478-
total_recos=int(response_data["total_recos"]),
479-
)
441+
return DatabaseSummaryReport.from_response_dict(response_data) # type: ignore[misc]
480442

481443
def delete_target(self, target_id: str) -> None:
482444
"""Delete a given target.

0 commit comments

Comments
 (0)