Skip to content

Commit 5d561b7

Browse files
author
Diego Ardila
committed
can test this tomorrow
1 parent 4d09675 commit 5d561b7

File tree

5 files changed

+106
-47
lines changed

5 files changed

+106
-47
lines changed

conftest.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,11 @@ def _make_request_patch(
5252
payload: dict, route: str, requests_command=requests.post
5353
) -> dict:
5454
response = client._make_request_raw(payload, route, requests_command)
55-
assert response.status_code in SUCCESS_STATUS_CODES, (
56-
f"HTTP response had status code: {response.status_code}. "
57-
f"Full JSON: {response.json()}"
58-
)
55+
if response.status_code not in SUCCESS_STATUS_CODES:
56+
response.raise_for_status()
5957
return response.json()
6058

61-
monkeypatch_session.setattr(client, "_make_request", _make_request_patch)
59+
monkeypatch_session.setattr(client, "make_request", _make_request_patch)
6260
return client
6361

6462

nucleus/__init__.py

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ def list_models(self) -> List[Model]:
167167
Lists available models in your repo.
168168
:return: model_ids
169169
"""
170-
model_objects = self._make_request({}, "models/", requests.get)
170+
model_objects = self.make_request({}, "models/", requests.get)
171171

172172
return [
173173
Model(
@@ -185,14 +185,14 @@ def list_datasets(self) -> Dict[str, Union[str, List[str]]]:
185185
Lists available datasets in your repo.
186186
:return: { datasets_ids }
187187
"""
188-
return self._make_request({}, "dataset/", requests.get)
188+
return self.make_request({}, "dataset/", requests.get)
189189

