mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 11:18:54 -05:00
[V3 JSON] Drivers deepcopy input/output data (#1855)
* [V3 JSON] Return deepcopy in JSON driver * Add a test * foo not bar * Add a test for setting and then mutating * Resolve issue for setting and mutating as well * Reformat
This commit is contained in:
parent
bfd6e4af3f
commit
0298b53803
@ -335,7 +335,7 @@ class Group(Value):
|
|||||||
default = poss_default
|
default = poss_default
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return deepcopy(await self.driver.get(*self.identifiers, *path))
|
return await self.driver.get(*self.identifiers, *path)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
if default is not ...:
|
if default is not ...:
|
||||||
return default
|
return default
|
||||||
@ -365,7 +365,7 @@ class Group(Value):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
if not defaults:
|
if not defaults:
|
||||||
defaults = deepcopy(self.defaults)
|
defaults = self.defaults
|
||||||
|
|
||||||
for key, value in current.items():
|
for key, value in current.items():
|
||||||
if isinstance(value, collections.Mapping):
|
if isinstance(value, collections.Mapping):
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
import copy
|
||||||
import weakref
|
import weakref
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -97,7 +98,7 @@ class JSON(BaseDriver):
|
|||||||
full_identifiers = (self.unique_cog_identifier, *identifiers)
|
full_identifiers = (self.unique_cog_identifier, *identifiers)
|
||||||
for i in full_identifiers:
|
for i in full_identifiers:
|
||||||
partial = partial[i]
|
partial = partial[i]
|
||||||
return partial
|
return copy.deepcopy(partial)
|
||||||
|
|
||||||
async def set(self, *identifiers: str, value=None):
|
async def set(self, *identifiers: str, value=None):
|
||||||
partial = self.data
|
partial = self.data
|
||||||
@ -107,7 +108,7 @@ class JSON(BaseDriver):
|
|||||||
partial[i] = {}
|
partial[i] = {}
|
||||||
partial = partial[i]
|
partial = partial[i]
|
||||||
|
|
||||||
partial[full_identifiers[-1]] = value
|
partial[full_identifiers[-1]] = copy.deepcopy(value)
|
||||||
await self.jsonIO._threadsafe_save_json(self.data)
|
await self.jsonIO._threadsafe_save_json(self.data)
|
||||||
|
|
||||||
async def clear(self, *identifiers: str):
|
async def clear(self, *identifiers: str):
|
||||||
|
|||||||
@ -379,13 +379,9 @@ async def test_value_ctxmgr_saves(config):
|
|||||||
async def test_value_ctxmgr_immutable(config):
|
async def test_value_ctxmgr_immutable(config):
|
||||||
config.register_global(foo=True)
|
config.register_global(foo=True)
|
||||||
|
|
||||||
try:
|
with pytest.raises(TypeError):
|
||||||
async with config.foo() as foo:
|
async with config.foo() as foo:
|
||||||
foo = False
|
foo = False
|
||||||
except TypeError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
raise AssertionError
|
|
||||||
|
|
||||||
foo = await config.foo()
|
foo = await config.foo()
|
||||||
assert foo is True
|
assert foo is True
|
||||||
@ -401,3 +397,25 @@ async def test_ctxmgr_no_shared_default(config, member_factory):
|
|||||||
foo.append(1)
|
foo.append(1)
|
||||||
|
|
||||||
assert 1 not in await config.member(m2).foo()
|
assert 1 not in await config.member(m2).foo()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_get_then_mutate(config):
|
||||||
|
"""Tests that mutating an object after getting it as a value doesn't mutate the data store."""
|
||||||
|
config.register_global(list1=[])
|
||||||
|
await config.list1.set([])
|
||||||
|
list1 = await config.list1()
|
||||||
|
list1.append("foo")
|
||||||
|
list1 = await config.list1()
|
||||||
|
assert "foo" not in list1
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_set_then_mutate(config):
|
||||||
|
"""Tests that mutating an object after setting it as a value doesn't mutate the data store."""
|
||||||
|
config.register_global(list1=[])
|
||||||
|
list1 = []
|
||||||
|
await config.list1.set(list1)
|
||||||
|
list1.append("foo")
|
||||||
|
list1 = await config.list1()
|
||||||
|
assert "foo" not in list1
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user