Skip to content

Commit b108e31

Browse files
author
Matt Sokoloff
committed
use alias instead of camelcase for ndjson
1 parent 0d3c30c commit b108e31

File tree

4 files changed

+39
-35
lines changed

4 files changed

+39
-35
lines changed

labelbox/data/serialization/ndjson/base.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from uuid import uuid4
2-
from pydantic import BaseModel, validator
2+
from pydantic import BaseModel, validator, Field
33

44

55
def to_camel(string: str) -> str:
@@ -21,21 +21,20 @@ def validate_id(cls, v):
2121

2222
class NDJsonBase(BaseModel):
2323
uuid: str = None
24-
dataRow: DataRow
24+
data_row: DataRow = Field(..., alias="dataRow")
2525

2626
@validator('uuid', pre=True, always=True)
2727
def set_id(cls, v):
2828
return v or str(uuid4())
2929

3030
class Config:
31-
#alias_generator = to_camel
3231
allow_population_by_field_name = True
3332

3433

3534
class NDAnnotation(NDJsonBase):
36-
schemaId: str = None
35+
schema_id: str = Field(None, alias="schemaId")
3736

38-
@validator('schemaId', pre=True, always=True)
37+
@validator('schema_id', pre=True, always=True)
3938
def validate_id(cls, v):
4039
if v is None:
4140
raise ValueError(

labelbox/data/serialization/ndjson/classifications.py

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
from typing import List, Union, Optional
22

3-
from pydantic import BaseModel, validator
3+
from pydantic import BaseModel, validator, Field
44

55
from ...annotation_types.annotation import AnnotationType, ClassificationAnnotation, VideoClassificationAnnotation
66
from ...annotation_types.classification.classification import ClassificationAnswer, Dropdown, Text, Checklist, Radio
77
from .base import NDAnnotation
88

99

1010
class NDFeature(BaseModel):
11-
schemaId: str #= Field(..., alias = 'schemaId')
11+
schema_id: str = Field(..., alias='schemaId')
1212

13-
@validator('schemaId', pre=True, always=True)
13+
@validator('schema_id', pre=True, always=True)
1414
def validate_id(cls, v):
1515
if v is None:
1616
raise ValueError(
1717
"Schema ids are not set. Use `LabelGenerator.assign_schema_ids`, `LabelCollection.assign_schema_ids`, or `Label.assign_schema_ids`."
1818
)
1919
return v
2020

21+
class Config:
22+
allow_population_by_field_name = True
23+
2124

2225
class FrameLocation(BaseModel):
2326
end: int
@@ -45,38 +48,39 @@ def to_common(self) -> Text:
4548
@classmethod
4649
def from_common(cls, annotation) -> "NDTextSubclass":
4750
return cls(answer=annotation.value.answer,
48-
schemaId=annotation.schema_id)
51+
schema_id=annotation.schema_id)
4952

5053

5154
class NDChecklistSubclass(NDFeature):
5255
answer: List[NDFeature]
5356

5457
def to_common(self) -> Checklist:
5558
return Checklist(answer=[
56-
ClassificationAnswer(schema_id=answer.schemaId)
59+
ClassificationAnswer(schema_id=answer.schema_id)
5760
for answer in self.answer
5861
])
5962

6063
@classmethod
6164
def from_common(cls, annotation) -> "NDChecklistSubclass":
6265
return cls(answer=[
63-
NDFeature(schemaId=answer.schema_id)
66+
NDFeature(schema_id=answer.schema_id)
6467
for answer in annotation.value.answer
6568
],
66-
schemaId=annotation.schema_id)
69+
schema_id=annotation.schema_id)
6770

6871

6972
class NDRadioSubclass(NDFeature):
7073
answer: NDFeature
7174

7275
def to_common(self) -> Radio:
7376
return Radio(answer=ClassificationAnswer(
74-
schema_id=self.answer.schemaId))
77+
schema_id=self.answer.schema_id))
7578

7679
@classmethod
7780
def from_common(cls, annotation) -> "NDRadioSubclass":
78-
return cls(answer=NDFeature(schemaId=annotation.value.answer.schema_id),
79-
schemaId=annotation.schema_id)
81+
return cls(
82+
answer=NDFeature(schema_id=annotation.value.answer.schema_id),
83+
schema_id=annotation.schema_id)
8084

8185

8286
### ====== End of subclasses
@@ -89,7 +93,7 @@ def from_common(cls, annotation, data) -> "NDText":
8993
return cls(
9094
answer=annotation.value.answer,
9195
dataRow={'id': data.uid},
92-
schemaId=annotation.schema_id,
96+
schema_id=annotation.schema_id,
9397
uuid=annotation.extra.get('uuid'),
9498
)
9599

@@ -99,11 +103,11 @@ class NDChecklist(NDAnnotation, NDChecklistSubclass, VideoSupported):
99103
@classmethod
100104
def from_common(cls, annotation, data) -> "NDChecklist":
101105
return cls(answer=[
102-
NDFeature(schemaId=answer.schema_id)
106+
NDFeature(schema_id=answer.schema_id)
103107
for answer in annotation.value.answer
104108
],
105109
dataRow={'id': data.uid},
106-
schemaId=annotation.schema_id,
110+
schema_id=annotation.schema_id,
107111
uuid=annotation.extra.get('uuid'),
108112
frames=annotation.extra.get('frames'))
109113

@@ -112,11 +116,12 @@ class NDRadio(NDAnnotation, NDRadioSubclass, VideoSupported):
112116

