Skip to content

Commit 1a34f54

Browse files
authored
[BUGFIX] argilla: prevent enum literal validation errors (#5679)
# Description <!-- Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. --> In some environments, working with enun instances as string values may lead to some validation errors. See [this discord discussion](https://discord.com/channels/879548962464493619/1300936213531983882/1300936213531983882). This PR reviews how metadata settings classes are defined, and defines type directly as a literal string, in the same way we do fo questions or fields, instead of using the MetadataPropertyType class. **Type of change** <!-- Please delete options that are not relevant. Remember to title the PR according to the type of change --> - Bug fix (non-breaking change which fixes an issue) - Refactor (change restructuring the codebase without changing functionality) **How Has This Been Tested** <!-- Please add some reference about how your feature has been tested. --> **Checklist** <!-- Please go over the list and make sure you've taken everything into account --> - I added relevant documentation - I followed the style guidelines of this project - I did a self-review of my code - I made corresponding changes to the documentation - I confirm My changes generate no new warnings - I have added tests that prove my fix is effective or that my feature works - I have added relevant notes to the CHANGELOG.md file (See https://keepachangelog.com/)
1 parent 0cbbdeb commit 1a34f54

File tree

4 files changed

+18
-50
lines changed

4 files changed

+18
-50
lines changed

argilla/src/argilla/_models/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
)
5151
from argilla._models._settings._metadata import (
5252
MetadataFieldModel,
53-
MetadataPropertyType,
5453
BaseMetadataPropertySettings,
5554
TermsMetadataPropertySettings,
5655
NumericMetadataPropertySettings,

argilla/src/argilla/_models/_settings/_metadata.py

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from enum import Enum
1615
from typing import List, Literal, Optional, Union, Annotated, Any
1716
from uuid import UUID
1817

@@ -22,19 +21,12 @@
2221
from argilla._models import ResourceModel
2322

2423

25-
class MetadataPropertyType(str, Enum):
26-
terms = "terms"
27-
integer = "integer"
28-
float = "float"
29-
30-
3124
class BaseMetadataPropertySettings(BaseModel):
32-
type: MetadataPropertyType
3325
visible_for_annotators: Optional[bool] = True
3426

3527

3628
class TermsMetadataPropertySettings(BaseMetadataPropertySettings):
37-
type: Literal[MetadataPropertyType.terms]
29+
type: Literal["terms"] = "terms"
3830
values: Optional[List[Any]] = None
3931

4032
@field_validator("values")
@@ -64,7 +56,7 @@ def __validate_min_max(cls, values):
6456

6557

6658
class IntegerMetadataPropertySettings(NumericMetadataPropertySettings):
67-
type: Literal[MetadataPropertyType.integer]
59+
type: Literal["integer"] = "integer"
6860

6961
@model_validator(mode="before")
7062
@classmethod
@@ -78,7 +70,7 @@ def __validate_min_max(cls, values):
7870

7971

8072
class FloatMetadataPropertySettings(NumericMetadataPropertySettings):
81-
type: Literal[MetadataPropertyType.float]
73+
type: Literal["float"] = "float"
8274

8375

8476
MetadataPropertySettings = Annotated[
@@ -97,12 +89,15 @@ class MetadataFieldModel(ResourceModel):
9789
name: str
9890
settings: MetadataPropertySettings
9991

100-
type: Optional[MetadataPropertyType] = Field(None, validate_default=True)
10192
title: Optional[str] = None
10293
visible_for_annotators: Optional[bool] = True
10394

10495
dataset_id: Optional[UUID] = None
10596

97+
@property
98+
def type(self) -> str:
99+
return self.settings.type
100+
106101
@field_validator("title")
107102
@classmethod
108103
def __title_default(cls, title, values):
@@ -112,10 +107,3 @@ def __title_default(cls, title, values):
112107
@field_serializer("id", "dataset_id", when_used="unless-none")
113108
def serialize_id(self, value: UUID) -> str:
114109
return str(value)
115-
116-
@field_validator("type", mode="plain")
117-
@classmethod
118-
def __validate_type(cls, type, values):
119-
if type is None:
120-
return values.data["settings"].type
121-
return type

argilla/src/argilla/settings/_metadata.py

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from argilla._api._metadata import MetadataAPI
1818
from argilla._exceptions import MetadataError
1919
from argilla._models import (
20-
MetadataPropertyType,
2120
TermsMetadataPropertySettings,
2221
FloatMetadataPropertySettings,
2322
IntegerMetadataPropertySettings,
@@ -122,13 +121,12 @@ def __init__(
122121
super().__init__(client=client)
123122

124123
try:
125-
settings = TermsMetadataPropertySettings(values=options, type=MetadataPropertyType.terms)
124+
settings = TermsMetadataPropertySettings(values=options)
126125
except ValueError as e:
127126
raise MetadataError(f"Error defining metadata settings for {name}") from e
128127

129128
self._model = MetadataFieldModel(
130129
name=name,
131-
type=MetadataPropertyType.terms,
132130
title=title,
133131
settings=settings,
134132
visible_for_annotators=visible_for_annotators,
@@ -176,13 +174,12 @@ def __init__(
176174
super().__init__(client=client)
177175

178176
try:
179-
settings = FloatMetadataPropertySettings(min=min, max=max, type=MetadataPropertyType.float)
177+
settings = FloatMetadataPropertySettings(min=min, max=max)
180178
except ValueError as e:
181179
raise MetadataError(f"Error defining metadata settings for {name}") from e
182180

183181
self._model = MetadataFieldModel(
184182
name=name,
185-
type=MetadataPropertyType.float,
186183
title=title,
187184
settings=settings,
188185
visible_for_annotators=visible_for_annotators,
@@ -237,13 +234,12 @@ def __init__(
237234
super().__init__(client=client)
238235

239236
try:
240-
settings = IntegerMetadataPropertySettings(min=min, max=max, type=MetadataPropertyType.integer)
237+
settings = IntegerMetadataPropertySettings(min=min, max=max)
241238
except ValueError as e:
242239
raise MetadataError(f"Error defining metadata settings for {name}") from e
243240

244241
self._model = MetadataFieldModel(
245242
name=name,
246-
type=MetadataPropertyType.integer,
247243
title=title,
248244
settings=settings,
249245
visible_for_annotators=visible_for_annotators,
@@ -283,27 +279,14 @@ def from_model(cls, model: MetadataFieldModel) -> "IntegerMetadataProperty":
283279
class MetadataField:
284280
@classmethod
285281
def from_model(cls, model: MetadataFieldModel) -> MetadataType:
286-
switch = {
287-
MetadataPropertyType.terms: TermsMetadataProperty,
288-
MetadataPropertyType.float: FloatMetadataProperty,
289-
MetadataPropertyType.integer: IntegerMetadataProperty,
290-
}
291-
metadata_type = model.type
292-
try:
293-
return switch[metadata_type].from_model(model)
294-
except KeyError as e:
295-
raise MetadataError(f"Unknown metadata property type: {metadata_type}") from e
282+
if model.type == "terms":
283+
return TermsMetadataProperty.from_model(model)
284+
elif model.type == "float":
285+
return FloatMetadataProperty.from_model(model)
286+
elif model.type == "integer":
287+
return IntegerMetadataProperty.from_model(model)
288+
raise MetadataError(f"Unknown metadata property type: {model.type}")
296289

297290
@classmethod
298291
def from_dict(cls, data: dict) -> MetadataType:
299-
switch = {
300-
MetadataPropertyType.terms: TermsMetadataProperty,
301-
MetadataPropertyType.float: FloatMetadataProperty,
302-
MetadataPropertyType.integer: IntegerMetadataProperty,
303-
}
304-
metadata_type = data["type"]
305-
try:
306-
metadata_model = MetadataFieldModel(**data)
307-
return switch[metadata_type].from_model(metadata_model)
308-
except KeyError as e:
309-
raise MetadataError(f"Unknown metadata property type: {metadata_type}") from e
292+
return cls.from_model(MetadataFieldModel(**data))

argilla/tests/unit/test_settings/test_metadata.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ def test_create_metadata_terms(self, options: list):
3737
"name": "metadata",
3838
"settings": {"type": "terms", "values": options, "visible_for_annotators": True},
3939
"title": "A metadata property",
40-
"type": "terms",
4140
"visible_for_annotators": True,
4241
"inserted_at": None,
4342
"updated_at": None,
@@ -59,7 +58,6 @@ def test_create_terms_metadata_without_options(self):
5958
"name": "metadata",
6059
"title": "metadata",
6160
"settings": {"type": "terms", "values": None, "visible_for_annotators": True},
62-
"type": "terms",
6361
"visible_for_annotators": True,
6462
"inserted_at": None,
6563
"updated_at": None,

0 commit comments

Comments
 (0)