Skip to content

Commit d692a73

Browse files
authored
fix: ibis data types, from upgrade (#4847)
Newer version of ibis has changed the expected datatype response. Also handles some more cases in type conversion.
1 parent 68954a3 commit d692a73

File tree

2 files changed

+33
-43
lines changed

2 files changed

+33
-43
lines changed

marimo/_sql/engines/ibis.py

+22-7
Original file line numberDiff line numberDiff line change
@@ -356,25 +356,40 @@ def _ibis_to_marimo_dtype(ibis_dtype: dt.DataType) -> DataType:
356356
# numeric is a superset of integer, so we evaluate after is_integer
357357
elif ibis_dtype.is_numeric():
358358
return "number"
359-
360359
elif ibis_dtype.is_date():
361360
return "date"
362-
363361
elif ibis_dtype.is_timestamp():
364362
return "datetime"
365-
366363
elif ibis_dtype.is_time():
367364
return "time"
368-
365+
elif ibis_dtype.is_temporal():
366+
return "datetime"
367+
elif ibis_dtype.is_interval():
368+
return "string"
369369
elif ibis_dtype.is_boolean():
370370
return "boolean"
371-
372371
elif ibis_dtype.is_string():
373372
return "string"
374-
375373
elif ibis_dtype.is_binary():
376374
return "string"
377-
375+
elif ibis_dtype.is_array():
376+
return "unknown"
377+
elif ibis_dtype.is_map():
378+
return "unknown"
379+
elif ibis_dtype.is_struct():
380+
return "unknown"
381+
elif ibis_dtype.is_json():
382+
return "unknown"
383+
elif ibis_dtype.is_uuid():
384+
return "string"
385+
elif ibis_dtype.is_macaddr():
386+
return "string"
387+
elif ibis_dtype.is_inet():
388+
return "string"
389+
elif ibis_dtype.is_linestring():
390+
return "string"
391+
elif ibis_dtype.is_multilinestring():
392+
return "string"
378393
else:
379394
raise IbisToMarimoConversionError
380395

tests/_sql/test_ibis.py

+11-36
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ def test_ibis_sql_types() -> None:
244244
str(dt.String()): "string",
245245
str(dt.Date()): "date",
246246
str(dt.Time()): "time",
247-
str(dt.Timestamp()): "timestamp(6)", # duckdb sets default precision
247+
str(dt.Timestamp()): "timestamp", # duckdb sets default precision
248248
str(dt.Interval(unit="D")): "interval('us')",
249249
str(dt.Array(value_type=dt.Int32())): "array<int32>",
250250
str(
@@ -275,12 +275,10 @@ def test_ibis_sql_types() -> None:
275275
str(dt.Time()): "time",
276276
str(dt.Timestamp()): "datetime",
277277
str(dt.Interval(unit="D")): "string", # default case
278-
str(dt.Array(value_type=dt.Int32())): "string", # default case
279-
str(
280-
dt.Map(key_type=dt.String(), value_type=dt.Int32())
281-
): "string", # default case
282-
str(dt.Struct(fields={"foo": dt.Int32()})): "string", # default case
283-
str(dt.JSON()): "string", # default case
278+
str(dt.Array(value_type=dt.Int32())): "unknown",
279+
str(dt.Map(key_type=dt.String(), value_type=dt.Int32())): "unknown",
280+
str(dt.Struct(fields={"foo": dt.Int32()})): "unknown",
281+
str(dt.JSON()): "unknown", # default case
284282
str(dt.MACADDR()): "string", # default case
285283
str(dt.UUID()): "string", # default case
286284
}
@@ -303,8 +301,12 @@ def test_ibis_sql_types() -> None:
303301

304302
for column in table.columns:
305303
assert column.name in expected_marimo_type.keys()
306-
assert column.type == expected_marimo_type[column.name]
307-
assert column.external_type == expected_external_type[column.name]
304+
assert column.type == expected_marimo_type[column.name], (
305+
f"{column.name} {column.type} {expected_marimo_type[column.name]}"
306+
)
307+
assert column.external_type == expected_external_type[column.name], (
308+
f"{column.name} {column.external_type} {expected_external_type[column.name]}"
309+
)
308310

309311

310312
@pytest.mark.skipif(not HAS_IBIS, reason="Ibis not installed")
@@ -345,24 +347,7 @@ def test_ibis_type_conversion() -> None:
345347
assert to_marimo(dt.Time()) == "time"
346348
assert to_marimo(dt.Timestamp()) == "datetime"
347349

348-
# unhandled cases will be converted to string
349-
with pytest.raises(IbisToMarimoConversionError):
350-
to_marimo(dt.Interval(unit="D"))
351-
352-
# nested types
353-
with pytest.raises(IbisToMarimoConversionError):
354-
to_marimo(dt.Array(value_type=dt.Int32()))
355-
356-
with pytest.raises(IbisToMarimoConversionError):
357-
to_marimo(dt.Map(key_type=dt.String(), value_type=dt.Int32()))
358-
359-
with pytest.raises(IbisToMarimoConversionError):
360-
to_marimo(dt.Struct(fields={"foo": dt.Int32()}))
361-
362350
# geometry
363-
with pytest.raises(IbisToMarimoConversionError):
364-
to_marimo(dt.MultiLineString())
365-
366351
with pytest.raises(IbisToMarimoConversionError):
367352
to_marimo(dt.MultiPoint())
368353

@@ -378,16 +363,6 @@ def test_ibis_type_conversion() -> None:
378363
with pytest.raises(IbisToMarimoConversionError):
379364
to_marimo(dt.Polygon())
380365

381-
# special types
382-
with pytest.raises(IbisToMarimoConversionError):
383-
to_marimo(dt.JSON())
384-
385-
with pytest.raises(IbisToMarimoConversionError):
386-
to_marimo(dt.MACADDR())
387-
388-
with pytest.raises(IbisToMarimoConversionError):
389-
to_marimo(dt.UUID())
390-
391366

392367
@pytest.mark.skipif(not HAS_IBIS, reason="Ibis not installed")
393368
def test_ibis_engine_get_table_details(ibis_backend: SQLBackend) -> None:

0 commit comments

Comments
 (0)