Merge branch 'more-checkers' into 'v3'

Enable more lint checkers

See merge request openflexure/openflexure-microscope-server!290
This commit is contained in:
Julian Stirling 2025-06-12 11:56:29 +00:00
commit c43b7cb8b4
11 changed files with 29 additions and 36 deletions

View file

@ -102,22 +102,21 @@ select = [
# "PL", # Pylint (a subset of, catches far less than pylint does) # "PL", # Pylint (a subset of, catches far less than pylint does)
# "B", # Flake8 bugbear # "B", # Flake8 bugbear
"A", # Flake8 builtins checker "A", # Flake8 builtins checker
# "C", # Flake8 comprehensions "C", # Flake8 comprehensions
# "FIX", #TODO/FIXME's in code. These should be added during develoment for ongoing tasks. # "FIX", #TODO/FIXME's in code. These should be added during develoment for ongoing tasks.
# If they are not fixed before merge they should be converted to GitLab issues # If they are not fixed before merge they should be converted to GitLab issues
# "LOG", # Flake8 logging issues (pedantic logger formatting issues can be added with "G") # "LOG", # Flake8 logging issues (pedantic logger formatting issues can be added with "G")
# "T20", # Warns for print statments, production code should log # "T20", # Warns for print statments, production code should log
# "PT", # pytest linting # "PT", # pytest linting
# "RET", # Consistent clear return statments "RET", # Consistent clear return statements
"RSE", # Raise parentheses "RSE", # Raise parentheses
# "SIM", # Simplifications detected # "SIM", # Simplifications detected
# "ARG", # unused arguments "ARG", # unused arguments
# "C90", # McCabe complexity! "C90", # McCabe complexity!
"NPY", # Numpy linting "NPY", # Numpy linting
"N", # PEP8 naming "N", # PEP8 naming
# "DOC", # Enforce argument, return, and raise to be mentioned in docstrings there is # "D", # Docstring checks these may need to be added gradually
# also "D" but this even warns about docstring punctuation. Perhaps a step too "ERA001", # Commented out code!
# far?
] ]
ignore = [ ignore = [

View file

@ -24,16 +24,15 @@ select = [
"LOG", # Flake8 logging issues (pedantic logger formatting issues can be added with "G") "LOG", # Flake8 logging issues (pedantic logger formatting issues can be added with "G")
"T20", # Warns for print statments, production code should log "T20", # Warns for print statments, production code should log
"PT", # pytest linting "PT", # pytest linting
"RET", # Consistent clear return statments "RET", # Consistent clear return statements
"RSE", # Raise parentheses "RSE", # Raise parentheses
"SIM", # Simplifications detected "SIM", # Simplifications detected
"ARG", # unused arguments "ARG", # unused arguments
"C90", # McCabe complexity! "C90", # McCabe complexity!
"NPY", # Numpy linting "NPY", # Numpy linting
"N", # PEP8 naming "N", # PEP8 naming
"DOC", # Enforce argument, return, and raise to be mentioned in docstrings there is "D", # Docstring checks these may need to be added gradually
# also "D" but this even warns about docstring punctuation. Perhaps a step too "ERA001", # Commented out code!
# far?
] ]
# Line length is set to 88 for ruff. This is what the formatter aims for # Line length is set to 88 for ruff. This is what the formatter aims for

View file

@ -118,20 +118,12 @@ class RecentringThing(Thing):
logging.info( logging.info(
f"Breaking because the highest point is at {np.argmax(sorted_all_heights)} in the list" f"Breaking because the highest point is at {np.argmax(sorted_all_heights)} in the list"
) )
# plt.plot(sorted_lateral, sorted_all_heights,'.')
# plt.plot(sorted_lateral, quad_fit_func(sorted_lateral))
# plt.show()
break break
else: if turning_loc < np.min(sorted_lateral):
if turning_loc < np.min(sorted_lateral): moves = -1
moves = -1 elif turning_loc > np.max(sorted_lateral):
elif turning_loc > np.max(sorted_lateral): moves = 1
moves = 1
else:
# plt.plot(sorted_lateral, sorted_all_heights,'.')
# plt.plot(sorted_lateral, quad_fit_func(sorted_lateral))
# plt.show()
pass
# Centre value is replaced by the maximum value recorded in that axis # Centre value is replaced by the maximum value recorded in that axis
centre[direction] = focused_pos[direction][np.argmax(all_heights)][ centre[direction] = focused_pos[direction][np.argmax(all_heights)][

View file

@ -105,11 +105,12 @@ class JPEGSharpnessMonitor:
stop: int = int(np.argmax(jpeg_times > stage_times[1])) stop: int = int(np.argmax(jpeg_times > stage_times[1]))
except ValueError as e: except ValueError as e:
if np.sum(jpeg_times > stage_times[0]) == 0: if np.sum(jpeg_times > stage_times[0]) == 0:
raise ValueError( errmsg = (
"No images were captured during the move of the stage. Perhaps the camera is not streaming images?" "No images were captured during the move of the stage. "
) from e "Perhaps the camera is not streaming images?"
else: )
raise e raise ValueError(errmsg) from e
raise e
if stop < 1: if stop < 1:
stop = len(jpeg_times) stop = len(jpeg_times)
logging.debug("changing stop to %s", (stop)) logging.debug("changing stop to %s", (stop))

View file

@ -23,8 +23,7 @@ class BackgroundDetectThing(Thing):
bd = self.thing_settings.get("background_distributions", None) bd = self.thing_settings.get("background_distributions", None)
if bd: if bd:
return ChannelDistributions(**bd) return ChannelDistributions(**bd)
else: return None
return None
@background_distributions.setter @background_distributions.setter
def background_distributions(self, value: Optional[ChannelDistributions]) -> None: def background_distributions(self, value: Optional[ChannelDistributions]) -> None:

View file

@ -83,6 +83,7 @@ class OpenCVCamera(BaseCamera):
It's likely to be highly inefficient - raw and/or uncompressed captures using It's likely to be highly inefficient - raw and/or uncompressed captures using
binary image formats will be added in due course. binary image formats will be added in due course.
""" """
logging.warning(f"OpenCV camera doen't respect {resolution} setting")
ret, frame = self.cap.read() ret, frame = self.cap.read()
if not ret: if not ret:
raise RuntimeError( raise RuntimeError(
@ -100,6 +101,7 @@ class OpenCVCamera(BaseCamera):
This function will produce a JPEG image. This function will produce a JPEG image.
""" """
logging.warning(f"OpenCV camera doen't respect {resolution} setting")
frame = self.capture_array() frame = self.capture_array()
jpeg = cv2.imencode(".jpg", frame)[1].tobytes() jpeg = cv2.imencode(".jpg", frame)[1].tobytes()
exif_dict = { exif_dict = {

View file

@ -189,6 +189,7 @@ class SimulatedCamera(BaseCamera):
It's likely to be highly inefficient - raw and/or uncompressed captures using It's likely to be highly inefficient - raw and/or uncompressed captures using
binary image formats will be added in due course. binary image formats will be added in due course.
""" """
logging.warning(f"Simulation camera doen't respect {resolution} setting")
return self.generate_frame() return self.generate_frame()
@thing_action @thing_action
@ -201,6 +202,7 @@ class SimulatedCamera(BaseCamera):
This function will produce a JPEG image. This function will produce a JPEG image.
""" """
logging.warning(f"Simulation camera doen't respect {resolution} setting")
frame = self.capture_array() frame = self.capture_array()
jpeg = cv2.imencode(".jpg", frame)[1].tobytes() jpeg = cv2.imencode(".jpg", frame)[1].tobytes()
exif_dict = { exif_dict = {

View file

@ -87,7 +87,7 @@ def make_hardware_interface(
axes = stage.axis_names axes = stage.axis_names
def pos2dict(pos: Sequence[float]) -> Mapping[str, float]: def pos2dict(pos: Sequence[float]) -> Mapping[str, float]:
return {k: p for k, p in zip(axes, pos)} return dict(zip(axes, pos))
def dict2pos(posd: Mapping[str, float]) -> Sequence[float]: def dict2pos(posd: Mapping[str, float]) -> Sequence[float]:
return tuple(posd[k] for k in axes if k in posd) return tuple(posd[k] for k in axes if k in posd)

View file

@ -80,7 +80,7 @@ class BaseStage(Thing):
position = PropertyDescriptor( position = PropertyDescriptor(
Mapping[str, int], Mapping[str, int],
{k: 0 for k in _axis_names}, dict.fromkeys(_axis_names, 0),
description="Current position of the stage", description="Current position of the stage",
readonly=True, readonly=True,
observable=True, observable=True,

View file

@ -91,5 +91,5 @@ class DummyStage(BaseStage):
It is intended for use after manually or automatically recentring the It is intended for use after manually or automatically recentring the
stage. stage.
""" """
self.position = {k: 0 for k in self.axis_names} self.position = dict.fromkeys(self.axis_names, 0)
self.instantaneous_position = self.position self.instantaneous_position = self.position

View file

@ -189,8 +189,7 @@ def get_expected_result_for_example_smart_spiral(
""" """
pkl_fname = os.path.join(THIS_DIR, f"example_smart_spiral_{sample_name}.pkl") pkl_fname = os.path.join(THIS_DIR, f"example_smart_spiral_{sample_name}.pkl")
with open(pkl_fname, "rb") as pkl_file_obj: with open(pkl_fname, "rb") as pkl_file_obj:
planner = pickle.load(pkl_file_obj) return pickle.load(pkl_file_obj)
return planner
def load_sample_points(sample_name: str): def load_sample_points(sample_name: str):