Skip to content

Commit 0b7e333

Browse files
committed
RDBC-855 Check if pydantic objects break storing documents
RDBC-856 Delete convert_to_snake_case occurances #1/?
1 parent 4130404 commit 0b7e333

File tree

15 files changed

+94
-79
lines changed

15 files changed

+94
-79
lines changed

ravendb/documents/commands/batches.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def set_response(self, response: str, from_cache: bool) -> None:
199199
"Got None response from the server after doing a batch, something is very wrong."
200200
" Probably a garbled response."
201201
)
202-
self.result = Utils.initialize_object(json.loads(response), self._result_class, True)
202+
self.result = BatchCommandResult.from_json(json.loads(response))
203203

204204

205205
class ClusterWideBatchCommand(SingleNodeBatchCommand):

ravendb/documents/operations/operation.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@ def wait_for_completion(self) -> None:
5151
raise OperationCancelledException()
5252
elif operation_status == "Faulted":
5353
result = status.get("Result")
54-
exception_result: OperationExceptionResult = Utils.initialize_object(
55-
result, OperationExceptionResult, True
56-
)
54+
exception_result = OperationExceptionResult.from_json(result)
5755
schema = ExceptionDispatcher.ExceptionSchema(
5856
self.__request_executor.url, exception_result.type, exception_result.message, exception_result.error
5957
)

ravendb/documents/session/document_session_operations/in_memory_document_session_operations.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,10 @@ def before_query_invoke(self, before_query_event_args: BeforeQueryEventArgs):
599599
def documents_by_id(self):
600600
return self._documents_by_id
601601

602+
@property
603+
def included_documents_by_id(self):
604+
return self._included_documents_by_id
605+
602606
@property
603607
def deleted_entities(self):
604608
return self._deleted_entities

ravendb/documents/session/operations/load_operation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,11 @@ def __get_document(self, object_type: Type[_T], key: str) -> _T:
129129
if self._session.is_deleted(key):
130130
return Utils.get_default_value(object_type)
131131

132-
doc = self._session._documents_by_id.get(key)
132+
doc = self._session.documents_by_id.get(key)
133133
if doc is not None:
134134
return self._session.track_entity_document_info(object_type, doc)
135135

136-
doc = self._session._included_documents_by_id.get(key)
136+
doc = self._session.included_documents_by_id.get(key)
137137
if doc is not None:
138138
return self._session.track_entity_document_info(object_type, doc)
139139

ravendb/http/request_executor.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -438,11 +438,7 @@ def __run(errors: list):
438438

439439
topology = Topology(
440440
self._topology_etag,
441-
(
442-
self.topology_nodes
443-
if self.topology_nodes
444-
else list(map(lambda url_val: ServerNode(url_val, self._database_name, "!"), initial_urls))
445-
),
441+
(self.topology_nodes or [ServerNode(url, self._database_name, "!") for url in initial_urls]),
446442
)
447443

448444
self._node_selector = NodeSelector(topology, self._thread_pool_executor)

ravendb/http/server_node.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from enum import Enum
2-
from typing import Optional, TYPE_CHECKING
2+
from typing import Optional, TYPE_CHECKING, Any, Dict
33

