Skip to content

Commit aaaac7e

Browse files
Merge pull request #1143 from adamtheturtle/target-report-dataclass
Return a data class for the target report
2 parents 80c656c + 12511f5 commit aaaac7e

File tree

3 files changed

+91
-36
lines changed

3 files changed

+91
-36
lines changed

src/vws/reports.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
Classes for representing Vuforia reports.
33
"""
44

5+
import datetime
56
from dataclasses import dataclass
7+
from enum import Enum
68

79

810
@dataclass
@@ -26,3 +28,35 @@ class DatabaseSummaryReport:
2628
request_usage: int
2729
target_quota: int
2830
total_recos: int
31+
32+
33+
class TargetStatuses(Enum):
34+
"""
35+
Constants representing VWS target statuses.
36+
See the 'status' field in
37+
https://library.vuforia.com/articles/Solution/How-To-Use-the-Vuforia-Web-Services-API.html#How-To-Retrieve-a-Target-Record
38+
"""
39+
40+
PROCESSING = 'processing'
41+
SUCCESS = 'success'
42+
FAILED = 'failed'
43+
44+
45+
@dataclass
46+
class TargetSummaryReport:
47+
"""
48+
A target summary report.
49+
50+
See
51+
https://library.vuforia.com/articles/Solution/How-To-Use-the-Vuforia-Web-Services-API#How-To-Retrieve-a-Target-Summary-Report.
52+
"""
53+
54+
status: TargetStatuses
55+
database_name: str
56+
target_name: str
57+
upload_date: datetime.date
58+
active_flag: bool
59+
tracking_rating: int
60+
total_recos: int
61+
current_month_recos: int
62+
previous_month_recos: int

src/vws/vws.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import base64
66
import io
77
import json
8+
from datetime import date
89
from time import sleep
910
from typing import Dict, List, Optional, Union
1011
from urllib.parse import urljoin
@@ -16,7 +17,11 @@
1617

1718
from vws._result_codes import raise_for_result_code
1819
from vws.exceptions import TargetProcessingTimeout
19-
from vws.reports import DatabaseSummaryReport
20+
from vws.reports import (
21+
DatabaseSummaryReport,
22+
TargetStatuses,
23+
TargetSummaryReport,
24+
)
2025

2126

2227
def _target_api_request(
@@ -45,7 +50,7 @@ def _target_api_request(
4550
Returns:
4651
The response to the request made by `requests`.
4752
"""
48-
date = rfc_1123_date()
53+
date_string = rfc_1123_date()
4954
content_type = 'application/json'
5055

