diff --git a/README.md b/README.md index 63f4df74a9ab052bea4e7ead885106dc5dbd73db..8c2e4d49b6f909823659ad4eee6c5cd5922cf6f1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [](https://git-ce.rwth-aachen.de/wzl-mq-ms/forschung-lehre/lava/unified-device-interface/python/commits/master) # Python Unified Device Interface -Current stable version: 9.1.1 +Current stable version: 9.1.2 ## Installation 1. Install the WZL-UDI package via pip @@ -58,6 +58,10 @@ Funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) ## Recent changes +**9.1.2** - 2024-01-19 + - added "all" query parameter for semantics, to request complete semantic data model + - fixed bug when requesting enum or time measurements and parameters + **9.1.1** - 2024-01-18 - bug fix of subjects of license paths in semantic data packages diff --git a/setup.py b/setup.py index d00865226c9949323326af45645a4a294c4adada..ec90b99d533467a6fd8b60f9f796f0ec9a26335d 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read() setup(name='wzl-udi', - version='9.1.1', + version='9.1.2', url='https://git-ce.rwth-aachen.de/wzl-mq-public/soil/python', project_urls={ "Bug Tracker": "https://git-ce.rwth-aachen.de/wzl-mq-public/soil/python/-/issues", diff --git a/src/http/server.py b/src/http/server.py index 2cac618899f441802c051e4e94f633bdde0bb5bb..c6a3d2e164cc78fc2304a6d56f87f8de64d1a774 100644 --- a/src/http/server.py +++ b/src/http/server.py @@ -193,7 +193,8 @@ class HTTPServer(object): # serializing the element try: if semantic: - response = item.serialize_semantics(semantic) + recursive = request.query is not None and 'all' in request.query + response = item.serialize_semantics(semantic, recursive) else: response = item.serialize(keys, self._legacy_mode, HTTP_GET) status = 200 diff --git a/src/soil/component.py b/src/soil/component.py index 4767d0f8b50d8a3e62e9f3fa3ccbd9431eee2f88..8d2e26f6f7f5280ed2fe72d9233d6eca847ec88d 100644 --- a/src/soil/component.py +++ b/src/soil/component.py @@ -383,7 +383,7 @@ class Component(Element): for child in self.children: child.load_semantics(profiles_path, metadata_path, f"{parent_name}{self.uuid[4:].capitalize()}") - def serialize_semantics(self, kind: str) -> rdflib.Graph: + def serialize_semantics(self, kind: str, recursive=False) -> rdflib.Graph: if self._metadata_profile is None or self._metadata is None: raise SerialisationException('No semantic information have been provided during initialization.') @@ -393,6 +393,11 @@ class Component(Element): result = self._metadata else: raise DeviceException('The provided kind of semantic information cannot be returned.') + + if recursive: + for child in self._components + self._measurements + self._parameters: + result += child.serialize_semantics(kind, recursive) + return result def resolve_semantic_path(self, suffix: str) -> (Element, str): diff --git a/src/soil/element.py b/src/soil/element.py index 35d614d4a61c56e84f23e209d6920d97db950531..d2a45a8958190c6304fb7827ebe364710e1c1348 100644 --- a/src/soil/element.py +++ b/src/soil/element.py @@ -113,7 +113,7 @@ class Element(ABC): self._metadata.add((rdflib.URIRef(self.semantic_name), Namespaces.schema.license, Semantics.metadata_license)) @abstractmethod - def serialize_semantics(self, kind: str) -> rdflib.Graph: + def serialize_semantics(self, kind: str, recursive: bool = False) -> rdflib.Graph: ... def resolve_semantic_path(self, suffix: str) -> ('Element', str): diff --git a/src/soil/figure.py b/src/soil/figure.py index c76c0432e5224af169949b816b5d39fbb32c77c3..1b28f0788f105e779aca7288941be9b980b9897b 100644 --- a/src/soil/figure.py +++ b/src/soil/figure.py @@ -88,9 +88,9 @@ class Figure(Element, ABC): else: value = self.get() - if self._datatype == 'time': + if self._datatype == Datatype.TIME: value = serialize_time(value) - elif self._datatype == 'enum': + elif self._datatype == Datatype.ENUM: value = str(value) except Exception as e: diff --git a/src/soil/function.py b/src/soil/function.py index 53c2a45cce2a81ae1dd33ffe1283a1e2e6ac5678..fd44b02b2f375c22fd32047b4950609befbc15d1 100644 --- a/src/soil/function.py +++ b/src/soil/function.py @@ -191,7 +191,7 @@ class Function(Element): # This method does nothing intentionally, as we do not have any semantic definition for function pass - def serialize_semantics(self, kind: str) -> rdflib.Graph: + def serialize_semantics(self, kind: str, recursive=False) -> rdflib.Graph: # This method does nothing intentionally, as we do not have any semantic definition for function return None diff --git a/src/soil/measurement.py b/src/soil/measurement.py index 6624efad9717fd88de106f396f5699ff5bb34cd9..35adbd3aa3fd7667f992d910956f4348c35f9739 100644 --- a/src/soil/measurement.py +++ b/src/soil/measurement.py @@ -172,7 +172,7 @@ class Measurement(Figure): except Exception as e: raise SerialisationException('{}: The measurement can not be deserialized. {}'.format(uuid, e)) - def serialize_semantics(self, kind: str) -> rdflib.Graph: + def serialize_semantics(self, kind: str, recursive=False) -> rdflib.Graph: if kind == 'profile': result = self._metadata_profile elif kind == 'metadata': diff --git a/src/soil/parameter.py b/src/soil/parameter.py index 62b094b44b02c54a31767bcf6f79f11c3b81db03..466d78882600c5c7370f1749976fc548f0bebc05 100644 --- a/src/soil/parameter.py +++ b/src/soil/parameter.py @@ -136,7 +136,7 @@ class Parameter(Figure): else: raise ReadOnlyException(self._uuid, self._name) - def serialize_semantics(self, kind: str) -> rdflib.Graph: + def serialize_semantics(self, kind: str, recursive=False) -> rdflib.Graph: if kind == 'profile': result = self._metadata_profile elif kind == 'metadata':