Add float -> int migration to Bank (float was a bug) (#4386)

* Add float -> int migration to Bank (float was a bug)

* wrong refs

* Cause ctx manager compares before and after values...
This commit is contained in:
jack1142 2020-09-01 02:04:19 +02:00 committed by GitHub
parent 4adf328fac
commit b11359eebb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 4 deletions

View File

@ -47,7 +47,10 @@ __all__ = [
_MAX_BALANCE = 2 ** 63 - 1
_SCHEMA_VERSION = 1
_DEFAULT_GLOBAL = {
"schema_version": 0,
"is_global": False,
"bank_name": "Twentysix bank",
"currency": "credits",
@ -73,13 +76,48 @@ log = logging.getLogger("red.core.bank")
_data_deletion_lock = asyncio.Lock()
def _init():
async def _init():
global _config
_config = Config.get_conf(None, 384734293238749, cog_name="Bank", force_registration=True)
_config.register_global(**_DEFAULT_GLOBAL)
_config.register_guild(**_DEFAULT_GUILD)
_config.register_member(**_DEFAULT_MEMBER)
_config.register_user(**_DEFAULT_USER)
await _migrate_config()
async def _migrate_config():
schema_version = await _config.schema_version()
if schema_version == _SCHEMA_VERSION:
return
if schema_version == 0:
await _schema_0_to_1()
schema_version += 1
await _config.schema_version.set(schema_version)
async def _schema_0_to_1():
# convert floats in bank balances to ints
# don't use anything seen below in extensions, it's optimized and controlled for here,
# but can't be safe in 3rd party use
# this CANNOT use ctx manager, because ctx managers compare before and after,
# and floats can be equal to ints: (1.0 == 1) is True
group = _config._get_base_group(_config.USER)
bank_user_data = await group.all()
for user_config in bank_user_data.values():
user_config["balance"] = int(user_config["balance"])
await group.set(bank_user_data)
group = _config._get_base_group(_config.MEMBER)
bank_member_data = await group.all()
for guild_data in bank_member_data.values():
for member_config in guild_data.values():
member_config["balance"] = int(member_config["balance"])
await group.set(bank_member_data)
async def _process_data_deletion(

View File

@ -738,7 +738,7 @@ class RedBase(
self.add_cog(Dev())
await modlog._init(self)
bank._init()
await bank._init()
packages = []

View File

@ -5,11 +5,11 @@ __all__ = ["bank"]
@pytest.fixture()
def bank(config, monkeypatch):
async def bank(config, monkeypatch):
from redbot.core import Config
with monkeypatch.context() as m:
m.setattr(Config, "get_conf", lambda *args, **kwargs: config)
# noinspection PyProtectedMember
bank_module._init()
await bank_module._init()
return bank_module