Skip to content

Commit 8b99f69

Browse files
committed
attribute responses : name, min, max
1 parent b668ddc commit 8b99f69

2 files changed

Lines changed: 60 additions & 76 deletions

File tree

src/opengeodeweb_back/routes/blueprint_routes.py

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -266,38 +266,42 @@ def texture_coordinates() -> flask.Response:
266266
return flask.make_response({"texture_coordinates": texture_coordinates}, 200)
267267

268268

269-
def attributes_metadata(manager: og.AttributeManager) -> dict[str, list[float]]:
270-
metadata: dict[str, list[float]] = {}
269+
def attributes_metadata(manager: og.AttributeManager) -> list[dict[str, Any]]:
270+
attributes: list[dict[str, Any]] = []
271271
nb_elements = manager.nb_elements()
272272
for name in manager.attribute_names():
273273
attribute = manager.find_generic_attribute(name)
274274
if not attribute.is_genericable():
275-
metadata[name] = [-1.0, -1.0]
275+
attributes.append(
276+
{"attribute_name": name, "min_value": -1.0, "max_value": -1.0}
277+
)
276278
continue
277279
min_value = None
278280
max_value = None
279-
for i in range(nb_elements):
281+
for index in range(nb_elements):
280282
if hasattr(attribute, "value"):
281-
val = attribute.value(i)
283+
val = attribute.value(index)
282284
if isinstance(val, list):
283285
values_to_check = val
284286
else:
285287
values_to_check = [val]
286288
else:
287-
values_to_check = [attribute.generic_value(i)]
288-
289-
for v in values_to_check:
290-
if v is not None and not math.isnan(v):
291-
if min_value is None or v < min_value:
292-
min_value = v
293-
if max_value is None or v > max_value:
294-
max_value = v
295-
metadata[name] = (
296-
[min_value, max_value]
297-
if min_value is not None and max_value is not None
298-
else [-1.0, -1.0]
289+
values_to_check = [attribute.generic_value(index)]
290+
291+
for value in values_to_check:
292+
if value is not None and not math.isnan(value):
293+
if min_value is None or value < min_value:
294+
min_value = value
295+
if max_value is None or value > max_value:
296+
max_value = value
297+
attributes.append(
298+
{
299+
"attribute_name": name,
300+
"min_value": min_value if min_value is not None else -1.0,
301+
"max_value": max_value if max_value is not None else -1.0,
302+
}
299303
)
300-
return metadata
304+
return attributes
301305

302306

303307
@routes.route(
@@ -314,10 +318,7 @@ def vertex_attribute_names() -> flask.Response:
314318
flask.abort(400, f"{params.id} is not a GeodeMesh")
315319
attribute_manager = geode_object.vertex_attribute_manager()
316320
return flask.make_response(
317-
{
318-
"vertex_attribute_names": attribute_manager.attribute_names(),
319-
"vertex_attribute_metadata": attributes_metadata(attribute_manager),
320-
},
321+
{"attributes": attributes_metadata(attribute_manager)},
321322
200,
322323
)
323324

@@ -336,10 +337,7 @@ def cell_attribute_names() -> flask.Response:
336337
flask.abort(400, f"{params.id} is not a GeodeGrid")
337338
attribute_manager = geode_object.cell_attribute_manager()
338339
return flask.make_response(
339-
{
340-
"cell_attribute_names": attribute_manager.attribute_names(),
341-
"cell_attribute_metadata": attributes_metadata(attribute_manager),
342-
},
340+
{"attributes": attributes_metadata(attribute_manager)},
343341
200,
344342
)
345343

@@ -358,10 +356,7 @@ def polygon_attribute_names() -> flask.Response:
358356
flask.abort(400, f"{params.id} is not a GeodeSurfaceMesh")
359357
attribute_manager = geode_object.polygon_attribute_manager()
360358
return flask.make_response(
361-
{
362-
"polygon_attribute_names": attribute_manager.attribute_names(),
363-
"polygon_attribute_metadata": attributes_metadata(attribute_manager),
364-
},
359+
{"attributes": attributes_metadata(attribute_manager)},
365360
200,
366361
)
367362

@@ -380,10 +375,7 @@ def polyhedron_attribute_names() -> flask.Response:
380375
flask.abort(400, f"{params.id} is not a GeodeSolidMesh")
381376
attribute_manager = geode_object.polyhedron_attribute_manager()
382377
return flask.make_response(
383-
{
384-
"polyhedron_attribute_names": attribute_manager.attribute_names(),
385-
"polyhedron_attribute_metadata": attributes_metadata(attribute_manager),
386-
},
378+
{"attributes": attributes_metadata(attribute_manager)},
387379
200,
388380
)
389381

@@ -402,10 +394,7 @@ def edge_attribute_names() -> flask.Response:
402394
flask.abort(400, f"{params.id} does not have edges")
403395
attribute_manager = geode_object.edge_attribute_manager()
404396
return flask.make_response(
405-
{
406-
"edge_attribute_names": attribute_manager.attribute_names(),
407-
"edge_attribute_metadata": attributes_metadata(attribute_manager),
408-
},
397+
{"attributes": attributes_metadata(attribute_manager)},
409398
200,
410399
)
411400

tests/test_routes.py

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -244,13 +244,12 @@ def test_vertex_attribute_names(client: FlaskClient, test_id: str) -> None:
244244
assert os.path.exists(data_path), f"File not found at {data_path}"
245245
response = client.post(route, json={"id": data.id})
246246
assert response.status_code == 200
247-
vertex_attribute_names = response.get_json()["vertex_attribute_names"]
248-
vertex_attribute_metadata = response.get_json()["vertex_attribute_metadata"]
249-
assert type(vertex_attribute_names) is list
250-
assert type(vertex_attribute_metadata) is dict
251-
for vertex_attribute_name in vertex_attribute_names:
252-
assert type(vertex_attribute_name) is str
253-
assert vertex_attribute_name in vertex_attribute_metadata
247+
attributes = response.get_json()["attributes"]
248+
assert type(attributes) is list
249+
for attribute in attributes:
250+
assert "attribute_name" in attribute
251+
assert "min_value" in attribute
252+
assert "max_value" in attribute
254253

255254

256255
def test_cell_attribute_names(client: FlaskClient, test_id: str) -> None:
@@ -273,13 +272,12 @@ def test_cell_attribute_names(client: FlaskClient, test_id: str) -> None:
273272
assert os.path.exists(data_path), f"File not found at {data_path}"
274273
response = client.post(route, json={"id": data.id})
275274
assert response.status_code == 200
276-
cell_attribute_names = response.get_json()["cell_attribute_names"]
277-
cell_attribute_metadata = response.get_json()["cell_attribute_metadata"]
278-
assert type(cell_attribute_names) is list
279-
assert type(cell_attribute_metadata) is dict
280-
for cell_attribute_name in cell_attribute_names:
281-
assert type(cell_attribute_name) is str
282-
assert cell_attribute_name in cell_attribute_metadata
275+
attributes = response.get_json()["attributes"]
276+
assert type(attributes) is list
277+
for attribute in attributes:
278+
assert "attribute_name" in attribute
279+
assert "min_value" in attribute
280+
assert "max_value" in attribute
283281

284282

285283
def test_polygon_attribute_names(client: FlaskClient, test_id: str) -> None:
@@ -302,13 +300,12 @@ def test_polygon_attribute_names(client: FlaskClient, test_id: str) -> None:
302300
assert os.path.exists(data_path), f"File not found at {data_path}"
303301
response = client.post(route, json={"id": data.id})
304302
assert response.status_code == 200
305-
polygon_attribute_names = response.get_json()["polygon_attribute_names"]
306-
polygon_attribute_metadata = response.get_json()["polygon_attribute_metadata"]
307-
assert type(polygon_attribute_names) is list
308-
assert type(polygon_attribute_metadata) is dict
309-
for polygon_attribute_name in polygon_attribute_names:
310-
assert type(polygon_attribute_name) is str
311-
assert polygon_attribute_name in polygon_attribute_metadata
303+
attributes = response.get_json()["attributes"]
304+
assert type(attributes) is list
305+
for attribute in attributes:
306+
assert "attribute_name" in attribute
307+
assert "min_value" in attribute
308+
assert "max_value" in attribute
312309

313310

314311
def test_polyhedron_attribute_names(client: FlaskClient, test_id: str) -> None:
@@ -332,16 +329,15 @@ def test_polyhedron_attribute_names(client: FlaskClient, test_id: str) -> None:
332329
response = client.post(route, json={"id": data.id})
333330
print(response.get_json())
334331
assert response.status_code == 200
335-
polyhedron_attribute_names = response.get_json()["polyhedron_attribute_names"]
336-
polyhedron_attribute_metadata = response.get_json()["polyhedron_attribute_metadata"]
337-
assert type(polyhedron_attribute_names) is list
338-
assert type(polyhedron_attribute_metadata) is dict
339-
for polyhedron_attribute_name in polyhedron_attribute_names:
340-
assert type(polyhedron_attribute_name) is str
341-
assert polyhedron_attribute_name in polyhedron_attribute_metadata
342-
343-
if "Range" in polyhedron_attribute_metadata:
344-
assert polyhedron_attribute_metadata["Range"] == [0.0, 579.0]
332+
attributes = response.get_json()["attributes"]
333+
assert type(attributes) is list
334+
for attribute in attributes:
335+
assert "attribute_name" in attribute
336+
assert "min_value" in attribute
337+
assert "max_value" in attribute
338+
if attribute["attribute_name"] == "Range":
339+
assert attribute["min_value"] == 0.0
340+
assert attribute["max_value"] == 579.0
345341

346342

347343
def test_edge_attribute_names(client: FlaskClient, test_id: str) -> None:
@@ -365,13 +361,12 @@ def test_edge_attribute_names(client: FlaskClient, test_id: str) -> None:
365361
response = client.post(route, json={"id": data.id})
366362
print(response.get_json())
367363
assert response.status_code == 200
368-
edge_attribute_names = response.get_json()["edge_attribute_names"]
369-
edge_attribute_metadata = response.get_json()["edge_attribute_metadata"]
370-
assert type(edge_attribute_names) is list
371-
assert type(edge_attribute_metadata) is dict
372-
for edge_attribute_name in edge_attribute_names:
373-
assert type(edge_attribute_name) is str
374-
assert edge_attribute_name in edge_attribute_metadata
364+
attributes = response.get_json()["attributes"]
365+
assert type(attributes) is list
366+
for attribute in attributes:
367+
assert "attribute_name" in attribute
368+
assert "min_value" in attribute
369+
assert "max_value" in attribute
375370

376371

377372
def test_database_uri_path(client: FlaskClient) -> None:

0 commit comments

Comments
 (0)