113117
@classmethod
114118
def from_common(cls, annotation, data) -> "NDRadio":
115-
return cls(answer=NDFeature(schemaId=annotation.value.answer.schema_id),
116-
dataRow={'id': data.uid},
117-
schemaId=annotation.schema_id,
118-
uuid=annotation.extra.get('uuid'),
119-
frames=annotation.extra.get('frames'))
119+
return cls(
120+
answer=NDFeature(schema_id=annotation.value.answer.schema_id),
121+
dataRow={'id': data.uid},
122+
schema_id=annotation.schema_id,
123+
uuid=annotation.extra.get('uuid'),
124+
frames=annotation.extra.get('frames'))
120125

121126

122127
class NDSubclassification:
@@ -135,7 +140,7 @@ def from_common(
135140
@staticmethod
136141
def to_common(annotation: AnnotationType) -> ClassificationAnnotation:
137142
return ClassificationAnnotation(value=annotation.to_common(),
138-
schema_id=annotation.schemaId)
143+
schema_id=annotation.schema_id)
139144

140145
@staticmethod
141146
def lookup_subclassification(annotation: AnnotationType):
@@ -155,7 +160,7 @@ def to_common(
155160
annotation: AnnotationType
156161
) -> Union[ClassificationAnnotation, VideoClassificationAnnotation]:
157162
common = ClassificationAnnotation(value=annotation.to_common(),
158-
schema_id=annotation.schemaId,
163+
schema_id=annotation.schema_id,
159164
extra={'uuid': annotation.uuid})
160165
if getattr(annotation, 'frames', None) is None:
161166
return [common]

labelbox/data/serialization/ndjson/label.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ class NDLabel(BaseModel):
1919
def to_common(self) -> LabelGenerator:
2020
data_rows = {}
2121
for annotation in self.annotations:
22-
if annotation.dataRow.id in data_rows:
23-
data_rows[annotation.dataRow.id].append(annotation)
22+
if annotation.data_row.id in data_rows:
23+
data_rows[annotation.data_row.id].append(annotation)
2424
else:
25-
data_rows[annotation.dataRow.id] = [annotation]
25+
data_rows[annotation.data_row.id] = [annotation]
2626

2727
def generate_annotations() -> LabelGenerator:
2828
for data_row_id, annotations in data_rows.items():

labelbox/data/serialization/ndjson/objects.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def from_common(cls, annotation, data) -> "NDPoint":
4040
'y': annotation.value.y
4141
},
4242
dataRow=DataRow(id=data.uid),
43-
schemaId=annotation.schema_id,
43+
schema_id=annotation.schema_id,
4444
uuid=annotation.extra.get('uuid'),
4545
classifications=[
4646
NDSubclassification.from_common(annot)
@@ -61,7 +61,7 @@ def from_common(cls, annotation, data) -> "NDLine":
6161
'y': pt.y
6262
} for pt in annotation.value.points],
6363
dataRow=DataRow(id=data.uid),
64-
schemaId=annotation.schema_id,
64+
schema_id=annotation.schema_id,
6565
uuid=annotation.extra.get('uuid'),
6666
classifications=[
6767
NDSubclassification.from_common(annot)
@@ -83,7 +83,7 @@ def from_common(cls, annotation, data) -> "NDPolygon":
8383
'y': pt.y
8484
} for pt in annotation.value.points],
8585
dataRow=DataRow(id=data.uid),
86-
schemaId=annotation.schema_id,
86+
schema_id=annotation.schema_id,
8787
uuid=annotation.extra.get('uuid'),
8888
classifications=[
8989
NDSubclassification.from_common(annot)
@@ -107,7 +107,7 @@ def from_common(cls, annotation, data) -> "NDRectangle":
107107
height=annotation.value.end.y - annotation.value.start.y,
108108
width=annotation.value.end.x - annotation.value.start.x),
109109
dataRow=DataRow(id=data.uid),
110-
schemaId=annotation.schema_id,
110+
schema_id=annotation.schema_id,
111111
uuid=annotation.extra.get('uuid'),
112112
classifications=[
113113
NDSubclassification.from_common(annot)
@@ -132,7 +132,7 @@ def from_common(cls, annotation, data) -> "NDMask":
132132
return cls(mask=_Mask(instanceURI=annotation.value.mask.url,
133133
colorRGB=annotation.value.color_rgb),
134134
dataRow=DataRow(id=data.uid),
135-
schemaId=annotation.schema_id,
135+
schema_id=annotation.schema_id,
136136
uuid=annotation.extra.get('uuid'),
137137
classifications=[
138138
NDSubclassification.from_common(annot)
@@ -158,7 +158,7 @@ def from_common(cls, annotation, data) -> "NDTextEntity":
158158
end=annotation.value.end,
159159
),
160160
dataRow=DataRow(id=data.uid),
161-
schemaId=annotation.schema_id,
161+
schema_id=annotation.schema_id,
162162
uuid=annotation.extra.get('uuid'),
163163
classifications=[
164164
NDSubclassification.from_common(annot)
@@ -176,7 +176,7 @@ def to_common(annotation) -> ObjectAnnotation:
176176
for annot in annotation.classifications
177177
]
178178
return ObjectAnnotation(value=common_annotation,
179-
schema_id=annotation.schemaId,
179+
schema_id=annotation.schema_id,
180180
classifications=classifications,
181181
extra={'uuid': annotation.uuid})
182182

0 commit comments

Comments
 (0)