Skip to content

Commit 0b988ea

Browse files
Improve directory and startup (#29)
* Upgrade to use class object instead of json -> Before we were using the json which introduced some potential confusion now it uses the directory object -> Move functions inside class -> Move default setting inside here... the API returning default in that way still not best but working in existing pattern * Seperate concerns and improve startup -> move default dir and label setting to optional and more cleanly define at init instead of inside auth -> use new directory class -> use new get_directory_list() -> get dir now checks if none -> Added print statements for now since still so much changing but those can be optional log statements in future of course * Align with schema direction only schema is needed not directory id (changing API side too) * Align with new pattern * opencv should be optional only needed in some cases, heavy requirement to put here * Fix init bug - this was preventing to_tensorflow() from working init_file_ids asumes the id was already set but for now refresh_from_dict pattern means the id is set after init so refactor `init_files()` and call it after... We will need to work on this more Luckily at least now it's refactored to `convert_json_to_sdk_object()` so we have it only in one place * fix: dir initialization Co-authored-by: Pablo <pjestradac@gmail.com>
1 parent 2931576 commit 0b988ea

File tree

6 files changed

+159
-144
lines changed

6 files changed

+159
-144
lines changed

sdk/diffgram/brain/brain.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44
import tempfile
55

66
# TODO import these only if local prediction is needed
7-
import cv2
7+
8+
try:
9+
import cv2
10+
except:
11+
print("Could not import cv2")
812

913
try:
1014
import tensorflow as tf

sdk/diffgram/core/core.py

Lines changed: 69 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
from diffgram import __version__
44

55
from diffgram.file.view import get_label_file_dict
6-
from diffgram.core.directory import get_directory_list
7-
from diffgram.core.directory import set_directory_by_name
86
from diffgram.convert.convert import convert_label
97
from diffgram.label.label_new import label_new
108

@@ -29,7 +27,10 @@ def __init__(
2927
client_secret = None,
3028
debug = False,
3129
staging = False,
32-
host = None
30+
host = None,
31+
init_default_directory = True,
32+
refresh_local_label_dict = True
33+
3334
):
3435

3536
self.session = requests.Session()
@@ -50,24 +51,41 @@ def __init__(
5051
self.host = "https://diffgram.com"
5152
else:
5253
self.host = host
53-
self.directory_id = None
54-
self.name_to_file_id = None
54+
5555
self.auth(
5656
project_string_id = project_string_id,
5757
client_id = client_id,
5858
client_secret = client_secret)
59-
self.client_id = client_id
60-
self.client_secret = client_secret
6159

6260
self.file = FileConstructor(self)
63-
self.train = Train(self)
61+
#self.train = Train(self)
6462
self.job = Job(self)
6563
self.guide = Guide(self)
66-
self.directory = Directory(self, validate_ids = False)
64+
self.directory = Directory(self,
65+
init_file_ids = False,
66+
validate_ids = False)
6767
self.export = Export(self)
6868
self.task = Task(client = self)
69+
70+
self.directory_id = None
71+
self.name_to_file_id = None
72+
73+
74+
if init_default_directory is True:
75+
self.set_default_directory(directory = self.directory)
76+
print("Default directory set:", self.directory_id)
77+
78+
if refresh_local_label_dict is True:
79+
self.get_label_file_dict()
80+
81+
self.client_id = client_id
82+
self.client_secret = client_secret
83+
6984
self.label_schema_list = self.get_label_schema_list()
7085

86+
self.directory_list = None
87+
88+
7189
def get_member_list(self):
7290
url = '/api/project/{}/view'.format(self.project_string_id)
7391
response = self.session.get(url = self.host + url)
@@ -216,9 +234,7 @@ def handle_errors(self,
216234
def auth(self,
217235
project_string_id,
218236
client_id = None,
219-
client_secret = None,
220-
set_default_directory = True,
221-
refresh_local_label_dict = True
237+
client_secret = None
222238
):
223239
"""
224240
Define authorization configuration
@@ -242,55 +258,65 @@ def auth(self,
242258
if client_id and client_secret:
243259
self.session.auth = (client_id, client_secret)
244260

245-
if set_default_directory is True:
246-
self.set_default_directory()
247-
248-
if refresh_local_label_dict is True:
249-
# Refresh local labels from Diffgram project
250-
self.get_label_file_dict()
251261

252-
def set_default_directory(self,
253-
directory_id = None):
262+
def set_directory_by_name(self, name):
254263
"""
255-
-> If no id is provided fetch directory list for project
256-
and set first directory to default.
257-
-> Sets the headers of self.session
258264
259265
Arguments
260-
directory_id, int, defaults to None
266+
self
267+
name, string
261268
262-
Returns
263-
None
269+
"""
264270

265-
Future
266-
TODO return error if invalid directory?
271+
if name is None:
272+
raise Exception("No name provided.")
267273

268-
"""
274+
# Don't refresh by default, just set from existing
269275

270-
if directory_id:
271-
# TODO check if valid?
272-
# data = {}
273-
# data["directory_id"] = directory_id
274-
self.directory_id = directory_id
275-
else:
276+
names_attempted = []
277+
did_set = False
278+
279+
if not self.directory_list:
280+
self.directory_list = self.directory.get_directory_list()
276281

277-
data = self.get_directory_list()
282+
for directory in self.directory_list:
278283

279-
self.default_directory = data['default_directory']
284+
if directory.nickname == name:
285+
self.set_default_directory(directory = directory)
286+
did_set = True
287+
break
288+
else:
289+
names_attempted.append(directory.nickname)
290+
291+
if did_set is False:
292+
raise Exception(name, " does not exist. Valid names are: " +
293+
str(names_attempted))
294+
295+
296+
def set_default_directory(self,
297+
directory_id = None,
298+
directory = None):
299+
"""
300+
-> If no id is provided fetch directory list for project
301+
and set first directory to default.
302+
-> Sets the headers of self.session
280303
281-
# Hold over till refactoring (would prefer to
282-
# just call self.directory_default.id
283-
self.directory_id = self.default_directory['id']
304+
"""
305+
if directory_id:
306+
self.directory_id = directory_id
307+
if directory:
308+
self.directory_id = directory.id
309+
self.default_directory = directory
310+
311+
if not hasattr(self, 'directory_list'):
312+
self.directory_list = self.directory.get_directory_list()
284313

285-
self.directory_list = data["directory_list"]
286314
self.session.headers.update(
287315
{'directory_id': str(self.directory_id)})
288316

289317

290318
# TODO review not using this pattern anymore
291319

292320
setattr(Project, "get_label_file_dict", get_label_file_dict)
293-
setattr(Project, "get_directory_list", get_directory_list)
294321
setattr(Project, "convert_label", convert_label)
295322
setattr(Project, "label_new", label_new)
296-
setattr(Project, "set_directory_by_name", set_directory_by_name)

0 commit comments

Comments
 (0)