Skip to content

Commit a657460

Browse files
committed
RDBC-768 RavenDB_13452Test::canModifyDictionaryWithPatch_Remove
1 parent cb85739 commit a657460

File tree

3 files changed

+62
-15
lines changed

3 files changed

+62
-15
lines changed

ravendb/documents/session/document_session.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,8 @@ def patch_object(
927927
script_map = JavaScriptMap(self.__custom_count, path_to_object)
928928
self.__custom_count += 1
929929

930+
dictionary_adder(script_map)
931+
930932
patch_request = PatchRequest()
931933
patch_request.script = script_map.script
932934
patch_request.values = script_map.parameters

ravendb/documents/session/misc.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import threading
55
from abc import ABC
66
from enum import Enum
7-
from typing import Union, Optional, TYPE_CHECKING, List, Dict
7+
from typing import Union, Optional, TYPE_CHECKING, List, Dict, Generic, TypeVar
88

99
from ravendb.http.misc import LoadBalanceBehavior
1010

@@ -18,6 +18,9 @@
1818
from ravendb.documents import DocumentStore
1919

2020

21+
_T_Key = TypeVar("_T_Key")
22+
_T_Value = TypeVar("_T_Value")
23+
2124
class TransactionMode(Enum):
2225
SINGLE_NODE = "single_node"
2326
CLUSTER_WIDE = "cluster_wide"
@@ -210,33 +213,36 @@ def remove_at(self, index: int) -> JavaScriptArray:
210213
return self
211214

212215

213-
class JavaScriptMap:
216+
class JavaScriptMap(Generic[_T_Key, _T_Value]):
214217
def __init__(self, suffix: int, path_to_map: str):
215-
self.__suffix = suffix
216-
self.__path_to_map = path_to_map
217-
self.__arg_counter = 0
218-
self.__script_lines = []
219-
self.__parameters: Dict[str, object] = {}
218+
self._suffix = suffix
219+
self._path_to_map = path_to_map
220+
self._arg_counter = 0
221+
self._script_lines = []
222+
self._parameters: Dict[str, object] = {}
220223

221224
@property
222225
def script(self) -> str:
223-
return "\r".join(self.__script_lines)
226+
return "\r".join(self._script_lines)
224227

225228
@property
226229
def parameters(self) -> Dict[str, object]:
227-
return self.__parameters
230+
return self._parameters
228231

229-
def __get_next_argument_name(self) -> str:
230-
self.__arg_counter += 1
231-
return f"val_{self.__arg_counter - 1}_{self.__suffix}"
232+
def _get_next_argument_name(self) -> str:
233+
self._arg_counter += 1
234+
return f"val_{self._arg_counter - 1}_{self._suffix}"
232235

233-
def put(self, key, value) -> JavaScriptMap:
234-
argument_name = self.__get_next_argument_name()
236+
def put(self, key: _T_Key, value:_T_Value) -> JavaScriptMap[_T_Key, _T_Value]:
237+
argument_name = self._get_next_argument_name()
235238

236-
self.__script_lines.append(f"this.{self.__path_to_map}.{key} = args.{argument_name};")
239+
self._script_lines.append(f"this.{self._path_to_map}.{key} = args.{argument_name};")
237240
self.parameters[argument_name] = value
238241
return self
239242

243+
def remove(self, key: _T_Key) -> JavaScriptMap[_T_Key, _T_Value]:
244+
self._script_lines.append(f"delete this.{self._path_to_map}.{key};")
245+
240246

241247
class MethodCall(ABC):
242248
def __init__(self, args: List[object] = None, access_path: str = None):
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from typing import Dict
2+
3+
from ravendb.tests.test_base import TestBase
4+
5+
class Item:
6+
def __init__(self, values: Dict[str, str] = None):
7+
self.values = values
8+
9+
class TestRavenDB13452(TestBase):
10+
def setUp(self):
11+
super().setUp()
12+
13+
def test_can_modify_dictionary_with_patch_remove(self):
14+
with self.store.open_session() as session:
15+
item = Item()
16+
values = {}
17+
item.values = values
18+
values["Key1"] = "Value1"
19+
values["Key2"] = "Value2"
20+
values["Key3"] = "Value3"
21+
22+
session.store(item, "items/1")
23+
session.save_changes()
24+
25+
with self.store.open_session() as session:
26+
item = session.load("items/1", Item)
27+
session.advanced.patch_object(item, "values", lambda dict_: dict_.remove("Key2"))
28+
session.save_changes()
29+
30+
with self.store.open_session() as session:
31+
item = session.load("items/1", dict)
32+
values = item.get("values")
33+
self.assertIsNotNone(values)
34+
self.assertEqual(2, len(values))
35+
36+
self.assertEqual("Value1", values.get("Key1"))
37+
self.assertEqual("Value3", values.get("Key3"))
38+
39+

0 commit comments

Comments
 (0)