diff --git a/pyproject.toml b/pyproject.toml index 884a32ef..9957a3b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -134,7 +134,6 @@ ignore = [ "D203", # incompatible with D204 "D213", # incompatible with D212 "D400", # A stricter version of #415 that doesn't allow ! - "ANN204", # Requrite type hints for "ANN401", # Disalows Any, Any is needed at times, Once MyPy is running Any will be # handled appropriately ] diff --git a/src/openflexure_microscope_server/background_detect.py b/src/openflexure_microscope_server/background_detect.py index d9e39e15..d9e44cfc 100644 --- a/src/openflexure_microscope_server/background_detect.py +++ b/src/openflexure_microscope_server/background_detect.py @@ -55,7 +55,7 @@ class BackgroundDetectAlgorithm: settings_data_model: BaseModel = BaseModel """The data model of algorithm settings. This must be set by child classes""" - def __init__(self): + def __init__(self) -> None: """Initialise the algorithm settings.""" try: self._settings: BaseModel = self.settings_data_model() diff --git a/src/openflexure_microscope_server/logging.py b/src/openflexure_microscope_server/logging.py index b1b5074b..0dd3ee12 100644 --- a/src/openflexure_microscope_server/logging.py +++ b/src/openflexure_microscope_server/logging.py @@ -120,7 +120,7 @@ class OFMLogFileFormatter(logging.Formatter): class OFMHandler(logging.Handler): """A logging.Handler that stores the most recent logs for access by the server.""" - def __init__(self, level: int = logging.INFO, max_logs: int = 250): + def __init__(self, level: int = logging.INFO, max_logs: int = 250) -> None: """Initialise the handler with a set logging level and message buffer size. :param level: The level of logs captured. As standard logs of INFO and above diff --git a/src/openflexure_microscope_server/scan_directories.py b/src/openflexure_microscope_server/scan_directories.py index f34c0836..8256f414 100644 --- a/src/openflexure_microscope_server/scan_directories.py +++ b/src/openflexure_microscope_server/scan_directories.py @@ -167,7 +167,7 @@ class ScanDirectoryManager: _base_scan_dir: str - def __init__(self, base_scan_dir: str): + def __init__(self, base_scan_dir: str) -> None: """Initialise the scan directory manager. :param base_scan_dir: Path of the directory that holds all scans. @@ -374,7 +374,7 @@ class ScanDirectory: _name: str _base_scan_dir: str - def __init__(self, name: str, base_scan_dir: str): + def __init__(self, name: str, base_scan_dir: str) -> None: """Initialise the scan directory. :param name: the name of the scan (the scan directory basename). diff --git a/src/openflexure_microscope_server/scan_planners.py b/src/openflexure_microscope_server/scan_planners.py index 67efbf65..7682443c 100644 --- a/src/openflexure_microscope_server/scan_planners.py +++ b/src/openflexure_microscope_server/scan_planners.py @@ -80,7 +80,7 @@ class ScanPlanner: def __init__( self, initial_position: XYPos, planner_settings: Optional[dict] = None - ): + ) -> None: """Set up lists for the path planning, and scan history.""" self._initial_position = enforce_xy_tuple(initial_position) self._parse(planner_settings) diff --git a/src/openflexure_microscope_server/stitching.py b/src/openflexure_microscope_server/stitching.py index f8754425..c81bd34d 100644 --- a/src/openflexure_microscope_server/stitching.py +++ b/src/openflexure_microscope_server/stitching.py @@ -59,7 +59,9 @@ class BaseStitcher: complete. """ - def __init__(self, images_dir: str, *, overlap: float, correlation_resize: float): + def __init__( + self, images_dir: str, *, overlap: float, correlation_resize: float + ) -> None: """Initialise a stitcher. All args except images_dir are positional only. @@ -128,7 +130,9 @@ class PreviewStitcher(BaseStitcher): one preview must finish before another can be started. """ - def __init__(self, images_dir: str, *, overlap: float, correlation_resize: float): + def __init__( + self, images_dir: str, *, overlap: float, correlation_resize: float + ) -> None: """Initialise a preview stitcher. All args except images_dir are positional only. @@ -192,7 +196,7 @@ class FinalStitcher(BaseStitcher): correlation_resize: Optional[float] = None, stitch_tiff: bool = False, scan_data_dict: Optional[dict[str, Any]] = None, - ): + ) -> None: """Initialise a final stitcher, this has more args than the base class. All args except images_dir are positional only. diff --git a/src/openflexure_microscope_server/things/autofocus.py b/src/openflexure_microscope_server/things/autofocus.py index ca1adfcd..e0b956f1 100644 --- a/src/openflexure_microscope_server/things/autofocus.py +++ b/src/openflexure_microscope_server/things/autofocus.py @@ -215,7 +215,9 @@ class JPEGSharpnessMonitor: SharpnessMonitorDep as an argument is called. """ - def __init__(self, stage: Stage, camera: RawCamera, portal: lt.deps.BlockingPortal): + def __init__( + self, stage: Stage, camera: RawCamera, portal: lt.deps.BlockingPortal + ) -> None: """Initialise a new JPEGSharpnessMonitor. The args are injected automatically. :param stage: A direct_thing_client dependency for the the microscope stage. diff --git a/src/openflexure_microscope_server/things/camera/__init__.py b/src/openflexure_microscope_server/things/camera/__init__.py index e5e171e0..ace9d74c 100644 --- a/src/openflexure_microscope_server/things/camera/__init__.py +++ b/src/openflexure_microscope_server/things/camera/__init__.py @@ -69,7 +69,7 @@ class CameraMemoryBuffer: _storage: dict[int, tuple[Any, Optional[dict]]] - def __init__(self): + def __init__(self) -> None: """Create the buffer instance.""" # This dictionary is the main store for data. Dictionaries are ordered since # Python 3.6, so the order in the dictionary is the capture order @@ -170,7 +170,7 @@ class BaseCamera(lt.Thing): lores_mjpeg_stream = lt.outputs.MJPEGStreamDescriptor() _memory_buffer = CameraMemoryBuffer() - def __init__(self): + def __init__(self) -> None: """Initialise the base camera, this creates the background detectors. This must be run by all child camera classes. diff --git a/src/openflexure_microscope_server/things/camera/opencv.py b/src/openflexure_microscope_server/things/camera/opencv.py index 763096e5..c159ce41 100644 --- a/src/openflexure_microscope_server/things/camera/opencv.py +++ b/src/openflexure_microscope_server/things/camera/opencv.py @@ -25,7 +25,7 @@ from . import BaseCamera class OpenCVCamera(BaseCamera): """A Thing that provides and interface to an OpenCV Camera.""" - def __init__(self, camera_index: int = 0): + def __init__(self, camera_index: int = 0) -> None: """Iniatilise the thing storing the index of the camera to use. :param camera_index: The index of the camera to use for the microscope. @@ -35,7 +35,7 @@ class OpenCVCamera(BaseCamera): self._capture_thread: Optional[Thread] = None self._capture_enabled = False - def __enter__(self): + def __enter__(self) -> None: """Start the capture thread when the Thing context manager is opened.""" self.cap = cv2.VideoCapture(self.camera_index) self._capture_enabled = True @@ -48,7 +48,7 @@ class OpenCVCamera(BaseCamera): _exc_type: type[BaseException], _exc_value: Optional[BaseException], _traceback: Optional[TracebackType], - ): + ) -> None: """Release the camera when the Thing context manager is closed. Before releasing the camera the capture thread is closed. diff --git a/src/openflexure_microscope_server/things/camera/picamera.py b/src/openflexure_microscope_server/things/camera/picamera.py index 4ff2844d..e8ab2e2f 100644 --- a/src/openflexure_microscope_server/things/camera/picamera.py +++ b/src/openflexure_microscope_server/things/camera/picamera.py @@ -53,7 +53,9 @@ class MissingCalibrationError(RuntimeError): class PicameraStreamOutput(Output): """An Output class that sends frames to a stream.""" - def __init__(self, stream: lt.outputs.MJPEGStream, portal: lt.deps.BlockingPortal): + def __init__( + self, stream: lt.outputs.MJPEGStream, portal: lt.deps.BlockingPortal + ) -> None: """Create an output that puts frames in an MJPEGStream. We need to pass the stream object, and also the blocking portal, because @@ -126,7 +128,7 @@ class StreamingPiCamera2(BaseCamera): generalisation. """ - def __init__(self, camera_num: int = 0): + def __init__(self, camera_num: int = 0) -> None: """Initialise the camera with the given camera number. This makes no connection to the camera (except to get the default tuning file). @@ -384,7 +386,7 @@ class StreamingPiCamera2(BaseCamera): ) self._picamera_lock = RLock() - def __enter__(self): + def __enter__(self) -> None: """Start streaming when the Thing context manager is opened. This opens the picamera connection, initialises the camera, sets the @@ -430,7 +432,7 @@ class StreamingPiCamera2(BaseCamera): _exc_type: type[BaseException], _exc_value: Optional[BaseException], _traceback: Optional[TracebackType], - ): + ) -> None: """Close the picamera connection when the Thing context manager is closed.""" self.stop_streaming() with self._streaming_picamera() as cam: diff --git a/src/openflexure_microscope_server/things/camera/simulation.py b/src/openflexure_microscope_server/things/camera/simulation.py index 2882a216..80dadb55 100644 --- a/src/openflexure_microscope_server/things/camera/simulation.py +++ b/src/openflexure_microscope_server/things/camera/simulation.py @@ -54,7 +54,7 @@ class SimulatedCamera(BaseCamera): glyph_shape: tuple[int, int, int] = (91, 91, 3), canvas_shape: tuple[int, int, int] = (3000, 4000, 3), frame_interval: float = 0.1, - ): + ) -> None: """Initialise the simulated with settings for how images are generated. :param shape: The shape (size) of the generated image. @@ -208,7 +208,7 @@ class SimulatedCamera(BaseCamera): pos = {"x": 0, "y": 0, "z": 0} return self.generate_image((pos["y"], pos["x"], pos["z"])) - def __enter__(self): + def __enter__(self) -> None: """Start the capture thread when the Thing context manager is opened.""" self.start_streaming() return self @@ -218,7 +218,7 @@ class SimulatedCamera(BaseCamera): _exc_type: type[BaseException], _exc_value: Optional[BaseException], _traceback: Optional[TracebackType], - ): + ) -> None: """Close the capture thread when the Thing context manager is closed.""" if self.stream_active: self._capture_enabled = False diff --git a/src/openflexure_microscope_server/things/camera_stage_mapping.py b/src/openflexure_microscope_server/things/camera_stage_mapping.py index d9281e22..a05a3385 100644 --- a/src/openflexure_microscope_server/things/camera_stage_mapping.py +++ b/src/openflexure_microscope_server/things/camera_stage_mapping.py @@ -62,7 +62,7 @@ class RecordedMove: for calibrating the stage as it allows measuring how long moves take. """ - def __init__(self, stage: Stage): + def __init__(self, stage: Stage) -> None: """Set the stage client used for for movement. :param stage: the stage client to be used. ``stage.move_to_xyz_position`` will @@ -72,7 +72,7 @@ class RecordedMove: self._current_position: Optional[CoordinateType] = None self._history: List[Tuple[float, Optional[CoordinateType]]] = [] - def __call__(self, new_position: CoordinateType): + def __call__(self, new_position: CoordinateType) -> None: """Move to a new position, and record it.""" self._history.append((time.time(), self._current_position)) self._stage.move_to_xyz_position(xyz_pos=new_position) @@ -99,7 +99,7 @@ class CSMUncalibratedError(HTTPException): live preview to move, or when performing a scan. """ - def __init__(self): + def __init__(self) -> None: """Customise the default error code and message of HTTPException.""" HTTPException.__init__( self, diff --git a/src/openflexure_microscope_server/things/smart_scan.py b/src/openflexure_microscope_server/things/smart_scan.py index 3e0badba..ae723880 100644 --- a/src/openflexure_microscope_server/things/smart_scan.py +++ b/src/openflexure_microscope_server/things/smart_scan.py @@ -85,7 +85,7 @@ class SmartScanThing(lt.Thing): past scans. """ - def __init__(self, scans_folder: str): + def __init__(self, scans_folder: str) -> None: """Initialise a SmartScanThing saving to and loading from the input directory. :param scans_folder: This is the path to the directory where all scans will be diff --git a/src/openflexure_microscope_server/things/stage/__init__.py b/src/openflexure_microscope_server/things/stage/__init__.py index f6a49590..4bbcacaf 100644 --- a/src/openflexure_microscope_server/things/stage/__init__.py +++ b/src/openflexure_microscope_server/things/stage/__init__.py @@ -45,7 +45,7 @@ class BaseStage(lt.Thing): _axis_names = ("x", "y", "z") - def __init__(self): + def __init__(self) -> None: """Initialise the stage. :raises RedefinedBaseMovementError: if ``move_relative`` and/or diff --git a/src/openflexure_microscope_server/things/stage/dummy.py b/src/openflexure_microscope_server/things/stage/dummy.py index b238c1c2..6758b37a 100644 --- a/src/openflexure_microscope_server/things/stage/dummy.py +++ b/src/openflexure_microscope_server/things/stage/dummy.py @@ -19,7 +19,7 @@ class DummyStage(BaseStage): hardware attached. """ - def __init__(self, step_time: float = 0.001, **kwargs: Any): + def __init__(self, step_time: float = 0.001, **kwargs: Any) -> None: """Initialise the Dummy stage, setting the step_time to adjust the speed. :param step_time: The time in seconds per "motor" step. The default of 0.001 @@ -31,7 +31,7 @@ class DummyStage(BaseStage): self.step_time = step_time self.instantaneous_position = self._hardware_position - def __enter__(self): + def __enter__(self) -> None: """Register the stage position when the Thing context manager is opened.""" self.instantaneous_position = self._hardware_position @@ -40,7 +40,7 @@ class DummyStage(BaseStage): _exc_type: type[BaseException], _exc_value: Optional[BaseException], _traceback: Optional[TracebackType], - ): + ) -> None: """Nothing to do when the Thing context manager is closed.""" axis_inverted = lt.ThingSetting( diff --git a/src/openflexure_microscope_server/things/stage/sangaboard.py b/src/openflexure_microscope_server/things/stage/sangaboard.py index 05fb55a9..932fa373 100644 --- a/src/openflexure_microscope_server/things/stage/sangaboard.py +++ b/src/openflexure_microscope_server/things/stage/sangaboard.py @@ -25,7 +25,7 @@ class SangaboardThing(BaseStage): functionality is accessed by directly querying the serial interface. """ - def __init__(self, port: str = None, **kwargs: Any): + def __init__(self, port: str = None, **kwargs: Any) -> None: """Initialise SangaboardThing. Initialise the "Thing", but do not initialise an underlying @@ -42,7 +42,7 @@ class SangaboardThing(BaseStage): self.sangaboard_kwargs["port"] = port super().__init__(**kwargs) - def __enter__(self): + def __enter__(self) -> None: """Connect to the sangaboard when the Thing context manager is opened.""" self._sangaboard = sangaboard.Sangaboard(**self.sangaboard_kwargs) self._sangaboard_lock = threading.RLock() @@ -59,7 +59,7 @@ class SangaboardThing(BaseStage): _exc_type: type[BaseException], _exc_value: Optional[BaseException], _traceback: Optional[TracebackType], - ): + ) -> None: """Close the sangaboard connection when the Thing context manager is closed.""" with self.sangaboard() as sb: sb.close() diff --git a/src/openflexure_microscope_server/utilities.py b/src/openflexure_microscope_server/utilities.py index 87503aaa..d9debd1e 100644 --- a/src/openflexure_microscope_server/utilities.py +++ b/src/openflexure_microscope_server/utilities.py @@ -78,7 +78,7 @@ class ErrorCapturingThread(Thread): kwargs: Optional[dict[str, Any]] = None, *, daemon: Optional[bool] = None, - ): + ) -> None: """Initialise with the same arguments as Thread.""" # As all inputs are keywords we need to set the default values for args and kwargs: if args is None: