|
1 | 1 | from datetime import datetime, timezone |
2 | 2 | import json |
| 3 | +from labelbox.schema.ontology import Ontology |
3 | 4 | import logging |
4 | 5 | import mimetypes |
5 | 6 | import os |
@@ -71,6 +72,7 @@ def __init__(self, |
71 | 72 | 'X-User-Agent': f'python-sdk {SDK_VERSION}' |
72 | 73 | } |
73 | 74 |
|
| 75 | + #TODO: Add exponential backoff so we don'tt overwhelm the api |
74 | 76 | @retry.Retry(predicate=retry.if_exception_type( |
75 | 77 | labelbox.exceptions.InternalServerError)) |
76 | 78 | def execute(self, query, params=None, timeout=10.0): |
@@ -126,25 +128,23 @@ def convert_value(value): |
126 | 128 | logger.debug("Response: %s", response.text) |
127 | 129 | except requests.exceptions.Timeout as e: |
128 | 130 | raise labelbox.exceptions.TimeoutError(str(e)) |
129 | | - |
130 | 131 | except requests.exceptions.RequestException as e: |
131 | 132 | logger.error("Unknown error: %s", str(e)) |
132 | 133 | raise labelbox.exceptions.NetworkError(e) |
133 | | - |
134 | 134 | except Exception as e: |
135 | 135 | raise labelbox.exceptions.LabelboxError( |
136 | 136 | "Unknown error during Client.query(): " + str(e), e) |
137 | | - |
138 | 137 | try: |
139 | 138 | r_json = response.json() |
140 | 139 | except: |
141 | | - error_502 = '502 Bad Gateway' |
142 | | - if error_502 in response.text: |
143 | | - raise labelbox.exceptions.InternalServerError(error_502) |
144 | 140 | if "upstream connect error or disconnect/reset before headers" \ |
145 | 141 | in response.text: |
146 | 142 | raise labelbox.exceptions.InternalServerError( |
147 | 143 | "Connection reset") |
| 144 | + elif response.status_code == 502: |
| 145 | + error_502 = '502 Bad Gateway' |
| 146 | + raise labelbox.exceptions.InternalServerError(error_502) |
| 147 | + |
148 | 148 | raise labelbox.exceptions.LabelboxError( |
149 | 149 | "Failed to parse response as JSON: %s" % response.text) |
150 | 150 |
|
@@ -189,6 +189,7 @@ def check_errors(keywords, *path): |
189 | 189 |
|
190 | 190 | # Check if API limit was exceeded |
191 | 191 | response_msg = r_json.get("message", "") |
| 192 | + |
192 | 193 | if response_msg.startswith("You have exceeded"): |
193 | 194 | raise labelbox.exceptions.ApiLimitError(response_msg) |
194 | 195 |
|
@@ -292,7 +293,6 @@ def upload_data(self, |
292 | 293 | "1": (filename, content, content_type) if |
293 | 294 | (filename and content_type) else content |
294 | 295 | }) |
295 | | - |
296 | 296 | try: |
297 | 297 | file_data = response.json().get("data", None) |
298 | 298 | except ValueError as e: # response is not valid JSON |
@@ -415,6 +415,12 @@ def get_datasets(self, where=None): |
415 | 415 | """ |
416 | 416 | return self._get_all(Dataset, where) |
417 | 417 |
|
| 418 | + def get_ontologies(self, where=None): |
| 419 | + """ |
| 420 | + #TODO |
| 421 | + """ |
| 422 | + return self._get_all(Ontology, where) |
| 423 | + |
418 | 424 | def get_labeling_frontends(self, where=None): |
419 | 425 | """ Fetches all the labeling frontends. |
420 | 426 |
|
@@ -473,7 +479,9 @@ def create_dataset(self, **kwargs): |
473 | 479 | """ |
474 | 480 | return self._create(Dataset, kwargs) |
475 | 481 |
|
476 | | - def create_project(self, **kwargs): |
| 482 | + def create_project(self, |
| 483 | + ontology=None, |
| 484 | + **kwargs): #<<<<< TODO: Do we want that signature |
477 | 485 | """ Creates a Project object on the server. |
478 | 486 |
|
479 | 487 | Attribute values are passed as keyword arguments. |
|
0 commit comments