Skip to content

Commit 0c7c327

Browse files
authored
Merge pull request #201 from poissoncorp/RDBC-775
RDBC-775 Python client - revisions
2 parents ad549fc + 5962ab0 commit 0c7c327

File tree

22 files changed

+2058
-229
lines changed

22 files changed

+2058
-229
lines changed

ravendb/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
GetIndexErrorsOperation,
104104
IndexingStatus,
105105
)
106-
from ravendb.documents.operations.lazy.lazy_operation import LazyOperation
106+
from ravendb.documents.operations.lazy.definition import LazyOperation
107107
from ravendb.documents.operations.misc import DeleteByQueryOperation, GetOperationStateOperation, QueryOperationOptions
108108
from ravendb.documents.operations.patch import (
109109
PatchOperation,
@@ -120,7 +120,7 @@
120120
ReplicationNode,
121121
ExternalReplicationBase,
122122
)
123-
from ravendb.documents.operations.revisions.configuration import (
123+
from ravendb.documents.operations.revisions import (
124124
RevisionsCollectionConfiguration,
125125
RevisionsConfiguration,
126126
)
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
from __future__ import annotations
2+
3+
import json
4+
from datetime import datetime
5+
from typing import List, Optional, TYPE_CHECKING
6+
7+
import requests
8+
9+
from ravendb.http.raven_command import RavenCommand
10+
from ravendb.json.result import JsonArrayResult
11+
from ravendb.tools.utils import Utils
12+
13+
if TYPE_CHECKING:
14+
from ravendb.http.server_node import ServerNode
15+
16+
17+
class GetRevisionsCommand(RavenCommand[JsonArrayResult]):
18+
def __init__(
19+
self,
20+
id_: str = None,
21+
start: int = None,
22+
page_size: int = None,
23+
metadata_only: bool = None,
24+
before: datetime = None,
25+
change_vector: str = None,
26+
change_vectors: List[str] = None,
27+
):
28+
super().__init__(JsonArrayResult)
29+
self._id = id_
30+
self._start = start
31+
self._page_size = page_size
32+
self._metadata_only = metadata_only
33+
self._before = before
34+
self._change_vector = change_vector
35+
self._change_vectors = change_vectors
36+
37+
@property
38+
def change_vectors(self) -> Optional[List[str]]:
39+
return self._change_vectors
40+
41+
@property
42+
def change_vector(self) -> Optional[str]:
43+
return self._change_vector
44+
45+
@property
46+
def before(self) -> Optional[datetime]:
47+
return self._before
48+
49+
@property
50+
def id(self) -> Optional[str]:
51+
return self._id
52+
53+
@classmethod
54+
def from_change_vector(cls, change_vector: str, metadata_only: bool = False) -> GetRevisionsCommand:
55+
return GetRevisionsCommand(change_vector=change_vector, metadata_only=metadata_only)
56+
57+
@classmethod
58+
def from_change_vectors(cls, change_vectors: List[str] = None, metadata_only: bool = False) -> GetRevisionsCommand:
59+
return GetRevisionsCommand(change_vectors=change_vectors, metadata_only=metadata_only)
60+
61+
@classmethod
62+
def from_before(cls, id_: str, before: datetime) -> GetRevisionsCommand:
63+
if id_ is None:
64+
raise ValueError("Id cannot be None")
65+
return GetRevisionsCommand(id_=id_, before=before)
66+
67+
@classmethod
68+
def from_start_page(
69+
cls, id_: str = None, start: int = None, page_size: int = None, metadata_only: bool = False
70+
) -> GetRevisionsCommand:
71+
if id_ is None:
72+
raise ValueError("Id cannot be None")
73+
74+
return cls(id_=id_, start=start, page_size=page_size, metadata_only=metadata_only)
75+
76+
def create_request(self, node: ServerNode) -> requests.Request:
77+
path_builder = [node.url, "/databases/", node.database, "/revisions?"]
78+
79+
self.get_request_query_string(path_builder)
80+
return requests.Request("GET", "".join(path_builder))
81+
82+
def get_request_query_string(self, path_builder: List[str]) -> None:
83+
if self._id is not None:
84+
path_builder.append("&id=")
85+
path_builder.append(Utils.escape(self._id))
86+
elif self._change_vector is not None:
87+
path_builder.append("&changeVector=")
88+
path_builder.append(Utils.escape(self._change_vector))
89+
elif self._change_vectors is not None:
90+
for change_vector in self._change_vectors:
91+
path_builder.append("&changeVector=")
92+
path_builder.append(Utils.escape(change_vector))
93+
94+
if self._before is not None:
95+
path_builder.append("&before")
96+
path_builder.append(Utils.datetime_to_string(self._before))
97+
98+
if self._start is not None:
99+
path_builder.append("&start=")
100+
path_builder.append(str(self._start))
101+
102+
if self._page_size is not None:
103+
path_builder.append("&pageSize=")
104+
path_builder.append(str(self._page_size))
105+
106+
if self._metadata_only:
107+
path_builder.append("&metadataOnly=true")
108+
109+
def set_response(self, response: Optional[str], from_cache: bool) -> None:
110+
if response is None:
111+
self.result = None
112+
return
113+
114+
self.result = JsonArrayResult.from_json(json.loads(response))
115+
116+
def is_read_request(self) -> bool:
117+
return True
118+
119+
120+
class GetRevisionsBinEntryCommand(RavenCommand[JsonArrayResult]):
121+
def __init__(self, etag: int, page_size: int):
122+
super().__init__(JsonArrayResult)
123+
self._etag = etag
124+
self._page_size = page_size
125+
126+
def create_request(self, node: ServerNode) -> requests.Request:
127+
request = requests.Request("GET")
128+
path = [node.url, "/databases/", node.database, "/revisions/bin?start=", str(self._etag)]
129+
if self._page_size is not None:
130+
path.append("&pageSize=")
131+
path.append(str(self._page_size))
132+
133+
request.url = "".join(path)
134+
135+
return request
136+
137+
def set_response(self, response: Optional[str], from_cache: bool) -> None:
138+
if response is None:
139+
self._throw_invalid_response()
140+
141+
self.result = JsonArrayResult.from_json(json.loads(response))
142+
143+
def is_read_request(self) -> bool:
144+
return True

0 commit comments

Comments
 (0)