5156
signature_string = authorization_header(
@@ -54,13 +59,13 @@ def _target_api_request(
5459
method=method,
5560
content=content,
5661
content_type=content_type,
57-
date=date,
62+
date=date_string,
5863
request_path=request_path,
5964
)
6065

6166
headers = {
6267
'Authorization': signature_string,
63-
'Date': date,
68+
'Date': date_string,
6469
'Content-Type': content_type,
6570
}
6671

@@ -267,7 +272,7 @@ def _wait_for_target_processed(
267272
"""
268273
while True:
269274
report = self.get_target_summary_report(target_id=target_id)
270-
if report['status'] != 'processing':
275+
if report.status != TargetStatuses.PROCESSING:
271276
return
272277

273278
sleep(seconds_between_requests)
@@ -345,10 +350,7 @@ def list_targets(self) -> List[str]:
345350

346351
return list(response.json()['results'])
347352

348-
def get_target_summary_report(
349-
self,
350-
target_id: str,
351-
) -> Dict[str, Union[str, int]]:
353+
def get_target_summary_report(self, target_id: str) -> TargetSummaryReport:
352354
"""
353355
Get a summary report for a target.
354356
@@ -378,7 +380,18 @@ def get_target_summary_report(
378380
expected_result_code='Success',
379381
)
380382

381-
return dict(response.json())
383+
result_data = dict(response.json())
384+
return TargetSummaryReport(
385+
status=TargetStatuses(result_data['status']),
386+
database_name=result_data['database_name'],
387+
target_name=result_data['target_name'],
388+
upload_date=date.fromisoformat(result_data['upload_date']),
389+
active_flag=result_data['active_flag'],
390+
tracking_rating=result_data['tracking_rating'],
391+
total_recos=result_data['total_recos'],
392+
current_month_recos=result_data['current_month_recos'],
393+
previous_month_recos=result_data['previous_month_recos'],
394+
)
382395

383396
def get_database_summary_report(self) -> DatabaseSummaryReport:
384397
"""

tests/test_vws.py

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,24 @@
33
"""
44

55
import base64
6+
import datetime
67
import io
78
import random
89
import uuid
910
from typing import Optional
1011

1112
import pytest
13+
from freezegun import freeze_time
1214
from mock_vws import MockVWS
1315
from mock_vws.database import VuforiaDatabase
1416

1517
from vws import VWS, CloudRecoService
1618
from vws.exceptions import TargetProcessingTimeout
17-
from vws.reports import DatabaseSummaryReport
19+
from vws.reports import (
20+
DatabaseSummaryReport,
21+
TargetStatuses,
22+
TargetSummaryReport,
23+
)
1824

1925

2026
class TestAddTarget:
@@ -184,29 +190,31 @@ def test_get_target_summary_report(
184190
"""
185191
Details of a target are returned by ``get_target_summary_report``.
186192
"""
187-
target_id = vws_client.add_target(
188-
name='x',
189-
width=1,
190-
image=high_quality_image,
191-
active_flag=True,
192-
application_metadata=None,
193-
)
193+
date = '2018-04-25'
194+
target_name = uuid.uuid4().hex
195+
with freeze_time(date):
196+
target_id = vws_client.add_target(
197+
name=target_name,
198+
width=1,
199+
image=high_quality_image,
200+
active_flag=True,
201+
application_metadata=None,
202+
)
194203

195204
result = vws_client.get_target_summary_report(target_id=target_id)
196-
expected_keys = {
197-
'status',
198-
'result_code',
199-
'transaction_id',
200-
'database_name',
201-
'target_name',
202-
'upload_date',
203-
'active_flag',
204-
'tracking_rating',
205-
'total_recos',
206-
'current_month_recos',
207-
'previous_month_recos',
208-
}
209-
assert set(result.keys()) == expected_keys
205+
206+
expected_report = TargetSummaryReport(
207+
status=TargetStatuses.SUCCESS,
208+
database_name=result.database_name,
209+
target_name=target_name,
210+
upload_date=datetime.date(2018, 4, 25),
211+
active_flag=True,
212+
tracking_rating=result.tracking_rating,
213+
total_recos=0,
214+
current_month_recos=0,
215+
previous_month_recos=0,
216+
)
217+
assert result == expected_report
210218

211219

212220
class TestGetDatabaseSummaryReport:
@@ -292,10 +300,10 @@ def test_wait_for_target_processed(
292300
application_metadata=None,
293301
)
294302
report = vws_client.get_target_summary_report(target_id=target_id)
295-
assert report['status'] == 'processing'
303+
assert report.status == TargetStatuses.PROCESSING
296304
vws_client.wait_for_target_processed(target_id=target_id)
297305
report = vws_client.get_target_summary_report(target_id=target_id)
298-
assert report['status'] != 'processing'
306+
assert report.status != TargetStatuses.PROCESSING
299307

300308
def test_default_seconds_between_requests(
301309
self,
@@ -416,7 +424,7 @@ def test_custom_timeout(
416424
)
417425

418426
report = vws_client.get_target_summary_report(target_id=target_id)
419-
assert report['status'] == 'processing'
427+
assert report.status == TargetStatuses.PROCESSING
420428
with pytest.raises(TargetProcessingTimeout):
421429
vws_client.wait_for_target_processed(
422430
target_id=target_id,
@@ -428,7 +436,7 @@ def test_custom_timeout(
428436
timeout_seconds=0.5,
429437
)
430438
report = vws_client.get_target_summary_report(target_id=target_id)
431-
assert report['status'] != 'processing'
439+
assert report.status != TargetStatuses.PROCESSING
432440

433441

434442
class TestGetDuplicateTargets:

0 commit comments

Comments
 (0)