Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
25a621e
remove source and CouchDBBackend in couchdb.py
shenchenruwo Nov 7, 2024
2f0a229
delete import backends
shenchenruwo Nov 8, 2024
36d2bba
remove LocalFileBackend class
shenchenruwo Nov 8, 2024
12dba7d
adapt replication checking
shenchenruwo Nov 8, 2024
9798fb2
remove source related code in local_file.py
shenchenruwo Nov 8, 2024
46a6827
change do_requrest to non-public
shenchenruwo Nov 8, 2024
7f119e4
remove source, update and commit from Referable
shenchenruwo Nov 8, 2024
483f6ad
delete backends.py
shenchenruwo Nov 8, 2024
b892047
remove update and commit from couchdb tutorial
shenchenruwo Nov 8, 2024
8eb27c8
Merge branch 'eclipse-basyx:main' into improve/data_persistence
shenchenruwo Nov 8, 2024
d2bf73c
adapt test_couchdb and test_local_file
shenchenruwo Nov 8, 2024
ed2108f
adapt test_backends and test_base
shenchenruwo Nov 8, 2024
e17940e
adapt documentation
shenchenruwo Nov 8, 2024
e421655
delete import backends in base.py
shenchenruwo Nov 8, 2024
f6e4555
remove source in test_base
shenchenruwo Nov 8, 2024
c2e3e69
delete test_parse_source
shenchenruwo Nov 8, 2024
766686b
remove update and commit in multiple files
shenchenruwo Nov 8, 2024
880331e
adapt documentation about update and commit
shenchenruwo Nov 8, 2024
cd234c0
adapt docs
shenchenruwo Nov 8, 2024
8ae2fc6
delete missed update in test_base
shenchenruwo Nov 8, 2024
f12cd5d
adapt couchdb safe_delete test
shenchenruwo Nov 8, 2024
af3cbd3
Merge branch 'develop' into improve/data_persistence
s-heppner Jan 20, 2025
791e754
backend: Improve docstring and comment formulation
s-heppner Jan 20, 2025
4c5217d
test.backend: Remove outdated tests, fix codestyle
s-heppner Jan 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion sdk/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ For further examples and tutorials, check out the `basyx.aas.examples`-package.
* [`tutorial_storage`](./basyx/aas/examples/tutorial_storage.py): Manage a larger number of Asset Administration Shells in an ObjectStore and resolve references
* [`tutorial_serialization_deserialization`](./basyx/aas/examples/tutorial_serialization_deserialization.py): Use the JSON and XML serialization/deserialization for single objects or full standard-compliant files
* [`tutorial_aasx`](./basyx/aas/examples/tutorial_aasx.py): Export Asset Administration Shells with related objects and auxiliary files to AASX package files
* [`tutorial_backend_couchdb`](./basyx/aas/examples/tutorial_backend_couchdb.py): Use the *Backends* interface (`update()/commit()` methods) to manage and retrieve AAS objects in a CouchDB document database
* [`tutorial_backend_couchdb`](./basyx/aas/examples/tutorial_backend_couchdb.py): Use the *CouchDBObjectStore* to manage and retrieve AAS objects in a CouchDB document database


