Skip to content

Commit 39e29d6

Browse files
author
Matt Sokoloff
committed
try/finally beta
1 parent eac1c8d commit 39e29d6

File tree

6 files changed

+42
-34
lines changed

6 files changed

+42
-34
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM python:3.7
1+
FROM python:3.6
22

33
RUN pip install pytest pytest-cases
44

labelbox/client.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import logging
44
import mimetypes
55
import os
6-
from typing import Tuple
76

87
from google.api_core import retry
98
import requests
@@ -63,24 +62,25 @@ def __init__(self,
6362
"Labelbox API key not provided")
6463
api_key = os.environ[_LABELBOX_API_KEY]
6564
self.api_key = api_key
66-
self.enable_beta = enable_beta
67-
65+
66+
self.enable_beta = True
6867
if enable_beta:
6968
logger.info("Beta features have been enabled")
69+
7070

7171
logger.info("Initializing Labelbox client at '%s'", endpoint)
72-
7372
self.endpoint = endpoint
7473
self.headers = {
7574
'Accept': 'application/json',
7675
'Content-Type': 'application/json',
7776
'Authorization': 'Bearer %s' % api_key,
7877
'X-User-Agent': f'python-sdk {SDK_VERSION}'
7978
}
79+
8080

8181
@retry.Retry(predicate=retry.if_exception_type(
8282
labelbox.exceptions.InternalServerError))
83-
def execute(self, query, params=None, timeout=30.0):
83+
def execute(self, query, params=None, timeout=30.0, beta = False):
8484
""" Sends a request to the server for the execution of the
8585
given query.
8686
@@ -126,7 +126,11 @@ def convert_value(value):
126126
data = json.dumps({'query': query, 'variables': params}).encode('utf-8')
127127

128128
try:
129-
response = requests.post(self.endpoint,
129+
endpoint = self.endpoint
130+
if beta:
131+
endpoint = endpoint.replace('/graphql', '/_gql')
132+
133+
response = requests.post(endpoint,
130134
data=data,
131135
headers=self.headers,
132136
timeout=timeout)

labelbox/orm/db_object.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from dataclasses import field
22
from datetime import datetime, timezone
3+
from functools import partial
34
import logging
5+
from os import EX_CANTCREAT
46

57
from labelbox import utils
68
from labelbox.exceptions import InvalidQueryError, InvalidAttributeError
@@ -45,9 +47,10 @@ def __init__(self, client, field_values):
4547
self._set_field_values(field_values)
4648

4749
for relationship in self.relationships():
48-
value = field_values[
49-
relationship.name] if relationship.precompute else None
50-
50+
value = field_values.get(relationship.name)
51+
if relationship.precompute and value is None:
52+
raise KeyError(f"Expected field values for {relationship.name}")
53+
5154
setattr(self, relationship.name,
5255
RelationshipManager(self, relationship, value))
5356

@@ -254,18 +257,23 @@ def delete(self):
254257
type(self).bulk_delete([self])
255258

256259

257-
258260
def beta(fn):
259261
def wrapper(self, *args, **kwargs):
260262
if not isinstance(self, DbObject):
261263
raise TypeError("Cannot decorate functions that are not functions of `DbOjects` with `beta` decorator")
262264
if not self.client.enable_beta:
263-
logger.warning(
265+
raise Exception(
264266
f"This function {fn.__name__} relies on a beta feature in the api. This means that the interface could change."
265-
" Set `enable_beta=True` in the client to silence this warning.")
266-
self.client.endpoint = self.client.endpoint.replace("/graphql", "/_gql")
267+
" Set `enable_beta=True` in the client to enable use of these functions.")
268+
execute_fn = self.client.execute
269+
try:
270+
self.client.execute = partial(execute_fn, beta = True)
267271
result = fn(self, *args, **kwargs)
268-
self.client.endpoint = self.client.endpoint.replace("/_gql", "/graphql")
272+
if isinstance(result, PaginatedCollection):
273+
result.beta = True
269274
return result
275+
finally:
276+
self.client.execute = execute_fn
270277
return wrapper
271278

279+

labelbox/pagination.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ def __init__(self,
1717
params,
1818
dereferencing,
1919
obj_class,
20-
cursor_path=None,
21-
beta=False):
20+
cursor_path=None
21+
):
2222
""" Creates a PaginatedCollection.
2323
2424
Args:
@@ -40,7 +40,7 @@ def __init__(self,
4040
self.params = params
4141
self.dereferencing = dereferencing
4242
self.obj_class = obj_class
43-
self.beta = beta
43+
self.beta = False
4444

4545
self._fetched_all = False
4646
self._data = []
@@ -95,13 +95,11 @@ def get_next_cursor(self, results):
9595

9696
def fetched_all(self, n_items, results):
9797
self.next_cursor = self.get_next_cursor(results)
98-
if self.next_cursor is None:
99-
return True
100-
return False
98+
return self.next_cursor is None
10199

102-
def fetch_results(self, query, params, experimental):
100+
def fetch_results(self, query, params, beta):
103101
params.update({'from': self.next_cursor, 'first': _PAGE_SIZE})
104-
return self.client.execute(query, params, experimental=experimental)
102+
return self.client.execute(query, params, beta=beta)
105103

106104

107105
class _OffsetPagination:
@@ -116,6 +114,6 @@ def fetched_all(self, n_items, results):
116114
return True
117115
return False
118116

119-
def fetch_results(self, query, params, experimental):
117+
def fetch_results(self, query, params, beta):
120118
query = query % (self._fetched_pages * _PAGE_SIZE, _PAGE_SIZE)
121-
return self.client.execute(query, params, experimental=experimental)
119+
return self.client.execute(query, params, beta=beta)

labelbox/schema/invite.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,4 @@ def revoke(self):
5858
cancelInvite(where: $where) {id}}"""
5959
self.client.execute(query_str, {'where': {
6060
'id': self.uid
61-
}},
62-
experimental=True)
61+
}})

labelbox/schema/organization.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ def invites(self) -> PaginatedCollection:
6060
self.client,
6161
query_str, {}, ['organization', 'invites', 'nodes'],
6262
Invite,
63-
cursor_path=['organization', 'invites', 'nextCursor'],
64-
experimental=True)
63+
cursor_path=['organization', 'invites', 'nextCursor'])
6564

6665
def _assign_user_role(self, email: str, role: Role,
6766
project_roles: List[ProjectRole]) -> Dict[str, Any]:
@@ -95,7 +94,8 @@ def _assign_user_role(self, email: str, role: Role,
9594
"projects": projects
9695
}]
9796
},
98-
experimental=True) # We prob want to return an invite
97+
)
98+
# We prob want to return an invite
9999
# Could support bulk ops in the future
100100
invite_info = res['createInvites'][0]['invite']
101101
return invite_info
@@ -159,7 +159,7 @@ def user_limit(self) -> UserLimit:
159159
query_str = """query UsersLimitPyApi {
160160
organization {id account { id usersLimit { dateLimitWasReached remaining used limit }}}}
161161
"""
162-
res = self.client.execute(query_str, experimental=True)
162+
res = self.client.execute(query_str)
163163
return UserLimit(
164164
**{
165165
utils.snake_case(k): v for k, v in res['organization']
@@ -179,12 +179,11 @@ def invite_limit(self) -> InviteLimit:
179179
org_id_param = "organizationId"
180180
res = self.client.execute("""query InvitesLimitPyApi($%s: ID!) {
181181
invitesLimit(where: {id: $%s}) { used limit remaining }
182-
}""" % (org_id_param, org_id_param), {org_id_param: self.uid},
183-
experimental=True)
182+
}""" % (org_id_param, org_id_param), {org_id_param: self.uid})
184183
return InviteLimit(
185184
**{utils.snake_case(k): v for k, v in res['invitesLimit'].items()})
186185

187-
186+
@beta
188187
def remove_user(self, user: User):
189188
"""
190189
Deletes a user from the organization. This cannot be undone without sending another invite.

0 commit comments

Comments
 (0)