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]