diff --git a/graphene_sqlalchemy/converter.py b/graphene_sqlalchemy/converter.py index f4b805e2..697251a2 100644 --- a/graphene_sqlalchemy/converter.py +++ b/graphene_sqlalchemy/converter.py @@ -234,11 +234,15 @@ def convert_scalar_list_to_list(type, column, registry=None): return List(String) +def init_array_list_recursive(inner_type, n): + return inner_type if n == 0 else List(init_array_list_recursive(inner_type, n-1)) + + @convert_sqlalchemy_type.register(types.ARRAY) @convert_sqlalchemy_type.register(postgresql.ARRAY) def convert_array_to_list(_type, column, registry=None): inner_type = convert_sqlalchemy_type(column.type.item_type, column) - return List(inner_type) + return List(init_array_list_recursive(inner_type, (column.type.dimensions or 1) - 1)) @convert_sqlalchemy_type.register(postgresql.HSTORE) diff --git a/graphene_sqlalchemy/tests/test_converter.py b/graphene_sqlalchemy/tests/test_converter.py index f0fc1802..59abb932 100644 --- a/graphene_sqlalchemy/tests/test_converter.py +++ b/graphene_sqlalchemy/tests/test_converter.py @@ -324,6 +324,21 @@ def test_should_array_convert(): assert field.type.of_type == graphene.Int +def test_should_2d_array_convert(): + field = get_field(types.ARRAY(types.Integer, dimensions=2)) + assert isinstance(field.type, graphene.List) + assert isinstance(field.type.of_type, graphene.List) + assert field.type.of_type.of_type == graphene.Int + + +def test_should_3d_array_convert(): + field = get_field(types.ARRAY(types.Integer, dimensions=3)) + assert isinstance(field.type, graphene.List) + assert isinstance(field.type.of_type, graphene.List) + assert isinstance(field.type.of_type.of_type, graphene.List) + assert field.type.of_type.of_type.of_type == graphene.Int + + def test_should_postgresql_json_convert(): assert get_field(postgresql.JSON()).type == graphene.JSONString