Skip to content

Commit fe5719f

Browse files
committed
fixed
1 parent 87f2f2d commit fe5719f

File tree

2 files changed

+45
-12
lines changed

2 files changed

+45
-12
lines changed

pyiceberg/types.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
Field,
4848
PrivateAttr,
4949
SerializeAsAny,
50+
field_validator,
5051
model_serializer,
5152
model_validator,
5253
)
@@ -310,6 +311,14 @@ class NestedField(IcebergType):
310311
... doc="Just a long"
311312
... ))
312313
'2: bar: required long (Just a long)'
314+
>>> str(NestedField(
315+
... field_id=3,
316+
... name='baz',
317+
... field_type="string",
318+
... required=True,
319+
... doc="A string field"
320+
... ))
321+
'3: baz: required string (A string field)'
313322
"""
314323

315324
field_id: int = Field(alias="id")
@@ -320,6 +329,16 @@ class NestedField(IcebergType):
320329
initial_default: Optional[Any] = Field(alias="initial-default", default=None, repr=False)
321330
write_default: Optional[L] = Field(alias="write-default", default=None, repr=False) # type: ignore
322331

332+
@field_validator("field_type", mode="before")
333+
def convert_field_type(cls, v: Any) -> IcebergType:
334+
"""Convert string values into IcebergType instances."""
335+
if isinstance(v, str):
336+
try:
337+
return IcebergType.handle_primitive_type(v, None)
338+
except ValueError as e:
339+
raise ValueError(f"Unsupported field type: '{v}'") from e
340+
return v
341+
323342
def __init__(
324343
self,
325344
field_id: Optional[int] = None,
@@ -340,12 +359,6 @@ def __init__(
340359
data["doc"] = doc
341360
data["initial-default"] = data["initial-default"] if "initial-default" in data else initial_default
342361
data["write-default"] = data["write-default"] if "write-default" in data else write_default
343-
if isinstance(data["type"], str):
344-
try:
345-
data["type"] = IcebergType.handle_primitive_type(data["type"], None)
346-
except ValueError as e:
347-
raise ValueError(f"Unsupported field type: {data['type']}.") from e
348-
349362
super().__init__(**data)
350363

351364
def __str__(self) -> str:

tests/test_types.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,21 @@
6262
(12, BinaryType),
6363
]
6464

65+
primitive_types = {
66+
"boolean": BooleanType,
67+
"int": IntegerType,
68+
"long": LongType,
69+
"float": FloatType,
70+
"double": DoubleType,
71+
"date": DateType,
72+
"time": TimeType,
73+
"timestamp": TimestampType,
74+
"timestamptz": TimestamptzType,
75+
"string": StringType,
76+
"uuid": UUIDType,
77+
"binary": BinaryType,
78+
}
79+
6580

6681
@pytest.mark.parametrize("input_index, input_type", non_parameterized_types)
6782
def test_repr_primitive_types(input_index: int, input_type: Type[PrimitiveType]) -> None:
@@ -232,19 +247,24 @@ def test_nested_field() -> None:
232247

233248

234249
def test_nested_field_type_as_str_unsupported() -> None:
235-
with pytest.raises(ValueError) as exc_info:
236-
_ = (NestedField(1, "field", "list", required=True),)
237-
assert "Unsupported field type: list" in str(exc_info.value)
250+
unsupported_types = ["list", "map", "struct"]
251+
for type_str in unsupported_types:
252+
with pytest.raises(ValueError) as exc_info:
253+
_ = NestedField(1, "field", type_str, required=True)
254+
assert f"Unsupported field type: '{type_str}'" in str(exc_info.value)
238255

239256

240-
def test_nested_field_type_as_str_struct() -> None:
257+
@pytest.mark.parametrize("type_str, type_class", primitive_types.items())
258+
def test_nested_field_type_as_str(type_str: str, type_class: type) -> None:
241259
field_var = NestedField(
242260
1,
243261
"field",
244-
"string",
262+
type_str,
245263
required=True,
246264
)
247-
assert isinstance(field_var.field_type, StringType)
265+
assert isinstance(
266+
field_var.field_type, type_class
267+
), f"Expected {type_class.__name__}, got {field_var.field_type.__class__.__name__}"
248268

249269

250270
@pytest.mark.parametrize("input_index,input_type", non_parameterized_types)

0 commit comments

Comments
 (0)