From e4dbe2a6297aefc9a2f705d94fa6c948bb76bb0f Mon Sep 17 00:00:00 2001 From: LilithCole Date: Wed, 21 May 2025 15:26:47 +0100 Subject: [PATCH 1/5] pyright fixes for genie_advanced --- src/genie_python/genie_advanced.py | 15 ++++++---- .../genie_pre_post_cmd_manager.py | 30 ++++++++++--------- src/genie_python/genie_simulate_impl.py | 11 +++++-- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/genie_python/genie_advanced.py b/src/genie_python/genie_advanced.py index b90cbb63..f2765f6d 100644 --- a/src/genie_python/genie_advanced.py +++ b/src/genie_python/genie_advanced.py @@ -5,10 +5,11 @@ """ import contextlib -from datetime import datetime, timedelta +from datetime import UTC, datetime, timedelta from time import sleep from typing import Any, Callable, Iterator, TypedDict +import numpy as np import numpy.typing as npt from genie_python.genie_api_setup import ( @@ -52,7 +53,7 @@ def assert_in_manager_mode() -> None: @contextlib.contextmanager -def motor_in_set_mode(pv_name: str) -> Iterator: +def motor_in_set_mode(pv_name: str) -> Iterator[None]: """ Uses a context to place motor into set mode and ensure that it leaves set mode after context has ended. If it can not set the mode correctly @@ -134,7 +135,7 @@ def get_pv_from_block(block: str) -> str: @usercommand @helparglist("pv str") @log_command_and_handle_exception -def pv_exists(pv: str, is_local: bool = False) -> None: +def pv_exists(pv: str, is_local: bool = False) -> bool: """ Check if PV exists. @@ -159,13 +160,13 @@ def wait_for_pv( value: The value to wait for maxwait (int, optional): The maximum time to wait for in seconds """ - start_time = datetime.utcnow() + start_time = datetime.now(UTC) while True: curr_value = __api.get_pv_value(pv) if curr_value == value: break if maxwait is not None: - if timedelta(seconds=maxwait) < datetime.utcnow() - start_time: + if timedelta(seconds=maxwait) < datetime.now(UTC) - start_time: break sleep(DELAY_IN_WAIT_FOR_SLEEP_LOOP) check_break(2) @@ -400,7 +401,9 @@ def get_exp_data( @usercommand @helparglist("") @log_command_and_handle_exception -def get_spectrum_data(with_spec_zero: bool = True, with_time_bin_zero: bool = False) -> npt.NDArray: +def get_spectrum_data( + with_spec_zero: bool = True, with_time_bin_zero: bool = False +) -> npt.NDArray[np.float32]: """ Get the event mode spectrum data as ND array. diff --git a/src/genie_python/genie_pre_post_cmd_manager.py b/src/genie_python/genie_pre_post_cmd_manager.py index 8914167a..910fc68f 100644 --- a/src/genie_python/genie_pre_post_cmd_manager.py +++ b/src/genie_python/genie_pre_post_cmd_manager.py @@ -1,21 +1,23 @@ from builtins import object +from typing import Any, Callable class PrePostCmdManager(object): """ - A class to manager the precmd and postcmd commands such as used in begin, end, abort, resume, pause. + A class to manager the precmd and postcmd commands such as used in begin, end, abort, resume, + pause. """ - def __init__(self): - self.begin_precmd = lambda **pars: None - self.begin_postcmd = lambda **pars: None - self.abort_precmd = lambda **pars: None - self.abort_postcmd = lambda **pars: None - self.end_precmd = lambda **pars: None - self.end_postcmd = lambda **pars: None - self.pause_precmd = lambda **pars: None - self.pause_postcmd = lambda **pars: None - self.resume_precmd = lambda **pars: None - self.resume_postcmd = lambda **pars: None - self.cset_precmd = lambda **pars: True - self.cset_postcmd = lambda **pars: None + def __init__(self) -> None: + self.begin_precmd: Callable[[Any], str | None] = lambda **pars: None + self.begin_postcmd: Callable[[Any], str | None] = lambda **pars: None + self.abort_precmd: Callable[[Any], str | None] = lambda **pars: None + self.abort_postcmd: Callable[[Any], str | None] = lambda **pars: None + self.end_precmd: Callable[[Any], str | None] = lambda **pars: None + self.end_postcmd: Callable[[Any], str | None] = lambda **pars: None + self.pause_precmd: Callable[[Any], str | None] = lambda **pars: None + self.pause_postcmd: Callable[[Any], str | None] = lambda **pars: None + self.resume_precmd: Callable[[Any], str | None] = lambda **pars: None + self.resume_postcmd: Callable[[Any], str | None] = lambda **pars: None + self.cset_precmd: Callable[[Any], str | bool | None] = lambda **pars: True + self.cset_postcmd: Callable[[Any], str | None] = lambda **pars: None diff --git a/src/genie_python/genie_simulate_impl.py b/src/genie_python/genie_simulate_impl.py index 4262f984..3b187f75 100644 --- a/src/genie_python/genie_simulate_impl.py +++ b/src/genie_python/genie_simulate_impl.py @@ -1085,12 +1085,16 @@ def __init__( self.sample_pars = {} self.strict_block = strict_block self.logger = GenieLogger(sim_mode=True) + self.exp_data = None def set_instrument( self, pv_prefix: str, globs: dict | None, import_instrument_init: bool ) -> None: self.inst_prefix = pv_prefix + def get_instrument(self) -> str: + return self.inst_prefix + def prefix_pv_name(self, name: str) -> str: """Adds the instrument prefix to the specified PV""" if self.inst_prefix is not None and not name.startswith(self.inst_prefix): @@ -1100,7 +1104,7 @@ def prefix_pv_name(self, name: str) -> str: return name def set_pv_value( - self, name: str, value: str, wait: bool = False, is_local: bool = False + self, name: str, value: "PVValue", wait: bool = False, is_local: bool = False ) -> None: if is_local: name = self.prefix_pv_name(name) @@ -1119,7 +1123,7 @@ def get_pv_value( % (name, to_string, attempts, is_local) ) - def pv_exists(self, name: str) -> bool: + def pv_exists(self, name: str, is_local: bool = False) -> bool: return True def reload_current_config(self) -> None: @@ -1189,6 +1193,9 @@ def get_block_data(self, block: str, fail_fast: bool = False) -> dict(): ans["alarm"] = self.get_alarm_from_block(block) return ans + def get_pv_from_block(self, block_name: str) -> str: + return block_name + def set_multiple_blocks(self, names: list, values: list) -> None: temp = list(zip(names, values)) for name, value in temp: From 398b7129a24fb0bab4c4f20b80f9aac04fcd74e0 Mon Sep 17 00:00:00 2001 From: LilithCole Date: Wed, 21 May 2025 16:32:11 +0100 Subject: [PATCH 2/5] fix pre_post pyright, unfix genie advanced --- .../genie_pre_post_cmd_manager.py | 47 ++++++++++++++----- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/src/genie_python/genie_pre_post_cmd_manager.py b/src/genie_python/genie_pre_post_cmd_manager.py index 910fc68f..1fad5d7d 100644 --- a/src/genie_python/genie_pre_post_cmd_manager.py +++ b/src/genie_python/genie_pre_post_cmd_manager.py @@ -7,17 +7,38 @@ class PrePostCmdManager(object): A class to manager the precmd and postcmd commands such as used in begin, end, abort, resume, pause. """ + def begin_precmd(self, **kwargs: Any) -> str | None: + return - def __init__(self) -> None: - self.begin_precmd: Callable[[Any], str | None] = lambda **pars: None - self.begin_postcmd: Callable[[Any], str | None] = lambda **pars: None - self.abort_precmd: Callable[[Any], str | None] = lambda **pars: None - self.abort_postcmd: Callable[[Any], str | None] = lambda **pars: None - self.end_precmd: Callable[[Any], str | None] = lambda **pars: None - self.end_postcmd: Callable[[Any], str | None] = lambda **pars: None - self.pause_precmd: Callable[[Any], str | None] = lambda **pars: None - self.pause_postcmd: Callable[[Any], str | None] = lambda **pars: None - self.resume_precmd: Callable[[Any], str | None] = lambda **pars: None - self.resume_postcmd: Callable[[Any], str | None] = lambda **pars: None - self.cset_precmd: Callable[[Any], str | bool | None] = lambda **pars: True - self.cset_postcmd: Callable[[Any], str | None] = lambda **pars: None + def begin_postcmd(self, **kwargs: Any) -> str | None: + return + + def abort_precmd(self, **kwargs: Any) -> str | None: + return + + def abort_postcmd(self, **kwargs: Any) -> str | None: + return + + def end_precmd(self, **kwargs: Any) -> str | None: + return + + def end_postcmd(self, **kwargs: Any) -> str | None: + return + + def pause_precmd(self, **kwargs: Any) -> str | None: + return + + def pause_postcmd(self, **kwargs: Any) -> str | None: + return + + def resume_precmd(self, **kwargs: Any) -> str | None: + return + + def resume_postcmd(self, **kwargs: Any) -> str | None: + return + + def cset_precmd(self, **kwargs: Any) -> bool: + return True + + def cset_postcmd(self, **kwargs: Any) -> str | None: + return From 8c7165ce922e772a058c4eb777ae87516f52009c Mon Sep 17 00:00:00 2001 From: LilithCole Date: Thu, 22 May 2025 16:47:59 +0100 Subject: [PATCH 3/5] fix both genie advanced and pre/post pyright and ruff --- src/genie_python/genie_advanced.py | 29 ++++++++++++------- .../genie_pre_post_cmd_manager.py | 3 +- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/genie_python/genie_advanced.py b/src/genie_python/genie_advanced.py index f2765f6d..8eb2ba89 100644 --- a/src/genie_python/genie_advanced.py +++ b/src/genie_python/genie_advanced.py @@ -7,7 +7,7 @@ import contextlib from datetime import UTC, datetime, timedelta from time import sleep -from typing import Any, Callable, Iterator, TypedDict +from typing import Any, Iterator, ParamSpec, Protocol, TypedDict import numpy as np import numpy.typing as npt @@ -21,6 +21,13 @@ from genie_python.genie_waitfor import DELAY_IN_WAIT_FOR_SLEEP_LOOP from genie_python.utilities import check_break +P = ParamSpec("P") + + +class PrePostCmd(Protocol): + def __call__(self, **kwargs: Any) -> str | None: + pass + @usercommand @helparglist("") @@ -174,7 +181,7 @@ def wait_for_pv( @usercommand @helparglist("") -def set_begin_precmd(begin_precmd: Callable[[Any], str | None]) -> None: +def set_begin_precmd(begin_precmd: PrePostCmd) -> None: """ Set the function to call before the begin command. @@ -187,7 +194,7 @@ def set_begin_precmd(begin_precmd: Callable[[Any], str | None]) -> None: @usercommand @helparglist("") -def set_begin_postcmd(begin_postcmd: Callable[[Any], str | None]) -> None: +def set_begin_postcmd(begin_postcmd: PrePostCmd) -> None: """ Set the function to call after the begin command. @@ -199,7 +206,7 @@ def set_begin_postcmd(begin_postcmd: Callable[[Any], str | None]) -> None: @usercommand @helparglist("") -def set_abort_precmd(abort_precmd: Callable[[Any], str | None]) -> None: +def set_abort_precmd(abort_precmd: PrePostCmd) -> None: """ Set the function to call before the abort command. @@ -211,7 +218,7 @@ def set_abort_precmd(abort_precmd: Callable[[Any], str | None]) -> None: @usercommand @helparglist("") -def set_abort_postcmd(abort_postcmd: Callable[[Any], str | None]) -> None: +def set_abort_postcmd(abort_postcmd: PrePostCmd) -> None: """ Set the function to call after the abort command. @@ -223,7 +230,7 @@ def set_abort_postcmd(abort_postcmd: Callable[[Any], str | None]) -> None: @usercommand @helparglist("") -def set_end_precmd(end_precmd: Callable[[Any], str | None]) -> None: +def set_end_precmd(end_precmd: PrePostCmd) -> None: """ Set the function to call before the end command. @@ -235,7 +242,7 @@ def set_end_precmd(end_precmd: Callable[[Any], str | None]) -> None: @usercommand @helparglist("") -def set_end_postcmd(end_postcmd: Callable[[Any], str | None]) -> None: +def set_end_postcmd(end_postcmd: PrePostCmd) -> None: """ Set the function to call after the end command. @@ -247,7 +254,7 @@ def set_end_postcmd(end_postcmd: Callable[[Any], str | None]) -> None: @usercommand @helparglist("") -def set_pause_precmd(pause_precmd: Callable[[Any], str | None]) -> None: +def set_pause_precmd(pause_precmd: PrePostCmd) -> None: """ Set the function to call before the pause command. @@ -259,7 +266,7 @@ def set_pause_precmd(pause_precmd: Callable[[Any], str | None]) -> None: @usercommand @helparglist("") -def set_pause_postcmd(pause_postcmd: Callable[[Any], str | None]) -> None: +def set_pause_postcmd(pause_postcmd: PrePostCmd) -> None: """ Set the function to call after the pause command. @@ -271,7 +278,7 @@ def set_pause_postcmd(pause_postcmd: Callable[[Any], str | None]) -> None: @usercommand @helparglist("") -def set_resume_precmd(resume_precmd: Callable[[Any], str | None]) -> None: +def set_resume_precmd(resume_precmd: PrePostCmd) -> None: """ Set the function to call before the resume command. @@ -283,7 +290,7 @@ def set_resume_precmd(resume_precmd: Callable[[Any], str | None]) -> None: @usercommand @helparglist("") -def set_resume_postcmd(resume_postcmd: Callable[[Any], str | None]) -> None: +def set_resume_postcmd(resume_postcmd: PrePostCmd) -> None: """ Set the function to call after the resume command. diff --git a/src/genie_python/genie_pre_post_cmd_manager.py b/src/genie_python/genie_pre_post_cmd_manager.py index 1fad5d7d..0b7bc52d 100644 --- a/src/genie_python/genie_pre_post_cmd_manager.py +++ b/src/genie_python/genie_pre_post_cmd_manager.py @@ -1,5 +1,5 @@ from builtins import object -from typing import Any, Callable +from typing import Any class PrePostCmdManager(object): @@ -7,6 +7,7 @@ class PrePostCmdManager(object): A class to manager the precmd and postcmd commands such as used in begin, end, abort, resume, pause. """ + def begin_precmd(self, **kwargs: Any) -> str | None: return From 311d321e12d39424e6e1166df38a43be1742a68c Mon Sep 17 00:00:00 2001 From: LilithCole Date: Thu, 22 May 2025 16:55:01 +0100 Subject: [PATCH 4/5] removed unused paranspec, fixed two simulate_impl pyright errors github complained about --- src/genie_python/genie_advanced.py | 4 +--- src/genie_python/genie_simulate_impl.py | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/genie_python/genie_advanced.py b/src/genie_python/genie_advanced.py index 8eb2ba89..856f54f3 100644 --- a/src/genie_python/genie_advanced.py +++ b/src/genie_python/genie_advanced.py @@ -7,7 +7,7 @@ import contextlib from datetime import UTC, datetime, timedelta from time import sleep -from typing import Any, Iterator, ParamSpec, Protocol, TypedDict +from typing import Any, Iterator, Protocol, TypedDict import numpy as np import numpy.typing as npt @@ -21,8 +21,6 @@ from genie_python.genie_waitfor import DELAY_IN_WAIT_FOR_SLEEP_LOOP from genie_python.utilities import check_break -P = ParamSpec("P") - class PrePostCmd(Protocol): def __call__(self, **kwargs: Any) -> str | None: diff --git a/src/genie_python/genie_simulate_impl.py b/src/genie_python/genie_simulate_impl.py index 3b187f75..6ee8bf90 100644 --- a/src/genie_python/genie_simulate_impl.py +++ b/src/genie_python/genie_simulate_impl.py @@ -1092,7 +1092,7 @@ def set_instrument( ) -> None: self.inst_prefix = pv_prefix - def get_instrument(self) -> str: + def get_instrument(self) -> str | None: return self.inst_prefix def prefix_pv_name(self, name: str) -> str: @@ -1196,7 +1196,7 @@ def get_block_data(self, block: str, fail_fast: bool = False) -> dict(): def get_pv_from_block(self, block_name: str) -> str: return block_name - def set_multiple_blocks(self, names: list, values: list) -> None: + def set_multiple_blocks(self, names: list[str], values: list[PVValue]) -> None: temp = list(zip(names, values)) for name, value in temp: if name in self.block_dict: From 42c2a43248962af57c6a7bd1641ad1e46dd2963d Mon Sep 17 00:00:00 2001 From: LilithCole Date: Thu, 22 May 2025 16:57:33 +0100 Subject: [PATCH 5/5] pvvalue fix simulation_impl --- src/genie_python/genie_simulate_impl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/genie_python/genie_simulate_impl.py b/src/genie_python/genie_simulate_impl.py index 6ee8bf90..5f9d8c6c 100644 --- a/src/genie_python/genie_simulate_impl.py +++ b/src/genie_python/genie_simulate_impl.py @@ -1196,7 +1196,7 @@ def get_block_data(self, block: str, fail_fast: bool = False) -> dict(): def get_pv_from_block(self, block_name: str) -> str: return block_name - def set_multiple_blocks(self, names: list[str], values: list[PVValue]) -> None: + def set_multiple_blocks(self, names: list[str], values: list["PVValue"]) -> None: temp = list(zip(names, values)) for name, value in temp: if name in self.block_dict: