Skip to content

Commit 7e81564

Browse files
committed
Place MediaType in a dedicated file
1 parent 18911a1 commit 7e81564

File tree

5 files changed

+115
-102
lines changed

5 files changed

+115
-102
lines changed

examples/basics/projects.ipynb

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22
"cells": [
33
{
44
"cell_type": "markdown",
5+
"metadata": {},
56
"source": [
67
"<td>\n",
78
" <a target=\"_blank\" href=\"https://labelbox.com\" ><img src=\"https://labelbox.com/blog/content/images/2021/02/logo-v4.svg\" width=256/></a>\n",
89
"</td>"
9-
],
10-
"metadata": {}
10+
]
1111
},
1212
{
1313
"cell_type": "markdown",
14+
"metadata": {},
1415
"source": [
1516
"<td>\n",
1617
"<a href=\"https://colab.research.google.com/github/Labelbox/labelbox-python/blob/develop/examples/basics/projects.ipynb\" target=\"_blank\"><img\n",
@@ -21,18 +22,18 @@
2122
"<a href=\"https://github.com/Labelbox/labelbox-python/tree/develop/examples/basics/projects.ipynb\" target=\"_blank\"><img\n",
2223
"src=\"https://img.shields.io/badge/GitHub-100000?logo=github&logoColor=white\" alt=\"GitHub\"></a>\n",
2324
"</td>"
24-
],
25-
"metadata": {}
25+
]
2626
},
2727
{
2828
"cell_type": "markdown",
29+
"metadata": {},
2930
"source": [
3031
"# Projects"
31-
],
32-
"metadata": {}
32+
]
3333
},
3434
{
3535
"cell_type": "markdown",
36+
"metadata": {},
3637
"source": [
3738
"* A project can be thought of as a specific labeling task on a set of labels\n",
3839
"* That set of labels is defined by the datasets attached to the project\n",
@@ -41,123 +42,129 @@
4142
"\n",
4243
"** Note that there is a lot of advanced usage that is not covered in this notebook. See project_setup for those functions.\n",
4344
"* Also note that deprecated functions are not explained here."
44-
],
45-
"metadata": {}
45+
]
4646
},
4747
{
4848
"cell_type": "code",
4949
"execution_count": 1,
50+
"metadata": {},
51+
"outputs": [],
5052
"source": [
5153
"!pip install labelbox"
52-
],
53-
"outputs": [],
54-
"metadata": {}
54+
]
5555
},
5656
{
5757
"cell_type": "code",
5858
"execution_count": 2,
59+
"metadata": {},
60+
"outputs": [],
5961
"source": [
6062
"from labelbox import Client\n",
63+
"from labelbox.schema.media_type import MediaType\n",
6164
"import os"
62-
],
63-
"outputs": [],
64-
"metadata": {}
65+
]
6566
},
6667
{
6768
"cell_type": "markdown",
69+
"metadata": {},
6870
"source": [
6971
"# API Key and Client\n",
7072
"Provide a valid api key below in order to properly connect to the Labelbox Client."
71-
],
72-
"metadata": {}
73+
]
7374
},
7475
{
7576
"cell_type": "code",
7677
"execution_count": 5,
78+
"metadata": {},
79+
"outputs": [],
7780
"source": [
7881
"# Add your api key\n",
7982
"API_KEY = None\n",
8083
"client = Client(api_key=API_KEY)"
81-
],
82-
"outputs": [],
83-
"metadata": {}
84+
]
8485
},
8586
{
8687
"cell_type": "markdown",
88+
"metadata": {},
8789
"source": [
8890
"### Create\n"
89-
],
90-
"metadata": {}
91+
]
9192
},
9293
{
9394
"cell_type": "code",
9495
"execution_count": 6,
96+
"metadata": {},
97+
"outputs": [],
9598
"source": [
96-
"# Creates an empty project\n",
99+
"# Creates an empty project without a media type\n",
97100
"project = client.create_project(name=\"my-test-project\",\n",
98-
" description=\"a description\")"
99-
],
100-
"outputs": [],
101-
"metadata": {}
101+
" description=\"a description\")\n",
102+
"\n",
103+
"# Creates an empty project a media type\n",
104+
"project = client.create_project(name=\"my-test-project\",\n",
105+
" description=\"a description\",\n",
106+
" media_type=MediaType.Image)"
107+
]
102108
},
103109
{
104110
"cell_type": "markdown",
111+
"metadata": {},
105112
"source": [
106113
"### Read"
107-
],
108-
"metadata": {}
114+
]
109115
},
110116
{
111117
"cell_type": "code",
112118
"execution_count": null,
119+
"metadata": {},
120+
"outputs": [],
113121
"source": [
114122
"# Note the project is not setup (so a lot of these fiels are empty). Follow the project setup workflow\n",
115123
"print(\"Project is not setup yet:\", project.setup_complete is None)\n",
116124
"print(\"Project name:\", project.name)\n",
117125
"print(\"Project description:\", project.description)\n",
126+
"print(\"Media Type:\", project.media_type)\n",
118127
"print(\"Dataset:\", list(project.datasets()))\n",
119128
"print(\"Ontology:\", project.ontology().normalized)\n",
120129
"print(\"Benchmarks:\", project.benchmarks())"
121-
],
122-
"outputs": [],
123-
"metadata": {}
130+
]
124131
},
125132
{
126133
"cell_type": "markdown",
134+
"metadata": {},
127135
"source": [
128136
"### Update\n",
129137
"\n"
130-
],
131-
"metadata": {}
138+
]
132139
},
133140
{
134141
"cell_type": "code",
135142
"execution_count": null,
143+
"metadata": {},
144+
"outputs": [],
136145
"source": [
137146
"# Attach dataset\n",
138147
"ds = client.create_dataset(name=\"test-ds\")\n",
139148
"project.datasets.connect(ds)\n",
140149
"print([ds.name for ds in project.datasets()])\n",
141150
"ds.delete()"
142-
],
143-
"outputs": [],
144-
"metadata": {}
151+
]
145152
},
146153
{
147154
"cell_type": "markdown",
155+
"metadata": {},
148156
"source": [
149157
"### Delete"
150-
],
151-
"metadata": {}
158+
]
152159
},
153160
{
154161
"cell_type": "code",
155162
"execution_count": 9,
163+
"metadata": {},
164+
"outputs": [],
156165
"source": [
157166
"project.delete()"
158-
],
159-
"outputs": [],
160-
"metadata": {}
167+
]
161168
}
162169
],
163170
"metadata": {
@@ -181,4 +188,4 @@
181188
},
182189
"nbformat": 4,
183190
"nbformat_minor": 5
184-
}
191+
}

labelbox/client.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
from labelbox.schema.project import Project
3333
from labelbox.schema.role import Role
3434

35+
from labelbox.schema.media_type import MediaType
36+
3537
logger = logging.getLogger(__name__)
3638

3739
_LABELBOX_API_KEY = "LABELBOX_API_KEY"
@@ -613,17 +615,12 @@ def create_project(self, **kwargs) -> Project:
613615
"""
614616
media_type = kwargs.get("media_type")
615617
if media_type:
616-
if isinstance(media_type, Project.MediaType
617-
) and media_type is not Project.MediaType.Unknown:
618+
if MediaType.is_accepted(media_type):
618619
kwargs["media_type"] = media_type.value
619620
else:
620-
media_types = [
621-
item for item in Project.MediaType.__members__
622-
if item != "Unknown"
623-
]
624-
raise TypeError(
625-
f"{media_type} is not a supported type. Please use any of {media_types} from the {type(media_type).__name__} enumeration."
626-
)
621+
raise TypeError(f"{media_type} is not a valid media type. Use"
622+
f" any of {MediaType.get_accepted_members()}"
623+
" from MediaType. Example: MediaType.Image.")
627624

628625
return self._create(Entity.Project, kwargs)
629626

labelbox/schema/media_type.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from enum import Enum
2+
3+
4+
class MediaType(Enum):
5+
"""add DOCUMENT, GEOSPATIAL_TILE, SIMPLE_TILE to match the UI choices"""
6+
Audio = "AUDIO"
7+
Conversational = "CONVERSATIONAL"
8+
Dicom = "DICOM"
9+
Document = "PDF"
10+
Geospatial_Tile = "TMS_GEO"
11+
Image = "IMAGE"
12+
Json = "JSON"
13+
Pdf = "PDF"
14+
Simple_Tile = "TMS_SIMPLE"
15+
Text = "TEXT"
16+
Tms_Geo = "TMS_GEO"
17+
Tms_Simple = "TMS_SIMPLE"
18+
Video = "VIDEO"
19+
Unknown = "UNKNOWN"
20+
Unsupported = "UNSUPPORTED"
21+
22+
@classmethod
23+
def _missing_(cls, name):
24+
"""Handle missing null data types for projects
25+
created without setting allowedMediaType
26+
Handle upper case names for compatibility with
27+
the GraphQL"""
28+
29+
if name is None:
30+
return cls.Unknown
31+
32+
for member in cls.__members__:
33+
if member.name == name.upper():
34+
return member
35+
36+
@classmethod
37+
def is_accepted(cls, value):
38+
return isinstance(value,
39+
cls) and value not in [cls.Unknown, cls.Unsupported]
40+
41+
@classmethod
42+
def get_accepted_members(cls):
43+
return [
44+
item for item in cls.__members__
45+
if item not in ["Unknown", "Unsupported"]
46+
]

labelbox/schema/project.py

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from labelbox.orm.model import Entity, Field, Relationship
2020
from labelbox.pagination import PaginatedCollection
2121
from labelbox.schema.resource_tag import ResourceTag
22+
from labelbox.schema.media_type import MediaType
2223

2324
if TYPE_CHECKING:
2425
from labelbox import BulkImportRequest
@@ -64,36 +65,6 @@ class Project(DbObject, Updateable, Deletable):
6465
ontology (Relationship): `ToOne` relationship to Ontology
6566
"""
6667

67-
class MediaType(Enum):
68-
"""add DOCUMENT, GEOSPATIAL_TILE, SIMPLE_TILE to match the UI choices"""
69-
Audio = "AUDIO"
70-
Conversational = "CONVERSATIONAL"
71-
Dicom = "DICOM"
72-
Document = "PDF"
73-
Geospatial_Tile = "TMS_GEO"
74-
Image = "IMAGE"
75-
Json = "JSON"
76-
Pdf = "PDF"
77-
Simple_Tile = "TMS_SIMPLE"
78-
Text = "TEXT"
79-
Tms_Geo = "TMS_GEO"
80-
Tms_Simple = "TMS_SIMPLE"
81-
Video = "VIDEO"
82-
Unknown = "UNKNOWN"
83-
84-
@classmethod
85-
def _missing_(cls, name):
86-
"""Handle missing null data types for projects
87-
created without setting allowedMediaType"""
88-
# return Project.MediaType.UNKNOWN
89-
90-
if name is None:
91-
return cls.Unknown
92-
93-
for member in cls.__members__:
94-
if member.name == name.upper():
95-
return member
96-
9768
name = Field.String("name")
9869
description = Field.String("description")
9970
updated_at = Field.DateTime("updated_at")
@@ -129,17 +100,12 @@ def update(self, **kwargs):
129100

130101
media_type = kwargs.get("media_type")
131102
if media_type:
132-
if isinstance(media_type, Project.MediaType
133-
) and media_type != Project.MediaType.Unknown:
103+
if MediaType.is_accepted(media_type):
134104
kwargs["media_type"] = media_type.value
135105
else:
136-
media_types = [
137-
item for item in Project.MediaType.__members__
138-
if item != "Unknown"
139-
]
140-
raise TypeError(
141-
f"{media_type} is not a supported type. Please use any of {media_types} from the {type(media_type).__name__} enumeration."
142-
)
106+
raise TypeError(f"{media_type} is not a valid media type. Use"
107+
f" any of {MediaType.get_accepted_members()}"
108+
" from MediaType. Example: MediaType.Image.")
143109

144110
return super().update(**kwargs)
145111

tests/integration/test_project.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from labelbox import Project, LabelingFrontend
88
from labelbox.exceptions import InvalidQueryError
9+
from labelbox.schema.media_type import MediaType
910

1011

1112
def test_project(client, rand_gen):
@@ -204,22 +205,18 @@ def test_queue_mode(configured_project: Project):
204205

205206

206207
def test_media_type(client, configured_project: Project, rand_gen):
207-
# Existing project
208-
assert configured_project.media_type is None or isinstance(
209-
configured_project.media_type, Project.MediaType)
208+
# Existing project with no media_type
209+
assert isinstance(configured_project.media_type, MediaType)
210210

211-
# No media_type
211+
# Update test
212212
project = client.create_project(name=rand_gen(str))
213-
assert project.media_type == Project.MediaType.Unknown
214-
project.update(media_type=Project.MediaType.Image)
215-
assert project.media_type == Project.MediaType.Image
213+
project.update(media_type=MediaType.Image)
214+
assert project.media_type == MediaType.Image
216215
project.delete()
217216

218-
for media_type in Project.MediaType:
219-
if media_type == Project.MediaType.Unknown:
220-
continue
217+
for media_type in MediaType.get_accepted_members():
221218

222219
project = client.create_project(name=rand_gen(str),
223-
media_type=media_type)
224-
assert project.media_type == media_type
220+
media_type=MediaType[media_type])
221+
assert project.media_type == MediaType[media_type]
225222
project.delete()

0 commit comments

Comments
 (0)