mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 03:08:55 -05:00
Ya'll are gonna hate me. * Initial modifications * Add initial setup.py * working setup py help * Modify setup file to package stuff * Move a bunch of shit and fix imports * Fix or skip tests * Must add init files for find_packages to work * Move main to scripts folder and rename * Add shebangs * Copy over translation files * WORKING PIP INSTALL * add dependency information * Hardcoded version for now, will need to figure out a better way to do this * OKAY ITS FINALLY FUCKING WORKING * Add this guy * Fix stuff * Change readme to rst * Remove double sentry opt in * Oopsie * Fix this thing * Aaaand fix test * Aaaand fix test * Fix core cog importing and default cog install path * Adjust readme * change instance name from optional to required * Ayyy let's do more dependency injection
56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
import functools
|
|
import json
|
|
import os
|
|
import asyncio
|
|
import logging
|
|
from uuid import uuid4
|
|
|
|
# This is basically our old DataIO, except that it's now threadsafe
|
|
# and just a base for much more elaborate classes
|
|
from pathlib import Path
|
|
|
|
log = logging.getLogger("red")
|
|
|
|
PRETTY = {"indent": 4, "sort_keys": True, "separators": (',', ' : ')}
|
|
MINIFIED = {"sort_keys": True, "separators": (',', ':')}
|
|
|
|
|
|
class JsonIO:
|
|
"""Basic functions for atomic saving / loading of json files"""
|
|
def __init__(self, path: Path=Path.cwd()):
|
|
"""
|
|
:param path: Full path to file.
|
|
"""
|
|
self._lock = asyncio.Lock()
|
|
self.path = path
|
|
|
|
# noinspection PyUnresolvedReferences
|
|
def _save_json(self, data, settings=PRETTY):
|
|
log.debug("Saving file {}".format(self.path))
|
|
filename = self.path.stem
|
|
tmp_file = "{}-{}.tmp".format(filename, uuid4().fields[0])
|
|
tmp_path = self.path.parent / tmp_file
|
|
with tmp_path.open(encoding="utf-8", mode="w") as f:
|
|
json.dump(data, f, **settings)
|
|
tmp_path.replace(self.path)
|
|
|
|
async def _threadsafe_save_json(self, data, settings=PRETTY):
|
|
loop = asyncio.get_event_loop()
|
|
func = functools.partial(self._save_json, data, settings)
|
|
with await self._lock:
|
|
await loop.run_in_executor(None, func)
|
|
|
|
# noinspection PyUnresolvedReferences
|
|
def _load_json(self):
|
|
log.debug("Reading file {}".format(self.path))
|
|
with self.path.open(encoding='utf-8', mode="r") as f:
|
|
data = json.load(f)
|
|
return data
|
|
|
|
async def _threadsafe_load_json(self, path):
|
|
loop = asyncio.get_event_loop()
|
|
func = functools.partial(self._load_json, path)
|
|
task = loop.run_in_executor(None, func)
|
|
with await self._lock:
|
|
return await asyncio.wait_for(task)
|