Skip to content

Commit

Permalink
Make target databases an Iterable
Browse files Browse the repository at this point in the history
  • Loading branch information
adamtheturtle committed Sep 28, 2024
1 parent e38d241 commit e450256
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 15 deletions.
27 changes: 22 additions & 5 deletions src/mock_vws/_flask_server/target_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,10 @@ def create_target(database_name: str) -> Response:
target_id=request_json["target_id"],
target_tracking_rater=target_tracking_rater,
)
database.targets.add(target)
new_database_targets = {*database.targets, target}
new_database = dataclasses.replace(database, targets=new_database_targets)
TARGET_MANAGER.remove_database(database=database)
TARGET_MANAGER.add_database(database=new_database)

return Response(
response=json.dumps(obj=target.to_dict()),
Expand All @@ -232,8 +235,15 @@ def delete_target(database_name: str, target_id: str) -> Response:
target = database.get_target(target_id=target_id)
now = datetime.datetime.now(tz=target.upload_date.tzinfo)
new_target = dataclasses.replace(target, delete_date=now)
database.targets.remove(target)
database.targets.add(new_target)
new_database_targets = {
database_target
for database_target in database.targets
if database_target != target
}
new_database_targets = {*new_database_targets, new_target}
new_database = dataclasses.replace(database, targets=new_database_targets)
TARGET_MANAGER.remove_database(database=database)
TARGET_MANAGER.add_database(database=new_database)
return Response(
response=json.dumps(obj=new_target.to_dict()),
status=HTTPStatus.OK,
Expand Down Expand Up @@ -282,8 +292,15 @@ def update_target(database_name: str, target_id: str) -> Response:
last_modified_date=last_modified_date,
)

database.targets.remove(target)
database.targets.add(new_target)
new_database_targets = {
database_target
for database_target in database.targets
if database_target != target
}
new_database_targets = {*new_database_targets, new_target}
new_database = dataclasses.replace(database, targets=new_database_targets)
TARGET_MANAGER.remove_database(database=database)
TARGET_MANAGER.add_database(database=new_database)

return Response(
response=json.dumps(obj=new_target.to_dict()),
Expand Down
2 changes: 1 addition & 1 deletion src/mock_vws/_flask_server/vws.py
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,7 @@ def get_duplicates(target_id: str) -> Response:
(target,) = (
target for target in database.targets if target.target_id == target_id
)
other_targets = database.targets - {target}
other_targets = set(database.targets) - {target}

similar_targets = [
other.target_id
Expand Down
36 changes: 30 additions & 6 deletions src/mock_vws/_requests_mock_server/mock_web_services_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,13 @@ def add_target(self, request: PreparedRequest) -> _ResponseType:
application_metadata=application_metadata,
target_tracking_rater=self._target_tracking_rater,
)
database.targets.add(new_target)
new_database_targets = {*database.targets, new_target}
new_database = dataclasses.replace(
database,
targets=new_database_targets,
)
self._target_manager.remove_database(database=database)
self._target_manager.add_database(database=new_database)

date = email.utils.formatdate(
timeval=None,
Expand Down Expand Up @@ -251,8 +257,19 @@ def delete_target(self, request: PreparedRequest) -> _ResponseType:

now = datetime.datetime.now(tz=target.upload_date.tzinfo)
new_target = dataclasses.replace(target, delete_date=now)
database.targets.remove(target)
database.targets.add(new_target)
new_database_targets = {
database_target
for database_target in database.targets
if database_target != target
}
new_database_targets = {*new_database_targets, new_target}
new_database = dataclasses.replace(
database,
targets=new_database_targets,
)
self._target_manager.remove_database(database=database)
self._target_manager.add_database(database=new_database)

date = email.utils.formatdate(
timeval=None,
localtime=False,
Expand Down Expand Up @@ -492,7 +509,7 @@ def get_duplicates(self, request: PreparedRequest) -> _ResponseType:
target_id = request.path_url.split(sep="/")[-1]
target = database.get_target(target_id=target_id)

other_targets = database.targets - {target}
other_targets = set(database.targets) - {target}

similar_targets = [
other.target_id
Expand Down Expand Up @@ -624,8 +641,15 @@ def update_target(self, request: PreparedRequest) -> _ResponseType:
last_modified_date=last_modified_date,
)

database.targets.remove(target)
database.targets.add(new_target)
new_targets = {
database_target
for database_target in database.targets
if database_target != target
}
new_targets = {*new_targets, new_target}
new_database = dataclasses.replace(database, targets=new_targets)
self._target_manager.remove_database(database=database)
self._target_manager.add_database(database=new_database)

body = {
"result_code": ResultCodes.SUCCESS.value,
Expand Down
3 changes: 2 additions & 1 deletion src/mock_vws/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"""

import uuid
from collections.abc import Iterable
from dataclasses import dataclass, field
from typing import Self, TypedDict

Expand Down Expand Up @@ -67,7 +68,7 @@ class VuforiaDatabase:
# ``frozen=True`` while still being able to keep the interface we want.
# In particular, we might want to inspect the ``database`` object's targets
# as they change via API requests.
targets: set[Target] = field(default_factory=set, hash=False)
targets: Iterable[Target] = field(default_factory=set, hash=False)
state: States = States.WORKING

request_quota: int = 100000
Expand Down
4 changes: 2 additions & 2 deletions tests/mock_vws/test_requests_mock_usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ def test_to_dict(high_quality_image: io.BytesIO) -> None:
application_metadata=None,
)

assert len(database.targets) == 1
assert len(list(database.targets)) == 1

Check warning on line 286 in tests/mock_vws/test_requests_mock_usage.py

View check run for this annotation

Codecov / codecov/patch

tests/mock_vws/test_requests_mock_usage.py#L286

Added line #L286 was not covered by tests
target = next(iter(database.targets))
target_dict = target.to_dict()

Expand Down Expand Up @@ -318,7 +318,7 @@ def test_to_dict_deleted(high_quality_image: io.BytesIO) -> None:
vws_client.wait_for_target_processed(target_id=target_id)
vws_client.delete_target(target_id=target_id)

assert len(database.targets) == 1
assert len(list(database.targets)) == 1

Check warning on line 321 in tests/mock_vws/test_requests_mock_usage.py

View check run for this annotation

Codecov / codecov/patch

tests/mock_vws/test_requests_mock_usage.py#L321

Added line #L321 was not covered by tests
target = next(iter(database.targets))
target_dict = target.to_dict()

Expand Down

0 comments on commit e450256

Please sign in to comment.