Source code for fastcs.util

import re
from typing import _GenericAlias, get_args, get_origin, get_type_hints  # type: ignore

import numpy as np

from fastcs.attributes import Attribute
from fastcs.controller import BaseController
from fastcs.datatypes import Bool, DataType, Float, Int, String


[docs] def snake_to_pascal(name: str) -> str: """Converts string from snake case to Pascal case. If string is not a valid snake case it will be returned unchanged """ if re.fullmatch(r"[a-z][a-z0-9]*(?:_[a-z0-9]+)*", name): name = re.sub(r"(?:^|_)([a-z0-9])", lambda match: match.group(1).upper(), name) return name
[docs] def numpy_to_fastcs_datatype(np_type) -> DataType: """Converts numpy types to fastcs types for widget creation. Only types important for widget creation are explicitly converted """ if np.issubdtype(np_type, np.integer): return Int() elif np.issubdtype(np_type, np.floating): return Float() elif np.issubdtype(np_type, np.bool_): return Bool() else: return String()
[docs] def validate_hinted_attributes(controller: BaseController): """Validates that type-hinted attributes exist in the controller, and are accessible via the dot accessor, from the attributes dictionary and with the right datatype. """ hints = get_type_hints(type(controller)) alias_hints = {k: v for k, v in hints.items() if isinstance(v, _GenericAlias)} for name, hint in alias_hints.items(): attr_class = get_origin(hint) if not issubclass(attr_class, Attribute): continue attr = getattr(controller, name, None) if attr is None: raise RuntimeError( f"Controller `{controller.__class__.__name__}` failed to introspect " f"hinted attribute `{name}` during initialisation" ) if type(attr) is not attr_class: raise RuntimeError( f"Controller '{controller.__class__.__name__}' introspection of hinted " f"attribute '{name}' does not match defined access mode. " f"Expected '{attr_class.__name__}', got '{type(attr).__name__}'." ) (attr_dtype,) = get_args(hint) if attr.datatype.dtype != attr_dtype: raise RuntimeError( f"Controller '{controller.__class__.__name__}' introspection of hinted " f"attribute '{name}' does not match defined datatype. " f"Expected '{attr_dtype.__name__}', " f"got '{attr.datatype.dtype.__name__}'." )