[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:
Will 2018-06-09 20:27:06 -04:00 committed by GitHub
parent a070dffb93
commit 470521f7c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 104 additions and 30 deletions

1
.gitignore vendored
View File

@ -2,6 +2,7 @@
*.exe
*.dll
.data
!/tests/cogs/dataconverter/data/**/*.json
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm

View File

@ -119,11 +119,10 @@ class SpecResolver(object):
def past_nicknames_conv_spec(self, data: dict):
flatscoped = self.apply_scope(Config.MEMBER, self.flatten_dict(data))
ret = {}
for k, v in flatscoped.items():
outerkey, innerkey = (*k[:-1],), (k[-1],)
if outerkey not in ret:
ret[outerkey] = {}
ret[outerkey].update({innerkey: v})
for config_identifiers, v2data in flatscoped.items():
if config_identifiers not in ret:
ret[config_identifiers] = {}
ret[config_identifiers].update({("past_nicks",): v2data})
return ret
def customcom_conv_spec(self, data: dict):
@ -144,18 +143,28 @@ class SpecResolver(object):
ret[outerkey].update({innerkey: ccinfo})
return ret
async def convert(self, bot: Red, prettyname: str):
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"]
def get_config_object(self, bot, cogname, attr, _id):
try:
config = getattr(bot.get_cog(cogname), attr)
except (TypeError, AttributeError):
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:
items = converter(dc.json_load(filepath))
await dc(config).dict_import(items)

View File

View File

@ -0,0 +1,26 @@
{
"1" : {
"1" : [
"Test",
"Test2",
"TEST3"
],
"2" : [
"Test4",
"Test5",
"TEST6"
]
},
"2" : {
"1" : [
"Test",
"Test2",
"TEST3"
],
"2" : [
"Test4",
"Test5",
"TEST6"
]
}
}

View 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

View File

@ -1,15 +1,14 @@
import pytest
from redbot.cogs.alias import Alias
from redbot.core import Config
@pytest.fixture()
def alias(config):
import redbot.cogs.alias.alias
redbot.cogs.alias.alias.Config.get_conf = lambda *args, **kwargs: config
return Alias(None)
def alias(config, monkeypatch):
with monkeypatch.context() as m:
m.setattr(Config, "get_conf", lambda *args, **kwargs: config)
return Alias(None)
def test_is_valid_alias_name(alias):

View File

@ -2,15 +2,15 @@ import pytest
@pytest.fixture()
def bank(config):
def bank(config, monkeypatch):
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()
return bank
bank._register_defaults()
return bank
@pytest.mark.asyncio

View File

@ -2,15 +2,15 @@ import pytest
@pytest.fixture
def mod(config):
def mod(config, monkeypatch):
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()
return modlog
modlog._register_defaults()
return modlog
@pytest.mark.asyncio