This is an automated email from the ASF dual-hosted git repository.

hsluoyz pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/casbin-python-redis-adapter.git


The following commit(s) were added to refs/heads/master by this push:
     new 0d1efc1  feat: load policy with a single LRANGE instead of one LINDEX 
per rule (#4)
0d1efc1 is described below

commit 0d1efc1e5abcd9d7e6a3848e69ea5beaebdc7e9a
Author: Joe <[email protected]>
AuthorDate: Fri Oct 9 18:27:11 2026 +0200

    feat: load policy with a single LRANGE instead of one LINDEX per rule (#4)
---
 casbin_redis_adapter/adapter.py |  6 +++---
 tests/test_adapter.py           | 19 +++++++++++++++++++
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/casbin_redis_adapter/adapter.py b/casbin_redis_adapter/adapter.py
index fbbabd8..8ec342d 100644
--- a/casbin_redis_adapter/adapter.py
+++ b/casbin_redis_adapter/adapter.py
@@ -73,9 +73,9 @@ class Adapter(persist.Adapter):
             model (CasbinRule): CasbinRule object
         """
 
-        length = self.client.llen(self.key)
-        for i in range(length):
-            line = self.client.lindex(self.key, i)
+        # Fetch the whole list with a single LRANGE: one round trip instead of
+        # one LINDEX per rule, and an atomic snapshot of the list.
+        for line in self.client.lrange(self.key, 0, -1):
             line = json.loads(line)
             rule = CasbinRule(**line)
             persist.load_policy_line(str(rule), model)
diff --git a/tests/test_adapter.py b/tests/test_adapter.py
index 858a7de..9d6569b 100644
--- a/tests/test_adapter.py
+++ b/tests/test_adapter.py
@@ -2,6 +2,7 @@ from casbin_redis_adapter.adapter import Adapter
 from casbin_redis_adapter.adapter import CasbinRule
 
 from unittest import TestCase
+from unittest import mock
 import redis
 import casbin
 import os
@@ -71,6 +72,24 @@ class TestConfig(TestCase):
         self.assertTrue(e.enforce("alice", "data2", "read"))
         self.assertTrue(e.enforce("alice", "data2", "write"))
 
+    def test_load_policy_single_round_trip(self):
+        """
+        test load_policy reads all rules with one LRANGE, not one LINDEX per 
rule
+        """
+        e = get_enforcer()
+        adapter = e.get_adapter()
+        with mock.patch.object(
+            adapter.client, "lrange", wraps=adapter.client.lrange
+        ) as lrange, mock.patch.object(
+            adapter.client, "lindex", side_effect=AssertionError("LINDEX used")
+        ):
+            e.load_policy()
+        lrange.assert_called_once_with("casbin_rules", 0, -1)
+        self.assertEqual(len(e.get_policy()), 4)
+        self.assertEqual(len(e.get_grouping_policy()), 1)
+        self.assertTrue(e.enforce("alice", "data1", "read"))
+        self.assertTrue(e.enforce("alice", "data2", "write"))
+
     def test_add_policy(self):
         """
         test add_policy


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to