mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 03:08:55 -05:00
[V3 DataConverter] Fix past nicks conversion for mod (#1840)
* Fix existing tests permanently modifying attributes * Add dataconverter tests file * Fix past nicks spec converter * Update gitignore for dataconverter data files * Add data file for dataconverter test * Simplify fix
This commit is contained in:
parent
a070dffb93
commit
470521f7c8
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,6 +2,7 @@
|
|||||||
*.exe
|
*.exe
|
||||||
*.dll
|
*.dll
|
||||||
.data
|
.data
|
||||||
|
!/tests/cogs/dataconverter/data/**/*.json
|
||||||
|
|
||||||
### JetBrains template
|
### JetBrains template
|
||||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||||
|
|||||||
@ -119,11 +119,10 @@ class SpecResolver(object):
|
|||||||
def past_nicknames_conv_spec(self, data: dict):
|
def past_nicknames_conv_spec(self, data: dict):
|
||||||
flatscoped = self.apply_scope(Config.MEMBER, self.flatten_dict(data))
|
flatscoped = self.apply_scope(Config.MEMBER, self.flatten_dict(data))
|
||||||
ret = {}
|
ret = {}
|
||||||
for k, v in flatscoped.items():
|
for config_identifiers, v2data in flatscoped.items():
|
||||||
outerkey, innerkey = (*k[:-1],), (k[-1],)
|
if config_identifiers not in ret:
|
||||||
if outerkey not in ret:
|
ret[config_identifiers] = {}
|
||||||
ret[outerkey] = {}
|
ret[config_identifiers].update({("past_nicks",): v2data})
|
||||||
ret[outerkey].update({innerkey: v})
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def customcom_conv_spec(self, data: dict):
|
def customcom_conv_spec(self, data: dict):
|
||||||
@ -144,18 +143,28 @@ class SpecResolver(object):
|
|||||||
ret[outerkey].update({innerkey: ccinfo})
|
ret[outerkey].update({innerkey: ccinfo})
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
async def convert(self, bot: Red, prettyname: str):
|
def get_config_object(self, bot, cogname, attr, _id):
|
||||||
if prettyname not in self.available:
|
|
||||||
raise NotImplementedError("No Conversion Specs for this")
|
|
||||||
|
|
||||||
info = self.available_core_conversions[prettyname]
|
|
||||||
filepath, converter = info["file"], info["converter"]
|
|
||||||
(cogname, attr, _id) = info["cfg"]
|
|
||||||
try:
|
try:
|
||||||
config = getattr(bot.get_cog(cogname), attr)
|
config = getattr(bot.get_cog(cogname), attr)
|
||||||
except (TypeError, AttributeError):
|
except (TypeError, AttributeError):
|
||||||
config = Config.get_conf(None, _id, cog_name=cogname)
|
config = Config.get_conf(None, _id, cog_name=cogname)
|
||||||
|
|
||||||
|
return config
|
||||||
|
|
||||||
|
def get_conversion_info(self, prettyname: str):
|
||||||
|
info = self.available_core_conversions[prettyname]
|
||||||
|
filepath, converter = info["file"], info["converter"]
|
||||||
|
(cogname, attr, _id) = info["cfg"]
|
||||||
|
return filepath, converter, cogname, attr, _id
|
||||||
|
|
||||||
|
async def convert(self, bot: Red, prettyname: str, config=None):
|
||||||
|
if prettyname not in self.available:
|
||||||
|
raise NotImplementedError("No Conversion Specs for this")
|
||||||
|
|
||||||
|
filepath, converter, cogname, attr, _id = self.get_conversion_info(prettyname)
|
||||||
|
if config is None:
|
||||||
|
config = self.get_config_object(bot, cogname, attr, _id)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
items = converter(dc.json_load(filepath))
|
items = converter(dc.json_load(filepath))
|
||||||
await dc(config).dict_import(items)
|
await dc(config).dict_import(items)
|
||||||
|
|||||||
0
tests/cogs/dataconverter/__init__.py
Normal file
0
tests/cogs/dataconverter/__init__.py
Normal file
26
tests/cogs/dataconverter/data/mod/past_nicknames.json
Normal file
26
tests/cogs/dataconverter/data/mod/past_nicknames.json
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"1" : {
|
||||||
|
"1" : [
|
||||||
|
"Test",
|
||||||
|
"Test2",
|
||||||
|
"TEST3"
|
||||||
|
],
|
||||||
|
"2" : [
|
||||||
|
"Test4",
|
||||||
|
"Test5",
|
||||||
|
"TEST6"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"2" : {
|
||||||
|
"1" : [
|
||||||
|
"Test",
|
||||||
|
"Test2",
|
||||||
|
"TEST3"
|
||||||
|
],
|
||||||
|
"2" : [
|
||||||
|
"Test4",
|
||||||
|
"Test5",
|
||||||
|
"TEST6"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
39
tests/cogs/dataconverter/test_dataconverter.py
Normal file
39
tests/cogs/dataconverter/test_dataconverter.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import pytest
|
||||||
|
from pathlib import Path
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
from redbot.cogs.dataconverter import core_specs
|
||||||
|
from redbot.core.utils.data_converter import DataConverter
|
||||||
|
|
||||||
|
|
||||||
|
def mock_dpy_object(id_):
|
||||||
|
return namedtuple("DPYObject", "id")(int(id_))
|
||||||
|
|
||||||
|
|
||||||
|
def mock_dpy_member(guildid, userid):
|
||||||
|
return namedtuple("Member", "id guild")(int(userid), mock_dpy_object(guildid))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def specresolver():
|
||||||
|
here = Path(__file__)
|
||||||
|
|
||||||
|
resolver = core_specs.SpecResolver(here.parent)
|
||||||
|
return resolver
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_mod_nicknames(red, specresolver: core_specs.SpecResolver):
|
||||||
|
filepath, converter, cogname, attr, _id = specresolver.get_conversion_info("Past Nicknames")
|
||||||
|
conf = specresolver.get_config_object(red, cogname, attr, _id)
|
||||||
|
|
||||||
|
v2data = DataConverter.json_load(filepath)
|
||||||
|
|
||||||
|
await specresolver.convert(red, "Past Nicknames", config=conf)
|
||||||
|
|
||||||
|
for guildid, guild_data in v2data.items():
|
||||||
|
guild = mock_dpy_object(guildid)
|
||||||
|
for userid, user_data in guild_data.items():
|
||||||
|
member = mock_dpy_member(guildid, userid)
|
||||||
|
|
||||||
|
assert await conf.member(member).past_nicks() == user_data
|
||||||
@ -1,14 +1,13 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from redbot.cogs.alias import Alias
|
from redbot.cogs.alias import Alias
|
||||||
|
from redbot.core import Config
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def alias(config):
|
def alias(config, monkeypatch):
|
||||||
import redbot.cogs.alias.alias
|
with monkeypatch.context() as m:
|
||||||
|
m.setattr(Config, "get_conf", lambda *args, **kwargs: config)
|
||||||
redbot.cogs.alias.alias.Config.get_conf = lambda *args, **kwargs: config
|
|
||||||
|
|
||||||
return Alias(None)
|
return Alias(None)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,11 +2,11 @@ import pytest
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def bank(config):
|
def bank(config, monkeypatch):
|
||||||
from redbot.core import Config
|
from redbot.core import Config
|
||||||
|
|
||||||
Config.get_conf = lambda *args, **kwargs: config
|
with monkeypatch.context() as m:
|
||||||
|
m.setattr(Config, "get_conf", lambda *args, **kwargs: config)
|
||||||
from redbot.core import bank
|
from redbot.core import bank
|
||||||
|
|
||||||
bank._register_defaults()
|
bank._register_defaults()
|
||||||
|
|||||||
@ -2,11 +2,11 @@ import pytest
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mod(config):
|
def mod(config, monkeypatch):
|
||||||
from redbot.core import Config
|
from redbot.core import Config
|
||||||
|
|
||||||
Config.get_conf = lambda *args, **kwargs: config
|
with monkeypatch.context() as m:
|
||||||
|
m.setattr(Config, "get_conf", lambda *args, **kwargs: config)
|
||||||
from redbot.core import modlog
|
from redbot.core import modlog
|
||||||
|
|
||||||
modlog._register_defaults()
|
modlog._register_defaults()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user