OpenGeodeWeb-Back 6.12.6__tar.gz → 6.13.0rc1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/PKG-INFO +1 -1
  2. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/pyproject.toml +1 -1
  3. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/OpenGeodeWeb_Back.egg-info/PKG-INFO +1 -1
  4. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/blueprint_routes.py +18 -12
  5. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/tests/test_routes.py +12 -0
  6. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/LICENSE +0 -0
  7. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/README.md +0 -0
  8. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/requirements.txt +0 -0
  9. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/setup.cfg +0 -0
  10. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +0 -0
  11. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  12. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
  13. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/OpenGeodeWeb_Back.egg-info/requires.txt +0 -0
  14. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  15. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/__init__.py +0 -0
  16. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/app.py +0 -0
  17. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/app_config.py +0 -0
  18. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_functions.py +0 -0
  19. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/__init__.py +0 -0
  20. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_brep.py +0 -0
  21. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_cross_section.py +0 -0
  22. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_edged_curve2d.py +0 -0
  23. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_edged_curve3d.py +0 -0
  24. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_graph.py +0 -0
  25. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_grid2d.py +0 -0
  26. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_grid3d.py +0 -0
  27. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_horizon_stack3d.py +0 -0
  28. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_hybrid_solid3d.py +0 -0
  29. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_implicit_cross_section.py +0 -0
  30. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_implicit_structural_model.py +0 -0
  31. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid2d.py +0 -0
  32. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid3d.py +0 -0
  33. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_mesh.py +0 -0
  34. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_model.py +0 -0
  35. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_object.py +0 -0
  36. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_point_set2d.py +0 -0
  37. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_point_set3d.py +0 -0
  38. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface2d.py +0 -0
  39. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface3d.py +0 -0
  40. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_polyhedral_solid3d.py +0 -0
  41. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py +0 -0
  42. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py +0 -0
  43. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_regular_grid2d.py +0 -0
  44. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_regular_grid3d.py +0 -0
  45. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_section.py +0 -0
  46. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py +0 -0
  47. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_structural_model.py +0 -0
  48. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py +0 -0
  49. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py +0 -0
  50. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_tetrahedral_solid3d.py +0 -0
  51. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface2d.py +0 -0
  52. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface3d.py +0 -0
  53. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/geode_objects/geode_vertex_set.py +0 -0
  54. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/py.typed +0 -0
  55. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/create/blueprint_create.py +0 -0
  56. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/create/schemas/__init__.py +0 -0
  57. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/create/schemas/edged_curve.json +0 -0
  58. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/create/schemas/edged_curve.py +0 -0
  59. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/create/schemas/point_set.json +0 -0
  60. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/create/schemas/point_set.py +0 -0
  61. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.json +0 -0
  62. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.py +0 -0
  63. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/__init__.py +0 -0
  64. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  65. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.py +0 -0
  66. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  67. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.py +0 -0
  68. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.json +0 -0
  69. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.py +0 -0
  70. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.json +0 -0
  71. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.py +0 -0
  72. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/export_project.json +0 -0
  73. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/export_project.py +0 -0
  74. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json +0 -0
  75. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py +0 -0
  76. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  77. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py +0 -0
  78. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json +0 -0
  79. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.py +0 -0
  80. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/import_project.json +0 -0
  81. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/import_project.py +0 -0
  82. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
  83. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/kill.py +0 -0
  84. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/missing_files.json +0 -0
  85. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/missing_files.py +0 -0
  86. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.json +0 -0
  87. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.py +0 -0
  88. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.json +0 -0
  89. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.py +0 -0
  90. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.json +0 -0
  91. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.py +0 -0
  92. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.json +0 -0
  93. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.py +0 -0
  94. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  95. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/ping.py +0 -0
  96. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  97. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.py +0 -0
  98. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  99. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.py +0 -0
  100. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +0 -0
  101. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.py +0 -0
  102. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  103. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.py +0 -0
  104. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  105. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/upload_file.py +0 -0
  106. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/validate.json +0 -0
  107. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/validate.py +0 -0
  108. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
  109. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py +0 -0
  110. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/test_utils.py +0 -0
  111. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/src/opengeodeweb_back/utils_functions.py +0 -0
  112. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/tests/test_create_routes.py +0 -0
  113. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/tests/test_geode_functions.py +0 -0
  114. {opengeodeweb_back-6.12.6 → opengeodeweb_back-6.13.0rc1}/tests/test_utils_functions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.12.6
3
+ Version: 6.13.0rc1
4
4
  Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
5
5
  Author-email: Geode-solutions <team-web@geode-solutions.com>
6
6
  Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "OpenGeodeWeb-Back"
7
- version = "6.12.6"
7
+ version = "6.13.0-rc.1"
8
8
  dynamic = ["dependencies"]
9
9
  authors = [{ name = "Geode-solutions", email = "team-web@geode-solutions.com" }]
10
10
  description = "OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.12.6
3
+ Version: 6.13.0rc1
4
4
  Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
5
5
  Author-email: Geode-solutions <team-web@geode-solutions.com>
6
6
  Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
@@ -256,32 +256,35 @@ def extract_valid_attribute_values(
256
256
  attribute_manager: og.AttributeManager,
257
257
  attribute_name: str,
258
258
  item_index: int,
259
- ) -> list[float]:
259
+ ) -> tuple[list[float], bool]:
260
260
  attribute_ids_matching_name = attribute_manager.attribute_ids_matching_name(
261
261
  attribute_name
262
262
  )
263
263
  if not isinstance(attribute_ids_matching_name, list):
