Skip to content

Commit 23de7d3

Browse files
authored
Computed Values support for PUT /_api/collection/collection/properties (#268)
* initial commit * fix: black * fix: prevent computedValue from affecting other tests * typing: Jsons instead of List[Json] * fix: isort * update: computedValues formatter
1 parent f5b1d50 commit 23de7d3

File tree

3 files changed

+42
-19
lines changed

3 files changed

+42
-19
lines changed

arango/collection.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from arango.request import Request
4242
from arango.response import Response
4343
from arango.result import Result
44-
from arango.typings import Fields, Headers, Json, Params
44+
from arango.typings import Fields, Headers, Json, Jsons, Params
4545
from arango.utils import get_batches, get_doc_id, is_none_or_int, is_none_or_str
4646

4747

@@ -306,6 +306,7 @@ def configure(
306306
schema: Optional[Json] = None,
307307
replication_factor: Optional[int] = None,
308308
write_concern: Optional[int] = None,
309+
computed_values: Optional[Jsons] = None,
309310
) -> Result[Json]:
310311
"""Configure collection properties.
311312
@@ -341,6 +342,8 @@ def configure(
341342
data["replicationFactor"] = replication_factor
342343
if write_concern is not None:
343344
data["writeConcern"] = write_concern
345+
if computed_values is not None:
346+
data["computedValues"] = computed_values
344347

345348
request = Request(
346349
method="put",
@@ -976,7 +979,7 @@ def get_many(
976979
self,
977980
documents: Sequence[Union[str, Json]],
978981
allow_dirty_read: bool = False,
979-
) -> Result[List[Json]]:
982+
) -> Result[Jsons]:
980983
"""Return multiple documents ignoring any missing ones.
981984
982985
:param documents: List of document keys, IDs or bodies. Document bodies
@@ -1001,7 +1004,7 @@ def get_many(
10011004
headers={"x-arango-allow-dirty-read": "true"} if allow_dirty_read else None,
10021005
)
10031006

1004-
def response_handler(resp: Response) -> List[Json]:
1007+
def response_handler(resp: Response) -> Jsons:
10051008
if not resp.is_success:
10061009
raise DocumentGetError(resp, request)
10071010
return [doc for doc in resp.body if "_id" in doc]
@@ -1034,7 +1037,7 @@ def response_handler(resp: Response) -> Json:
10341037
# Index Management #
10351038
####################
10361039

1037-
def indexes(self) -> Result[List[Json]]:
1040+
def indexes(self) -> Result[Jsons]:
10381041
"""Return the collection indexes.
10391042
10401043
:return: Collection indexes.
@@ -1047,7 +1050,7 @@ def indexes(self) -> Result[List[Json]]:
10471050
params={"collection": self.name},
10481051
)
10491052

1050-
def response_handler(resp: Response) -> List[Json]:
1053+
def response_handler(resp: Response) -> Jsons:
10511054
if not resp.is_success:
10521055
raise IndexListError(resp, request)
10531056
result = resp.body["indexes"]

arango/formatter.py

+2-13
Original file line numberDiff line numberDiff line change
@@ -249,20 +249,9 @@ def format_collection(body: Json) -> Json:
249249
result["min_revision"] = body["minRevision"]
250250
if "schema" in body:
251251
result["schema"] = body["schema"]
252-
253-
# New in 3.10
254252
if body.get("computedValues") is not None:
255-
result["computedValues"] = [
256-
{
257-
"name": cv["name"],
258-
"expression": cv["expression"],
259-
"overwrite": cv["overwrite"],
260-
"computedOn": cv["computedOn"],
261-
"keepNull": cv["keepNull"],
262-
"failOnWarning": cv["failOnWarning"],
263-
}
264-
for cv in body["computedValues"]
265-
]
253+
result["computedValues"] = body["computedValues"]
254+
266255
if "internalValidatorType" in body:
267256
result["internal_validator_type"] = body["internalValidatorType"]
268257

tests/test_collection.py

+32-1
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,27 @@ def test_collection_misc_methods(col, bad_col, cluster):
4949

5050
# Test configure properties
5151
prev_sync = properties["sync"]
52-
properties = col.configure(sync=not prev_sync, schema={})
52+
53+
computed_values = [
54+
{
55+
"name": "foo",
56+
"expression": "RETURN 1",
57+
"computeOn": ["insert", "update", "replace"],
58+
"overwrite": True,
59+
"failOnWarning": False,
60+
"keepNull": True,
61+
}
62+
]
63+
64+
properties = col.configure(
65+
sync=not prev_sync, schema={}, computed_values=computed_values
66+
)
67+
5368
assert properties["name"] == col.name
5469
assert properties["system"] is False
5570
assert properties["sync"] is not prev_sync
71+
assert properties["computedValues"] == computed_values
72+
col.configure(computed_values=[])
5673

5774
# Test configure properties with bad collection
5875
with assert_raises(CollectionConfigureError) as err:
@@ -153,6 +170,17 @@ def test_collection_management(db, bad_db, cluster):
153170
"type": "json",
154171
}
155172

173+
computed_values = [
174+
{
175+
"name": "foo",
176+
"expression": "RETURN 1",
177+
"computeOn": ["insert", "update", "replace"],
178+
"overwrite": True,
179+
"failOnWarning": False,
180+
"keepNull": True,
181+
}
182+
]
183+
156184
col = db.create_collection(
157185
name=col_name,
158186
sync=True,
@@ -172,6 +200,7 @@ def test_collection_management(db, bad_db, cluster):
172200
smart_join_attribute="test_attr",
173201
write_concern=1,
174202
schema=schema,
203+
computedValues=computed_values,
175204
)
176205
assert db.has_collection(col_name) is True
177206

@@ -181,6 +210,8 @@ def test_collection_management(db, bad_db, cluster):
181210
assert properties["name"] == col_name
182211
assert properties["sync"] is True
183212
assert properties["system"] is False
213+
assert properties["computedValues"] == computed_values
214+
col.configure(computed_values=[])
184215

185216
# Test create duplicate collection
186217
with assert_raises(CollectionCreateError) as err:

0 commit comments

Comments
 (0)