Skip to content

Commit e896c9e

Browse files
author
Val Brodsky
committed
Add Identifiable hierarchy
1 parent 6060cc3 commit e896c9e

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed

labelbox/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,4 @@
3333
from labelbox.schema.slice import Slice, CatalogSlice, ModelSlice
3434
from labelbox.schema.queue_mode import QueueMode
3535
from labelbox.schema.task_queue import TaskQueue
36+
from labelbox.schema.identifiable import UniqueIds, GlobalKeys

labelbox/schema/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@
2121
import labelbox.schema.batch
2222
import labelbox.schema.iam_integration
2323
import labelbox.schema.media_type
24+
import labelbox.schema.identifiable

labelbox/schema/identifiable.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from abc import ABC
2+
from enum import Enum
3+
from typing import List, Union
4+
from typing_extensions import TypeAlias
5+
6+
7+
class IdType(str, Enum):
8+
DataRowId = "DATA_ROW_ID"
9+
GlobalKey = "GLOBAL_KEY"
10+
11+
12+
class Identifiable(ABC):
13+
14+
def __init__(self, keys: Union[str, List[str]]):
15+
self._keys = keys
16+
if isinstance(keys, str):
17+
self.keys = [keys]
18+
self._id_type = IdType.DataRowId
19+
20+
@property
21+
def keys(self):
22+
return self._keys
23+
24+
@keys.setter
25+
def keys(self, keys):
26+
self._keys = keys
27+
if isinstance(keys, str):
28+
self.keys = [keys]
29+
30+
@property
31+
def id_type(self):
32+
return self._id_type
33+
34+
def __eq__(self, other):
35+
return other.keys == self.keys
36+
37+
def __hash__(self):
38+
hash(self.keys)
39+
40+
def __str__(self):
41+
return self.keys.__str__()
42+
43+
44+
class UniqueIds(Identifiable):
45+
46+
def __init__(self, keys: Union[str, List[str]]):
47+
super().__init__(keys)
48+
self._id_type = IdType.DataRowId
49+
50+
51+
class GlobalKeys(Identifiable):
52+
53+
def __init__(self, keys: Union[str, List[str]]):
54+
super().__init__(keys)
55+
self._id_type = IdType.GlobalKey
56+
57+
58+
DefaultIdentifiable: TypeAlias = UniqueIds
59+
DataRowIdentifiers: TypeAlias = Union[UniqueIds, GlobalKeys]
60+
61+
62+
def strings_to_identifiable(keys: Union[str, List[str]]) -> DefaultIdentifiable:
63+
return DefaultIdentifiable(keys)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from labelbox.schema.identifiable import GlobalKeys, UniqueIds, strings_to_identifiable
2+
3+
4+
def test_unique_ids():
5+
ids = ["a", "b", "c"]
6+
identifiable = UniqueIds(ids)
7+
assert identifiable.keys == ids
8+
assert identifiable.id_type == "DATA_ROW_ID"
9+
10+
11+
def test_global_keys():
12+
ids = ["a", "b", "c"]
13+
identifiable = GlobalKeys(ids)
14+
assert identifiable.keys == ids
15+
assert identifiable.id_type == "GLOBAL_KEY"
16+
17+
18+
def test_strings_to_identifiable():
19+
ids = ["a", "b", "c"]
20+
identifiable = strings_to_identifiable(ids)
21+
assert identifiable.keys == ids
22+
assert identifiable.id_type == "DATA_ROW_ID"
23+
24+
ids = "a"
25+
identifiable = strings_to_identifiable(ids)
26+
assert identifiable.keys == [ids]
27+
assert identifiable.id_type == "DATA_ROW_ID"
28+
29+
30+
def test__str__():
31+
ids = ["a", "b", "c"]
32+
identifiable = UniqueIds(ids)
33+
str_representation = identifiable.__str__()
34+
assert str_representation == "['a', 'b', 'c']"

0 commit comments

Comments
 (0)