190190
def get_dataset_items(self, dataset_id) -> List[DatasetItem]:
191191
"""
192192
Gets all the dataset items inside your repo as a json blob.
193193
:return [ DatasetItem ]
194194
"""
195-
response = self._make_request(
195+
response = self.make_request(
196196
{}, f"dataset/{dataset_id}/datasetItems", requests.get
197197
)
198198
dataset_items = response.get("dataset_items", None)
@@ -235,7 +235,7 @@ def delete_model_run(self, model_run_id: str):
235235
:param model_run_id: internally controlled model_run_id
236236
:return: model_run
237237
"""
238-
return self._make_request(
238+
return self.make_request(
239239
{}, f"modelRun/{model_run_id}", requests.delete
240240
)
241241

@@ -254,7 +254,7 @@ def create_dataset_from_project(
254254
payload["last_n_tasks"] = str(last_n_tasks)
255255
if name:
256256
payload["name"] = name
257-
response = self._make_request(payload, "dataset/create_from_project")
257+
response = self.make_request(payload, "dataset/create_from_project")
258258
return Dataset(response[DATASET_ID_KEY], self)
259259

260260
def create_dataset(
@@ -271,7 +271,7 @@ def create_dataset(
271271
:param annotation_metadata_schema -- optional dictionary to define annotation metadata schema
272272
:return: new Dataset object
273273
"""
274-
response = self._make_request(
274+
response = self.make_request(
275275
{
276276
NAME_KEY: name,
277277
ANNOTATION_METADATA_SCHEMA_KEY: annotation_metadata_schema,
@@ -289,7 +289,7 @@ def delete_dataset(self, dataset_id: str) -> dict:
289289
:param payload: { "name": str }
290290
:return: { "dataset_id": str, "name": str }
291291
"""
292-
return self._make_request({}, f"dataset/{dataset_id}", requests.delete)
292+
return self.make_request({}, f"dataset/{dataset_id}", requests.delete)
293293

294294
def delete_dataset_item(
295295
self, dataset_id: str, item_id: str = None, reference_id: str = None
@@ -302,11 +302,11 @@ def delete_dataset_item(
302302
:return: { "dataset_id": str, "name": str }
303303
"""
304304
if item_id:
305-
return self._make_request(
305+
return self.make_request(
306306
{}, f"dataset/{dataset_id}/{item_id}", requests.delete
307307
)
308308
else: # Assume reference_id is provided
309-
return self._make_request(
309+
return self.make_request(
310310
{},
311311
f"dataset/{dataset_id}/refloc/{reference_id}",
312312
requests.delete,
@@ -566,7 +566,7 @@ def annotate_dataset(
566566
with self.tqdm_bar(total=total_batches) as pbar:
567567
for batch in tqdm_batches:
568568
payload = construct_annotation_payload(batch, update)
569-
response = self._make_request(
569+
response = self.make_request(
570570
payload, f"dataset/{dataset_id}/annotate"
571571
)
572572
pbar.update(1)
@@ -582,7 +582,7 @@ def annotate_dataset(
582582

583583
for s_batch in semseg_batches:
584584
payload = construct_segmentation_payload(s_batch, update)
585-
response = self._make_request(
585+
response = self.make_request(
586586
payload, f"dataset/{dataset_id}/annotate_segmentation"
587587
)
588588
pbar.update(1)
@@ -607,9 +607,7 @@ def ingest_tasks(self, dataset_id: str, payload: dict):
607607
:param dataset_id: id of the dataset
608608
:return: {"ingested_tasks": int, "ignored_tasks": int, "pending_tasks": int}
609609
"""
610-
return self._make_request(
611-
payload, f"dataset/{dataset_id}/ingest_tasks"
612-
)
610+
return self.make_request(payload, f"dataset/{dataset_id}/ingest_tasks")
613611

614612
def add_model(
615613
self, name: str, reference_id: str, metadata: Optional[Dict] = None
@@ -624,7 +622,7 @@ def add_model(
624622
:param metadata: An optional arbitrary metadata blob for the model.
625623
:return: { "model_id": str }
626624
"""
627-
response = self._make_request(
625+
response = self.make_request(
628626
construct_model_creation_payload(name, reference_id, metadata),
629627
"models/add",
630628
)
@@ -659,7 +657,7 @@ def create_model_run(self, dataset_id: str, payload: dict) -> ModelRun:
659657
}
660658
:return: new ModelRun object
661659
"""
662-
response = self._make_request(
660+
response = self.make_request(
663661
payload, f"dataset/{dataset_id}/modelRun/create"
664662
)
665663
if response.get(STATUS_CODE_KEY, None):
@@ -723,7 +721,7 @@ def predict(
723721
batch,
724722
update,
725723
)
726-
response = self._make_request(
724+
response = self.make_request(
727725
batch_payload, f"modelRun/{model_run_id}/predict"
728726
)
729727
if STATUS_CODE_KEY in response:
@@ -738,7 +736,7 @@ def predict(
738736

739737
for s_batch in s_batches:
740738
payload = construct_segmentation_payload(s_batch, update)
741-
response = self._make_request(
739+
response = self.make_request(
742740
payload, f"modelRun/{model_run_id}/predict_segmentation"
743741
)
744742
# pbar.update(1)
@@ -783,7 +781,7 @@ def commit_model_run(
783781
"""
784782
if payload is None:
785783
payload = {}
786-
return self._make_request(payload, f"modelRun/{model_run_id}/commit")
784+
return self.make_request(payload, f"modelRun/{model_run_id}/commit")
787785

788786
def dataset_info(self, dataset_id: str):
789787
"""
@@ -797,7 +795,7 @@ def dataset_info(self, dataset_id: str):
797795
'slice_ids': List[str]
798796
}
799797
"""
800-
return self._make_request(
798+
return self.make_request(
801799
{}, f"dataset/{dataset_id}/info", requests.get
802800
)
803801

@@ -816,7 +814,7 @@ def model_run_info(self, model_run_id: str):
816814
"metadata": Dict[str, Any],
817815
}
818816
"""
819-
return self._make_request(
817+
return self.make_request(
820818
{}, f"modelRun/{model_run_id}/info", requests.get
821819
)
822820

@@ -826,7 +824,7 @@ def dataitem_ref_id(self, dataset_id: str, reference_id: str):
826824
:param reference_id: reference_id of a dataset_item
827825
:return:
828826
"""
829-
return self._make_request(
827+
return self.make_request(
830828
{}, f"dataset/{dataset_id}/refloc/{reference_id}", requests.get
831829
)
832830

@@ -840,7 +838,7 @@ def predictions_ref_id(self, model_run_id: str, ref_id: str):
840838
"annotations": List[BoxPrediction],
841839
}
842840
"""
843-
return self._make_request(
841+
return self.make_request(
844842
{}, f"modelRun/{model_run_id}/refloc/{ref_id}", requests.get
845843
)
846844

@@ -851,7 +849,7 @@ def dataitem_iloc(self, dataset_id: str, i: int):
851849
:param i: absolute number of the dataset_item
852850
:return:
853851
"""
854-
return self._make_request(
852+
return self.make_request(
855853
{}, f"dataset/{dataset_id}/iloc/{i}", requests.get
856854
)
857855

@@ -865,7 +863,7 @@ def predictions_iloc(self, model_run_id: str, i: int):
865863
"annotations": List[BoxPrediction],
866864
}
867865
"""
868-
return self._make_request(
866+
return self.make_request(
869867
{}, f"modelRun/{model_run_id}/iloc/{i}", requests.get
870868
)
871869

@@ -880,7 +878,7 @@ def dataitem_loc(self, dataset_id: str, dataset_item_id: str):
880878
"annotations": List[Box2DAnnotation],
881879
}
882880
"""
883-
return self._make_request(
881+
return self.make_request(
884882
{}, f"dataset/{dataset_id}/loc/{dataset_item_id}", requests.get
885883
)
886884

@@ -894,7 +892,7 @@ def predictions_loc(self, model_run_id: str, dataset_item_id: str):
894892
"annotations": List[BoxPrediction],
895893
}
896894
"""
897-
return self._make_request(
895+
return self.make_request(
898896
{}, f"modelRun/{model_run_id}/loc/{dataset_item_id}", requests.get
899897
)
900898

@@ -920,7 +918,7 @@ def create_slice(self, dataset_id: str, payload: dict) -> Slice:
920918
}
921919
:return: new Slice object
922920
"""
923-
response = self._make_request(
921+
response = self.make_request(
924922
payload, f"dataset/{dataset_id}/create_slice"
925923
)
926924
return Slice(response[SLICE_ID_KEY], self)
@@ -951,7 +949,7 @@ def slice_info(self, slice_id: str) -> dict:
951949
"dataset_item_ids": List[str],
952950
}
953951
"""
954-
response = self._make_request(
952+
response = self.make_request(
955953
{},
956954
f"slice/{slice_id}",
957955
requests_command=requests.get,
@@ -968,7 +966,7 @@ def delete_slice(self, slice_id: str) -> dict:
968966
:return:
969967
{}
970968
"""
971-
response = self._make_request(
969+
response = self.make_request(
972970
{},
973971
f"slice/{slice_id}",
974972
requests_command=requests.delete,
@@ -1006,9 +1004,7 @@ def append_to_slice(
10061004
if reference_ids:
10071005
ids_to_append[REFERENCE_IDS_KEY] = reference_ids
10081006

1009-
response = self._make_request(
1010-
ids_to_append, f"slice/{slice_id}/append"
1011-
)
1007+
response = self.make_request(ids_to_append, f"slice/{slice_id}/append")
10121008
return response
10131009

10141010
def list_autotags(self, dataset_id: str) -> List[str]:
@@ -1017,7 +1013,7 @@ def list_autotags(self, dataset_id: str) -> List[str]:
10171013
:param dataset_id: internally controlled dataset_id
10181014
:return: List[str] representing autotag_ids
10191015
"""
1020-
response = self._make_request(
1016+
response = self.make_request(
10211017
{},
10221018
f"{dataset_id}/list_autotags",
10231019
requests_command=requests.get,
@@ -1035,29 +1031,29 @@ def delete_model(self, model_id: str) -> dict:
10351031
:return:
10361032
{}
10371033
"""
1038-
response = self._make_request(
1034+
response = self.make_request(
10391035
{},
10401036
f"model/{model_id}",
10411037
requests_command=requests.delete,
10421038
)
10431039
return response
10441040

10451041
def create_custom_index(self, dataset_id: str, embeddings_url: str):
1046-
return self._make_request(
1042+
return self.make_request(
10471043
{EMBEDDINGS_URL_KEY: embeddings_url},
10481044
f"indexing/{dataset_id}",
10491045
requests_command=requests.post,
10501046
)
10511047

10521048
def check_index_status(self, job_id: str):
1053-
return self._make_request(
1049+
return self.make_request(
10541050
{},
10551051
f"indexing/{job_id}",
10561052
requests_command=requests.get,
10571053
)
10581054

10591055
def delete_custom_index(self, dataset_id: str):
1060-
return self._make_request(
1056+
return self.make_request(
10611057
{},
10621058
f"indexing/{dataset_id}",
10631059
requests_command=requests.delete,
@@ -1132,7 +1128,7 @@ def _make_request_raw(
11321128

11331129
return response
11341130

1135-
def _make_request(
1131+
def make_request(
11361132
self, payload: dict, route: str, requests_command=requests.post
11371133
) -> dict:
11381134
"""
@@ -1149,6 +1145,7 @@ def _make_request(
11491145
if getattr(response, "status_code") not in SUCCESS_STATUS_CODES:
11501146
logger.warning(response)
11511147

1152-
return (
1153-
response.json()
1154-
) # TODO: this line fails if response has code == 404
1148+
if response.status_code == 404:
1149+
raise response.raise_for_status()
1150+
1151+
return response.json()

nucleus/dataset.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
)
2121
from .payload_constructor import construct_model_run_creation_payload
2222

23+
import requests
24+
2325

2426
class Dataset:
2527
"""
@@ -61,6 +63,25 @@ def size(self) -> int:
6163
def items(self) -> List[DatasetItem]:
6264
return self._client.get_dataset_items(self.id)
6365

66+
def autotag_scores(self, autotag_name, for_scores_greater_than=0):
67+
"""Export the autotag scores above a threshold, largest scores first.
68+
69+
If you have pandas installed, you can create a pandas dataframe using
70+
71+
pandas.Dataframe(dataset.autotag_scores(autotag_name))
72+
73+
:return: dictionary of the form
74+
{'ref_ids': List[str],
75+
'datset_item_ids': List[str],
76+
'score': List[float]}
77+
"""
78+
response = self._client.make_request(
79+
payload={},
80+
route=f"autotag/{self.id}/{autotag_name}/{for_scores_greater_than}",
81+
requests_command=requests.get,
82+
)
83+
return response
84+
6485
def info(self) -> dict:
6586
"""
6687
Returns information about existing dataset

0 commit comments

Comments
 (0)