From ac35e895d2b188ee4ac3673908cc81cda9de55ce Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 6 Jan 2026 09:24:41 +0100 Subject: [PATCH 01/18] adding imports fix in mypy.ini --- mypy.ini | 11 ++++++++++- src/opengeodeweb_viewer/py.typed | 1 - 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mypy.ini b/mypy.ini index 089c0496..f2a13fd3 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,4 +1,13 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False \ No newline at end of file +disallow_untyped_decorators = False + +[mypy-vtkmodules.*,vtk.*] +ignore_missing_imports = True + +[mypy-dataclasses_json.*] +ignore_missing_imports = True + +[mypy-opengeodeweb_microservice.*] +ignore_missing_imports = True \ No newline at end of file diff --git a/src/opengeodeweb_viewer/py.typed b/src/opengeodeweb_viewer/py.typed index b648ac92..e69de29b 100644 --- a/src/opengeodeweb_viewer/py.typed +++ b/src/opengeodeweb_viewer/py.typed @@ -1 +0,0 @@ -partial From 1d65aec3aab303204c767870a1f56736a17bb2bf Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 6 Jan 2026 08:28:56 +0000 Subject: [PATCH 02/18] Apply prepare changes --- mypy.ini | 11 +---------- requirements.txt | 1 - 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/mypy.ini b/mypy.ini index f2a13fd3..089c0496 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,13 +1,4 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False - -[mypy-vtkmodules.*,vtk.*] -ignore_missing_imports = True - -[mypy-dataclasses_json.*] -ignore_missing_imports = True - -[mypy-opengeodeweb_microservice.*] -ignore_missing_imports = True \ No newline at end of file +disallow_untyped_decorators = False \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 62eb4a79..065674ac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.0.11 From ac26221efc68f0e128656d281bfc3bbb2c470410 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 6 Jan 2026 11:38:05 +0100 Subject: [PATCH 03/18] type vtk --- mypy.ini | 5 ++ src/opengeodeweb_viewer/config.py | 5 +- .../object/object_methods.py | 27 +++++--- .../rpc/generic/generic_protocols.py | 2 +- .../rpc/mesh/cells/cells_protocols.py | 2 +- .../rpc/mesh/edges/mesh_edges_protocols.py | 2 +- .../rpc/mesh/mesh_protocols.py | 10 +-- .../rpc/mesh/polygons/polygons_protocols.py | 4 +- .../rpc/mesh/polyhedra/polyhedra_protocols.py | 4 +- .../model/blocks/model_blocks_protocols.py | 4 +- .../model/corners/model_corners_protocols.py | 4 +- .../rpc/model/edges/model_edges_protocols.py | 4 +- .../rpc/model/lines/model_lines_protocols.py | 4 +- .../rpc/model/model_protocols.py | 4 +- .../model/points/model_points_protocols.py | 4 +- .../surfaces/model_surfaces_protocols.py | 4 +- .../rpc/utils_protocols.py | 2 +- .../rpc/viewer/viewer_protocols.py | 16 ++--- src/opengeodeweb_viewer/vtk_protocol.py | 17 +++++- src/opengeodeweb_viewer/vtkw_server.py | 61 ++++++++++--------- tests/conftest.py | 20 +++--- .../mesh/points/test_mesh_points_protocols.py | 17 +++--- tests/py.typed | 1 - 23 files changed, 130 insertions(+), 93 deletions(-) diff --git a/mypy.ini b/mypy.ini index f2a13fd3..9a15ac42 100644 --- a/mypy.ini +++ b/mypy.ini @@ -2,6 +2,8 @@ strict = True files = src/ disallow_untyped_decorators = False +explicit_package_bases = True +mypy_path = src [mypy-vtkmodules.*,vtk.*] ignore_missing_imports = True @@ -10,4 +12,7 @@ ignore_missing_imports = True ignore_missing_imports = True [mypy-opengeodeweb_microservice.*] +ignore_missing_imports = True + +[mypy-wslink.*] ignore_missing_imports = True \ No newline at end of file diff --git a/src/opengeodeweb_viewer/config.py b/src/opengeodeweb_viewer/config.py index 14b04a67..876fc697 100644 --- a/src/opengeodeweb_viewer/config.py +++ b/src/opengeodeweb_viewer/config.py @@ -21,8 +21,9 @@ def dev_config() -> None: os.environ["DATA_FOLDER_PATH"] = os.path.join( "C:/Users", os.getlogin(), "OpenGeodeWeb_Data" ) - if not os.path.exists(os.environ.get("DATA_FOLDER_PATH")): - os.mkdir(os.environ.get("DATA_FOLDER_PATH")) + data_folder_path = os.environ.get("DATA_FOLDER_PATH") + if data_folder_path and not os.path.exists(data_folder_path): + os.mkdir(data_folder_path) def _copy_test_assets( diff --git a/src/opengeodeweb_viewer/object/object_methods.py b/src/opengeodeweb_viewer/object/object_methods.py index d00ecacf..2d0febcd 100644 --- a/src/opengeodeweb_viewer/object/object_methods.py +++ b/src/opengeodeweb_viewer/object/object_methods.py @@ -4,7 +4,12 @@ # Third party imports from vtkmodules.vtkIOXML import vtkXMLDataReader, vtkXMLImageDataReader from vtkmodules.vtkCommonExecutionModel import vtkAlgorithm -from vtkmodules.vtkRenderingCore import vtkMapper, vtkActor, vtkTexture +from vtkmodules.vtkRenderingCore import ( + vtkMapper, + vtkActor, + vtkTexture, + vtkCompositePolyDataMapper, +) from vtkmodules.vtkCommonDataModel import vtkDataObject # Local application imports @@ -32,7 +37,7 @@ def registerObject( renderWindow = self.getView("-1") renderer = renderWindow.GetRenderers().GetFirstRenderer() resetCamara = True - for registered_actor in renderer.GetActors(): + for registered_actor in renderer.GetActors(): # type: ignore[attr-defined] if registered_actor.visibility == True: resetCamara = False renderer.AddActor(data.actor) @@ -104,20 +109,22 @@ def SetBlocksVisibility( self, data_id: str, block_ids: list[int], visibility: bool ) -> None: mapper = self.get_object(data_id).mapper - for block_id in block_ids: - mapper.SetBlockVisibility(block_id, visibility) + if isinstance(mapper, vtkCompositePolyDataMapper): + for block_id in block_ids: + mapper.SetBlockVisibility(block_id, visibility) def SetBlocksColor( self, data_id: str, block_ids: list[int], red: int, green: int, blue: int ) -> None: mapper = self.get_object(data_id).mapper - for block_id in block_ids: - mapper.SetBlockColor(block_id, [red / 255, green / 255, blue / 255]) + if isinstance(mapper, vtkCompositePolyDataMapper): + for block_id in block_ids: + mapper.SetBlockColor(block_id, [red / 255, green / 255, blue / 255]) def clearColors(self, data_id: str) -> None: db = self.get_object(data_id) - mapper = db["mapper"] - reader = db["reader"] - reader.GetOutput().GetPointData().SetActiveScalars("") - reader.GetOutput().GetCellData().SetActiveScalars("") + mapper = db.mapper + reader = db.reader + reader.GetOutput().GetPointData().SetActiveScalars("") # type: ignore[attr-defined] + reader.GetOutput().GetCellData().SetActiveScalars("") # type: ignore[attr-defined] mapper.ScalarVisibilityOff() diff --git a/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py index f14a9c27..acc06461 100644 --- a/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py +++ b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py @@ -3,7 +3,7 @@ # Third party imports from vtkmodules.web import protocols as vtk_protocols -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py index 9e25c0be..e5a47f10 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py index 1f0f62cf..65e96ab4 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py index 697d54fa..2ec4f231 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from vtkmodules.vtkIOXML import vtkXMLGenericDataObjectReader, vtkXMLImageDataReader from vtkmodules.vtkRenderingCore import vtkDataSetMapper, vtkActor, vtkTexture from vtkmodules.vtkCommonDataModel import vtkDataSet, vtkCellTypes @@ -109,7 +109,7 @@ def meshApplyTextures(self, rpc_params: RpcParams) -> None: if texture_data is None: continue texture_file = texture_data.viewable_file - if not texture_file.lower().endswith(".vti"): + if texture_file is None or not texture_file.lower().endswith(".vti"): continue texture_file_path = self.get_data_file_path(texture_id) texture_reader = vtkXMLImageDataReader() @@ -119,7 +119,7 @@ def meshApplyTextures(self, rpc_params: RpcParams) -> None: texture.SetInputConnection(texture_reader.GetOutputPort()) texture.InterpolateOn() reader = self.get_object(mesh_id).reader - output = reader.GetOutput() + output = reader.GetOutput() # type: ignore[attr-defined] point_data = output.GetPointData() for i in range(point_data.GetNumberOfArrays()): array = point_data.GetArray(i) @@ -131,7 +131,7 @@ def meshApplyTextures(self, rpc_params: RpcParams) -> None: def displayAttributeOnVertices(self, data_id: str, name: str) -> None: reader = self.get_object(data_id).reader - points = reader.GetOutput().GetPointData() + points = reader.GetOutput().GetPointData() # type: ignore[attr-defined] points.SetActiveScalars(name) mapper = self.get_object(data_id).mapper mapper.ScalarVisibilityOn() @@ -140,7 +140,7 @@ def displayAttributeOnVertices(self, data_id: str, name: str) -> None: def displayAttributeOnCells(self, data_id: str, name: str) -> None: reader = self.get_object(data_id).reader - cells = reader.GetOutput().GetCellData() + cells = reader.GetOutput().GetCellData() # type: ignore[attr-defined] cells.SetActiveScalars(name) mapper = self.get_object(data_id).mapper mapper.ScalarVisibilityOn() diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py index 8ca9eec3..8f240a88 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports @@ -20,7 +20,7 @@ class VtkMeshPolygonsView(VtkMeshView): os.path.join(os.path.dirname(__file__), "schemas") ) - def __init__(self): + def __init__(self) -> None: super().__init__() @exportRpc(mesh_polygons_prefix + mesh_polygons_schemas_dict["visibility"]["rpc"]) diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py index 4931b358..8b3b2c4e 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports @@ -20,7 +20,7 @@ class VtkMeshPolyhedraView(VtkMeshView): os.path.join(os.path.dirname(__file__), "schemas") ) - def __init__(self): + def __init__(self) -> None: super().__init__() @exportRpc(mesh_polyhedra_prefix + mesh_polyhedra_schemas_dict["visibility"]["rpc"]) diff --git a/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py b/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py index 6db12083..3892a510 100644 --- a/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports @@ -20,7 +20,7 @@ class VtkModelBlocksView(VtkModelView): os.path.join(os.path.dirname(__file__), "schemas") ) - def __init__(self): + def __init__(self) -> None: super().__init__() @exportRpc(model_blocks_prefix + model_blocks_schemas_dict["visibility"]["rpc"]) diff --git a/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py b/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py index 3e6a3ee2..1a10c105 100644 --- a/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports @@ -20,7 +20,7 @@ class VtkModelCornersView(VtkModelView): os.path.join(os.path.dirname(__file__), "schemas") ) - def __init__(self): + def __init__(self) -> None: super().__init__() @exportRpc(model_corners_prefix + model_corners_schemas_dict["visibility"]["rpc"]) diff --git a/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py b/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py index 2ed35a30..969625ae 100644 --- a/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports @@ -20,7 +20,7 @@ class VtkModelEdgesView(VtkModelView): os.path.join(os.path.dirname(__file__), "schemas") ) - def __init__(self): + def __init__(self) -> None: super().__init__() @exportRpc(model_edges_prefix + model_edges_schemas_dict["visibility"]["rpc"]) diff --git a/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py b/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py index 76e18d42..14660a03 100644 --- a/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports @@ -20,7 +20,7 @@ class VtkModelLinesView(VtkModelView): os.path.join(os.path.dirname(__file__), "schemas") ) - def __init__(self): + def __init__(self) -> None: super().__init__() @exportRpc(model_lines_prefix + model_lines_schemas_dict["visibility"]["rpc"]) diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index e651d4b9..f2cf1a22 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -8,7 +8,7 @@ ) from vtkmodules.vtkIOXML import vtkXMLMultiBlockDataReader from vtkmodules.vtkFiltersGeometry import vtkGeometryFilter -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports @@ -27,7 +27,7 @@ class VtkModelView(VtkObjectView): os.path.join(os.path.dirname(__file__), "schemas") ) - def __init__(self): + def __init__(self) -> None: super().__init__() @exportRpc(model_prefix + model_schemas_dict["register"]["rpc"]) diff --git a/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py b/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py index 5a71046b..3b4f4873 100644 --- a/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports @@ -20,7 +20,7 @@ class VtkModelPointsView(VtkModelView): os.path.join(os.path.dirname(__file__), "schemas") ) - def __init__(self): + def __init__(self) -> None: super().__init__() @exportRpc(model_points_prefix + model_points_schemas_dict["visibility"]["rpc"]) diff --git a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py index 20a985db..ff31f520 100644 --- a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports @@ -20,7 +20,7 @@ class VtkModelSurfacesView(VtkModelView): os.path.join(os.path.dirname(__file__), "schemas") ) - def __init__(self): + def __init__(self) -> None: super().__init__() @exportRpc(model_surfaces_prefix + model_surfaces_schemas_dict["visibility"]["rpc"]) diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index d06c6b9d..5155c9ba 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -3,7 +3,7 @@ from typing import cast # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc # Local application imports from opengeodeweb_microservice.schemas import get_schemas_dict diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index 5039632a..d6a4fe82 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -3,7 +3,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from vtkmodules.vtkIOImage import vtkPNGWriter, vtkJPEGWriter from vtkmodules.vtkRenderingAnnotation import vtkCubeAxesActor, vtkAxesActor from vtkmodules.vtkRenderingCore import ( @@ -140,6 +140,7 @@ def takeScreenshot(self, rpc_params: RpcParams) -> dict[str, str | bytes]: w2if.ReadFrontBufferOff() w2if.Update() output_extension = params.output_extension + writer: vtkPNGWriter | vtkJPEGWriter if output_extension == schemas.OutputExtension.PNG: writer = vtkPNGWriter() elif output_extension == schemas.OutputExtension.JPG: @@ -167,17 +168,17 @@ def updateData(self, rpc_params: RpcParams) -> None: ) params = schemas.UpdateData.from_dict(rpc_params) data = self.get_object(params.id) - reader = data["reader"] + reader = data.reader reader.Update() - mapper = data["mapper"] + mapper = data.mapper tag = reference(0) scalars = vtkAbstractMapper.GetAbstractScalars( - reader.GetOutput(), + reader.GetOutput(), # type: ignore[attr-defined] mapper.GetScalarMode(), mapper.GetArrayAccessMode(), mapper.GetArrayId(), mapper.GetArrayName(), - tag, + tag, # type: ignore[arg-type] ) mapper.SetScalarRange(scalars.GetRange()) @@ -203,7 +204,7 @@ def computeEpsilon(self, renderer: vtkRenderer, z: float) -> float: renderer.SetDisplayPoint(size[0], size[1], z) renderer.DisplayToWorld() windowUpperRight = renderer.GetWorldPoint() - epsilon = 0 + epsilon: float = 0.0 for i in range(3): epsilon += (windowUpperRight[i] - windowLowerLeft[i]) * ( windowUpperRight[i] - windowLowerLeft[i] @@ -229,7 +230,8 @@ def pickedIds(self, rpc_params: RpcParams) -> dict[str, list[str]]: array_ids = [] for id in params.ids: bounds = self.get_object(id).actor.GetBounds() - if bbox.Intersects(bounds): + bounds_box = vtkBoundingBox(bounds) + if bbox.Intersects(bounds_box): array_ids.append(id) return {"array_ids": array_ids} diff --git a/src/opengeodeweb_viewer/vtk_protocol.py b/src/opengeodeweb_viewer/vtk_protocol.py index 2ec6ed01..c7df3dba 100644 --- a/src/opengeodeweb_viewer/vtk_protocol.py +++ b/src/opengeodeweb_viewer/vtk_protocol.py @@ -14,6 +14,8 @@ vtkActor, vtkMapper, vtkRenderer, + vtkRenderWindow, + vtkCompositePolyDataMapper, ) from vtkmodules.vtkRenderingAnnotation import vtkCubeAxesActor, vtkAxesActor from vtkmodules.vtkInteractionWidgets import vtkOrientationMarkerWidget @@ -26,7 +28,7 @@ @dataclass class vtkData: reader: vtkXMLReader - mapper: vtkMapper + mapper: vtkMapper | vtkCompositePolyDataMapper filter: vtkAlgorithm | None = None actor: vtkActor = field(default_factory=vtkActor) max_dimension: Literal["points", "edges", "polygons", "polyhedra", "default"] = ( @@ -39,6 +41,19 @@ def __init__(self) -> None: super().__init__() self.DATA_FOLDER_PATH = os.getenv("DATA_FOLDER_PATH", ".") + # Typed wrappers for untyped parent methods + def getView(self, view_id: str) -> vtkRenderWindow: + """Typed wrapper for the untyped parent getView method.""" + return cast(vtkRenderWindow, super().getView(view_id)) # type: ignore[no-untyped-call] + + def registerVtkWebProtocol(self, protocol: vtk_protocols.vtkWebProtocol) -> None: + """Typed wrapper for the untyped parent registerVtkWebProtocol method.""" + super().registerVtkWebProtocol(protocol) + + def getApplication(self) -> Any: + """Typed wrapper for the untyped parent getApplication method.""" + return super().getApplication() # type: ignore[no-untyped-call] + def get_data_base(self) -> Any: return self.getSharedObject("db") diff --git a/src/opengeodeweb_viewer/vtkw_server.py b/src/opengeodeweb_viewer/vtkw_server.py index c75ec52a..a12ee580 100644 --- a/src/opengeodeweb_viewer/vtkw_server.py +++ b/src/opengeodeweb_viewer/vtkw_server.py @@ -1,11 +1,12 @@ # Standard library imports import argparse import os +from typing import Any, cast # Third party imports from vtkmodules.web import wslink as vtk_wslink from vtkmodules.web import protocols as vtk_protocols -from wslink import server # type: ignore +from wslink import server from vtkmodules.vtkRenderingCore import vtkRenderer, vtkRenderWindow from vtkmodules.vtkCommonCore import vtkFileOutputWindow, vtkOutputWindow from opengeodeweb_microservice.database import connection @@ -55,7 +56,7 @@ class _Server(vtk_wslink.ServerProtocol): debug = False @staticmethod - def add_arguments(parser): + def add_arguments(parser: argparse.ArgumentParser) -> None: parser.add_argument( "--data_folder_path", default=os.environ.get("DATA_FOLDER_PATH"), @@ -63,17 +64,17 @@ def add_arguments(parser): ) @staticmethod - def configure(args): + def configure(args: argparse.Namespace) -> None: # Standard args _Server.authKey = args.authKey - def initialize(self): + def initialize(self) -> None: # Bring used components - self.registerVtkWebProtocol(vtk_protocols.vtkWebMouseHandler()) - self.registerVtkWebProtocol(vtk_protocols.vtkWebViewPort()) - publisher = vtk_protocols.vtkWebPublishImageDelivery(decode=False) + cast(Any, self).registerVtkWebProtocol(vtk_protocols.vtkWebMouseHandler()) + cast(Any, self).registerVtkWebProtocol(vtk_protocols.vtkWebViewPort()) + publisher = vtk_protocols.vtkWebPublishImageDelivery(decode=False) # type: ignore[no-untyped-call] publisher.deltaStaleTimeBeforeRender = 0.1 - self.registerVtkWebProtocol(publisher) + cast(Any, self).registerVtkWebProtocol(publisher) self.setSharedObject("db", dict()) self.setSharedObject("publisher", publisher) @@ -81,27 +82,29 @@ def initialize(self): mesh_protocols = VtkMeshView() model_protocols = VtkModelView() vtk_view = VtkView() - self.registerVtkWebProtocol(vtk_view) - self.registerVtkWebProtocol(VtkUtilsView()) - self.registerVtkWebProtocol(VtkViewerView()) - self.registerVtkWebProtocol(mesh_protocols) - self.registerVtkWebProtocol(VtkMeshPointsView()) - self.registerVtkWebProtocol(VtkMeshEdgesView()) - self.registerVtkWebProtocol(VtkMeshCellsView()) # type: ignore - self.registerVtkWebProtocol(VtkMeshPolygonsView()) - self.registerVtkWebProtocol(VtkMeshPolyhedraView()) - self.registerVtkWebProtocol(model_protocols) - self.registerVtkWebProtocol(VtkModelEdgesView()) - self.registerVtkWebProtocol(VtkModelPointsView()) - self.registerVtkWebProtocol(VtkModelCornersView()) - self.registerVtkWebProtocol(VtkModelLinesView()) - self.registerVtkWebProtocol(VtkModelSurfacesView()) - self.registerVtkWebProtocol(VtkModelBlocksView()) - self.registerVtkWebProtocol(VtkGenericView(mesh_protocols, model_protocols)) + cast(Any, self).registerVtkWebProtocol(vtk_view) + cast(Any, self).registerVtkWebProtocol(VtkUtilsView()) + cast(Any, self).registerVtkWebProtocol(VtkViewerView()) + cast(Any, self).registerVtkWebProtocol(mesh_protocols) + cast(Any, self).registerVtkWebProtocol(VtkMeshPointsView()) + cast(Any, self).registerVtkWebProtocol(VtkMeshEdgesView()) + cast(Any, self).registerVtkWebProtocol(VtkMeshCellsView()) + cast(Any, self).registerVtkWebProtocol(VtkMeshPolygonsView()) + cast(Any, self).registerVtkWebProtocol(VtkMeshPolyhedraView()) + cast(Any, self).registerVtkWebProtocol(model_protocols) + cast(Any, self).registerVtkWebProtocol(VtkModelEdgesView()) + cast(Any, self).registerVtkWebProtocol(VtkModelPointsView()) + cast(Any, self).registerVtkWebProtocol(VtkModelCornersView()) + cast(Any, self).registerVtkWebProtocol(VtkModelLinesView()) + cast(Any, self).registerVtkWebProtocol(VtkModelSurfacesView()) + cast(Any, self).registerVtkWebProtocol(VtkModelBlocksView()) + cast(Any, self).registerVtkWebProtocol( + VtkGenericView(mesh_protocols, model_protocols) + ) # tell the C++ web app to use no encoding. # ParaViewWebPublishImageDelivery must be set to decode=False to match. - self.getApplication().SetImageEncoding(0) + cast(Any, self).getApplication().SetImageEncoding(0) # Update authentication key to use self.updateSecret(_Server.authKey) @@ -116,7 +119,9 @@ def initialize(self): renderWindow = vtkRenderWindow() renderWindow.AddRenderer(renderer) self.setSharedObject("renderer", renderer) - self.getApplication().GetObjectIdMap().SetActiveObject("VIEW", renderWindow) + cast(Any, self).getApplication().GetObjectIdMap().SetActiveObject( + "VIEW", renderWindow + ) renderWindow.SetOffScreenRendering(not _Server.debug) @@ -126,7 +131,7 @@ def initialize(self): # ============================================================================= -def run_server(Server=_Server): +def run_server(Server: type[vtk_wslink.ServerProtocol] = _Server) -> None: PYTHON_ENV = os.environ.get("PYTHON_ENV", default="prod").strip().lower() if PYTHON_ENV == "prod": prod_config() diff --git a/tests/conftest.py b/tests/conftest.py index 7d4895b3..b0fde064 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,21 +2,19 @@ from pathlib import Path from websocket import create_connection, WebSocketTimeoutException import json -from xprocess import ProcessStarter +from xprocess import ProcessStarter # type: ignore[import-untyped] from vtkmodules.vtkIOImage import vtkImageReader2, vtkPNGReader, vtkJPEGReader from vtkmodules.vtkImagingCore import vtkImageDifference import os import shutil import xml.etree.ElementTree as ET -from typing import Callable, Generator +from typing import Callable, Generator, Any, cast from opengeodeweb_viewer import config from opengeodeweb_microservice.database.connection import get_session, init_database from opengeodeweb_microservice.database.data import Data from opengeodeweb_viewer.rpc.viewer.viewer_protocols import VtkViewerView -type RpcTestParams = list[ - dict[str, str | int | float | bool | dict[str, int] | list[str]] | int -] | None +type RpcTestParams = list[dict[str, Any] | int] | None class ServerMonitor: @@ -80,16 +78,22 @@ def _reader_for_file(path: str) -> vtkImageReader2: return vtkJPEGReader() def images_diff(self, first_image_path: str, second_image_path: str) -> float: + first_reader: vtkImageReader2 if ".png" in first_image_path: first_reader = vtkPNGReader() elif (".jpg" in first_image_path) or (".jpeg" in first_image_path): first_reader = vtkJPEGReader() + else: + first_reader = vtkJPEGReader() first_reader.SetFileName(first_image_path) + second_reader: vtkImageReader2 if ".png" in second_image_path: second_reader = vtkPNGReader() elif (".jpg" in second_image_path) or (".jpeg" in second_image_path): second_reader = vtkJPEGReader() + else: + second_reader = vtkJPEGReader() second_reader.SetFileName(second_image_path) images_diff = vtkImageDifference() @@ -157,7 +161,7 @@ def __init__(self, root_path: Path) -> None: self.root_path = Path(root_path) def get_xprocess_args(self) -> tuple[str, type, type]: - class Starter(ProcessStarter): + class Starter(ProcessStarter): # type: ignore[misc] terminate_on_interrupt = True pattern = "wslink: Starting factory" timeout = 10 @@ -178,14 +182,14 @@ class Starter(ProcessStarter): def server(xprocess: object) -> Generator[ServerMonitor, None, None]: name, Starter, Monitor = HELPER.get_xprocess_args() os.environ["PYTHON_ENV"] = "test" - _, log = xprocess.ensure(name, Starter) + _, log = cast(Any, xprocess).ensure(name, Starter) monitor = Monitor(log) yield monitor try: monitor.ws.close() except Exception: pass - xprocess.getinfo(name).terminate() + cast(Any, xprocess).getinfo(name).terminate() monitor.print_log() diff --git a/tests/mesh/points/test_mesh_points_protocols.py b/tests/mesh/points/test_mesh_points_protocols.py index 564950df..8cca6ec6 100644 --- a/tests/mesh/points/test_mesh_points_protocols.py +++ b/tests/mesh/points/test_mesh_points_protocols.py @@ -1,5 +1,5 @@ # Standard library imports -from typing import Callable, cast +from typing import Callable # Third party imports from opengeodeweb_viewer.rpc.mesh.mesh_protocols import VtkMeshView @@ -20,7 +20,7 @@ def test_points_visibility( server.call( VtkMeshPointsView.mesh_points_prefix - + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["visibility"]["rpc"]), + + VtkMeshPointsView.mesh_points_schemas_dict["visibility"]["rpc"], [{"id": mesh_id, "visibility": True}], ) assert server.compare_image("mesh/points/visibility.jpeg") == True @@ -34,7 +34,7 @@ def test_points_size( server.call( VtkMeshPointsView.mesh_points_prefix - + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["size"]["rpc"]), + + VtkMeshPointsView.mesh_points_schemas_dict["size"]["rpc"], [{"id": mesh_id, "size": 15}], ) assert server.compare_image("mesh/points/size.jpeg") == True @@ -48,7 +48,7 @@ def test_points_color( server.call( VtkMeshPointsView.mesh_points_prefix - + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["color"]["rpc"]), + + VtkMeshPointsView.mesh_points_schemas_dict["color"]["rpc"], [{"id": mesh_id, "color": {"r": 255, "g": 0, "b": 0}}], ) assert server.compare_image("mesh/points/color.jpeg") == True @@ -61,29 +61,28 @@ def test_points_with_point_set( dataset_factory(id=mesh_id, viewable_file="points.vtp") server.call( - VtkMeshView.mesh_prefix - + cast(str, VtkMeshView.mesh_schemas_dict["register"]["rpc"]), + VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], [{"id": mesh_id}], ) assert server.compare_image("mesh/points/register_point_set.jpeg") == True server.call( VtkMeshPointsView.mesh_points_prefix - + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["size"]["rpc"]), + + VtkMeshPointsView.mesh_points_schemas_dict["size"]["rpc"], [{"id": mesh_id, "size": 10}], ) assert server.compare_image("mesh/points/point_set_size.jpeg") == True server.call( VtkMeshPointsView.mesh_points_prefix - + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["color"]["rpc"]), + + VtkMeshPointsView.mesh_points_schemas_dict["color"]["rpc"], [{"id": mesh_id, "color": {"r": 255, "g": 0, "b": 0}}], ) assert server.compare_image("mesh/points/point_set_color.jpeg") == True server.call( VtkMeshPointsView.mesh_points_prefix - + cast(str, VtkMeshPointsView.mesh_points_schemas_dict["visibility"]["rpc"]), + + VtkMeshPointsView.mesh_points_schemas_dict["visibility"]["rpc"], [{"id": mesh_id, "visibility": False}], ) assert server.compare_image("mesh/points/point_set_visibility.jpeg") == True diff --git a/tests/py.typed b/tests/py.typed index b648ac92..e69de29b 100644 --- a/tests/py.typed +++ b/tests/py.typed @@ -1 +0,0 @@ -partial From aebde42d4cb9a9421a80a2dd89dbb1707fe868be Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 6 Jan 2026 10:49:30 +0000 Subject: [PATCH 04/18] Apply prepare changes --- mypy.ini | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/mypy.ini b/mypy.ini index c0e0329f..089c0496 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,18 +1,4 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False -explicit_package_bases = True -mypy_path = src - -[mypy-vtkmodules.*,vtk.*] -ignore_missing_imports = True - -[mypy-dataclasses_json.*] -ignore_missing_imports = True - -[mypy-opengeodeweb_microservice.*] -ignore_missing_imports = True - -[mypy-wslink.*] -ignore_missing_imports = True +disallow_untyped_decorators = False \ No newline at end of file From 54ff41100b5e8ba8821815f22b4bfe48a0c36932 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 6 Jan 2026 11:53:12 +0100 Subject: [PATCH 05/18] reapply type ignore for exportRpc --- src/opengeodeweb_viewer/rpc/generic/generic_protocols.py | 2 +- src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py | 2 +- src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py | 2 +- src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py | 2 +- .../rpc/mesh/points/mesh_points_protocols.py | 2 +- src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py | 2 +- .../rpc/mesh/polyhedra/polyhedra_protocols.py | 2 +- .../rpc/model/blocks/model_blocks_protocols.py | 2 +- .../rpc/model/corners/model_corners_protocols.py | 2 +- .../rpc/model/edges/model_edges_protocols.py | 2 +- .../rpc/model/lines/model_lines_protocols.py | 2 +- src/opengeodeweb_viewer/rpc/model/model_protocols.py | 2 +- .../rpc/model/points/model_points_protocols.py | 2 +- .../rpc/model/surfaces/model_surfaces_protocols.py | 2 +- src/opengeodeweb_viewer/rpc/utils_protocols.py | 2 +- src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py index acc06461..f14a9c27 100644 --- a/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py +++ b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py @@ -3,7 +3,7 @@ # Third party imports from vtkmodules.web import protocols as vtk_protocols -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py index e5a47f10..9e25c0be 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py index 65e96ab4..1f0f62cf 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py index 2ec4f231..2cdd73c5 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from vtkmodules.vtkIOXML import vtkXMLGenericDataObjectReader, vtkXMLImageDataReader from vtkmodules.vtkRenderingCore import vtkDataSetMapper, vtkActor, vtkTexture from vtkmodules.vtkCommonDataModel import vtkDataSet, vtkCellTypes diff --git a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py index 1c79b3fa..81ed1318 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py index 8f240a88..78c5660a 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py index 8b3b2c4e..1d87bfd5 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py b/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py index 3892a510..692e9ec3 100644 --- a/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py b/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py index 1a10c105..ef376891 100644 --- a/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py b/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py index 969625ae..8558d32f 100644 --- a/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py b/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py index 14660a03..60c11925 100644 --- a/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index f2cf1a22..61c762a1 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -8,7 +8,7 @@ ) from vtkmodules.vtkIOXML import vtkXMLMultiBlockDataReader from vtkmodules.vtkFiltersGeometry import vtkGeometryFilter -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py b/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py index 3b4f4873..3285c279 100644 --- a/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py index ff31f520..aaa3a818 100644 --- a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index 5155c9ba..d06c6b9d 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -3,7 +3,7 @@ from typing import cast # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore # Local application imports from opengeodeweb_microservice.schemas import get_schemas_dict diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index d6a4fe82..bdfb6dbf 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -3,7 +3,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from vtkmodules.vtkIOImage import vtkPNGWriter, vtkJPEGWriter from vtkmodules.vtkRenderingAnnotation import vtkCubeAxesActor, vtkAxesActor from vtkmodules.vtkRenderingCore import ( From b3724ab25bc1cd74bed7ee5bc110584f780014b3 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 6 Jan 2026 11:57:12 +0100 Subject: [PATCH 06/18] mypy.ini restored --- mypy.ini | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/mypy.ini b/mypy.ini index 089c0496..9a15ac42 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,4 +1,18 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False \ No newline at end of file +disallow_untyped_decorators = False +explicit_package_bases = True +mypy_path = src + +[mypy-vtkmodules.*,vtk.*] +ignore_missing_imports = True + +[mypy-dataclasses_json.*] +ignore_missing_imports = True + +[mypy-opengeodeweb_microservice.*] +ignore_missing_imports = True + +[mypy-wslink.*] +ignore_missing_imports = True \ No newline at end of file From 5177649034a3ec50c4eaf09a531cd4540c4528b1 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 6 Jan 2026 11:57:56 +0100 Subject: [PATCH 07/18] type ignore restored --- src/opengeodeweb_viewer/vtkw_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengeodeweb_viewer/vtkw_server.py b/src/opengeodeweb_viewer/vtkw_server.py index a12ee580..bfd291c4 100644 --- a/src/opengeodeweb_viewer/vtkw_server.py +++ b/src/opengeodeweb_viewer/vtkw_server.py @@ -6,7 +6,7 @@ # Third party imports from vtkmodules.web import wslink as vtk_wslink from vtkmodules.web import protocols as vtk_protocols -from wslink import server +from wslink import server # type: ignore from vtkmodules.vtkRenderingCore import vtkRenderer, vtkRenderWindow from vtkmodules.vtkCommonCore import vtkFileOutputWindow, vtkOutputWindow from opengeodeweb_microservice.database import connection From 69051faf0e48be95bb0ae045a0b241e195dcb44f Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 6 Jan 2026 10:58:34 +0000 Subject: [PATCH 08/18] Apply prepare changes --- mypy.ini | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/mypy.ini b/mypy.ini index 9a15ac42..089c0496 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,18 +1,4 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False -explicit_package_bases = True -mypy_path = src - -[mypy-vtkmodules.*,vtk.*] -ignore_missing_imports = True - -[mypy-dataclasses_json.*] -ignore_missing_imports = True - -[mypy-opengeodeweb_microservice.*] -ignore_missing_imports = True - -[mypy-wslink.*] -ignore_missing_imports = True \ No newline at end of file +disallow_untyped_decorators = False \ No newline at end of file From e498e02b5ac32ab1a2d2d10cea0ca17c9fae3255 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 6 Jan 2026 14:57:19 +0100 Subject: [PATCH 09/18] vtkw_server typed kinda --- mypy.ini | 3 + .../rpc/generic/generic_protocols.py | 2 +- .../rpc/mesh/cells/cells_protocols.py | 2 +- .../rpc/mesh/edges/mesh_edges_protocols.py | 2 +- .../rpc/mesh/mesh_protocols.py | 8 +-- .../rpc/mesh/points/mesh_points_protocols.py | 2 +- .../rpc/mesh/polygons/polygons_protocols.py | 2 +- .../rpc/mesh/polyhedra/polyhedra_protocols.py | 2 +- .../model/blocks/model_blocks_protocols.py | 2 +- .../model/corners/model_corners_protocols.py | 2 +- .../rpc/model/edges/model_edges_protocols.py | 2 +- .../rpc/model/lines/model_lines_protocols.py | 2 +- .../rpc/model/model_protocols.py | 2 +- .../model/points/model_points_protocols.py | 2 +- .../surfaces/model_surfaces_protocols.py | 2 +- .../rpc/utils_protocols.py | 2 +- .../rpc/viewer/viewer_protocols.py | 2 +- src/opengeodeweb_viewer/utils_functions.py | 2 +- src/opengeodeweb_viewer/vtk_protocol.py | 8 +-- src/opengeodeweb_viewer/vtkw_server.py | 66 +++++++++++-------- tests/py.typed | 0 21 files changed, 64 insertions(+), 53 deletions(-) delete mode 100644 tests/py.typed diff --git a/mypy.ini b/mypy.ini index 9a15ac42..481865a9 100644 --- a/mypy.ini +++ b/mypy.ini @@ -15,4 +15,7 @@ ignore_missing_imports = True ignore_missing_imports = True [mypy-wslink.*] +ignore_missing_imports = True + +[mypy-fastjsonschema.*] ignore_missing_imports = True \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py index f14a9c27..acc06461 100644 --- a/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py +++ b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py @@ -3,7 +3,7 @@ # Third party imports from vtkmodules.web import protocols as vtk_protocols -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py index 9e25c0be..e5a47f10 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py index 1f0f62cf..65e96ab4 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py index 2cdd73c5..64d7ddea 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from vtkmodules.vtkIOXML import vtkXMLGenericDataObjectReader, vtkXMLImageDataReader from vtkmodules.vtkRenderingCore import vtkDataSetMapper, vtkActor, vtkTexture from vtkmodules.vtkCommonDataModel import vtkDataSet, vtkCellTypes @@ -119,7 +119,7 @@ def meshApplyTextures(self, rpc_params: RpcParams) -> None: texture.SetInputConnection(texture_reader.GetOutputPort()) texture.InterpolateOn() reader = self.get_object(mesh_id).reader - output = reader.GetOutput() # type: ignore[attr-defined] + output = reader.GetOutputAsDataSet() point_data = output.GetPointData() for i in range(point_data.GetNumberOfArrays()): array = point_data.GetArray(i) @@ -131,7 +131,7 @@ def meshApplyTextures(self, rpc_params: RpcParams) -> None: def displayAttributeOnVertices(self, data_id: str, name: str) -> None: reader = self.get_object(data_id).reader - points = reader.GetOutput().GetPointData() # type: ignore[attr-defined] + points = reader.GetOutputAsDataSet().GetPointData() points.SetActiveScalars(name) mapper = self.get_object(data_id).mapper mapper.ScalarVisibilityOn() @@ -140,7 +140,7 @@ def displayAttributeOnVertices(self, data_id: str, name: str) -> None: def displayAttributeOnCells(self, data_id: str, name: str) -> None: reader = self.get_object(data_id).reader - cells = reader.GetOutput().GetCellData() # type: ignore[attr-defined] + cells = reader.GetOutputAsDataSet().GetCellData() cells.SetActiveScalars(name) mapper = self.get_object(data_id).mapper mapper.ScalarVisibilityOn() diff --git a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py index 81ed1318..1c79b3fa 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py index 78c5660a..8f240a88 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py index 1d87bfd5..8b3b2c4e 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py b/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py index 692e9ec3..3892a510 100644 --- a/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py b/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py index ef376891..1a10c105 100644 --- a/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py b/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py index 8558d32f..969625ae 100644 --- a/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py b/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py index 60c11925..14660a03 100644 --- a/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index 61c762a1..f2cf1a22 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -8,7 +8,7 @@ ) from vtkmodules.vtkIOXML import vtkXMLMultiBlockDataReader from vtkmodules.vtkFiltersGeometry import vtkGeometryFilter -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py b/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py index 3285c279..3b4f4873 100644 --- a/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py index aaa3a818..ff31f520 100644 --- a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index d06c6b9d..5155c9ba 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -3,7 +3,7 @@ from typing import cast # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc # Local application imports from opengeodeweb_microservice.schemas import get_schemas_dict diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index bdfb6dbf..d6a4fe82 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -3,7 +3,7 @@ import os # Third party imports -from wslink import register as exportRpc # type: ignore +from wslink import register as exportRpc from vtkmodules.vtkIOImage import vtkPNGWriter, vtkJPEGWriter from vtkmodules.vtkRenderingAnnotation import vtkCubeAxesActor, vtkAxesActor from vtkmodules.vtkRenderingCore import ( diff --git a/src/opengeodeweb_viewer/utils_functions.py b/src/opengeodeweb_viewer/utils_functions.py index f2c468de..ef4cb2b1 100644 --- a/src/opengeodeweb_viewer/utils_functions.py +++ b/src/opengeodeweb_viewer/utils_functions.py @@ -1,7 +1,7 @@ # Standard library imports # Third party imports -import fastjsonschema # type: ignore +import fastjsonschema from opengeodeweb_microservice.schemas import SchemaDict diff --git a/src/opengeodeweb_viewer/vtk_protocol.py b/src/opengeodeweb_viewer/vtk_protocol.py index c7df3dba..edb15628 100644 --- a/src/opengeodeweb_viewer/vtk_protocol.py +++ b/src/opengeodeweb_viewer/vtk_protocol.py @@ -28,7 +28,7 @@ @dataclass class vtkData: reader: vtkXMLReader - mapper: vtkMapper | vtkCompositePolyDataMapper + mapper: vtkMapper filter: vtkAlgorithm | None = None actor: vtkActor = field(default_factory=vtkActor) max_dimension: Literal["points", "edges", "polygons", "polyhedra", "default"] = ( @@ -44,15 +44,15 @@ def __init__(self) -> None: # Typed wrappers for untyped parent methods def getView(self, view_id: str) -> vtkRenderWindow: """Typed wrapper for the untyped parent getView method.""" - return cast(vtkRenderWindow, super().getView(view_id)) # type: ignore[no-untyped-call] + return cast(vtkRenderWindow, cast(Any, super()).getView(view_id)) def registerVtkWebProtocol(self, protocol: vtk_protocols.vtkWebProtocol) -> None: """Typed wrapper for the untyped parent registerVtkWebProtocol method.""" - super().registerVtkWebProtocol(protocol) + cast(Any, super()).registerVtkWebProtocol(protocol) def getApplication(self) -> Any: """Typed wrapper for the untyped parent getApplication method.""" - return super().getApplication() # type: ignore[no-untyped-call] + return cast(Any, super()).getApplication() def get_data_base(self) -> Any: return self.getSharedObject("db") diff --git a/src/opengeodeweb_viewer/vtkw_server.py b/src/opengeodeweb_viewer/vtkw_server.py index bfd291c4..389864cb 100644 --- a/src/opengeodeweb_viewer/vtkw_server.py +++ b/src/opengeodeweb_viewer/vtkw_server.py @@ -1,12 +1,12 @@ # Standard library imports import argparse import os -from typing import Any, cast +from typing import Any, cast, Protocol, runtime_checkable # Third party imports from vtkmodules.web import wslink as vtk_wslink from vtkmodules.web import protocols as vtk_protocols -from wslink import server # type: ignore +from wslink import server from vtkmodules.vtkRenderingCore import vtkRenderer, vtkRenderWindow from vtkmodules.vtkCommonCore import vtkFileOutputWindow, vtkOutputWindow from opengeodeweb_microservice.database import connection @@ -44,6 +44,12 @@ from .rpc.utils_protocols import VtkUtilsView +@runtime_checkable +class VtkApplication(Protocol): + def SetImageEncoding(self, encoding: int) -> None: ... + def GetObjectIdMap(self) -> Any: ... + + # ============================================================================= # Server class # ============================================================================= @@ -68,13 +74,19 @@ def configure(args: argparse.Namespace) -> None: # Standard args _Server.authKey = args.authKey + def registerVtkWebProtocol(self, protocol: Any) -> None: + cast(Any, super()).registerVtkWebProtocol(protocol) + + def getApplication(self) -> VtkApplication: + return cast(VtkApplication, cast(Any, super()).getApplication()) + def initialize(self) -> None: # Bring used components - cast(Any, self).registerVtkWebProtocol(vtk_protocols.vtkWebMouseHandler()) - cast(Any, self).registerVtkWebProtocol(vtk_protocols.vtkWebViewPort()) - publisher = vtk_protocols.vtkWebPublishImageDelivery(decode=False) # type: ignore[no-untyped-call] + self.registerVtkWebProtocol(vtk_protocols.vtkWebMouseHandler()) + self.registerVtkWebProtocol(vtk_protocols.vtkWebViewPort()) + publisher = cast(Any, vtk_protocols).vtkWebPublishImageDelivery(decode=False) publisher.deltaStaleTimeBeforeRender = 0.1 - cast(Any, self).registerVtkWebProtocol(publisher) + self.registerVtkWebProtocol(publisher) self.setSharedObject("db", dict()) self.setSharedObject("publisher", publisher) @@ -82,29 +94,27 @@ def initialize(self) -> None: mesh_protocols = VtkMeshView() model_protocols = VtkModelView() vtk_view = VtkView() - cast(Any, self).registerVtkWebProtocol(vtk_view) - cast(Any, self).registerVtkWebProtocol(VtkUtilsView()) - cast(Any, self).registerVtkWebProtocol(VtkViewerView()) - cast(Any, self).registerVtkWebProtocol(mesh_protocols) - cast(Any, self).registerVtkWebProtocol(VtkMeshPointsView()) - cast(Any, self).registerVtkWebProtocol(VtkMeshEdgesView()) - cast(Any, self).registerVtkWebProtocol(VtkMeshCellsView()) - cast(Any, self).registerVtkWebProtocol(VtkMeshPolygonsView()) - cast(Any, self).registerVtkWebProtocol(VtkMeshPolyhedraView()) - cast(Any, self).registerVtkWebProtocol(model_protocols) - cast(Any, self).registerVtkWebProtocol(VtkModelEdgesView()) - cast(Any, self).registerVtkWebProtocol(VtkModelPointsView()) - cast(Any, self).registerVtkWebProtocol(VtkModelCornersView()) - cast(Any, self).registerVtkWebProtocol(VtkModelLinesView()) - cast(Any, self).registerVtkWebProtocol(VtkModelSurfacesView()) - cast(Any, self).registerVtkWebProtocol(VtkModelBlocksView()) - cast(Any, self).registerVtkWebProtocol( - VtkGenericView(mesh_protocols, model_protocols) - ) + self.registerVtkWebProtocol(vtk_view) + self.registerVtkWebProtocol(VtkUtilsView()) + self.registerVtkWebProtocol(VtkViewerView()) + self.registerVtkWebProtocol(mesh_protocols) + self.registerVtkWebProtocol(VtkMeshPointsView()) + self.registerVtkWebProtocol(VtkMeshEdgesView()) + self.registerVtkWebProtocol(VtkMeshCellsView()) + self.registerVtkWebProtocol(VtkMeshPolygonsView()) + self.registerVtkWebProtocol(VtkMeshPolyhedraView()) + self.registerVtkWebProtocol(model_protocols) + self.registerVtkWebProtocol(VtkModelEdgesView()) + self.registerVtkWebProtocol(VtkModelPointsView()) + self.registerVtkWebProtocol(VtkModelCornersView()) + self.registerVtkWebProtocol(VtkModelLinesView()) + self.registerVtkWebProtocol(VtkModelSurfacesView()) + self.registerVtkWebProtocol(VtkModelBlocksView()) + self.registerVtkWebProtocol(VtkGenericView(mesh_protocols, model_protocols)) # tell the C++ web app to use no encoding. # ParaViewWebPublishImageDelivery must be set to decode=False to match. - cast(Any, self).getApplication().SetImageEncoding(0) + self.getApplication().SetImageEncoding(0) # Update authentication key to use self.updateSecret(_Server.authKey) @@ -119,9 +129,7 @@ def initialize(self) -> None: renderWindow = vtkRenderWindow() renderWindow.AddRenderer(renderer) self.setSharedObject("renderer", renderer) - cast(Any, self).getApplication().GetObjectIdMap().SetActiveObject( - "VIEW", renderWindow - ) + self.getApplication().GetObjectIdMap().SetActiveObject("VIEW", renderWindow) renderWindow.SetOffScreenRendering(not _Server.debug) diff --git a/tests/py.typed b/tests/py.typed deleted file mode 100644 index e69de29b..00000000 From 98e77f17ca28c38aff1aaac8c5ce61ed432991e2 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Tue, 6 Jan 2026 13:58:15 +0000 Subject: [PATCH 10/18] Apply prepare changes --- mypy.ini | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/mypy.ini b/mypy.ini index 481865a9..089c0496 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,21 +1,4 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False -explicit_package_bases = True -mypy_path = src - -[mypy-vtkmodules.*,vtk.*] -ignore_missing_imports = True - -[mypy-dataclasses_json.*] -ignore_missing_imports = True - -[mypy-opengeodeweb_microservice.*] -ignore_missing_imports = True - -[mypy-wslink.*] -ignore_missing_imports = True - -[mypy-fastjsonschema.*] -ignore_missing_imports = True \ No newline at end of file +disallow_untyped_decorators = False \ No newline at end of file From 57178c420f3d06db4316c66a023921d69525bd6c Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Tue, 6 Jan 2026 15:58:43 +0100 Subject: [PATCH 11/18] commit --- .../object/object_methods.py | 28 +++++++++++-------- .../rpc/viewer/viewer_protocols.py | 8 ++++-- test_mypy_vtk.py | 11 ++++++++ 3 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 test_mypy_vtk.py diff --git a/src/opengeodeweb_viewer/object/object_methods.py b/src/opengeodeweb_viewer/object/object_methods.py index 2d0febcd..dcc77688 100644 --- a/src/opengeodeweb_viewer/object/object_methods.py +++ b/src/opengeodeweb_viewer/object/object_methods.py @@ -10,7 +10,7 @@ vtkTexture, vtkCompositePolyDataMapper, ) -from vtkmodules.vtkCommonDataModel import vtkDataObject +from vtkmodules.vtkCommonDataModel import vtkDataObject, vtkDataSet # Local application imports from opengeodeweb_viewer.vtk_protocol import VtkView, vtkData @@ -37,8 +37,10 @@ def registerObject( renderWindow = self.getView("-1") renderer = renderWindow.GetRenderers().GetFirstRenderer() resetCamara = True - for registered_actor in renderer.GetActors(): # type: ignore[attr-defined] - if registered_actor.visibility == True: + actors = renderer.GetActors() + actors.InitTraversal() + while actor := actors.GetNextItem(): + if actor.visibility == True: resetCamara = False renderer.AddActor(data.actor) if resetCamara: @@ -109,22 +111,26 @@ def SetBlocksVisibility( self, data_id: str, block_ids: list[int], visibility: bool ) -> None: mapper = self.get_object(data_id).mapper - if isinstance(mapper, vtkCompositePolyDataMapper): - for block_id in block_ids: - mapper.SetBlockVisibility(block_id, visibility) + if not isinstance(mapper, vtkCompositePolyDataMapper): + raise Exception("Mapper is not a vtkCompositePolyDataMapper") + for block_id in block_ids: + mapper.SetBlockVisibility(block_id, visibility) def SetBlocksColor( self, data_id: str, block_ids: list[int], red: int, green: int, blue: int ) -> None: mapper = self.get_object(data_id).mapper - if isinstance(mapper, vtkCompositePolyDataMapper): - for block_id in block_ids: - mapper.SetBlockColor(block_id, [red / 255, green / 255, blue / 255]) + if not isinstance(mapper, vtkCompositePolyDataMapper): + raise Exception("Mapper is not a vtkCompositePolyDataMapper") + for block_id in block_ids: + mapper.SetBlockColor(block_id, [red / 255, green / 255, blue / 255]) def clearColors(self, data_id: str) -> None: db = self.get_object(data_id) mapper = db.mapper reader = db.reader - reader.GetOutput().GetPointData().SetActiveScalars("") # type: ignore[attr-defined] - reader.GetOutput().GetCellData().SetActiveScalars("") # type: ignore[attr-defined] + output = reader.GetOutputDataObject(0) + if isinstance(output, vtkDataSet): + output.GetPointData().SetActiveScalars("") + output.GetCellData().SetActiveScalars("") mapper.ScalarVisibilityOff() diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index d6a4fe82..22ddc154 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -15,7 +15,7 @@ ) from vtkmodules.vtkInteractionStyle import vtkInteractorStyleTrackball from vtkmodules.vtkCommonCore import reference -from vtkmodules.vtkCommonDataModel import vtkBoundingBox +from vtkmodules.vtkCommonDataModel import vtkBoundingBox, vtkDataSet from vtkmodules.vtkCommonTransforms import vtkTransform from vtkmodules.vtkInteractionWidgets import vtkOrientationMarkerWidget from opengeodeweb_microservice.schemas import get_schemas_dict @@ -172,8 +172,12 @@ def updateData(self, rpc_params: RpcParams) -> None: reader.Update() mapper = data.mapper tag = reference(0) + output = reader.GetOutputDataObject(0) + if not isinstance(output, vtkDataSet): + raise Exception("Output is not a vtkDataSet") + scalars = vtkAbstractMapper.GetAbstractScalars( - reader.GetOutput(), # type: ignore[attr-defined] + output, mapper.GetScalarMode(), mapper.GetArrayAccessMode(), mapper.GetArrayId(), diff --git a/test_mypy_vtk.py b/test_mypy_vtk.py new file mode 100644 index 00000000..4bc9a163 --- /dev/null +++ b/test_mypy_vtk.py @@ -0,0 +1,11 @@ +from vtkmodules.vtkIOXML import vtkXMLReader +from typing import Any + + +def test_reader(reader: vtkXMLReader) -> None: + reader.SetFileName("test.vtp") + reader.Update() + out = reader.GetOutputAsDataSet() + reveal_type(out) + port = reader.GetOutputPort() + print(out, port) From 03ab993017064f021b677206f5ee652f67935d62 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 7 Jan 2026 09:22:48 +0100 Subject: [PATCH 12/18] revert exportRpc type ignore and fixed vtkw_server --- mypy.ini | 25 ++++++++++++++++- .../rpc/generic/generic_protocols.py | 2 +- .../rpc/mesh/cells/cells_protocols.py | 2 +- .../rpc/mesh/edges/mesh_edges_protocols.py | 2 +- .../rpc/mesh/mesh_protocols.py | 2 +- .../rpc/mesh/polygons/polygons_protocols.py | 2 +- .../rpc/mesh/polyhedra/polyhedra_protocols.py | 2 +- .../model/blocks/model_blocks_protocols.py | 2 +- .../model/corners/model_corners_protocols.py | 2 +- .../rpc/model/edges/model_edges_protocols.py | 2 +- .../rpc/model/lines/model_lines_protocols.py | 2 +- .../rpc/model/model_protocols.py | 2 +- .../model/points/model_points_protocols.py | 2 +- .../surfaces/model_surfaces_protocols.py | 2 +- .../rpc/utils_protocols.py | 2 +- .../rpc/viewer/viewer_protocols.py | 7 +++-- src/opengeodeweb_viewer/vtk_protocol.py | 27 +++++++++--------- src/opengeodeweb_viewer/vtkw_server.py | 25 +++++------------ test_mypy_vtk.py | 11 -------- tests/conftest.py | 28 ++++++------------- 20 files changed, 70 insertions(+), 81 deletions(-) delete mode 100644 test_mypy_vtk.py diff --git a/mypy.ini b/mypy.ini index 089c0496..6afc9edc 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,4 +1,27 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False \ No newline at end of file +disallow_untyped_decorators = False +explicit_package_bases = True +mypy_path = src + +[mypy-vtkmodules.*,vtk.*] +ignore_missing_imports = True + +[mypy-dataclasses_json.*] +ignore_missing_imports = True + +[mypy-opengeodeweb_microservice.*] +ignore_missing_imports = True + +[mypy-wslink.*] +ignore_missing_imports = True + +[mypy-fastjsonschema.*] +ignore_missing_imports = True + +[mypy-xprocess.*] +ignore_missing_imports = True + +[mypy-tests.conftest] +disallow_subclassing_any = False \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py index acc06461..f14a9c27 100644 --- a/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py +++ b/src/opengeodeweb_viewer/rpc/generic/generic_protocols.py @@ -3,7 +3,7 @@ # Third party imports from vtkmodules.web import protocols as vtk_protocols -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py index e5a47f10..9e25c0be 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/cells/cells_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py index 65e96ab4..1f0f62cf 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/edges/mesh_edges_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py index 64d7ddea..0b54166f 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from vtkmodules.vtkIOXML import vtkXMLGenericDataObjectReader, vtkXMLImageDataReader from vtkmodules.vtkRenderingCore import vtkDataSetMapper, vtkActor, vtkTexture from vtkmodules.vtkCommonDataModel import vtkDataSet, vtkCellTypes diff --git a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py index 8f240a88..78c5660a 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polygons/polygons_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py index 8b3b2c4e..1d87bfd5 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/polyhedra/polyhedra_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py b/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py index 3892a510..692e9ec3 100644 --- a/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/blocks/model_blocks_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py b/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py index 1a10c105..ef376891 100644 --- a/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/corners/model_corners_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py b/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py index 969625ae..8558d32f 100644 --- a/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/edges/model_edges_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py b/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py index 14660a03..60c11925 100644 --- a/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/lines/model_lines_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/model_protocols.py b/src/opengeodeweb_viewer/rpc/model/model_protocols.py index f2cf1a22..61c762a1 100644 --- a/src/opengeodeweb_viewer/rpc/model/model_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/model_protocols.py @@ -8,7 +8,7 @@ ) from vtkmodules.vtkIOXML import vtkXMLMultiBlockDataReader from vtkmodules.vtkFiltersGeometry import vtkGeometryFilter -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py b/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py index 3b4f4873..3285c279 100644 --- a/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/points/model_points_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py index ff31f520..aaa3a818 100644 --- a/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py +++ b/src/opengeodeweb_viewer/rpc/model/surfaces/model_surfaces_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index 5155c9ba..d06c6b9d 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -3,7 +3,7 @@ from typing import cast # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore # Local application imports from opengeodeweb_microservice.schemas import get_schemas_dict diff --git a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py index 22ddc154..8e98f2a2 100644 --- a/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py +++ b/src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py @@ -1,9 +1,10 @@ # Standard library imports import math import os +from typing import cast, Any # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from vtkmodules.vtkIOImage import vtkPNGWriter, vtkJPEGWriter from vtkmodules.vtkRenderingAnnotation import vtkCubeAxesActor, vtkAxesActor from vtkmodules.vtkRenderingCore import ( @@ -171,7 +172,7 @@ def updateData(self, rpc_params: RpcParams) -> None: reader = data.reader reader.Update() mapper = data.mapper - tag = reference(0) + tag: Any = reference(0) output = reader.GetOutputDataObject(0) if not isinstance(output, vtkDataSet): raise Exception("Output is not a vtkDataSet") @@ -182,7 +183,7 @@ def updateData(self, rpc_params: RpcParams) -> None: mapper.GetArrayAccessMode(), mapper.GetArrayId(), mapper.GetArrayName(), - tag, # type: ignore[arg-type] + tag, ) mapper.SetScalarRange(scalars.GetRange()) diff --git a/src/opengeodeweb_viewer/vtk_protocol.py b/src/opengeodeweb_viewer/vtk_protocol.py index edb15628..fc16e30e 100644 --- a/src/opengeodeweb_viewer/vtk_protocol.py +++ b/src/opengeodeweb_viewer/vtk_protocol.py @@ -9,6 +9,7 @@ from vtkmodules.vtkIOXML import ( vtkXMLReader, ) +from vtkmodules.vtkWebCore import vtkWebApplication from vtkmodules.vtkCommonExecutionModel import vtkAlgorithm from vtkmodules.vtkRenderingCore import ( vtkActor, @@ -36,23 +37,21 @@ class vtkData: ) -class VtkView(vtk_protocols.vtkWebProtocol): - def __init__(self) -> None: - super().__init__() - self.DATA_FOLDER_PATH = os.getenv("DATA_FOLDER_PATH", ".") - - # Typed wrappers for untyped parent methods +class VtkTypingMixin: def getView(self, view_id: str) -> vtkRenderWindow: - """Typed wrapper for the untyped parent getView method.""" - return cast(vtkRenderWindow, cast(Any, super()).getView(view_id)) + return cast(vtkRenderWindow, super().getView(view_id)) # type: ignore + + def registerVtkWebProtocol(self, protocol: Any) -> None: + super().registerVtkWebProtocol(protocol) # type: ignore - def registerVtkWebProtocol(self, protocol: vtk_protocols.vtkWebProtocol) -> None: - """Typed wrapper for the untyped parent registerVtkWebProtocol method.""" - cast(Any, super()).registerVtkWebProtocol(protocol) + def getApplication(self) -> vtkWebApplication: + return cast(vtkWebApplication, super().getApplication()) # type: ignore - def getApplication(self) -> Any: - """Typed wrapper for the untyped parent getApplication method.""" - return cast(Any, super()).getApplication() + +class VtkView(VtkTypingMixin, vtk_protocols.vtkWebProtocol): + def __init__(self) -> None: + super().__init__() + self.DATA_FOLDER_PATH = os.getenv("DATA_FOLDER_PATH", ".") def get_data_base(self) -> Any: return self.getSharedObject("db") diff --git a/src/opengeodeweb_viewer/vtkw_server.py b/src/opengeodeweb_viewer/vtkw_server.py index 389864cb..12d07654 100644 --- a/src/opengeodeweb_viewer/vtkw_server.py +++ b/src/opengeodeweb_viewer/vtkw_server.py @@ -4,16 +4,17 @@ from typing import Any, cast, Protocol, runtime_checkable # Third party imports -from vtkmodules.web import wslink as vtk_wslink +from vtkmodules.web.wslink import ServerProtocol from vtkmodules.web import protocols as vtk_protocols -from wslink import server +from wslink import server # type: ignore +from vtkmodules.vtkWebCore import vtkWebApplication from vtkmodules.vtkRenderingCore import vtkRenderer, vtkRenderWindow from vtkmodules.vtkCommonCore import vtkFileOutputWindow, vtkOutputWindow from opengeodeweb_microservice.database import connection # Local application imports from .config import * -from .vtk_protocol import VtkView +from .vtk_protocol import VtkView, VtkTypingMixin from .rpc.viewer.viewer_protocols import VtkViewerView from .rpc.mesh.mesh_protocols import VtkMeshView from .rpc.mesh.points.mesh_points_protocols import VtkMeshPointsView @@ -44,18 +45,12 @@ from .rpc.utils_protocols import VtkUtilsView -@runtime_checkable -class VtkApplication(Protocol): - def SetImageEncoding(self, encoding: int) -> None: ... - def GetObjectIdMap(self) -> Any: ... - - # ============================================================================= # Server class # ============================================================================= -class _Server(vtk_wslink.ServerProtocol): +class _Server(VtkTypingMixin, ServerProtocol): # Defaults authKey = "wslink-secret" view = None @@ -74,17 +69,11 @@ def configure(args: argparse.Namespace) -> None: # Standard args _Server.authKey = args.authKey - def registerVtkWebProtocol(self, protocol: Any) -> None: - cast(Any, super()).registerVtkWebProtocol(protocol) - - def getApplication(self) -> VtkApplication: - return cast(VtkApplication, cast(Any, super()).getApplication()) - def initialize(self) -> None: # Bring used components self.registerVtkWebProtocol(vtk_protocols.vtkWebMouseHandler()) self.registerVtkWebProtocol(vtk_protocols.vtkWebViewPort()) - publisher = cast(Any, vtk_protocols).vtkWebPublishImageDelivery(decode=False) + publisher = vtk_protocols.vtkWebPublishImageDelivery(decode=False) # type: ignore publisher.deltaStaleTimeBeforeRender = 0.1 self.registerVtkWebProtocol(publisher) self.setSharedObject("db", dict()) @@ -139,7 +128,7 @@ def initialize(self) -> None: # ============================================================================= -def run_server(Server: type[vtk_wslink.ServerProtocol] = _Server) -> None: +def run_server(Server: type[ServerProtocol] = _Server) -> None: PYTHON_ENV = os.environ.get("PYTHON_ENV", default="prod").strip().lower() if PYTHON_ENV == "prod": prod_config() diff --git a/test_mypy_vtk.py b/test_mypy_vtk.py deleted file mode 100644 index 4bc9a163..00000000 --- a/test_mypy_vtk.py +++ /dev/null @@ -1,11 +0,0 @@ -from vtkmodules.vtkIOXML import vtkXMLReader -from typing import Any - - -def test_reader(reader: vtkXMLReader) -> None: - reader.SetFileName("test.vtp") - reader.Update() - out = reader.GetOutputAsDataSet() - reveal_type(out) - port = reader.GetOutputPort() - print(out, port) diff --git a/tests/conftest.py b/tests/conftest.py index b0fde064..65ef66fd 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,7 +2,7 @@ from pathlib import Path from websocket import create_connection, WebSocketTimeoutException import json -from xprocess import ProcessStarter # type: ignore[import-untyped] +from xprocess import ProcessStarter, XProcess from vtkmodules.vtkIOImage import vtkImageReader2, vtkPNGReader, vtkJPEGReader from vtkmodules.vtkImagingCore import vtkImageDifference import os @@ -75,25 +75,13 @@ def _reader_for_file(path: str) -> vtkImageReader2: return vtkPNGReader() if lower.endswith(".jpg") or lower.endswith(".jpeg"): return vtkJPEGReader() - return vtkJPEGReader() + raise ValueError(f"Unsupported image format for file: {path}") def images_diff(self, first_image_path: str, second_image_path: str) -> float: - first_reader: vtkImageReader2 - if ".png" in first_image_path: - first_reader = vtkPNGReader() - elif (".jpg" in first_image_path) or (".jpeg" in first_image_path): - first_reader = vtkJPEGReader() - else: - first_reader = vtkJPEGReader() + first_reader = self._reader_for_file(first_image_path) first_reader.SetFileName(first_image_path) - second_reader: vtkImageReader2 - if ".png" in second_image_path: - second_reader = vtkPNGReader() - elif (".jpg" in second_image_path) or (".jpeg" in second_image_path): - second_reader = vtkJPEGReader() - else: - second_reader = vtkJPEGReader() + second_reader = self._reader_for_file(second_image_path) second_reader.SetFileName(second_image_path) images_diff = vtkImageDifference() @@ -161,7 +149,7 @@ def __init__(self, root_path: Path) -> None: self.root_path = Path(root_path) def get_xprocess_args(self) -> tuple[str, type, type]: - class Starter(ProcessStarter): # type: ignore[misc] + class Starter(ProcessStarter): terminate_on_interrupt = True pattern = "wslink: Starting factory" timeout = 10 @@ -179,17 +167,17 @@ class Starter(ProcessStarter): # type: ignore[misc] @pytest.fixture -def server(xprocess: object) -> Generator[ServerMonitor, None, None]: +def server(xprocess: XProcess) -> Generator[ServerMonitor, None, None]: name, Starter, Monitor = HELPER.get_xprocess_args() os.environ["PYTHON_ENV"] = "test" - _, log = cast(Any, xprocess).ensure(name, Starter) + _, log = xprocess.ensure(name, Starter) monitor = Monitor(log) yield monitor try: monitor.ws.close() except Exception: pass - cast(Any, xprocess).getinfo(name).terminate() + xprocess.getinfo(name).terminate() monitor.print_log() From ba2fb1bb19351b4fd00178bb6bb0033af98e8005 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Wed, 7 Jan 2026 08:23:45 +0000 Subject: [PATCH 13/18] Apply prepare changes --- mypy.ini | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/mypy.ini b/mypy.ini index 6afc9edc..089c0496 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,27 +1,4 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False -explicit_package_bases = True -mypy_path = src - -[mypy-vtkmodules.*,vtk.*] -ignore_missing_imports = True - -[mypy-dataclasses_json.*] -ignore_missing_imports = True - -[mypy-opengeodeweb_microservice.*] -ignore_missing_imports = True - -[mypy-wslink.*] -ignore_missing_imports = True - -[mypy-fastjsonschema.*] -ignore_missing_imports = True - -[mypy-xprocess.*] -ignore_missing_imports = True - -[mypy-tests.conftest] -disallow_subclassing_any = False \ No newline at end of file +disallow_untyped_decorators = False \ No newline at end of file From f44b149ec5fc2b9f5608a30bc2562d42557fdeca Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 7 Jan 2026 09:29:34 +0100 Subject: [PATCH 14/18] forgot one exportrpc --- .../rpc/mesh/points/mesh_points_protocols.py | 2 +- tests/conftest.py | 23 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py index 1c79b3fa..81ed1318 100644 --- a/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py +++ b/src/opengeodeweb_viewer/rpc/mesh/points/mesh_points_protocols.py @@ -2,7 +2,7 @@ import os # Third party imports -from wslink import register as exportRpc +from wslink import register as exportRpc # type: ignore from opengeodeweb_microservice.schemas import get_schemas_dict # Local application imports diff --git a/tests/conftest.py b/tests/conftest.py index 65ef66fd..8499306e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -68,20 +68,21 @@ def get_response(self) -> bytes | dict[str, object] | str: except Exception: return str(response) - @staticmethod - def _reader_for_file(path: str) -> vtkImageReader2: - lower = path.lower() - if lower.endswith(".png"): - return vtkPNGReader() - if lower.endswith(".jpg") or lower.endswith(".jpeg"): - return vtkJPEGReader() - raise ValueError(f"Unsupported image format for file: {path}") - def images_diff(self, first_image_path: str, second_image_path: str) -> float: - first_reader = self._reader_for_file(first_image_path) + if ".png" in first_image_path: + first_reader: vtkImageReader2 = vtkPNGReader() + elif (".jpg" in first_image_path) or (".jpeg" in first_image_path): + first_reader = vtkJPEGReader() + else: + raise Exception(f"Unsupported image format for file: {first_image_path}") first_reader.SetFileName(first_image_path) - second_reader = self._reader_for_file(second_image_path) + if ".png" in second_image_path: + second_reader: vtkImageReader2 = vtkPNGReader() + elif (".jpg" in second_image_path) or (".jpeg" in second_image_path): + second_reader = vtkJPEGReader() + else: + raise Exception(f"Unsupported image format for file: {second_image_path}") second_reader.SetFileName(second_image_path) images_diff = vtkImageDifference() From fc10d31dd1ae1bceeb8826cbf675806f7b40d1a2 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 7 Jan 2026 09:48:17 +0100 Subject: [PATCH 15/18] revert conftest --- mypy.ini | 25 ++++++++++++++++++++++++- tests/conftest.py | 9 +++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/mypy.ini b/mypy.ini index 089c0496..6afc9edc 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,4 +1,27 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False \ No newline at end of file +disallow_untyped_decorators = False +explicit_package_bases = True +mypy_path = src + +[mypy-vtkmodules.*,vtk.*] +ignore_missing_imports = True + +[mypy-dataclasses_json.*] +ignore_missing_imports = True + +[mypy-opengeodeweb_microservice.*] +ignore_missing_imports = True + +[mypy-wslink.*] +ignore_missing_imports = True + +[mypy-fastjsonschema.*] +ignore_missing_imports = True + +[mypy-xprocess.*] +ignore_missing_imports = True + +[mypy-tests.conftest] +disallow_subclassing_any = False \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py index 8499306e..b4f13731 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -68,6 +68,15 @@ def get_response(self) -> bytes | dict[str, object] | str: except Exception: return str(response) + @staticmethod + def _reader_for_file(path: str) -> vtkImageReader2: + lower = path.lower() + if lower.endswith(".png"): + return vtkPNGReader() + if lower.endswith(".jpg") or lower.endswith(".jpeg"): + return vtkJPEGReader() + return vtkJPEGReader() + def images_diff(self, first_image_path: str, second_image_path: str) -> float: if ".png" in first_image_path: first_reader: vtkImageReader2 = vtkPNGReader() From 80706bf85acf1dd5f3dec984b63f6a9fdb2fc168 Mon Sep 17 00:00:00 2001 From: MaxNumerique <144453705+MaxNumerique@users.noreply.github.com> Date: Wed, 7 Jan 2026 08:49:04 +0000 Subject: [PATCH 16/18] Apply prepare changes --- mypy.ini | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/mypy.ini b/mypy.ini index 6afc9edc..089c0496 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,27 +1,4 @@ [mypy] strict = True files = src/ -disallow_untyped_decorators = False -explicit_package_bases = True -mypy_path = src - -[mypy-vtkmodules.*,vtk.*] -ignore_missing_imports = True - -[mypy-dataclasses_json.*] -ignore_missing_imports = True - -[mypy-opengeodeweb_microservice.*] -ignore_missing_imports = True - -[mypy-wslink.*] -ignore_missing_imports = True - -[mypy-fastjsonschema.*] -ignore_missing_imports = True - -[mypy-xprocess.*] -ignore_missing_imports = True - -[mypy-tests.conftest] -disallow_subclassing_any = False \ No newline at end of file +disallow_untyped_decorators = False \ No newline at end of file From b119616e3d2be1629c26d67b7cc7b4b6c33abe03 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 7 Jan 2026 10:07:21 +0100 Subject: [PATCH 17/18] fix(lint): fix some types From ae944df89a7d07f25c3be689d495dc90a7f4d366 Mon Sep 17 00:00:00 2001 From: MaxNumerique Date: Wed, 7 Jan 2026 10:09:19 +0100 Subject: [PATCH 18/18] type ignore fastjsonschema --- src/opengeodeweb_viewer/utils_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengeodeweb_viewer/utils_functions.py b/src/opengeodeweb_viewer/utils_functions.py index ef4cb2b1..f2c468de 100644 --- a/src/opengeodeweb_viewer/utils_functions.py +++ b/src/opengeodeweb_viewer/utils_functions.py @@ -1,7 +1,7 @@ # Standard library imports # Third party imports -import fastjsonschema +import fastjsonschema # type: ignore from opengeodeweb_microservice.schemas import SchemaDict