summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordvora-h <dvora.heller@redis.com>2021-12-19 17:38:57 +0200
committerdvora-h <dvora.heller@redis.com>2021-12-19 17:38:57 +0200
commitaa0c80906a58ce4f79b3251e095d1fe0b816cf15 (patch)
tree583a16aa7ca806db4907b80784e261b73ee917a3
parentf82ab336c3e249ee871ee5e50e10c0de08c4f38a (diff)
downloadredis-py-aa0c80906a58ce4f79b3251e095d1fe0b816cf15.tar.gz
add set_file and set_path
-rw-r--r--redis/commands/json/commands.py39
-rw-r--r--tests/test_json.py12
2 files changed, 51 insertions, 0 deletions
diff --git a/redis/commands/json/commands.py b/redis/commands/json/commands.py
index e7f07b6..92b018c 100644
--- a/redis/commands/json/commands.py
+++ b/redis/commands/json/commands.py
@@ -4,6 +4,8 @@ from redis.exceptions import DataError
from .decoders import decode_dict_keys
from .path import Path
+from json import loads, JSONDecodeError
+import os
class JSONCommands:
@@ -213,6 +215,43 @@ class JSONCommands:
pieces.append("XX")
return self.execute_command("JSON.SET", *pieces)
+ def set_file(self, name, path, file_name, nx=False, xx=False, decode_keys=False):
+ """
+ Set the JSON value at key ``name`` under the ``path`` to the contents of the json file ``file_name``.
+
+ ``nx`` if set to True, set ``value`` only if it does not exist.
+ ``xx`` if set to True, set ``value`` only if it exists.
+ ``decode_keys`` If set to True, the keys of ``obj`` will be decoded
+ with utf-8.
+
+ """
+ try:
+ file_content = loads(file_name)
+ except JSONDecodeError:
+ raise JSONDecodeError("Inappropriate file type, set_file() requires json file")
+
+ return self.set(name, path, file_content, nx, xx, decode_keys)
+
+
+ def set_path(self, json_path, root_directory , nx=False, xx=False, decode_keys=False):
+ """
+
+ """
+ set_files_result = {}
+ for root, dirs, files in os.walk(root_directory):
+ for file in files:
+ try:
+ file_name = file.rsplit('.')[0]
+ file_path = os.path.join(root, file)
+ self.set_file(file_name, json_path, file_path, nx, xx, decode_keys)
+ set_files_result[os.path.join(root, file)] = True
+ except JSONDecodeError:
+ set_files_result[os.path.join(root, file)] = False
+
+ return set_files_result
+
+
+
def strlen(self, name, path=None):
"""Return the length of the string JSON value under ``path`` at key
``name``.
diff --git a/tests/test_json.py b/tests/test_json.py
index a99547d..74b00ea 100644
--- a/tests/test_json.py
+++ b/tests/test_json.py
@@ -1392,3 +1392,15 @@ def test_custom_decoder(client):
assert client.exists("foo") == 0
assert not isinstance(cj.__encoder__, json.JSONEncoder)
assert not isinstance(cj.__decoder__, json.JSONDecoder)
+
+
+@pytest.mark.redismod
+def test_set_file(client):
+ import tempfile
+ import json
+
+ jsonfile = tempfile.NamedTemporaryFile(suffix=".json")
+ with open(jsonfile.name, 'w+') as fp:
+ fp.write(json.dumps({"hello": "world"}))
+
+ assert client.json().set("test", Path.rootPath(), jsonfile.name) \ No newline at end of file