Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PY-386][external] Core method to move items between folders & tests #709

Merged
merged 3 commits into from
Nov 9, 2023
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
9 changes: 8 additions & 1 deletion darwin/future/core/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@
from requests.adapters import HTTPAdapter, Retry

from darwin.future.core.types.common import JSONType, QueryString
from darwin.future.exceptions import NotFound, Unauthorized, UnprocessibleEntity
from darwin.future.exceptions import (
BadRequest,
NotFound,
Unauthorized,
UnprocessibleEntity,
)


class TeamsConfig(BaseModel):
Expand Down Expand Up @@ -235,6 +240,8 @@ def raise_for_darwin_exception(response: requests.Response) -> None:
"""
if response.status_code == 200:
return
if response.status_code == 400:
raise BadRequest(response)
Comment on lines +243 to +244
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As covered in my comment in PY-386 here, we probably want to catch the 400 errors this endpoint can throw in Core

To do this, I introduced the BadRequest class. This broke some existing tests that returned 400s, as previously they were expecting HTTPError, so updated each breaking test to expect BadRequest instead

if response.status_code == 401:
raise Unauthorized(response)
if response.status_code == 404:
Expand Down
48 changes: 48 additions & 0 deletions darwin/future/core/items/move_items_to_folder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from typing import Dict, List
from uuid import UUID

from darwin.future.core.client import ClientCore
from darwin.future.core.types.common import JSONType
from darwin.future.data_objects.typing import UnknownType


def move_list_of_items_to_folder(
api_client: ClientCore,
team_slug: str,
dataset_id: int,
item_ids: List[UUID],
path: str,
filters: Dict[str, UnknownType] = {},
) -> JSONType:
"""
Move specified items to a folder

Parameters
----------
client: Client
The client to use for the request
team_slug: str
The slug of the team containing the items
dataset_id: int
The ID of the dataset containing the items
item_ids: List[UUID]
The IDs of the items to be moved
path: str
The path to the folder to move the items to
filters: Dict[str, UnknownType]
Dataset filter parameters