### Documentation
Expand Down
20 changes: 0 additions & 20 deletions sdk/basyx/aas/adapter/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -573,13 +573,11 @@ def _get_obj_ts(self, identifier: model.Identifier, type_: Type[model.provider._
identifiable = self.object_store.get(identifier)
if not isinstance(identifiable, type_):
raise NotFound(f"No {type_.__name__} with {identifier} found!")
identifiable.update()
return identifiable

def _get_all_obj_of_type(self, type_: Type[model.provider._IT]) -> Iterator[model.provider._IT]:
for obj in self.object_store:
if isinstance(obj, type_):
obj.update()
yield obj

def _resolve_reference(self, reference: model.ModelReference[model.base._RT]) -> model.base._RT:
Expand Down Expand Up @@ -745,7 +743,6 @@ def post_aas(self, request: Request, url_args: Dict, response_t: Type[APIRespons
self.object_store.add(aas)
except KeyError as e:
raise Conflict(f"AssetAdministrationShell with Identifier {aas.id} already exists!") from e
aas.commit()
created_resource_url = map_adapter.build(self.get_aas, {
"aas_id": aas.id
}, force_external=True)
Expand All @@ -772,7 +769,6 @@ def put_aas(self, request: Request, url_args: Dict, response_t: Type[APIResponse
aas = self._get_shell(url_args)
aas.update_from(HTTPApiDecoder.request_body(request, model.AssetAdministrationShell,
is_stripped_request(request)))
aas.commit()
return response_t()

def delete_aas(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response:
Expand All @@ -789,7 +785,6 @@ def put_aas_asset_information(self, request: Request, url_args: Dict, response_t
**_kwargs) -> Response:
aas = self._get_shell(url_args)
aas.asset_information = HTTPApiDecoder.request_body(request, model.AssetInformation, False)
aas.commit()
return response_t()

def get_aas_submodel_refs(self, request: Request, url_args: Dict, response_t: Type[APIResponse],
Expand All @@ -806,14 +801,12 @@ def post_aas_submodel_refs(self, request: Request, url_args: Dict, response_t: T
if sm_ref in aas.submodel:
raise Conflict(f"{sm_ref!r} already exists!")
aas.submodel.add(sm_ref)
aas.commit()
return response_t(sm_ref, status=201)

def delete_aas_submodel_refs_specific(self, request: Request, url_args: Dict, response_t: Type[APIResponse],
**_kwargs) -> Response:
aas = self._get_shell(url_args)
aas.submodel.remove(self._get_submodel_reference(aas, url_args["submodel_id"]))
aas.commit()
return response_t()

def put_aas_submodel_refs_submodel(self, request: Request, url_args: Dict, response_t: Type[APIResponse],
Expand All @@ -826,11 +819,9 @@ def put_aas_submodel_refs_submodel(self, request: Request, url_args: Dict, respo
id_changed: bool = submodel.id != new_submodel.id
# TODO: https://github.com/eclipse-basyx/basyx-python-sdk/issues/216
submodel.update_from(new_submodel)
submodel.commit()
if id_changed:
aas.submodel.remove(sm_ref)
aas.submodel.add(model.ModelReference.from_referable(submodel))
aas.commit()
return response_t()

def delete_aas_submodel_refs_submodel(self, request: Request, url_args: Dict, response_t: Type[APIResponse],
Expand All @@ -840,7 +831,6 @@ def delete_aas_submodel_refs_submodel(self, request: Request, url_args: Dict, re
submodel = self._resolve_reference(sm_ref)
self.object_store.remove(submodel)
aas.submodel.remove(sm_ref)
aas.commit()
return response_t()

def aas_submodel_refs_redirect(self, request: Request, url_args: Dict, map_adapter: MapAdapter,
Expand Down Expand Up @@ -869,7 +859,6 @@ def post_submodel(self, request: Request, url_args: Dict, response_t: Type[APIRe
self.object_store.add(submodel)
except KeyError as e:
raise Conflict(f"Submodel with Identifier {submodel.id} already exists!") from e
submodel.commit()
created_resource_url = map_adapter.build(self.get_submodel, {
"submodel_id": submodel.id
}, force_external=True)
Expand Down Expand Up @@ -911,7 +900,6 @@ def get_submodels_reference(self, request: Request, url_args: Dict, response_t:
def put_submodel(self, request: Request, url_args: Dict, response_t: Type[APIResponse], **_kwargs) -> Response:
submodel = self._get_submodel(url_args)
submodel.update_from(HTTPApiDecoder.request_body(request, model.Submodel, is_stripped_request(request)))
submodel.commit()
return response_t()

def get_submodel_submodel_elements(self, request: Request, url_args: Dict, response_t: Type[APIResponse],
Expand Down Expand Up @@ -984,7 +972,6 @@ def put_submodel_submodel_elements_id_short_path(self, request: Request, url_arg
model.SubmodelElement, # type: ignore[type-abstract]
is_stripped_request(request))
submodel_element.update_from(new_submodel_element)
submodel_element.commit()
return response_t()

def delete_submodel_submodel_elements_id_short_path(self, request: Request, url_args: Dict,
Expand Down Expand Up @@ -1043,7 +1030,6 @@ def put_submodel_submodel_element_attachment(self, request: Request, url_args: D
f"while {submodel_element!r} has content_type {submodel_element.content_type!r}!")

submodel_element.value = self.file_store.add_file(filename, file_storage.stream, submodel_element.content_type)
submodel_element.commit()
return response_t()

def delete_submodel_submodel_element_attachment(self, request: Request, url_args: Dict,
Expand All @@ -1066,7 +1052,6 @@ def delete_submodel_submodel_element_attachment(self, request: Request, url_args
pass
submodel_element.value = None

submodel_element.commit()
return response_t()

def get_submodel_submodel_element_qualifiers(self, request: Request, url_args: Dict, response_t: Type[APIResponse],
Expand All @@ -1084,7 +1069,6 @@ def post_submodel_submodel_element_qualifiers(self, request: Request, url_args:
if sm_or_se.qualifier.contains_id("type", qualifier.type):
raise Conflict(f"Qualifier with type {qualifier.type} already exists!")
sm_or_se.qualifier.add(qualifier)
sm_or_se.commit()
created_resource_url = map_adapter.build(self.get_submodel_submodel_element_qualifiers, {
"submodel_id": url_args["submodel_id"],
"id_shorts": url_args.get("id_shorts") or None,
Expand All @@ -1103,7 +1087,6 @@ def put_submodel_submodel_element_qualifiers(self, request: Request, url_args: D
raise Conflict(f"A qualifier of type {new_qualifier.type!r} already exists for {sm_or_se!r}")
sm_or_se.remove_qualifier_by_type(qualifier.type)
sm_or_se.qualifier.add(new_qualifier)
sm_or_se.commit()
if qualifier_type_changed:
created_resource_url = map_adapter.build(self.get_submodel_submodel_element_qualifiers, {
"submodel_id": url_args["submodel_id"],
Expand All @@ -1119,7 +1102,6 @@ def delete_submodel_submodel_element_qualifiers(self, request: Request, url_args
sm_or_se = self._get_submodel_or_nested_submodel_element(url_args)
qualifier_type = url_args["qualifier_type"]
self._qualifiable_qualifier_op(sm_or_se, sm_or_se.remove_qualifier_by_type, qualifier_type)
sm_or_se.commit()
return response_t()

# --------- CONCEPT DESCRIPTION ROUTES ---------
Expand All @@ -1137,7 +1119,6 @@ def post_concept_description(self, request: Request, url_args: Dict, response_t:
self.object_store.add(concept_description)
except KeyError as e:
raise Conflict(f"ConceptDescription with Identifier {concept_description.id} already exists!") from e
concept_description.commit()
created_resource_url = map_adapter.build(self.get_concept_description, {
"concept_id": concept_description.id
}, force_external=True)
Expand All @@ -1153,7 +1134,6 @@ def put_concept_description(self, request: Request, url_args: Dict, response_t:
concept_description = self._get_concept_description(url_args)
concept_description.update_from(HTTPApiDecoder.request_body(request, model.ConceptDescription,
is_stripped_request(request)))
concept_description.commit()
return response_t()

def delete_concept_description(self, request: Request, url_args: Dict, response_t: Type[APIResponse],
Expand Down
6 changes: 1 addition & 5 deletions sdk/basyx/aas/backend/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
"""
This module implements a standardized way of integrating data from existing systems into AAS objects. To achieve this,
the abstract :class:`~basyx.aas.backend.backends.Backend` class implements the class methods
:meth:`~basyx.aas.backend.backends.Backend.update_object` and :meth:`~basyx.aas.backend.backends.Backend.commit_object`,
which every implementation of a backend needs to overwrite. For a tutorial on how to implement a backend, see
:ref:`this tutorial <tutorial_backend_couchdb>`
This module implements a standardized way of persisting AAS objects using various backends.
"""
175 changes: 0 additions & 175 deletions sdk/basyx/aas/backend/backends.py

This file was deleted.

Loading
Loading