Skip to content

Commit cd95af3

Browse files
committed
Remove part done work
1 parent cebb6de commit cd95af3

File tree

4 files changed

+155
-1
lines changed

4 files changed

+155
-1
lines changed

src/vws/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
"""
44

55
from ._version import get_versions
6+
from .query import CloudRecoService
67
from .vws import VWS
78

89
__all__ = [
10+
'CloudRecoService',
911
'VWS',
1012
]
1113

src/vws/query.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import io
2+
from urllib.parse import urljoin
3+
4+
import requests
5+
from urllib3.filepost import encode_multipart_formdata
6+
7+
from ._authorization import authorization_header, rfc_1123_date
8+
9+
10+
class CloudRecoService:
11+
"""
12+
TODO
13+
"""
14+
15+
def __init__(
16+
self,
17+
client_access_key: str,
18+
client_secret_key: str,
19+
) -> None:
20+
"""
21+
Args:
22+
client_access_key: A VWS client access key.
23+
client_secret_key: A VWS client secret key.
24+
"""
25+
self._client_access_key = client_access_key.encode()
26+
self._client_secret_key = client_secret_key.encode()
27+
28+
def query(self, image: io.BytesIO) -> str:
29+
"""
30+
TODO docstring
31+
"""
32+
image_content = image.getvalue()
33+
body = {
34+
'image': ('image.jpeg', image_content, 'image/jpeg'),
35+
}
36+
date = rfc_1123_date()
37+
request_path = '/v1/query'
38+
content, content_type_header = encode_multipart_formdata(body)
39+
method = 'POST'
40+
41+
authorization_string = authorization_header(
42+
access_key=self._client_access_key,
43+
secret_key=self._client_secret_key,
44+
method=method,
45+
content=content,
46+
# Note that this is not the actual Content-Type header value sent.
47+
content_type='multipart/form-data',
48+
date=date,
49+
request_path=request_path,
50+
)
51+
52+
headers = {
53+
'Authorization': authorization_string,
54+
'Date': date,
55+
'Content-Type': content_type_header,
56+
}
57+
58+
base_vwq_url = 'https://cloudreco.vuforia.com'
59+
response = requests.request(
60+
method=method,
61+
url=urljoin(base=base_vwq_url, url=request_path),
62+
headers=headers,
63+
data=content,
64+
)
65+
66+
return response.json()['results']

tests/conftest.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from mock_vws import MockVWS
99
from mock_vws.database import VuforiaDatabase
1010

11-
from vws import VWS
11+
from vws import VWS, CloudRecoService
1212

1313
pytest_plugins = [ # pylint: disable=invalid-name
1414
'tests.fixtures.images',
@@ -35,3 +35,14 @@ def vws_client(_mock_database: VuforiaDatabase) -> Iterator[VWS]:
3535
server_access_key=_mock_database.server_access_key,
3636
server_secret_key=_mock_database.server_secret_key,
3737
)
38+
39+
40+
@pytest.fixture()
41+
def cloud_reco_client(_mock_database: VuforiaDatabase) -> Iterator[VWS]:
42+
"""
43+
TODO Docstring
44+
"""
45+
yield CloudRecoService(
46+
client_access_key=_mock_database.client_access_key,
47+
client_secret_key=_mock_database.client_secret_key,
48+
)

tests/test_query.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
"""
2+
TODO
3+
"""
4+
5+
import io
6+
import uuid
7+
8+
import pytest
9+
10+
from vws import VWS, CloudRecoService
11+
12+
13+
class TestQuery:
14+
"""
15+
TODO
16+
"""
17+
18+
def test_no_matches(
19+
self,
20+
cloud_reco_client: CloudRecoService,
21+
high_quality_image: io.BytesIO,
22+
) -> None:
23+
"""
24+
An empty list is returned if there are no matches.
25+
"""
26+
result = cloud_reco_client.query(image=high_quality_image)
27+
assert result == []
28+
29+
def test_match(
30+
self,
31+
vws_client: VWS,
32+
cloud_reco_client: CloudRecoService,
33+
high_quality_image: io.BytesIO,
34+
) -> None:
35+
"""
36+
Details of matching targets are returned.
37+
"""
38+
target_id = vws_client.add_target(
39+
name='x',
40+
width=1,
41+
image=high_quality_image,
42+
)
43+
vws_client.wait_for_target_processed(target_id=target_id)
44+
[matching_target] = cloud_reco_client.query(image=high_quality_image)
45+
assert matching_target['target_id'] == target_id
46+
47+
48+
class TestMaxNumResults:
49+
"""
50+
Tests for the ``max_num_results`` parameter of ``query``.
51+
"""
52+
53+
def test_default(
54+
self,
55+
vws_client: VWS,
56+
cloud_reco_client: CloudRecoService,
57+
high_quality_image: io.BytesIO,
58+
) -> None:
59+
"""
60+
By default the maximum number of results is 1.
61+
"""
62+
target_id = vws_client.add_target(
63+
name=uuid.uuid4().hex,
64+
width=1,
65+
image=high_quality_image,
66+
)
67+
target_id_2 = vws_client.add_target(
68+
name=uuid.uuid4().hex,
69+
width=1,
70+
image=high_quality_image,
71+
)
72+
vws_client.wait_for_target_processed(target_id=target_id)
73+
vws_client.wait_for_target_processed(target_id=target_id_2)
74+
matches = cloud_reco_client.query(image=high_quality_image)
75+
assert len(matches) == 1

0 commit comments

Comments
 (0)