Returns
-------
JSONType
"""
payload = {
"filters": {
"dataset_ids": [dataset_id],
"item_ids": [str(item_id) for item_id in item_ids],
**filters,
},
"path": path,
}

return api_client.post(f"/v2/teams/{team_slug}/items/path", data=payload)
5 changes: 5 additions & 0 deletions darwin/future/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from typing import Optional, Sequence


from darwin.future.data_objects.typing import KeyValuePairDict, UnknownType


Expand Down Expand Up @@ -107,6 +108,10 @@ class UnrecognizableFileEncoding(DarwinException):
pass


class BadRequest(DarwinException):
pass


class MissingSlug(DarwinException):
pass

Expand Down
4 changes: 2 additions & 2 deletions darwin/future/tests/core/datasets/test_create_dataset.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import responses
from pytest import raises
from requests import HTTPError

from darwin.future.core.client import ClientCore
from darwin.future.core.datasets import create_dataset
from darwin.future.data_objects.dataset import DatasetCore
from darwin.future.exceptions import BadRequest
from darwin.future.tests.core.fixtures import * # noqa: F401, F403

from .fixtures import * # noqa: F401, F403
Expand All @@ -29,7 +29,7 @@ def test_it_creates_a_dataset(
def test_it_raises_an_error_on_http_error(
basic_dataset: DatasetCore, base_client: ClientCore
) -> None:
with raises(HTTPError):
with raises(BadRequest):
with responses.RequestsMock() as rsps:
rsps.add(
rsps.POST,
Expand Down
4 changes: 2 additions & 2 deletions darwin/future/tests/core/datasets/test_delete_dataset.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import responses
from pytest import raises
from requests import HTTPError

from darwin.future.core.client import ClientCore
from darwin.future.core.datasets import remove_dataset
from darwin.future.exceptions import BadRequest
from darwin.future.tests.core.fixtures import *

from .fixtures import *
Expand All @@ -26,7 +26,7 @@ def test_it_deletes_a_dataset(base_client: ClientCore) -> None:


def test_it_throws_http_errors_returned_by_the_client(base_client: ClientCore) -> None:
with raises(HTTPError):
with raises(BadRequest):
with responses.RequestsMock() as rsps:
rsps.add(
rsps.PUT,
Expand Down
4 changes: 2 additions & 2 deletions darwin/future/tests/core/datasets/test_get_dataset.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import responses
from pydantic import ValidationError
from pytest import raises
from requests import HTTPError

from darwin.future.core.client import ClientCore
from darwin.future.core.datasets import get_dataset
from darwin.future.data_objects.dataset import DatasetCore
from darwin.future.exceptions import BadRequest
from darwin.future.tests.core.fixtures import *

from .fixtures import *
Expand Down Expand Up @@ -34,7 +34,7 @@ def test_it_raises_an_error_on_http_error(base_client: ClientCore) -> None:
json={},
status=400,
)
with raises(HTTPError):
with raises(BadRequest):
get_dataset(base_client, "test-dataset")
get_dataset(base_client, "test-dataset")

Expand Down
6 changes: 3 additions & 3 deletions darwin/future/tests/core/datasets/test_list_datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import pytest
import responses
from requests.exceptions import HTTPError

from darwin.future.core.client import ClientCore
from darwin.future.core.datasets import list_datasets
from darwin.future.data_objects.dataset import DatasetCore
from darwin.future.exceptions import BadRequest
from darwin.future.tests.core.fixtures import *

from .fixtures import *
Expand Down Expand Up @@ -42,7 +42,7 @@ def test_it_returns_an_error_if_the_client_returns_an_http_error(
json={},
status=400,
)
with pytest.raises(HTTPError) as execinfo:
with pytest.raises(BadRequest) as execinfo:
list_datasets(base_client)

assert execinfo.value.response.status_code == 400 # type: ignore
assert execinfo.value.args[0].status_code == 400 # type: ignore
63 changes: 63 additions & 0 deletions darwin/future/tests/core/items/test_move_items_to_folder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
from uuid import UUID

import responses
from pytest import raises

from darwin.future.core.client import ClientCore
from darwin.future.core.items.move_items_to_folder import move_list_of_items_to_folder
from darwin.future.exceptions import BadRequest
from darwin.future.tests.core.fixtures import *


@responses.activate
def test_move_list_of_items_to_folder_including_filters(
base_client: ClientCore,
) -> None:
# Define the expected response
responses.add(
responses.POST,
base_client.config.api_endpoint + "v2/teams/test-team/items/path",
json={"affected_item_count": 2},
)

# Call the function
response = move_list_of_items_to_folder(
api_client=base_client,
team_slug="test-team",
dataset_id=000000,
item_ids=[
UUID("00000000-0000-0000-0000-000000000000"),
UUID("00000000-0000-0000-0000-000000000000"),
],
filters={
"not_statuses": ["uploading", "annotate"],
"not_assignees": [123, 456, 789],
},
path="/test/path",
)

# Check that the response mathces what we expect
assert response == {"affected_item_count": 2}


def test_move_list_of_items_to_folder_with_error_response(
base_client: ClientCore,
) -> None:
with raises(BadRequest):
with responses.RequestsMock() as rsps:
rsps.add(
responses.POST,
base_client.config.api_endpoint + "v2/teams/test-team/items/path",
status=400,
)

move_list_of_items_to_folder(
api_client=base_client,
team_slug="test-team",
dataset_id=000000,
item_ids=[
UUID("00000000-0000-0000-0000-000000000000"),
UUID("00000000-0000-0000-0000-000000000000"),
],
path="/test/path",
)
4 changes: 2 additions & 2 deletions darwin/future/tests/core/workflows/test_get_workflow.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import responses
from pydantic import ValidationError
from pytest import raises
from requests import HTTPError

from darwin.future.core.client import ClientCore
from darwin.future.core.types.common import JSONType
from darwin.future.core.workflows import get_workflow
from darwin.future.data_objects.workflow import WorkflowCore
from darwin.future.exceptions import BadRequest
from darwin.future.tests.core.fixtures import *


Expand Down Expand Up @@ -84,5 +84,5 @@ def test_get_workflows_with_error(base_client: ClientCore) -> None:
status=400
)
# fmt: on
with raises(HTTPError):
with raises(BadRequest):
get_workflow(base_client, NON_EXISTENT_ID)
4 changes: 2 additions & 2 deletions darwin/future/tests/core/workflows/test_get_workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
import pytest
import responses
from pydantic import ValidationError
from requests import HTTPError

from darwin.future.core.client import ClientCore
from darwin.future.core.types.common import JSONType
from darwin.future.core.workflows import get_workflows
from darwin.future.data_objects.workflow import WorkflowCore
from darwin.future.exceptions import BadRequest
from darwin.future.tests.core.fixtures import *


Expand Down Expand Up @@ -81,5 +81,5 @@ def test_get_workflows_with_error(base_client: ClientCore) -> None:
)

# Call the function being tested
with pytest.raises(HTTPError):
with pytest.raises(BadRequest):
get_workflows(base_client)
4 changes: 2 additions & 2 deletions darwin/future/tests/core/workflows/test_list_workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import responses
from pydantic import ValidationError
from requests import HTTPError

from darwin.future.core.client import ClientCore
from darwin.future.core.types.common import JSONType
from darwin.future.core.workflows import list_workflows
from darwin.future.data_objects.workflow import WorkflowCore
from darwin.future.exceptions import BadRequest
from darwin.future.tests.core.fixtures import *


Expand Down Expand Up @@ -93,6 +93,6 @@ def test_list_workflows_with_error(base_client: ClientCore) -> None:

assert isinstance(exceptions, List)
assert len(exceptions) == 1
assert isinstance(exceptions[0], HTTPError)
assert isinstance(exceptions[0], BadRequest)

assert not workflows
Loading