labthings_fastapi.utilities
Utility functions used by LabThings-FastAPI.
Submodules
Attributes
Classes
Data used by LabThings, stored on each |
Functions
|
List all the attributes of an object's class. |
|
List all the attributes of an object not starting with |
|
Get (or create) a dictionary for LabThings properties. |
|
Ensure a type is a subclass of BaseModel. |
|
Convert a pydantic model to a dictionary, non-recursively. |
Package Contents
- labthings_fastapi.utilities.class_attributes(obj: Any) Iterable[tuple[str, Any]]
List all the attributes of an object’s class.
This function gets all class attributes, including inherited ones. It is used to obtain the various descriptors used to represent properties and actions. It calls
attributesonobj.__class__.- Parameters:
obj – The instance, usually a
Thinginstance.- Yield:
tuples of
(name, value)giving each attribute of the class.
- labthings_fastapi.utilities.attributes(cls: Any) Iterable[tuple[str, Any]]
List all the attributes of an object not starting with
__.- Parameters:
cls – The object whose attributes we are listing. This may be a class, because classes are objects too.
- Yield:
tuples of
(name, value)giving each attribute and its value.
- labthings_fastapi.utilities.LABTHINGS_DICT_KEY = '__labthings'
- class labthings_fastapi.utilities.LabThingsObjectData
Data used by LabThings, stored on each
Thing.This
pydantic.dataclassgroups together some properties used by LabThings descriptors, to avoid cluttering the namespace of theThingsubclass on which they are defined.- property_observers: Dict[str, weakref.WeakSet] = None
The observers added to each property.
Keys are property names, values are weak sets used by
ThingProperty.
- action_observers: Dict[str, weakref.WeakSet] = None
The observers added to each action.
Keys are action names, values are weak sets used by
ActionDescriptor.
- labthings_fastapi.utilities.labthings_data(obj: labthings_fastapi.thing.Thing) LabThingsObjectData
Get (or create) a dictionary for LabThings properties.
Ensure there is a
LabThingsObjectDatadataclass attached to a particularThing, and return it.- Parameters:
obj – The
Thingwe are looking for the dataclass on.- Returns:
a
LabThingsObjectDatainstance attached toobj.
- labthings_fastapi.utilities.wrap_plain_types_in_rootmodel(model: type) type[pydantic.BaseModel]
Ensure a type is a subclass of BaseModel.
If a
pydantic.BaseModelsubclass is passed to this function, we will pass it through unchanged. Otherwise, we wrap the type in apydantic.RootModel. In the future, we may explicitly check that the argument is a type and not a model instance.- Parameters:
model – A Python type or
pydanticmodel.- Returns:
A
pydanticmodel, wrapping Python types in aRootModelif needed.
- labthings_fastapi.utilities.model_to_dict(model: pydantic.BaseModel | None) Dict[str, Any]
Convert a pydantic model to a dictionary, non-recursively.
We convert only the top level model, i.e. we do not recurse into submodels. This is important to avoid serialising Blob objects in action inputs. This function returns
dict(model), with exceptions for the case ofNone(converted to an empty dictionary) andpydantic.RootModel(checked to see if they correspond to empty input).If
pydantic.RootModelwith non-empty input is allowed, this function will need to be updated to handle them.- Parameters:
model – A Pydantic model (usually the input of an action).
- Returns:
A dictionary with string keys, which are the fields of the model. This should be suitable for using as
**kwargsto an action.- Raises:
ValueError – if we are given a root model that isn’t empty.