264
- return []
264
+ return [], False
265
265
  component_attribute = attribute_manager.find_generic_attribute(
266
266
  attribute_ids_matching_name[0]
267
267
  )
268
268
  if component_attribute is None:
269
- return []
269
+ return [], False
270
270
  if not component_attribute.is_genericable():
271
- return []
271
+ return [], False
272
272
  valid_values: list[float] = []
273
+ has_nan = False
273
274
  for element_index in range(attribute_manager.nb_elements()):
274
275
  value = component_attribute.generic_item_value(element_index, item_index)
275
- if value is not None and not math.isnan(value):
276
+ if value is None or math.isnan(value):
277
+ has_nan = True
278
+ else:
276
279
  valid_values.append(value)
277
- return valid_values
280
+ return valid_values, has_nan
278
281
 
279
282
 
280
283
  def attributes_metadata(
281
284
  manager: og.AttributeManager | list[og.AttributeManager],
282
- ) -> list[dict[str, str | int | float | list[float]]]:
285
+ ) -> list[dict[str, str | int | float | bool | list[float]]]:
283
286
  attribute_managers = manager if isinstance(manager, list) else [manager]
284
- attributes: list[dict[str, str | int | float | list[float]]] = []
287
+ attributes: list[dict[str, str | int | float | bool | list[float]]] = []
285
288
  first_manager = attribute_managers[0]
286
289
  for id in first_manager.attribute_ids():
287
290
  attribute = first_manager.find_generic_attribute(id)
@@ -294,14 +297,16 @@ def attributes_metadata(
294
297
  continue
295
298
  nb_items = attribute.nb_items()
296
299
  min_values, max_values = [], []
300
+ attribute_has_nan = False
297
301
  for item_index in range(nb_items):
298
302
  valid_values: list[float] = []
299
303
  for attribute_manager in attribute_managers:
300
- valid_values.extend(
301
- extract_valid_attribute_values(
302
- attribute_manager, attribute_name, item_index
303
- )
304
+ extracted_values, has_nan = extract_valid_attribute_values(
305
+ attribute_manager, attribute_name, item_index
304
306
  )
307
+ valid_values.extend(extracted_values)
308
+ if has_nan:
309
+ attribute_has_nan = True
305
310
  if valid_values:
306
311
  min_values.append(min(valid_values))
307
312
  max_values.append(max(valid_values))
@@ -316,6 +321,7 @@ def attributes_metadata(
316
321
  "max_value": max(max_values),
317
322
  "min_values": min_values,
318
323
  "max_values": max_values,
324
+ "no_data": attribute_has_nan,
319
325
  }
320
326
  )
321
327
  return attributes
@@ -261,6 +261,8 @@ def test_vertex_attribute_names(client: FlaskClient, test_id: str) -> None:
261
261
  assert "nb_items" in attribute
262
262
  assert "min_values" in attribute
263
263
  assert "max_values" in attribute
264
+ assert "no_data" in attribute
265
+ assert isinstance(attribute["no_data"], bool)
264
266
  print(
265
267
  f"[ATTRIBUTES]: ",
266
268
  [attribute["nb_items"] for attribute in attributes],
@@ -297,6 +299,8 @@ def test_cell_attribute_names(client: FlaskClient, test_id: str) -> None:
297
299
  assert "nb_items" in attribute
298
300
  assert "min_values" in attribute
299
301
  assert "max_values" in attribute
302
+ assert "no_data" in attribute
303
+ assert isinstance(attribute["no_data"], bool)
300
304
  print(
301
305
  f"[ATTRIBUTES]: ",
302
306
  [attribute["nb_items"] for attribute in attributes],
@@ -333,6 +337,8 @@ def test_polygon_attribute_names(client: FlaskClient, test_id: str) -> None:
333
337
  assert "nb_items" in attribute
334
338
  assert "min_values" in attribute
335
339
  assert "max_values" in attribute
340
+ assert "no_data" in attribute
341
+ assert isinstance(attribute["no_data"], bool)
336
342
  print(
337
343
  f"[ATTRIBUTES]: ",
338
344
  [attribute["nb_items"] for attribute in attributes],
@@ -370,6 +376,8 @@ def test_polyhedron_attribute_names(client: FlaskClient, test_id: str) -> None:
370
376
  assert "nb_items" in attribute
371
377
  assert "min_values" in attribute
372
378
  assert "max_values" in attribute
379
+ assert "no_data" in attribute
380
+ assert isinstance(attribute["no_data"], bool)
373
381
  if attribute["attribute_name"] == "Range":
374
382
  assert attribute["min_value"] == 0.0
375
383
  assert attribute["max_value"] == 579.0
@@ -411,6 +419,8 @@ def test_edge_attribute_names(client: FlaskClient, test_id: str) -> None:
411
419
  assert "nb_items" in attribute
412
420
  assert "min_values" in attribute
413
421
  assert "max_values" in attribute
422
+ assert "no_data" in attribute
423
+ assert isinstance(attribute["no_data"], bool)
414
424
  print(
415
425
  f"[ATTRIBUTES]: ",
416
426
  [attribute["nb_items"] for attribute in attributes],
@@ -668,6 +678,8 @@ def _assert_attributes_response(response) -> None:
668
678
  assert "nb_items" in attribute
669
679
  assert "min_values" in attribute
670
680
  assert "max_values" in attribute
681
+ assert "no_data" in attribute
682
+ assert isinstance(attribute["no_data"], bool)
671
683
 
672
684
 
673
685
  def test_model_component_vertex_attribute_names(client: FlaskClient) -> None: