Skip to content

Commit 0ea324a

Browse files
owencjonesOwen
andauthored
[IO-1626][external] Unexpected data from API causes crash (#656)
* Initial fix * Tests for the client fix * Boyscouting/type clearup * Changed JSONFreeForm fixes to UnknownType as it is more appropriate. * Response to PR comments --------- Co-authored-by: Owen <[email protected]>
1 parent 3cc2d52 commit 0ea324a

File tree

3 files changed

+73
-6
lines changed

3 files changed

+73
-6
lines changed

darwin/client.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
is_project_dir,
3737
urljoin,
3838
)
39+
from darwin.utils.get_item_count import get_item_count
3940

4041

4142
class Client:
@@ -134,7 +135,7 @@ def list_remote_datasets(self, team_slug: Optional[str] = None) -> Iterator[Remo
134135
slug=dataset["slug"],
135136
team=team_slug or self.default_team,
136137
dataset_id=dataset["id"],
137-
item_count=self._get_item_count(dataset),
138+
item_count=get_item_count(dataset),
138139
progress=dataset["progress"],
139140
client=self,
140141
)
@@ -144,7 +145,7 @@ def list_remote_datasets(self, team_slug: Optional[str] = None) -> Iterator[Remo
144145
slug=dataset["slug"],
145146
team=team_slug or self.default_team,
146147
dataset_id=dataset["id"],
147-
item_count=self._get_item_count(dataset),
148+
item_count=get_item_count(dataset),
148149
progress=dataset["progress"],
149150
client=self,
150151
)
@@ -199,7 +200,7 @@ def get_remote_dataset(self, dataset_identifier: Union[str, DatasetIdentifier])
199200
slug=dataset["slug"],
200201
team=parsed_dataset_identifier.team_slug,
201202
dataset_id=dataset["id"],
202-
item_count=self._get_item_count(dataset),
203+
item_count=get_item_count(dataset),
203204
progress=0,
204205
client=self,
205206
)
@@ -209,7 +210,7 @@ def get_remote_dataset(self, dataset_identifier: Union[str, DatasetIdentifier])
209210
slug=dataset["slug"],
210211
team=parsed_dataset_identifier.team_slug,
211212
dataset_id=dataset["id"],
212-
item_count=self._get_item_count(dataset),
213+
item_count=get_item_count(dataset),
213214
progress=0,
214215
client=self,
215216
)
@@ -245,7 +246,7 @@ def create_dataset(self, name: str, team_slug: Optional[str] = None) -> RemoteDa
245246
team=team_slug or self.default_team,
246247
slug=dataset["slug"],
247248
dataset_id=dataset["id"],
248-
item_count=self._get_item_count(dataset),
249+
item_count=get_item_count(dataset),
249250
progress=0,
250251
client=self,
251252
)
@@ -255,7 +256,7 @@ def create_dataset(self, name: str, team_slug: Optional[str] = None) -> RemoteDa
255256
team=team_slug or self.default_team,
256257
slug=dataset["slug"],
257258
dataset_id=dataset["id"],
258-
item_count=self._get_item_count(dataset),
259+
item_count=get_item_count(dataset),
259260
progress=0,
260261
client=self,
261262
)

darwin/utils/get_item_count.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from typing import Dict, Optional
2+
3+
4+
def get_item_count(dataset_dict: Dict) -> int:
5+
"""
6+
Returns the number of items in the dataset.
7+
8+
Parameters
9+
----------
10+
dataset_dict: Dict
11+
The dataset dictionary.
12+
13+
Returns
14+
-------
15+
int
16+
The number of items in the dataset.
17+
"""
18+
num_items: Optional[int] = dataset_dict.get("num_items")
19+
num_videos: Optional[int] = dataset_dict.get("num_videos")
20+
num_images: Optional[int] = dataset_dict.get("num_images")
21+
22+
if num_items is not None:
23+
return num_items
24+
25+
return (num_images or 0) + (num_videos or 0)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Tests for _get_item_count
2+
from darwin.utils.get_item_count import get_item_count
3+
4+
5+
def test__get_item_count_defaults_to_num_items_if_present() -> None:
6+
dataset_return = {
7+
"num_images": 2, # Should be ignored
8+
"num_videos": 3, # Should be ignored
9+
"num_items": 5, # Should get this one
10+
}
11+
12+
assert get_item_count(dataset_return) == 5
13+
14+
15+
def test__get_item_count_returns_sum_of_others_if_num_items_not_present() -> None:
16+
dataset_return = {
17+
"num_images": 7, # Should be summed
18+
"num_videos": 3, # Should be summed
19+
}
20+
21+
assert get_item_count(dataset_return) == 10
22+
23+
24+
def test__get_item_count_should_tolerate_missing_members() -> None:
25+
assert (
26+
get_item_count(
27+
{
28+
"num_videos": 3, # Should be ignored
29+
}
30+
)
31+
== 3
32+
)
33+
34+
assert (
35+
get_item_count(
36+
{
37+
"num_images": 2,
38+
}
39+
)
40+
== 2
41+
)

0 commit comments

Comments
 (0)