From 598ae32508cab896338e27393dd1885144ccc133 Mon Sep 17 00:00:00 2001 From: Alex Petenchea Date: Fri, 18 Aug 2023 18:13:42 +0300 Subject: [PATCH 1/5] Updating tested versions --- tester.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tester.sh b/tester.sh index 7842427d..00371890 100755 --- a/tester.sh +++ b/tester.sh @@ -21,9 +21,9 @@ if [[ "$tests" != "all" && "$tests" != "community" && "$tests" != "enterprise" ] exit 1 fi -# 3.11.1 +# 3.11.2 # 3.10.9 -# 3.9.9 +# 3.9.11 version="${3:-3.11.1}" if [[ -n "$4" && "$4" != "notest" ]]; then From f22235a5d6700ab2ce355236f9c77604536cf965 Mon Sep 17 00:00:00 2001 From: Alex Petenchea Date: Fri, 18 Aug 2023 18:35:37 +0300 Subject: [PATCH 2/5] Adding shards method to Collection --- arango/collection.py | 29 +++++++++++++++++++++++++++++ arango/exceptions.py | 4 ++++ tests/test_collection.py | 7 +++++++ 3 files changed, 40 insertions(+) diff --git a/arango/collection.py b/arango/collection.py index 4e2f885e..6b35dc0e 100644 --- a/arango/collection.py +++ b/arango/collection.py @@ -16,6 +16,7 @@ CollectionRenameError, CollectionResponsibleShardError, CollectionRevisionError, + CollectionShardsError, CollectionStatisticsError, CollectionTruncateError, CollectionUnloadError, @@ -300,6 +301,31 @@ def response_handler(resp: Response) -> Json: return self._execute(request, response_handler) + def shards(self, details: bool = False) -> Result[Json]: + """Return collection shards and properties. + + Available only in a cluster setup. + + :param details: Include responsible servers for each shard. + :type details: bool + :return: Collection shards and properties. + :rtype: dict + :raise arango.exceptions.CollectionShardsError: If retrieval fails. + """ + request = Request( + method="get", + endpoint=f"/_api/collection/{self.name}/shards", + params={"details": details}, + read=self.name, + ) + + def response_handler(resp: Response) -> Json: + if resp.is_success: + return format_collection(resp.body) + raise CollectionShardsError(resp, request) + + return self._execute(request, response_handler) + def configure( self, sync: Optional[bool] = None, @@ -330,6 +356,9 @@ def configure( Default value is 1. Used for clusters only. :type write_concern: int :return: New collection properties. + :param computed_values: Define expressions on the collection level that + run on inserts, modifications, or both. + :type computed_values: dict | None :rtype: dict :raise arango.exceptions.CollectionConfigureError: If operation fails. """ diff --git a/arango/exceptions.py b/arango/exceptions.py index 9320c957..3de1c9ea 100644 --- a/arango/exceptions.py +++ b/arango/exceptions.py @@ -258,6 +258,10 @@ class CollectionConfigureError(ArangoServerError): """Failed to configure collection properties.""" +class CollectionShardsError(ArangoServerError): + """Failed to retrieve collection shards.""" + + class CollectionStatisticsError(ArangoServerError): """Failed to retrieve collection statistics.""" diff --git a/tests/test_collection.py b/tests/test_collection.py index b9d961b2..10239a23 100644 --- a/tests/test_collection.py +++ b/tests/test_collection.py @@ -204,6 +204,13 @@ def test_collection_management(db, bad_db, cluster): ) assert db.has_collection(col_name) is True + if cluster: + for details in (False, True): + shards = col.shards(details=details) + assert shards["name"] == col_name + assert shards["system"] is False + assert len(shards["shards"]) == 2 + properties = col.properties() assert "key_options" in properties assert properties["schema"] == schema From 61ef9ccc15b7d57d02bb503d684d4df79915dbe3 Mon Sep 17 00:00:00 2001 From: Alex Petenchea Date: Fri, 18 Aug 2023 18:37:47 +0300 Subject: [PATCH 3/5] Updating driver version --- arango/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arango/request.py b/arango/request.py index 2496321b..8ae7bd0c 100644 --- a/arango/request.py +++ b/arango/request.py @@ -12,7 +12,7 @@ def normalize_headers( if driver_flags is not None: for flag in driver_flags: flags = flags + flag + ";" - driver_version = "7.5.8" + driver_version = "7.6.0" driver_header = "python-arango/" + driver_version + " (" + flags + ")" normalized_headers: Headers = { "charset": "utf-8", From bfe86c124afef41bd8e9fe54437346bd7b849490 Mon Sep 17 00:00:00 2001 From: Alex Petenchea Date: Fri, 18 Aug 2023 18:38:02 +0300 Subject: [PATCH 4/5] Added changelog entry --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08bfd260..10362828 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ +main +----- + +* [DE-542] Added `shards()` method to `Collection` + 7.6.0 ----- +----- * [DE-562] Index Cache Refilling by @apetenchea in https://github.com/ArangoDB-Community/python-arango/pull/259 From 410164cc06597ddc9be0017512b2941900ced979 Mon Sep 17 00:00:00 2001 From: Alex Petenchea Date: Fri, 18 Aug 2023 19:06:33 +0300 Subject: [PATCH 5/5] Fixing test_database_misc_methods --- tests/test_database.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/test_database.py b/tests/test_database.py index d93e4995..60685c0f 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -56,7 +56,7 @@ def test_database_attributes(db, username): assert isinstance(db.wal, WAL) -def test_database_misc_methods(sys_db, db, bad_db): +def test_database_misc_methods(sys_db, db, bad_db, cluster): # Test get properties properties = db.properties() assert "id" in properties @@ -202,10 +202,6 @@ def test_database_misc_methods(sys_db, db, bad_db): # Test get log levels assert isinstance(sys_db.log_levels(), dict) - # Test get log levels (with server_id) - server_id = sys_db.replication.server_id() - assert isinstance(sys_db.log_levels(server_id), dict) - # Test get log levels with bad database with assert_raises(ServerLogLevelError) as err: bad_db.log_levels() @@ -219,12 +215,17 @@ def test_database_misc_methods(sys_db, db, bad_db): for key, value in sys_db.log_levels().items(): assert result[key] == value - # Test set log levels (with server_id) - result = sys_db.set_log_levels(server_id, **new_levels) - for key, value in new_levels.items(): - assert result[key] == value - for key, value in sys_db.log_levels(server_id).items(): - assert result[key] == value + if cluster: + # Test get log levels (with server_id) + server_id = sys_db.cluster.server_id() + assert isinstance(sys_db.log_levels(server_id), dict) + + # Test set log levels (with server_id) + result = sys_db.set_log_levels(server_id, **new_levels) + for key, value in new_levels.items(): + assert result[key] == value + for key, value in sys_db.log_levels(server_id).items(): + assert result[key] == value # Test set log levels with bad database with assert_raises(ServerLogLevelSetError):