Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions src/vws/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
Classes for representing Vuforia reports.
"""

import datetime
from dataclasses import dataclass
from enum import Enum


@dataclass
Expand All @@ -26,3 +28,35 @@ class DatabaseSummaryReport:
request_usage: int
target_quota: int
total_recos: int


class TargetStatuses(Enum):
"""
Constants representing VWS target statuses.
See the 'status' field in
https://library.vuforia.com/articles/Solution/How-To-Use-the-Vuforia-Web-Services-API.html#How-To-Retrieve-a-Target-Record
"""

PROCESSING = 'processing'
SUCCESS = 'success'
FAILED = 'failed'


@dataclass
class TargetSummaryReport:
"""
A target summary report.

See
https://library.vuforia.com/articles/Solution/How-To-Use-the-Vuforia-Web-Services-API#How-To-Retrieve-a-Target-Summary-Report.
"""

status: TargetStatuses
database_name: str
target_name: str
upload_date: datetime.date
active_flag: bool
tracking_rating: int
total_recos: int
current_month_recos: int
previous_month_recos: int
33 changes: 23 additions & 10 deletions src/vws/vws.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import base64
import io
import json
from datetime import date
from time import sleep
from typing import Dict, List, Optional, Union
from urllib.parse import urljoin
Expand All @@ -16,7 +17,11 @@

from vws._result_codes import raise_for_result_code
from vws.exceptions import TargetProcessingTimeout
from vws.reports import DatabaseSummaryReport
from vws.reports import (
DatabaseSummaryReport,
TargetStatuses,
TargetSummaryReport,
)


def _target_api_request(
Expand Down Expand Up @@ -45,7 +50,7 @@ def _target_api_request(
Returns:
The response to the request made by `requests`.
"""
date = rfc_1123_date()
date_string = rfc_1123_date()
content_type = 'application/json'

signature_string = authorization_header(
Expand All @@ -54,13 +59,13 @@ def _target_api_request(
method=method,
content=content,
content_type=content_type,
date=date,
date=date_string,
request_path=request_path,
)

headers = {
'Authorization': signature_string,
'Date': date,
'Date': date_string,
'Content-Type': content_type,
}

Expand Down Expand Up @@ -267,7 +272,7 @@ def _wait_for_target_processed(
"""
while True:
report = self.get_target_summary_report(target_id=target_id)
if report['status'] != 'processing':
if report.status != TargetStatuses.PROCESSING:
return

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

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

def get_target_summary_report(
self,
target_id: str,
) -> Dict[str, Union[str, int]]:
def get_target_summary_report(self, target_id: str) -> TargetSummaryReport:
"""
Get a summary report for a target.

Expand Down Expand Up @@ -378,7 +380,18 @@ def get_target_summary_report(
expected_result_code='Success',
)

return dict(response.json())
result_data = dict(response.json())
return TargetSummaryReport(
status=TargetStatuses(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=result_data['active_flag'],
tracking_rating=result_data['tracking_rating'],
total_recos=result_data['total_recos'],
current_month_recos=result_data['current_month_recos'],
previous_month_recos=result_data['previous_month_recos'],
)

def get_database_summary_report(self) -> DatabaseSummaryReport:
"""
Expand Down
60 changes: 34 additions & 26 deletions tests/test_vws.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,24 @@
"""

import base64
import datetime
import io
import random
import uuid
from typing import Optional

import pytest
from freezegun import freeze_time
from mock_vws import MockVWS
from mock_vws.database import VuforiaDatabase

from vws import VWS, CloudRecoService
from vws.exceptions import TargetProcessingTimeout
from vws.reports import DatabaseSummaryReport
from vws.reports import (
DatabaseSummaryReport,
TargetStatuses,
TargetSummaryReport,
)


class TestAddTarget:
Expand Down Expand Up @@ -184,29 +190,31 @@ def test_get_target_summary_report(
"""
Details of a target are returned by ``get_target_summary_report``.
"""
target_id = vws_client.add_target(
name='x',
width=1,
image=high_quality_image,
active_flag=True,
application_metadata=None,
)
date = '2018-04-25'
target_name = uuid.uuid4().hex
with freeze_time(date):
target_id = vws_client.add_target(
name=target_name,
width=1,
image=high_quality_image,
active_flag=True,
application_metadata=None,
)

result = vws_client.get_target_summary_report(target_id=target_id)
expected_keys = {
'status',
'result_code',
'transaction_id',
'database_name',
'target_name',
'upload_date',
'active_flag',
'tracking_rating',
'total_recos',
'current_month_recos',
'previous_month_recos',
}
assert set(result.keys()) == expected_keys

expected_report = TargetSummaryReport(
status=TargetStatuses.SUCCESS,
database_name=result.database_name,
target_name=target_name,
upload_date=datetime.date(2018, 4, 25),
active_flag=True,
tracking_rating=result.tracking_rating,
total_recos=0,
current_month_recos=0,
previous_month_recos=0,
)
assert result == expected_report


class TestGetDatabaseSummaryReport:
Expand Down Expand Up @@ -292,10 +300,10 @@ def test_wait_for_target_processed(
application_metadata=None,
)
report = vws_client.get_target_summary_report(target_id=target_id)
assert report['status'] == 'processing'
assert report.status == TargetStatuses.PROCESSING
vws_client.wait_for_target_processed(target_id=target_id)
report = vws_client.get_target_summary_report(target_id=target_id)
assert report['status'] != 'processing'
assert report.status != TargetStatuses.PROCESSING

def test_default_seconds_between_requests(
self,
Expand Down Expand Up @@ -416,7 +424,7 @@ def test_custom_timeout(
)

report = vws_client.get_target_summary_report(target_id=target_id)
assert report['status'] == 'processing'
assert report.status == TargetStatuses.PROCESSING
with pytest.raises(TargetProcessingTimeout):
vws_client.wait_for_target_processed(
target_id=target_id,
Expand All @@ -428,7 +436,7 @@ def test_custom_timeout(
timeout_seconds=0.5,
)
report = vws_client.get_target_summary_report(target_id=target_id)
assert report['status'] != 'processing'
assert report.status != TargetStatuses.PROCESSING


class TestGetDuplicateTargets:
Expand Down