44
if TYPE_CHECKING:
55
from ravendb.http.topology import ClusterTopology
@@ -26,8 +26,17 @@ def __init__(
2626
self.database = database
2727
self.cluster_tag = cluster_tag
2828
self.server_role = server_role
29-
self.__last_server_version_check = 0
30-
self.__last_server_version: str = None
29+
self._last_server_version_check = 0
30+
self._last_server_version: Optional[str] = None
31+
32+
@classmethod
33+
def from_json(cls, json_dict: Dict[str, Any]) -> "ServerNode":
34+
return cls(
35+
json_dict["Url"],
36+
json_dict["Database"],
37+
json_dict["ClusterTag"],
38+
ServerNode.Role(json_dict["ServerRole"]) if "ServerRole" in json_dict else None,
39+
)
3140

3241
def __eq__(self, other) -> bool:
3342
if self == other:
@@ -45,7 +54,7 @@ def __hash__(self) -> int:
4554

4655
@property
4756
def last_server_version(self) -> str:
48-
return self.__last_server_version
57+
return self._last_server_version
4958

5059
@classmethod
5160
def create_from(cls, topology: "ClusterTopology"):
@@ -64,16 +73,16 @@ def create_from(cls, topology: "ClusterTopology"):
6473
return nodes
6574

6675
def should_update_server_version(self) -> bool:
67-
if self.last_server_version is None or self.__last_server_version_check > 100:
76+
if self.last_server_version is None or self._last_server_version_check > 100:
6877
return True
6978

70-
self.__last_server_version_check += 1
79+
self._last_server_version_check += 1
7180
return False
7281

7382
def update_server_version(self, server_version: str):
74-
self.__last_server_version = server_version
75-
self.__last_server_version_check = 0
83+
self._last_server_version = server_version
84+
self._last_server_version_check = 0
7685

7786
def discard_server_version(self) -> None:
78-
self.__last_server_version_check = None
79-
self.__last_server_version_check = 0
87+
self._last_server_version_check = None
88+
self._last_server_version_check = 0

ravendb/http/topology.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import uuid
77
from abc import abstractmethod
88
from concurrent.futures import ThreadPoolExecutor
9-
from typing import TYPE_CHECKING, Optional
9+
from typing import TYPE_CHECKING, Optional, Any
1010
from typing import Union, List, Dict
1111

1212
from ravendb.exceptions.exceptions import (
@@ -25,6 +25,10 @@ def __init__(self, etag: int, nodes: List[ServerNode]):
2525
self.etag = etag
2626
self.nodes = nodes
2727

28+
@classmethod
29+
def from_json(cls, json_dict: Dict[str, Any]) -> "Topology":
30+
return cls(json_dict["Etag"], [ServerNode.from_json(node_json_dict) for node_json_dict in json_dict["Nodes"]])
31+
2832

2933
class ClusterTopology:
3034
def __init__(self):

ravendb/json/result.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
from typing import List, Any, Dict
1+
from typing import List, Any, Dict, Optional
22

33

44
class BatchCommandResult:
5-
def __init__(self, results, transaction_index):
6-
self.results: [None, list] = results
7-
self.transaction_index: [None, int] = transaction_index
5+
def __init__(self, results: Optional[List[Dict]], transaction_index: Optional[int]):
6+
self.results = results
7+
self.transaction_index = transaction_index
8+
9+
@classmethod
10+
def from_json(cls, json_dict: Dict[str, Any]) -> "BatchCommandResult":
11+
return cls(json_dict["Results"], json_dict["TransactionIndex"] if "TransactionIndex" in json_dict else None)
812

913

1014
class JsonArrayResult:

ravendb/serverwide/commands.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from ravendb.tools.utils import Utils
1414

1515

16-
class GetDatabaseTopologyCommand(RavenCommand):
16+
class GetDatabaseTopologyCommand(RavenCommand[Topology]):
1717
def __init__(self, debug_tag: Optional[str] = None, application_identifier: Optional[uuid.UUID] = None):
1818
super().__init__(Topology)
1919
self.__debug_tag = debug_tag
@@ -33,13 +33,7 @@ def create_request(self, node: ServerNode) -> requests.Request:
3333
def set_response(self, response: str, from_cache: bool) -> None:
3434
if response is None:
3535
return
36-
37-
# todo: that's pretty bad way to do that, replace with initialization function that take nested object types
38-
self.result: Topology = Utils.initialize_object(json.loads(response), self._result_class, True)
39-
node_list = []
40-
for node in self.result.nodes:
41-
node_list.append(Utils.initialize_object(node, ServerNode, True))
42-
self.result.nodes = node_list
36+
self.result = Topology.from_json(json.loads(response))
4337

4438

4539
class GetClusterTopologyCommand(RavenCommand[ClusterTopologyResponse]):
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from datetime import datetime
2+
3+
from pydantic import BaseModel
4+
5+
from ravendb.tests.test_base import TestBase
6+
7+
8+
class User(BaseModel):
9+
name: str = None
10+
birthday: datetime = None
11+
Id: str = None
12+
13+
14+
class TestRDBC855(TestBase):
15+
def test_storing_pydantic_objects(self):
16+
with self.store.open_session() as session:
17+
session.store(User(name="Josh", birthday=datetime(1999, 1, 1), Id="users/51"))
18+
session.save_changes()
19+
20+
with self.store.open_session() as session:
21+
user = session.load("users/51", User)
22+
self.assertEqual("Josh", user.name)

0 commit comments

Comments
 (0)