diff --git a/src/pyrestresource/rest_resource_handler.py b/src/pyrestresource/rest_resource_handler.py index e8cf0d5..0bbc105 100644 --- a/src/pyrestresource/rest_resource_handler.py +++ b/src/pyrestresource/rest_resource_handler.py @@ -312,9 +312,31 @@ class ResourceHandler_dict( _dict: dict[T_DictKey, T_DictValues] = cast(dict[T_DictKey, T_DictValues], self.resource) + plugin_dict: ResourcePlugin_dict | None = None + if self.req.get_resource_origin(1) in self.prev_handler.resource._plugins_: + plugin_dict = cast( + ResourcePlugin_dict, + self.prev_handler.resource._plugins_[self.req.get_resource_origin(1)], + ) + plugin_dict.set_context(self.req, self.req.get_root_resource()) + if params.API_key is not None: - del _dict[dict_key_type(params.API_key)] + if issubclass(dict_key_type, bytes): + key_byte = dict_key_type(params.API_key, "utf-8") + if plugin_dict: + plugin_dict.handle_dict_delete(_dict, key_byte, params) + return None + del _dict[key_byte] + else: + key_std = dict_key_type(params.API_key) + if plugin_dict: + plugin_dict.handle_dict_delete(_dict, key_std, params) + return None + del _dict[key_std] else: + if plugin_dict: + plugin_dict.handle_dict_delete_all(_dict, params) + return None _dict.clear() return @@ -407,35 +429,26 @@ class ResourceHandler_dict_elem( assert isinstance(self.prev_handler.resource, RestResourceBase) dict_key_type: T_T_DictKey = self.prev_handler.resource._dict_key_type_[self.req.get_resource_origin(1)] + _dict: dict[T_DictKey, T_DictValues] = cast(dict[T_DictKey, T_DictValues], self.resource) + + plugin_dict: ResourcePlugin_dict | None = None + if self.req.get_resource_origin(1) in self.prev_handler.resource._plugins_: + plugin_dict = cast( + ResourcePlugin_dict, + self.prev_handler.resource._plugins_[self.req.get_resource_origin(1)], + ) + plugin_dict.set_context(self.req, self.req.get_root_resource()) if issubclass(dict_key_type, bytes): key_byte = dict_key_type(self.req.get_resource_origin(0), "utf-8") - dict_byte: dict[T_DictKey, T_DictValues] = cast(dict[T_DictKey, T_DictValues], self.resource) - - if self.req.get_resource_origin(1) in self.prev_handler.resource._plugins_: - plugin_dict: ResourcePlugin_dict = cast( - ResourcePlugin_dict, - self.prev_handler.resource._plugins_[self.req.get_resource_origin(1)], - ) - - plugin_dict.set_context(self.req, self.req.get_root_resource()) - return plugin_dict.handle_dict_elem_get(dict_byte, key_byte, params) - - return dict_byte[key_byte] + if plugin_dict: + return plugin_dict.handle_dict_elem_get(_dict, key_byte, params) + return _dict[key_byte] else: key_std = dict_key_type(self.req.get_resource_origin(0)) - dict_std: dict[T_DictKey, T_DictValues] = cast(dict[T_DictKey, T_DictValues], self.resource) - - if self.req.get_resource_origin(1) in self.prev_handler.resource._plugins_: - plugin_dict: ResourcePlugin_dict = cast( - ResourcePlugin_dict, - self.prev_handler.resource._plugins_[self.req.get_resource_origin(1)], - ) - - plugin_dict.set_context(self.req, self.req.get_root_resource()) - return plugin_dict.handle_dict_elem_get(dict_std, key_std, params) - - return dict_std[key_std] + if plugin_dict: + return plugin_dict.handle_dict_elem_get(_dict, key_std, params) + return _dict[key_std] def _handle_process_delete(self, params) -> None: # print(f"{type(self).__name__}->_handle_process_delete()") @@ -449,33 +462,25 @@ class ResourceHandler_dict_elem( assert isinstance(self.prev_handler.resource, RestResourceBase) dict_key_type: T_T_DictKey = self.prev_handler.resource._dict_key_type_[self.req.get_resource_origin(2)] + _dict: dict[T_DictKey, T_DictValues] = cast(dict[T_DictKey, T_DictValues], self.resource) + + plugin_dict: ResourcePlugin_dict | None = None + if self.req.get_resource_origin(2) in self.prev_handler.resource._plugins_: + plugin_dict = cast(ResourcePlugin_dict, self.prev_handler.resource._plugins_[self.req.get_resource_origin(2)]) + plugin_dict.set_context(self.req, self.req.get_root_resource()) if issubclass(dict_key_type, bytes): key_byte = dict_key_type(self.req.get_resource_origin(1), "utf-8") - dict_byte: dict[T_DictKey, T_DictValues] = cast(dict[T_DictKey, T_DictValues], self.resource) - - if self.req.get_resource_origin(2) in self.prev_handler.resource._plugins_: - plugin_dict: ResourcePlugin_dict = cast( - ResourcePlugin_dict, self.prev_handler.resource._plugins_[self.req.get_resource_origin(2)] - ) - plugin_dict.set_context(self.req, self.req.get_root_resource()) - plugin_dict.handle_dict_delete(dict_byte, key_byte, params) + if plugin_dict: + plugin_dict.handle_dict_delete(_dict, key_byte, params) return None - - del dict_byte[key_byte] + del _dict[key_byte] else: key_std = dict_key_type(self.req.get_resource_origin(1)) - dict_std: dict[T_DictKey, T_DictValues] = cast(dict[T_DictKey, T_DictValues], self.resource) - - if self.req.get_resource_origin(2) in self.prev_handler.resource._plugins_: - plugin_dict: ResourcePlugin_dict = cast( - ResourcePlugin_dict, self.prev_handler.resource._plugins_[self.req.get_resource_origin(2)] - ) - plugin_dict.set_context(self.req, self.req.get_root_resource()) - plugin_dict.handle_dict_delete(dict_std, key_std, params) + if plugin_dict: + plugin_dict.handle_dict_delete(_dict, key_std, params) return None - - del dict_std[key_std] + del _dict[key_std] @ResourceHandler.register_resource_handler diff --git a/src/pyrestresource/rest_resource_rootpoint.py b/src/pyrestresource/rest_resource_rootpoint.py index 6a222fe..8f0068a 100644 --- a/src/pyrestresource/rest_resource_rootpoint.py +++ b/src/pyrestresource/rest_resource_rootpoint.py @@ -6,7 +6,6 @@ from typing import ( TYPE_CHECKING, ) -from pydantic import BaseModel from pydantic.fields import FieldInfo from .rest_resource import RestResourceBase diff --git a/test/test_rest_resource_plugins_dict.py b/test/test_rest_resource_plugins_dict.py index 92297eb..98b5c34 100644 --- a/test/test_rest_resource_plugins_dict.py +++ b/test/test_rest_resource_plugins_dict.py @@ -38,9 +38,6 @@ def init_classes(): resource_dict: dict[str, Test_Record], params: RestRequestParams_Dict_GET, ) -> list[str]: - # print("HOOK handle_dict_get_keys") - # print(resource_dict) - # print(params) result = super().handle_dict_get_keys(resource_dict, params) if self.static_Test_Record_active is True: result.append("static_elem") @@ -52,10 +49,6 @@ def init_classes(): key: str, params: RestRequestParams_Dict_elem_GET, ) -> Test_Record: - # print("HOOK handle_dict_elem_get") - # print(resource_dict) - # print(key) - # print(params) if key == "static_elem": if self.static_Test_Record_active is True: return self.static_Test_Record @@ -69,16 +62,19 @@ def init_classes(): key: str, params: RestRequestParams_Dict_DELETE[str], ) -> None: - print("HOOK handle_dict_delete") - print(resource_dict) - print(key) - print(params) - print(self.static_Test_Record_active) if key == "static_elem": self.static_Test_Record_active = False else: del resource_dict[key] + def handle_dict_delete_all( + self, + resource_dict: dict[str, Test_Record], + params: RestRequestParams_Dict_DELETE[str], + ) -> None: + self.static_Test_Record_active = False + resource_dict.clear() + @register_rest_rootpoint class RootApp(RestResourceBase): str_dict_Test_Record: dict[str, Test_Record] = RestField( @@ -116,14 +112,34 @@ class Test_RestAPI_Plugin_Dict(unittest.TestCase): self.assertEqual(result.get_result(), '{"test_str": "mytest", "test_int": 84}') def test_delete_dict_elems(self): - result = self.testapp.process_request("/str_dict_Test_Record/test", rsrc_verb.DELETE) - print(result.get_result()) + self.testapp.process_request("/str_dict_Test_Record/test", rsrc_verb.DELETE) result = self.testapp.process_request("/str_dict_Test_Record", rsrc_verb.GET) self.assertEqual(result.get_result(), '["static_elem"]') - result = self.testapp.process_request("/str_dict_Test_Record/static_elem", rsrc_verb.DELETE) - print(result.get_result()) + self.testapp.process_request("/str_dict_Test_Record/static_elem", rsrc_verb.DELETE) + + result = self.testapp.process_request("/str_dict_Test_Record", rsrc_verb.GET) + self.assertEqual(result.get_result(), "[]") + + def test_delete_all_dict_elems(self): + self.testapp.process_request("/str_dict_Test_Record/test", rsrc_verb.DELETE) + + result = self.testapp.process_request("/str_dict_Test_Record", rsrc_verb.GET) + self.assertEqual(result.get_result(), '["static_elem"]') + + self.testapp.process_request("/str_dict_Test_Record", rsrc_verb.DELETE) + + result = self.testapp.process_request("/str_dict_Test_Record", rsrc_verb.GET) + self.assertEqual(result.get_result(), "[]") + + def test_delete_dict_elems_API_key(self): + self.testapp.process_request("/str_dict_Test_Record/test", rsrc_verb.DELETE) + + result = self.testapp.process_request("/str_dict_Test_Record", rsrc_verb.GET) + self.assertEqual(result.get_result(), '["static_elem"]') + + self.testapp.process_request("/str_dict_Test_Record?API_key=static_elem", rsrc_verb.DELETE) result = self.testapp.process_request("/str_dict_Test_Record", rsrc_verb.GET) self.assertEqual(result.get_result(), "[]")