From 525b09f70698431043e431273aa3bc6589afa894 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 5 Aug 2025 11:49:21 +0200 Subject: [PATCH 1/6] object_priority added to geode_objects_dict --- src/opengeodeweb_back/geode_objects.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/opengeodeweb_back/geode_objects.py b/src/opengeodeweb_back/geode_objects.py index b878272c..1fdefbe0 100644 --- a/src/opengeodeweb_back/geode_objects.py +++ b/src/opengeodeweb_back/geode_objects.py @@ -27,6 +27,7 @@ def geode_objects_dict(): "output_factory": og.BRepOutputFactory, "additional_files": og.brep_additional_files, "is_loadable": og.is_brep_loadable, + "object_priority": og.brep_object_priority, "load": og.load_brep, "is_saveable": og.is_brep_saveable, "save": og.save_brep, @@ -50,6 +51,7 @@ def geode_objects_dict(): "output_factory": og_gs.CrossSectionOutputFactory, "additional_files": og_gs.cross_section_additional_files, "is_loadable": og_gs.is_cross_section_loadable, + "object_priority": og_gs.cross_section_object_priority, "load": og_gs.load_cross_section, "is_saveable": og_gs.is_cross_section_saveable, "save": og_gs.save_cross_section, @@ -72,6 +74,7 @@ def geode_objects_dict(): "output_factory": og.EdgedCurveOutputFactory2D, "additional_files": og.edged_curve_additional_files2D, "is_loadable": og.is_edged_curve_loadable2D, + "object_priority": og.edged_curve_object_priority2D, "load": og.load_edged_curve2D, "is_saveable": og.is_edged_curve_saveable2D, "save": og.save_edged_curve2D, @@ -95,6 +98,7 @@ def geode_objects_dict(): "output_factory": og.EdgedCurveOutputFactory3D, "additional_files": og.edged_curve_additional_files3D, "is_loadable": og.is_edged_curve_loadable3D, + "object_priority": og.edged_curve_object_priority3D, "load": og.load_edged_curve3D, "is_saveable": og.is_edged_curve_saveable3D, "save": og.save_edged_curve3D, @@ -118,6 +122,7 @@ def geode_objects_dict(): "output_factory": og.GraphOutputFactory, "additional_files": og.graph_additional_files, "is_loadable": og.is_graph_loadable, + "object_priority": og.graph_object_priority, "load": og.load_graph, "is_saveable": og.is_graph_saveable, "save": og.save_graph, @@ -132,6 +137,7 @@ def geode_objects_dict(): "output_factory": og.HybridSolidOutputFactory3D, "additional_files": og.hybrid_solid_additional_files3D, "is_loadable": og.is_hybrid_solid_loadable3D, + "object_priority": og.hybrid_solid_object_priority3D, "load": og.load_hybrid_solid3D, "is_saveable": og.is_hybrid_solid_saveable3D, "save": og.save_hybrid_solid3D, @@ -156,6 +162,7 @@ def geode_objects_dict(): "output_factory": og_gs.ImplicitCrossSectionOutputFactory, "additional_files": og_gs.implicit_cross_section_additional_files, "is_loadable": og_gs.is_implicit_cross_section_loadable, + "object_priority": og_gs.implicit_cross_section_object_priority, "load": og_gs.load_implicit_cross_section, "is_saveable": og_gs.is_implicit_cross_section_saveable, "save": og_gs.save_implicit_cross_section, @@ -179,6 +186,7 @@ def geode_objects_dict(): "output_factory": og_gs.ImplicitStructuralModelOutputFactory, "additional_files": og_gs.implicit_structural_model_additional_files, "is_loadable": og_gs.is_implicit_structural_model_loadable, + "object_priority": og_gs.implicit_structural_model_object_priority, "load": og_gs.load_implicit_structural_model, "is_saveable": og_gs.is_implicit_structural_model_saveable, "save": og_gs.save_implicit_structural_model, @@ -201,6 +209,7 @@ def geode_objects_dict(): "output_factory": og.LightRegularGridOutputFactory2D, "additional_files": og.light_regular_grid_additional_files2D, "is_loadable": og.is_light_regular_grid_loadable2D, + "object_priority": og.light_regular_grid_object_priority2D, "load": og.load_light_regular_grid2D, "is_saveable": og.is_light_regular_grid_saveable2D, "save": og.save_light_regular_grid2D, @@ -217,6 +226,7 @@ def geode_objects_dict(): "output_factory": og.LightRegularGridOutputFactory3D, "additional_files": og.light_regular_grid_additional_files3D, "is_loadable": og.is_light_regular_grid_loadable3D, + "object_priority": og.light_regular_grid_object_priority3D, "load": og.load_light_regular_grid3D, "is_saveable": og.is_light_regular_grid_saveable3D, "save": og.save_light_regular_grid3D, @@ -233,6 +243,7 @@ def geode_objects_dict(): "output_factory": og.PointSetOutputFactory2D, "additional_files": og.point_set_additional_files2D, "is_loadable": og.is_point_set_loadable2D, + "object_priority": og.point_set_object_priority2D, "load": og.load_point_set2D, "is_saveable": og.is_point_set_saveable2D, "save": og.save_point_set2D, @@ -256,6 +267,7 @@ def geode_objects_dict(): "output_factory": og.PointSetOutputFactory3D, "additional_files": og.point_set_additional_files3D, "is_loadable": og.is_point_set_loadable3D, + "object_priority": og.point_set_object_priority3D, "load": og.load_point_set3D, "is_saveable": og.is_point_set_saveable3D, "save": og.save_point_set3D, @@ -279,6 +291,7 @@ def geode_objects_dict(): "output_factory": og.PolygonalSurfaceOutputFactory2D, "additional_files": og.polygonal_surface_additional_files2D, "is_loadable": og.is_polygonal_surface_loadable2D, + "object_priority": og.polygonal_surface_object_priority2D, "load": og.load_polygonal_surface2D, "is_saveable": og.is_polygonal_surface_saveable2D, "save": og.save_polygonal_surface2D, @@ -302,6 +315,7 @@ def geode_objects_dict(): "output_factory": og.PolygonalSurfaceOutputFactory3D, "additional_files": og.polygonal_surface_additional_files3D, "is_loadable": og.is_polygonal_surface_loadable3D, + "object_priority": og.polygonal_surface_object_priority3D, "load": og.load_polygonal_surface3D, "is_saveable": og.is_polygonal_surface_saveable3D, "save": og.save_polygonal_surface3D, @@ -325,6 +339,7 @@ def geode_objects_dict(): "output_factory": og.PolyhedralSolidOutputFactory3D, "additional_files": og.polyhedral_solid_additional_files3D, "is_loadable": og.is_polyhedral_solid_loadable3D, + "object_priority": og.polyhedral_solid_object_priority3D, "load": og.load_polyhedral_solid3D, "is_saveable": og.is_polyhedral_solid_saveable3D, "save": og.save_polyhedral_solid3D, @@ -348,6 +363,7 @@ def geode_objects_dict(): "output_factory": og.RasterImageOutputFactory2D, "additional_files": og.raster_image_additional_files2D, "is_loadable": og.is_raster_image_loadable2D, + "object_priority": og.raster_image_object_priority2D, "load": og.load_raster_image2D, "is_saveable": og.is_raster_image_saveable2D, "save": og.save_raster_image2D, @@ -362,6 +378,7 @@ def geode_objects_dict(): "output_factory": og.RasterImageOutputFactory3D, "additional_files": og.raster_image_additional_files3D, "is_loadable": og.is_raster_image_loadable3D, + "object_priority": og.raster_image_object_priority3D, "load": og.load_raster_image3D, "is_saveable": og.is_raster_image_saveable3D, "save": og.save_raster_image3D, @@ -376,6 +393,7 @@ def geode_objects_dict(): "output_factory": og.RegularGridOutputFactory2D, "additional_files": og.regular_grid_additional_files2D, "is_loadable": og.is_regular_grid_loadable2D, + "object_priority": og.regular_grid_object_priority2D, "load": og.load_regular_grid2D, "is_saveable": og.is_regular_grid_saveable2D, "save": og.save_regular_grid2D, @@ -398,6 +416,7 @@ def geode_objects_dict(): "output_factory": og.RegularGridOutputFactory3D, "additional_files": og.regular_grid_additional_files3D, "is_loadable": og.is_regular_grid_loadable3D, + "object_priority": og.regular_grid_object_priority3D, "load": og.load_regular_grid3D, "is_saveable": og.is_regular_grid_saveable3D, "save": og.save_regular_grid3D, @@ -420,6 +439,7 @@ def geode_objects_dict(): "output_factory": og.SectionOutputFactory, "additional_files": og.section_additional_files, "is_loadable": og.is_section_loadable, + "object_prioriity": og.section_object_priority, "load": og.load_section, "is_saveable": og.is_section_saveable, "save": og.save_section, @@ -443,6 +463,7 @@ def geode_objects_dict(): "output_factory": og_gs.StructuralModelOutputFactory, "additional_files": og_gs.structural_model_additional_files, "is_loadable": og_gs.is_structural_model_loadable, + "object_priority": og_gs.structural_model_object_priority, "load": og_gs.load_structural_model, "is_saveable": og_gs.is_structural_model_saveable, "save": og_gs.save_structural_model, @@ -465,6 +486,7 @@ def geode_objects_dict(): "output_factory": og.TetrahedralSolidOutputFactory3D, "additional_files": og.tetrahedral_solid_additional_files3D, "is_loadable": og.is_tetrahedral_solid_loadable3D, + "object_priority": og.tetrahedral_solid_object_priority3D, "load": og.load_tetrahedral_solid3D, "is_saveable": og.is_tetrahedral_solid_saveable3D, "save": og.save_tetrahedral_solid3D, @@ -488,6 +510,7 @@ def geode_objects_dict(): "output_factory": og.TriangulatedSurfaceOutputFactory2D, "additional_files": og.triangulated_surface_additional_files2D, "is_loadable": og.is_triangulated_surface_loadable2D, + "object_priority": og.triangulated_surface_object_priority2D, "load": og.load_triangulated_surface2D, "is_saveable": og.is_triangulated_surface_saveable2D, "save": og.save_triangulated_surface2D, @@ -511,6 +534,7 @@ def geode_objects_dict(): "output_factory": og.TriangulatedSurfaceOutputFactory3D, "additional_files": og.triangulated_surface_additional_files3D, "is_loadable": og.is_triangulated_surface_loadable3D, + "object_priority": og.triangulated_surface_object_priority3D, "load": og.load_triangulated_surface3D, "is_saveable": og.is_triangulated_surface_saveable3D, "save": og.save_triangulated_surface3D, @@ -534,6 +558,7 @@ def geode_objects_dict(): "output_factory": og.VertexSetOutputFactory, "additional_files": og.vertex_set_additional_files, "is_loadable": og.is_vertex_set_loadable, + "object_priority": og.vertex_set_object_priority, "load": og.load_vertex_set, "is_saveable": og.is_vertex_set_saveable, "save": og.save_vertex_set, From bbddc5f52f2b1482e377aa14b02c3712ed457987 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 5 Aug 2025 14:22:55 +0200 Subject: [PATCH 2/6] feat(ObjectPriority): added priority score when is_loadable is equal --- src/opengeodeweb_back/geode_functions.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/opengeodeweb_back/geode_functions.py b/src/opengeodeweb_back/geode_functions.py index 68115f62..72968aa5 100644 --- a/src/opengeodeweb_back/geode_functions.py +++ b/src/opengeodeweb_back/geode_functions.py @@ -36,6 +36,8 @@ def is_loadable(geode_object: str, file_absolute_path: str) -> float: percentage = geode_object_value(geode_object)["is_loadable"](file_absolute_path) return percentage.value() +def object_priority(geode_object: str, file_absolute_path: str) -> int: + return geode_object_value(geode_object)["object_priority"](file_absolute_path) def load(geode_object: str, file_absolute_path: str): return geode_object_value(geode_object)["load"](file_absolute_path) @@ -181,11 +183,25 @@ def list_geode_objects( os.path.basename(file_absolute_path) ) geode_objects_filtered_list = filter_geode_objects(key) - for geode_object in geode_objects_filtered_list: if has_creator(geode_object, file_extension): loadability_score = is_loadable(geode_object, file_absolute_path) return_dict[geode_object] = {"is_loadable": loadability_score} + if return_dict: + max_loadability_score = max(obj_info["is_loadable"] for obj_info in return_dict.values()) + best_objects = { + object_name: object_info + for object_name, object_info in return_dict.items() + if object_info["is_loadable"] == max_loadability_score + } + if len(best_objects) > 1: + best_object_name = max( + best_objects, + key=lambda name: object_priority(name, file_absolute_path), + ) + return {best_object_name: return_dict[best_object_name]} + else: + return best_objects return return_dict From 4d7f82fc356d320f5060cb577f6f95dd26b705e1 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 5 Aug 2025 14:41:16 +0200 Subject: [PATCH 3/6] added test for object_priority. priority_object corrected --- src/opengeodeweb_back/geode_objects.py | 2 +- tests/test_geode_functions.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/opengeodeweb_back/geode_objects.py b/src/opengeodeweb_back/geode_objects.py index 1fdefbe0..7386f24e 100644 --- a/src/opengeodeweb_back/geode_objects.py +++ b/src/opengeodeweb_back/geode_objects.py @@ -439,7 +439,7 @@ def geode_objects_dict(): "output_factory": og.SectionOutputFactory, "additional_files": og.section_additional_files, "is_loadable": og.is_section_loadable, - "object_prioriity": og.section_object_priority, + "object_priority": og.section_object_priority, "load": og.load_section, "is_saveable": og.is_section_saveable, "save": og.save_section, diff --git a/tests/test_geode_functions.py b/tests/test_geode_functions.py index 24af3868..435dbc12 100644 --- a/tests/test_geode_functions.py +++ b/tests/test_geode_functions.py @@ -66,6 +66,13 @@ def test_is_loadable(): assert isinstance(is_loadable, float) assert 0.0 <= is_loadable <= 1.0 +def test_object_priority(): + for geode_object, _value in geode_objects.geode_objects_dict().items(): + input_extensions = geode_functions.geode_object_input_extensions(geode_object) + for input_extension in input_extensions: + file_absolute_path = os.path.join(data_folder, f"test.{input_extension}") + priority = geode_functions.object_priority(geode_object, file_absolute_path) + assert isinstance(priority, int), f"Priority should be int for {geode_object}" def test_load(): for geode_object, value in geode_objects.geode_objects_dict().items(): From df05400198b61d9eede54b5d6d38aa82d2e9e235 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:42:25 +0000 Subject: [PATCH 4/6] Apply prepare changes --- src/opengeodeweb_back/geode_functions.py | 6 +++++- tests/test_geode_functions.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/opengeodeweb_back/geode_functions.py b/src/opengeodeweb_back/geode_functions.py index 72968aa5..a10fc189 100644 --- a/src/opengeodeweb_back/geode_functions.py +++ b/src/opengeodeweb_back/geode_functions.py @@ -36,9 +36,11 @@ def is_loadable(geode_object: str, file_absolute_path: str) -> float: percentage = geode_object_value(geode_object)["is_loadable"](file_absolute_path) return percentage.value() + def object_priority(geode_object: str, file_absolute_path: str) -> int: return geode_object_value(geode_object)["object_priority"](file_absolute_path) + def load(geode_object: str, file_absolute_path: str): return geode_object_value(geode_object)["load"](file_absolute_path) @@ -188,7 +190,9 @@ def list_geode_objects( loadability_score = is_loadable(geode_object, file_absolute_path) return_dict[geode_object] = {"is_loadable": loadability_score} if return_dict: - max_loadability_score = max(obj_info["is_loadable"] for obj_info in return_dict.values()) + max_loadability_score = max( + obj_info["is_loadable"] for obj_info in return_dict.values() + ) best_objects = { object_name: object_info for object_name, object_info in return_dict.items() diff --git a/tests/test_geode_functions.py b/tests/test_geode_functions.py index 435dbc12..3cdaa5e0 100644 --- a/tests/test_geode_functions.py +++ b/tests/test_geode_functions.py @@ -66,13 +66,17 @@ def test_is_loadable(): assert isinstance(is_loadable, float) assert 0.0 <= is_loadable <= 1.0 + def test_object_priority(): for geode_object, _value in geode_objects.geode_objects_dict().items(): input_extensions = geode_functions.geode_object_input_extensions(geode_object) for input_extension in input_extensions: file_absolute_path = os.path.join(data_folder, f"test.{input_extension}") priority = geode_functions.object_priority(geode_object, file_absolute_path) - assert isinstance(priority, int), f"Priority should be int for {geode_object}" + assert isinstance( + priority, int + ), f"Priority should be int for {geode_object}" + def test_load(): for geode_object, value in geode_objects.geode_objects_dict().items(): From e7df16fb7f1a3f975db2201d32ebd76fd7e8195f Mon Sep 17 00:00:00 2001 From: Maximilien <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 5 Aug 2025 14:50:19 +0200 Subject: [PATCH 5/6] Apply suggestion from @BotellaA Co-authored-by: Arnaud Botella --- src/opengeodeweb_back/geode_functions.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/opengeodeweb_back/geode_functions.py b/src/opengeodeweb_back/geode_functions.py index a10fc189..3fd4cd05 100644 --- a/src/opengeodeweb_back/geode_functions.py +++ b/src/opengeodeweb_back/geode_functions.py @@ -189,23 +189,6 @@ def list_geode_objects( if has_creator(geode_object, file_extension): loadability_score = is_loadable(geode_object, file_absolute_path) return_dict[geode_object] = {"is_loadable": loadability_score} - if return_dict: - max_loadability_score = max( - obj_info["is_loadable"] for obj_info in return_dict.values() - ) - best_objects = { - object_name: object_info - for object_name, object_info in return_dict.items() - if object_info["is_loadable"] == max_loadability_score - } - if len(best_objects) > 1: - best_object_name = max( - best_objects, - key=lambda name: object_priority(name, file_absolute_path), - ) - return {best_object_name: return_dict[best_object_name]} - else: - return best_objects return return_dict From 93e11592c82aef877550acde221e5a6dc17b7d60 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:50:43 +0000 Subject: [PATCH 6/6] Apply prepare changes --- .releaserc | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .releaserc diff --git a/.releaserc b/.releaserc new file mode 100644 index 00000000..bf47fdf5 --- /dev/null +++ b/.releaserc @@ -0,0 +1,11 @@ +{ + branches: [ + { name: "master" }, + { name: "next", channel: "next", prerelease: "rc" } + ], + plugins: [ + '@semantic-release/commit-analyzer', + '@semantic-release/release-notes-generator', + '@semantic-release/github' + ] +}