Support SQLite

This commit is contained in:
洛水居室 2023-03-25 11:17:38 +08:00 committed by GitHub
parent 064a4083c5
commit 444d3e2bdc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 182 additions and 148 deletions

View File

@ -7,7 +7,8 @@ RELOAD_DIRS=[]
RELOAD_INCLUDE=[] RELOAD_INCLUDE=[]
RELOAD_EXCLUDE=[] RELOAD_EXCLUDE=[]
# MySQL # Database
DB_DRIVER_NAME=mysql+asyncmy
DB_HOST=127.0.0.1 DB_HOST=127.0.0.1
DB_PORT=3306 DB_PORT=3306
DB_USERNAME=user DB_USERNAME=user

View File

@ -19,7 +19,7 @@
## 环境需求 ## 环境需求
- Python 3.11+ - Python 3.11+
- MySQL - MySQL or SQLite
- Redis - Redis
## 使用方法 ## 使用方法

View File

@ -56,8 +56,6 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne
# output_encoding = utf-8 # output_encoding = utf-8
# sqlalchemy.url = driver://user:pass@localhost/dbname # sqlalchemy.url = driver://user:pass@localhost/dbname
sqlalchemy.url = mysql+asyncmy://%(DB_USERNAME)s:%(DB_PASSWORD)s@%(DB_HOST)s:%(DB_PORT)s/%(DB_DATABASE)s
[post_write_hooks] [post_write_hooks]
# post_write_hooks defines scripts or Python functions that are run # post_write_hooks defines scripts or Python functions that are run

View File

@ -7,22 +7,22 @@ from typing import Iterator
from alembic import context from alembic import context
from sqlalchemy import engine_from_config, pool from sqlalchemy import engine_from_config, pool
from sqlalchemy.engine import Connection from sqlalchemy.engine import Connection, URL
from sqlalchemy.ext.asyncio import AsyncEngine from sqlalchemy.ext.asyncio import AsyncEngine
from sqlmodel import SQLModel from sqlmodel import SQLModel
from core.config import config as BotConfig from core.config import config as application_config
from utils.const import CORE_DIR, PLUGIN_DIR, PROJECT_ROOT from utils.const import CORE_DIR, PLUGIN_DIR, PROJECT_ROOT
from utils.log import logger from utils.log import logger
# this is the Alembic Config object, which provides # this is the Alembic Config object, which provides
# access to the values within the .ini file in use. # access to the values within the .ini file in use.
config = context.config alembic_cfg = context.config
# Interpret the config file for Python logging. # Interpret the config file for Python logging.
# This line sets up loggers basically. # This line sets up loggers basically.
if config.config_file_name is not None: if alembic_cfg.config_file_name is not None:
fileConfig(config.config_file_name) # skipcq: PY-A6006 fileConfig(alembic_cfg.config_file_name) # skipcq: PY-A6006
def scan_models() -> Iterator[str]: def scan_models() -> Iterator[str]:
@ -40,7 +40,13 @@ def import_models():
try: try:
import_module(pkg) # 导入 models import_module(pkg) # 导入 models
except Exception as e: # pylint: disable=W0703 except Exception as e: # pylint: disable=W0703
logger.error("在导入文件 %s 的过程中遇到了错误: \n[red bold]%s: %s[/]", pkg, type(e).__name__, e, extra={"markup": True}) logger.error(
"在导入文件 %s 的过程中遇到了错误: \n[red bold]%s: %s[/]",
pkg,
type(e).__name__,
e,
extra={"markup": True},
)
# register our models for alembic to auto-generate migrations # register our models for alembic to auto-generate migrations
@ -56,12 +62,17 @@ target_metadata = SQLModel.metadata
# here we allow ourselves to pass interpolation vars to alembic.ini # here we allow ourselves to pass interpolation vars to alembic.ini
# from the application config module # from the application config module
section = config.config_ini_section sqlalchemy_url = alembic_cfg.get_main_option("sqlalchemy.url")
config.set_section_option(section, "DB_HOST", BotConfig.mysql.host) if sqlalchemy_url is None:
config.set_section_option(section, "DB_PORT", str(BotConfig.mysql.port)) new_url = URL.create(
config.set_section_option(section, "DB_USERNAME", BotConfig.mysql.username) application_config.database.driver_name,
config.set_section_option(section, "DB_PASSWORD", BotConfig.mysql.password) username=application_config.database.username,
config.set_section_option(section, "DB_DATABASE", BotConfig.mysql.database) password=application_config.database.password,
host=application_config.database.host,
port=application_config.database.port,
database=application_config.database.database,
)
alembic_cfg.set_main_option("sqlalchemy.url", str(new_url))
def run_migrations_offline() -> None: def run_migrations_offline() -> None:
@ -76,7 +87,7 @@ def run_migrations_offline() -> None:
script output. script output.
""" """
url = config.get_main_option("sqlalchemy.url") url = alembic_cfg.get_main_option("sqlalchemy.url")
context.configure( context.configure(
url=url, url=url,
target_metadata=target_metadata, target_metadata=target_metadata,
@ -104,7 +115,7 @@ async def run_migrations_online() -> None:
""" """
connectable = AsyncEngine( connectable = AsyncEngine(
engine_from_config( engine_from_config(
config.get_section(config.config_ini_section), alembic_cfg.get_section(alembic_cfg.config_ini_section),
prefix="sqlalchemy.", prefix="sqlalchemy.",
poolclass=pool.NullPool, poolclass=pool.NullPool,
future=True, future=True,

View File

@ -128,7 +128,6 @@ def upgrade() -> None:
sa.Column( sa.Column(
"time_created", "time_created",
sa.DateTime(timezone=True), sa.DateTime(timezone=True),
server_default=sa.text("now()"),
nullable=True, nullable=True,
), ),
sa.Column("time_updated", sa.DateTime(timezone=True), nullable=True), sa.Column("time_updated", sa.DateTime(timezone=True), nullable=True),
@ -146,10 +145,7 @@ def upgrade() -> None:
), ),
nullable=True, nullable=True,
), ),
sa.ForeignKeyConstraint( sa.ForeignKeyConstraint(["user_id"], ["user.user_id"], "sign_1"),
["user_id"],
["user.user_id"],
),
sa.PrimaryKeyConstraint("id", "user_id"), sa.PrimaryKeyConstraint("id", "user_id"),
mysql_charset="utf8mb4", mysql_charset="utf8mb4",
mysql_collate="utf8mb4_general_ci", mysql_collate="utf8mb4_general_ci",

View File

@ -226,7 +226,6 @@ def upgrade() -> None:
sa.Column( sa.Column(
"create_time", "create_time",
sa.DateTime(timezone=True), sa.DateTime(timezone=True),
server_default=sa.text("now()"),
nullable=True, nullable=True,
), ),
sa.Column("last_save_time", sa.DateTime(timezone=True), nullable=True), sa.Column("last_save_time", sa.DateTime(timezone=True), nullable=True),
@ -240,8 +239,14 @@ def upgrade() -> None:
op.drop_table(old_cookies_database_name1) op.drop_table(old_cookies_database_name1)
op.drop_table(old_cookies_database_name2) op.drop_table(old_cookies_database_name2)
op.drop_table("admin") op.drop_table("admin")
op.drop_constraint("sign_ibfk_1", "sign", type_="foreignkey") context = op.get_context()
op.drop_index("user_id", table_name="sign") if context.dialect.name == "sqlite":
with op.batch_alter_table("sign") as batch_op:
batch_op.drop_constraint("sign_1", type_="foreignkey")
op.drop_table("user")
return
op.drop_constraint("sign_1", "sign", type_="foreignkey")
op.drop_index("sign_1", table_name="sign")
op.drop_table("user") op.drop_table("user")
# ### end Alembic commands ### # ### end Alembic commands ###
@ -302,8 +307,13 @@ def downgrade() -> None:
mysql_default_charset="utf8mb4", mysql_default_charset="utf8mb4",
mysql_engine="InnoDB", mysql_engine="InnoDB",
) )
op.create_foreign_key("sign_ibfk_1", "sign", "user", ["user_id"], ["user_id"]) context = op.get_context()
op.create_index("user_id", "sign", ["user_id"], unique=False) if context.dialect.name == "sqlite":
with op.batch_alter_table("sign") as batch_op:
batch_op.create_foreign_key("sign_1", type_="foreignkey")
else:
op.create_foreign_key("sign_1", "sign", "user", ["user_id"], ["user_id"])
op.create_index("sign_1", "sign", ["user_id"], unique=False)
op.drop_table("users") op.drop_table("users")
op.drop_table("players") op.drop_table("players")
op.drop_table("cookies") op.drop_table("cookies")

View File

@ -21,9 +21,10 @@ class JoinGroups(str, Enum):
ALLOW_ALL = "ALLOW_ALL" ALLOW_ALL = "ALLOW_ALL"
class MySqlConfig(Settings): class DatabaseConfig(Settings):
host: str = "127.0.0.1" driver_name: str = "mysql+asyncmy"
port: int = 3306 host: Optional[str] = None
port: Optional[int] = None
username: Optional[str] = None username: Optional[str] = None
password: Optional[str] = None password: Optional[str] = None
database: Optional[str] = None database: Optional[str] = None
@ -43,7 +44,7 @@ class RedisConfig(Settings):
class LoggerConfig(Settings): class LoggerConfig(Settings):
name: str = "TGPaimon" name: str = "PaiGram"
width: Optional[int] = None width: Optional[int] = None
time_format: str = "[%Y-%m-%d %X]" time_format: str = "[%Y-%m-%d %X]"
traceback_max_frames: int = 20 traceback_max_frames: int = 20
@ -146,7 +147,7 @@ class ApplicationConfig(Settings):
pass_challenge_user_web: str = "" pass_challenge_user_web: str = ""
reload: ReloadConfig = ReloadConfig() reload: ReloadConfig = ReloadConfig()
mysql: MySqlConfig = MySqlConfig() database: DatabaseConfig = DatabaseConfig()
logger: LoggerConfig = LoggerConfig() logger: LoggerConfig = LoggerConfig()
webserver: WebServerConfig = WebServerConfig() webserver: WebServerConfig = WebServerConfig()
redis: RedisConfig = RedisConfig() redis: RedisConfig = RedisConfig()

View File

@ -10,29 +10,30 @@ from core.base_service import BaseService
from core.config import ApplicationConfig from core.config import ApplicationConfig
from core.sqlmodel.session import AsyncSession from core.sqlmodel.session import AsyncSession
__all__ = ("MySQL",) __all__ = ("Database",)
class MySQL(BaseService.Dependence): class Database(BaseService.Dependence):
@classmethod @classmethod
def from_config(cls, config: ApplicationConfig) -> Self: def from_config(cls, config: ApplicationConfig) -> Self:
return cls(**config.mysql.dict()) return cls(**config.database.dict())
def __init__( def __init__(
self, self,
driver_name: str,
host: Optional[str] = None, host: Optional[str] = None,
port: Optional[int] = None, port: Optional[int] = None,
username: Optional[str] = None, username: Optional[str] = None,
password: Optional[str] = None, password: Optional[str] = None,
database: Optional[str] = None, database: Optional[str] = None,
): ):
self.database = database self.database = database # skipcq: PTC-W0052
self.password = password self.password = password
self.username = username self.username = username
self.port = port self.port = port
self.host = host self.host = host
self.url = URL.create( self.url = URL.create(
"mysql+asyncmy", driver_name,
username=self.username, username=self.username,
password=self.password, password=self.password,
host=self.host, host=self.host,

View File

@ -4,7 +4,7 @@ from sqlmodel import select
from core.base_service import BaseService from core.base_service import BaseService
from core.basemodel import RegionEnum from core.basemodel import RegionEnum
from core.dependence.mysql import MySQL from core.dependence.database import Database
from core.services.cookies.models import CookiesDataBase as Cookies from core.services.cookies.models import CookiesDataBase as Cookies
from core.sqlmodel.session import AsyncSession from core.sqlmodel.session import AsyncSession
@ -12,8 +12,8 @@ __all__ = ("CookiesRepository",)
class CookiesRepository(BaseService.Component): class CookiesRepository(BaseService.Component):
def __init__(self, mysql: MySQL): def __init__(self, database: Database):
self.engine = mysql.engine self.engine = database.engine
async def get( async def get(
self, self,

View File

@ -4,7 +4,7 @@ from sqlmodel import select, delete
from core.base_service import BaseService from core.base_service import BaseService
from core.basemodel import RegionEnum from core.basemodel import RegionEnum
from core.dependence.mysql import MySQL from core.dependence.database import Database
from core.services.players.models import PlayerInfoSQLModel from core.services.players.models import PlayerInfoSQLModel
from core.services.players.models import PlayersDataBase as Player from core.services.players.models import PlayersDataBase as Player
from core.sqlmodel.session import AsyncSession from core.sqlmodel.session import AsyncSession
@ -13,8 +13,8 @@ __all__ = ("PlayersRepository", "PlayerInfoRepository")
class PlayersRepository(BaseService.Component): class PlayersRepository(BaseService.Component):
def __init__(self, mysql: MySQL): def __init__(self, database: Database):
self.engine = mysql.engine self.engine = database.engine
async def get( async def get(
self, self,
@ -63,8 +63,8 @@ class PlayersRepository(BaseService.Component):
class PlayerInfoRepository(BaseService.Component): class PlayerInfoRepository(BaseService.Component):
def __init__(self, mysql: MySQL): def __init__(self, database: Database):
self.engine = mysql.engine self.engine = database.engine
async def get( async def get(
self, self,

View File

@ -3,7 +3,7 @@ from typing import List
from sqlmodel import select from sqlmodel import select
from core.base_service import BaseService from core.base_service import BaseService
from core.dependence.mysql import MySQL from core.dependence.database import Database
from core.services.quiz.models import AnswerDB, QuestionDB from core.services.quiz.models import AnswerDB, QuestionDB
from core.sqlmodel.session import AsyncSession from core.sqlmodel.session import AsyncSession
@ -11,8 +11,8 @@ __all__ = ("QuizRepository",)
class QuizRepository(BaseService.Component): class QuizRepository(BaseService.Component):
def __init__(self, mysql: MySQL): def __init__(self, database: Database):
self.engine = mysql.engine self.engine = database.engine
async def get_question_list(self) -> List[QuestionDB]: async def get_question_list(self) -> List[QuestionDB]:
async with AsyncSession(self.engine) as session: async with AsyncSession(self.engine) as session:

View File

@ -3,7 +3,7 @@ from typing import List, Optional
from sqlmodel import select from sqlmodel import select
from core.base_service import BaseService from core.base_service import BaseService
from core.dependence.mysql import MySQL from core.dependence.database import Database
from core.services.sign.models import Sign from core.services.sign.models import Sign
from core.sqlmodel.session import AsyncSession from core.sqlmodel.session import AsyncSession
@ -11,8 +11,8 @@ __all__ = ("SignRepository",)
class SignRepository(BaseService.Component): class SignRepository(BaseService.Component):
def __init__(self, mysql: MySQL): def __init__(self, database: Database):
self.engine = mysql.engine self.engine = database.engine
async def add(self, sign: Sign): async def add(self, sign: Sign):
async with AsyncSession(self.engine) as session: async with AsyncSession(self.engine) as session:

View File

@ -3,7 +3,7 @@ from typing import Optional, List
from sqlmodel import select from sqlmodel import select
from core.base_service import BaseService from core.base_service import BaseService
from core.dependence.mysql import MySQL from core.dependence.database import Database
from core.services.users.models import UserDataBase as User from core.services.users.models import UserDataBase as User
from core.sqlmodel.session import AsyncSession from core.sqlmodel.session import AsyncSession
@ -11,8 +11,8 @@ __all__ = ("UserRepository",)
class UserRepository(BaseService.Component): class UserRepository(BaseService.Component):
def __init__(self, mysql: MySQL): def __init__(self, database: Database):
self.engine = mysql.engine self.engine = database.engine
async def get_by_user_id(self, user_id: int) -> Optional[User]: async def get_by_user_id(self, user_id: int) -> Optional[User]:
async with AsyncSession(self.engine) as session: async with AsyncSession(self.engine) as session:

View File

@ -15,7 +15,7 @@ from telegram.ext import ContextTypes
from core.basemodel import RegionEnum from core.basemodel import RegionEnum
from core.config import config from core.config import config
from core.dependence.mysql import MySQL from core.dependence.database import Database
from core.dependence.redisdb import RedisDB from core.dependence.redisdb import RedisDB
from core.error import ServiceNotFoundError from core.error import ServiceNotFoundError
from core.plugin import Plugin from core.plugin import Plugin
@ -59,22 +59,22 @@ class CharacterDetailsSQLModel(SQLModel, table=True):
class CharacterDetails(Plugin): class CharacterDetails(Plugin):
def __init__( def __init__(
self, self,
mysql: MySQL, database: Database,
redis: RedisDB, redis: RedisDB,
) -> None: ) -> None:
self.mysql = mysql self.database = database
self.redis = redis.client self.redis = redis.client
self.ttl = 60 * 60 * 6 self.ttl = 60 * 60 * 6
async def initialize(self) -> None: async def initialize(self) -> None:
def fetch_and_update_objects(connection): def fetch_and_update_objects(connection):
if not self.mysql.engine.dialect.has_table(connection, table_name="character_details"): if not self.database.engine.dialect.has_table(connection, table_name="character_details"):
logger.info("正在创建角色详细信息表") logger.info("正在创建角色详细信息表")
table: "Table" = SQLModel.metadata.tables["character_details"] table: "Table" = SQLModel.metadata.tables["character_details"]
table.create(connection) table.create(connection)
logger.success("创建角色详细信息表成功") logger.success("创建角色详细信息表成功")
async with self.mysql.engine.begin() as conn: async with self.database.engine.begin() as conn:
await conn.run_sync(fetch_and_update_objects) await conn.run_sync(fetch_and_update_objects)
asyncio.create_task(self.save_character_details_task(max_ttl=None)) asyncio.create_task(self.save_character_details_task(max_ttl=None))
self.application.job_queue.run_daily(self.del_old_data_job, time(hour=3, minute=0)) self.application.job_queue.run_daily(self.del_old_data_job, time(hour=3, minute=0))
@ -89,7 +89,7 @@ class CharacterDetails(Plugin):
async def del_old_data(self, expiration_time: timedelta): async def del_old_data(self, expiration_time: timedelta):
expire_time = datetime.now() - expiration_time expire_time = datetime.now() - expiration_time
statement = delete(CharacterDetailsSQLModel).where(CharacterDetailsSQLModel.time_updated <= expire_time) statement = delete(CharacterDetailsSQLModel).where(CharacterDetailsSQLModel.time_updated <= expire_time)
async with AsyncSession(self.mysql.engine) as session: async with AsyncSession(self.database.engine) as session:
await session.execute(statement) await session.execute(statement)
async def save_character_details_task(self, max_ttl: Optional[int] = 60 * 60): async def save_character_details_task(self, max_ttl: Optional[int] = 60 * 60):
@ -120,7 +120,7 @@ class CharacterDetails(Plugin):
logger.warning("Redis key[%s] 数据未找到", key) # 如果未找到可能因为处理过程中已经过期,导致该数据未回写到 MySQL logger.warning("Redis key[%s] 数据未找到", key) # 如果未找到可能因为处理过程中已经过期,导致该数据未回写到 MySQL
continue continue
str_data = str(data, encoding="utf-8") str_data = str(data, encoding="utf-8")
async with AsyncSession(self.mysql.engine) as session: async with AsyncSession(self.database.engine) as session:
statement = ( statement = (
select(CharacterDetailsSQLModel) select(CharacterDetailsSQLModel)
.where(CharacterDetailsSQLModel.player_id == player_id) .where(CharacterDetailsSQLModel.player_id == player_id)
@ -132,14 +132,14 @@ class CharacterDetails(Plugin):
sql_data = CharacterDetailsSQLModel( sql_data = CharacterDetailsSQLModel(
player_id=player_id, character_id=character_id, data=str_data, time_updated=datetime.now() player_id=player_id, character_id=character_id, data=str_data, time_updated=datetime.now()
) )
async with AsyncSession(self.mysql.engine) as session: async with AsyncSession(self.database.engine) as session:
session.add(sql_data) session.add(sql_data)
await session.commit() await session.commit()
else: else:
if sql_data.time_updated <= datetime.now() - timedelta(hours=2): if sql_data.time_updated <= datetime.now() - timedelta(hours=2):
sql_data.data = str_data sql_data.data = str_data
sql_data.time_updated = datetime.now() sql_data.time_updated = datetime.now()
async with AsyncSession(self.mysql.engine) as session: async with AsyncSession(self.database.engine) as session:
session.add(sql_data) session.add(sql_data)
await session.commit() await session.commit()
@ -170,7 +170,7 @@ class CharacterDetails(Plugin):
uid: int, uid: int,
character_id: int, character_id: int,
) -> Optional["CalculatorCharacterDetails"]: ) -> Optional["CalculatorCharacterDetails"]:
async with AsyncSession(self.mysql.engine) as session: async with AsyncSession(self.database.engine) as session:
statement = ( statement = (
select(CharacterDetailsSQLModel) select(CharacterDetailsSQLModel)
.where(CharacterDetailsSQLModel.player_id == uid) .where(CharacterDetailsSQLModel.player_id == uid)

136
poetry.lock generated
View File

@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry and should not be changed by hand. # This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand.
[[package]] [[package]]
name = "aiofiles" name = "aiofiles"
@ -151,6 +151,18 @@ files = [
[package.dependencies] [package.dependencies]
frozenlist = ">=1.1.0" frozenlist = ">=1.1.0"
[[package]]
name = "aiosqlite"
version = "0.18.0"
description = "asyncio bridge to the standard sqlite3 module"
category = "main"
optional = false
python-versions = ">=3.7"
files = [
{file = "aiosqlite-0.18.0-py3-none-any.whl", hash = "sha256:c3511b841e3a2c5614900ba1d179f366826857586f78abd75e7cbeb88e75a557"},
{file = "aiosqlite-0.18.0.tar.gz", hash = "sha256:faa843ef5fb08bafe9a9b3859012d3d9d6f77ce3637899de20606b7fc39aa213"},
]
[[package]] [[package]]
name = "alembic" name = "alembic"
version = "1.10.2" version = "1.10.2"
@ -735,7 +747,7 @@ tox = ["tox"]
[[package]] [[package]]
name = "enkanetwork.py" name = "enkanetwork.py"
version = "1.4.1" version = "1.4.2"
description = "Library for fetching JSON data from site https://enka.network/" description = "Library for fetching JSON data from site https://enka.network/"
category = "main" category = "main"
optional = false optional = false
@ -752,7 +764,7 @@ pydantic = "*"
type = "git" type = "git"
url = "https://github.com/mrwan200/EnkaNetwork.py" url = "https://github.com/mrwan200/EnkaNetwork.py"
reference = "HEAD" reference = "HEAD"
resolved_reference = "c42f2dee044a6cb6a037eeda20098b524aededb7" resolved_reference = "68482c394bcce9d5e42896e4c3a17d0022283c7b"
[[package]] [[package]]
name = "et-xmlfile" name = "et-xmlfile"
@ -943,7 +955,7 @@ geetest = ["rsa"]
type = "git" type = "git"
url = "https://github.com/thesadru/genshin.py" url = "https://github.com/thesadru/genshin.py"
reference = "HEAD" reference = "HEAD"
resolved_reference = "4c526970f4ed85a5055ebfb7cbe79455a45b6c2f" resolved_reference = "4e96f8308fb3afd6a7d3353d1d3655aa3f95ea2a"
[[package]] [[package]]
name = "gitdb" name = "gitdb"
@ -1209,14 +1221,14 @@ files = [
[[package]] [[package]]
name = "importlib-metadata" name = "importlib-metadata"
version = "6.0.0" version = "6.1.0"
description = "Read metadata from Python packages" description = "Read metadata from Python packages"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"}, {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"},
{file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"}, {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"},
] ]
[package.dependencies] [package.dependencies]
@ -1611,14 +1623,14 @@ files = [
[[package]] [[package]]
name = "pathspec" name = "pathspec"
version = "0.11.0" version = "0.11.1"
description = "Utility library for gitignore style pattern matching of file paths." description = "Utility library for gitignore style pattern matching of file paths."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"},
{file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"},
] ]
[[package]] [[package]]
@ -1791,48 +1803,48 @@ files = [
[[package]] [[package]]
name = "pydantic" name = "pydantic"
version = "1.10.6" version = "1.10.7"
description = "Data validation and settings management using python type hints" description = "Data validation and settings management using python type hints"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "pydantic-1.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9289065611c48147c1dd1fd344e9d57ab45f1d99b0fb26c51f1cf72cd9bcd31"}, {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"},
{file = "pydantic-1.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c32b6bba301490d9bb2bf5f631907803135e8085b6aa3e5fe5a770d46dd0160"}, {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"},
{file = "pydantic-1.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd9b9e98068fa1068edfc9eabde70a7132017bdd4f362f8b4fd0abed79c33083"}, {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"},
{file = "pydantic-1.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c84583b9df62522829cbc46e2b22e0ec11445625b5acd70c5681ce09c9b11c4"}, {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"},
{file = "pydantic-1.10.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b41822064585fea56d0116aa431fbd5137ce69dfe837b599e310034171996084"}, {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"},
{file = "pydantic-1.10.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:61f1f08adfaa9cc02e0cbc94f478140385cbd52d5b3c5a657c2fceb15de8d1fb"}, {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"},
{file = "pydantic-1.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:32937835e525d92c98a1512218db4eed9ddc8f4ee2a78382d77f54341972c0e7"}, {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"},
{file = "pydantic-1.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbd5c531b22928e63d0cb1868dee76123456e1de2f1cb45879e9e7a3f3f1779b"}, {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"},
{file = "pydantic-1.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e277bd18339177daa62a294256869bbe84df1fb592be2716ec62627bb8d7c81d"}, {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"},
{file = "pydantic-1.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f15277d720aa57e173954d237628a8d304896364b9de745dcb722f584812c7"}, {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"},
{file = "pydantic-1.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b243b564cea2576725e77aeeda54e3e0229a168bc587d536cd69941e6797543d"}, {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"},
{file = "pydantic-1.10.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3ce13a558b484c9ae48a6a7c184b1ba0e5588c5525482681db418268e5f86186"}, {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"},
{file = "pydantic-1.10.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3ac1cd4deed871dfe0c5f63721e29debf03e2deefa41b3ed5eb5f5df287c7b70"}, {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"},
{file = "pydantic-1.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:b1eb6610330a1dfba9ce142ada792f26bbef1255b75f538196a39e9e90388bf4"}, {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"},
{file = "pydantic-1.10.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4ca83739c1263a044ec8b79df4eefc34bbac87191f0a513d00dd47d46e307a65"}, {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"},
{file = "pydantic-1.10.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea4e2a7cb409951988e79a469f609bba998a576e6d7b9791ae5d1e0619e1c0f2"}, {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"},
{file = "pydantic-1.10.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53de12b4608290992a943801d7756f18a37b7aee284b9ffa794ee8ea8153f8e2"}, {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"},
{file = "pydantic-1.10.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:60184e80aac3b56933c71c48d6181e630b0fbc61ae455a63322a66a23c14731a"}, {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"},
{file = "pydantic-1.10.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:415a3f719ce518e95a92effc7ee30118a25c3d032455d13e121e3840985f2efd"}, {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"},
{file = "pydantic-1.10.6-cp37-cp37m-win_amd64.whl", hash = "sha256:72cb30894a34d3a7ab6d959b45a70abac8a2a93b6480fc5a7bfbd9c935bdc4fb"}, {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"},
{file = "pydantic-1.10.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3091d2eaeda25391405e36c2fc2ed102b48bac4b384d42b2267310abae350ca6"}, {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"},
{file = "pydantic-1.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:751f008cd2afe812a781fd6aa2fb66c620ca2e1a13b6a2152b1ad51553cb4b77"}, {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"},
{file = "pydantic-1.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12e837fd320dd30bd625be1b101e3b62edc096a49835392dcf418f1a5ac2b832"}, {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"},
{file = "pydantic-1.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d92831d0115874d766b1f5fddcdde0c5b6c60f8c6111a394078ec227fca6d"}, {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"},
{file = "pydantic-1.10.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:476f6674303ae7965730a382a8e8d7fae18b8004b7b69a56c3d8fa93968aa21c"}, {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"},
{file = "pydantic-1.10.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3a2be0a0f32c83265fd71a45027201e1278beaa82ea88ea5b345eea6afa9ac7f"}, {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"},
{file = "pydantic-1.10.6-cp38-cp38-win_amd64.whl", hash = "sha256:0abd9c60eee6201b853b6c4be104edfba4f8f6c5f3623f8e1dba90634d63eb35"}, {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"},
{file = "pydantic-1.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6195ca908045054dd2d57eb9c39a5fe86409968b8040de8c2240186da0769da7"}, {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"},
{file = "pydantic-1.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43cdeca8d30de9a897440e3fb8866f827c4c31f6c73838e3a01a14b03b067b1d"}, {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"},
{file = "pydantic-1.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c19eb5163167489cb1e0161ae9220dadd4fc609a42649e7e84a8fa8fff7a80f"}, {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"},
{file = "pydantic-1.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:012c99a9c0d18cfde7469aa1ebff922e24b0c706d03ead96940f5465f2c9cf62"}, {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"},
{file = "pydantic-1.10.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:528dcf7ec49fb5a84bf6fe346c1cc3c55b0e7603c2123881996ca3ad79db5bfc"}, {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"},
{file = "pydantic-1.10.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:163e79386c3547c49366e959d01e37fc30252285a70619ffc1b10ede4758250a"}, {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"},
{file = "pydantic-1.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:189318051c3d57821f7233ecc94708767dd67687a614a4e8f92b4a020d4ffd06"}, {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"},
{file = "pydantic-1.10.6-py3-none-any.whl", hash = "sha256:acc6783751ac9c9bc4680379edd6d286468a1dc8d7d9906cd6f1186ed682b2b0"}, {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"},
{file = "pydantic-1.10.6.tar.gz", hash = "sha256:cf95adb0d1671fc38d8c43dd921ad5814a735e7d9b4d9e437c088002863854fd"}, {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"},
] ]
[package.dependencies] [package.dependencies]
@ -2002,7 +2014,7 @@ files = [
] ]
[package.dependencies] [package.dependencies]
aiolimiter = {version = ">=1.0.0,<1.1.0", optional = true, markers = "extra == \"ext\""} aiolimiter = {version = ">=1.0.0,<1.1.0", optional = true, markers = "extra == \"ext\" or extra == \"rate-limiter\""}
APScheduler = {version = ">=3.10.0,<3.11.0", optional = true, markers = "extra == \"ext\""} APScheduler = {version = ">=3.10.0,<3.11.0", optional = true, markers = "extra == \"ext\""}
cachetools = {version = ">=5.3.0,<5.4.0", optional = true, markers = "extra == \"ext\""} cachetools = {version = ">=5.3.0,<5.4.0", optional = true, markers = "extra == \"ext\""}
httpx = {version = ">=0.23.3,<0.24.0", extras = ["http2"]} httpx = {version = ">=0.23.3,<0.24.0", extras = ["http2"]}
@ -2123,18 +2135,18 @@ test = ["coverage", "pytest"]
[[package]] [[package]]
name = "redis" name = "redis"
version = "4.5.1" version = "4.5.3"
description = "Python client for Redis database and key-value store" description = "Python client for Redis database and key-value store"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "redis-4.5.1-py3-none-any.whl", hash = "sha256:5deb072d26e67d2be1712603bfb7947ec3431fb0eec9c578994052e33035af6d"}, {file = "redis-4.5.3-py3-none-any.whl", hash = "sha256:7df17a0a2b72a4c8895b462dd07616c51b1dcb48fdd7ecb7b6f4bf39ecb2e94e"},
{file = "redis-4.5.1.tar.gz", hash = "sha256:1eec3741cda408d3a5f84b78d089c8b8d895f21b3b050988351e925faf202864"}, {file = "redis-4.5.3.tar.gz", hash = "sha256:56732e156fe31801c4f43396bd3ca0c2a7f6f83d7936798531b9848d103381aa"},
] ]
[package.dependencies] [package.dependencies]
async-timeout = ">=4.0.2" async-timeout = {version = ">=4.0.2", markers = "python_version < \"3.11\""}
[package.extras] [package.extras]
hiredis = ["hiredis (>=1.0.0)"] hiredis = ["hiredis (>=1.0.0)"]
@ -2348,7 +2360,7 @@ files = [
] ]
[package.dependencies] [package.dependencies]
greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""}
[package.extras] [package.extras]
aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"]
@ -2583,14 +2595,14 @@ files = [
[[package]] [[package]]
name = "tzlocal" name = "tzlocal"
version = "4.2" version = "4.3"
description = "tzinfo object for the local timezone" description = "tzinfo object for the local timezone"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.7"
files = [ files = [
{file = "tzlocal-4.2-py3-none-any.whl", hash = "sha256:89885494684c929d9191c57aa27502afc87a579be5cdd3225c77c463ea043745"}, {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"},
{file = "tzlocal-4.2.tar.gz", hash = "sha256:ee5842fa3a795f023514ac2d801c4a81d1743bbe642e3940143326b3a00addd7"}, {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"},
] ]
[package.dependencies] [package.dependencies]
@ -2599,8 +2611,7 @@ pytz-deprecation-shim = "*"
tzdata = {version = "*", markers = "platform_system == \"Windows\""} tzdata = {version = "*", markers = "platform_system == \"Windows\""}
[package.extras] [package.extras]
devenv = ["black", "pyroma", "pytest-cov", "zest.releaser"] devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"]
test = ["pytest (>=4.3)", "pytest-mock (>=3.3)"]
[[package]] [[package]]
name = "ujson" name = "ujson"
@ -2980,11 +2991,12 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker
testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"]
[extras] [extras]
all = ["pytest", "pytest-asyncio", "flaky", "Pyrogram", "TgCrypto"] all = ["Pyrogram", "TgCrypto", "aiosqlite", "flaky", "pytest", "pytest-asyncio"]
pyro = ["Pyrogram", "TgCrypto"] pyro = ["Pyrogram", "TgCrypto"]
test = ["pytest", "pytest-asyncio", "flaky"] sqlite = ["aiosqlite"]
test = ["flaky", "pytest", "pytest-asyncio"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.8" python-versions = "^3.8"
content-hash = "893affc6c0dc0aa322078692592d9eb683fa9ffa689b9ac64ba1bdf4383abe22" content-hash = "e52f9d32896f24e916c734b00eb75effa75933841ead1eb25c0408c9edea9f55"

View File

@ -43,11 +43,13 @@ qrcode = "^7.4.2"
cryptography = "^39.0.1" cryptography = "^39.0.1"
pillow = "^9.4.0" pillow = "^9.4.0"
playwright = "^1.27.1" playwright = "^1.27.1"
aiosqlite = { extras = ["sqlite"], version = "^0.18.0" }
[tool.poetry.extras] [tool.poetry.extras]
pyro = ["Pyrogram", "TgCrypto"] pyro = ["Pyrogram", "TgCrypto"]
test = ["pytest", "pytest-asyncio", "flaky"] test = ["pytest", "pytest-asyncio", "flaky"]
all = ["pytest", "pytest-asyncio", "flaky", "Pyrogram", "TgCrypto"] sqlite = ["aiosqlite"]
all = ["pytest", "pytest-asyncio", "flaky", "Pyrogram", "TgCrypto", "aiosqlite"]
[build-system] [build-system]
requires = ["poetry-core"] requires = ["poetry-core"]

View File

@ -2,6 +2,7 @@ aiofiles==23.1.0 ; python_version >= "3.8" and python_version < "4.0"
aiohttp==3.8.4 ; python_version >= "3.8" and python_version < "4.0" aiohttp==3.8.4 ; python_version >= "3.8" and python_version < "4.0"
aiolimiter==1.0.0 ; python_version >= "3.8" and python_version < "4.0" aiolimiter==1.0.0 ; python_version >= "3.8" and python_version < "4.0"
aiosignal==1.3.1 ; python_version >= "3.8" and python_version < "4.0" aiosignal==1.3.1 ; python_version >= "3.8" and python_version < "4.0"
aiosqlite[sqlite]==0.18.0 ; python_version >= "3.8" and python_version < "4.0"
alembic==1.10.2 ; python_version >= "3.8" and python_version < "4.0" alembic==1.10.2 ; python_version >= "3.8" and python_version < "4.0"
anyio==3.6.2 ; python_version >= "3.8" and python_version < "4.0" anyio==3.6.2 ; python_version >= "3.8" and python_version < "4.0"
appdirs==1.4.4 ; python_version >= "3.8" and python_version < "4.0" appdirs==1.4.4 ; python_version >= "3.8" and python_version < "4.0"
@ -12,7 +13,7 @@ async-timeout==4.0.2 ; python_version >= "3.8" and python_version < "4.0"
asyncmy==0.2.7 ; python_version >= "3.8" and python_version < "4.0" asyncmy==0.2.7 ; python_version >= "3.8" and python_version < "4.0"
attrs==22.2.0 ; python_version >= "3.8" and python_version < "4.0" attrs==22.2.0 ; python_version >= "3.8" and python_version < "4.0"
backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9" backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9"
beautifulsoup4==4.11.2 ; python_version >= "3.8" and python_version < "4.0" beautifulsoup4==4.12.0 ; python_version >= "3.8" and python_version < "4.0"
black==23.1.0 ; python_version >= "3.8" and python_version < "4.0" black==23.1.0 ; python_version >= "3.8" and python_version < "4.0"
cachetools==5.3.0 ; python_version >= "3.8" and python_version < "4.0" cachetools==5.3.0 ; python_version >= "3.8" and python_version < "4.0"
certifi==2022.12.7 ; python_version >= "3.8" and python_version < "4.0" certifi==2022.12.7 ; python_version >= "3.8" and python_version < "4.0"
@ -25,8 +26,8 @@ cryptography==39.0.2 ; python_version >= "3.8" and python_version < "4.0"
enkanetwork-py @ git+https://github.com/mrwan200/EnkaNetwork.py@master ; python_version >= "3.8" and python_version < "4.0" enkanetwork-py @ git+https://github.com/mrwan200/EnkaNetwork.py@master ; python_version >= "3.8" and python_version < "4.0"
et-xmlfile==1.1.0 ; python_version >= "3.8" and python_version < "4.0" et-xmlfile==1.1.0 ; python_version >= "3.8" and python_version < "4.0"
exceptiongroup==1.1.1 ; python_version >= "3.8" and python_version < "3.11" exceptiongroup==1.1.1 ; python_version >= "3.8" and python_version < "3.11"
fakeredis==2.10.0 ; python_version >= "3.8" and python_version < "4.0" fakeredis==2.10.2 ; python_version >= "3.8" and python_version < "4.0"
fastapi==0.94.1 ; python_version >= "3.8" and python_version < "4.0" fastapi==0.95.0 ; python_version >= "3.8" and python_version < "4.0"
flaky==3.7.0 ; python_version >= "3.8" and python_version < "4.0" flaky==3.7.0 ; python_version >= "3.8" and python_version < "4.0"
frozenlist==1.3.3 ; python_version >= "3.8" and python_version < "4.0" frozenlist==1.3.3 ; python_version >= "3.8" and python_version < "4.0"
genshin @ git+https://github.com/thesadru/genshin.py@master ; python_version >= "3.8" and python_version < "4.0" genshin @ git+https://github.com/thesadru/genshin.py@master ; python_version >= "3.8" and python_version < "4.0"
@ -42,7 +43,7 @@ httpx==0.23.3 ; python_version >= "3.8" and python_version < "4.0"
httpx[http2]==0.23.3 ; python_version >= "3.8" and python_version < "4.0" httpx[http2]==0.23.3 ; python_version >= "3.8" and python_version < "4.0"
hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0" hyperframe==6.0.1 ; python_version >= "3.8" and python_version < "4.0"
idna==3.4 ; python_version >= "3.8" and python_version < "4.0" idna==3.4 ; python_version >= "3.8" and python_version < "4.0"
importlib-metadata==6.0.0 ; python_version >= "3.8" and python_version < "4.0" importlib-metadata==6.1.0 ; python_version >= "3.8" and python_version < "4.0"
importlib-resources==5.12.0 ; python_version >= "3.8" and python_version < "3.9" importlib-resources==5.12.0 ; python_version >= "3.8" and python_version < "3.9"
iniconfig==2.0.0 ; python_version >= "3.8" and python_version < "4.0" iniconfig==2.0.0 ; python_version >= "3.8" and python_version < "4.0"
jinja2==3.1.2 ; python_version >= "3.8" and python_version < "4.0" jinja2==3.1.2 ; python_version >= "3.8" and python_version < "4.0"
@ -55,21 +56,21 @@ multidict==6.0.4 ; python_version >= "3.8" and python_version < "4.0"
mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "4.0" mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "4.0"
openpyxl==3.1.2 ; python_version >= "3.8" and python_version < "4.0" openpyxl==3.1.2 ; python_version >= "3.8" and python_version < "4.0"
packaging==23.0 ; python_version >= "3.8" and python_version < "4.0" packaging==23.0 ; python_version >= "3.8" and python_version < "4.0"
pathspec==0.11.0 ; python_version >= "3.8" and python_version < "4.0" pathspec==0.11.1 ; python_version >= "3.8" and python_version < "4.0"
pillow==9.4.0 ; python_version >= "3.8" and python_version < "4.0" pillow==9.4.0 ; python_version >= "3.8" and python_version < "4.0"
platformdirs==3.1.1 ; python_version >= "3.8" and python_version < "4.0" platformdirs==3.1.1 ; python_version >= "3.8" and python_version < "4.0"
playwright==1.27.1 ; python_version >= "3.8" and python_version < "4.0" playwright==1.27.1 ; python_version >= "3.8" and python_version < "4.0"
pluggy==1.0.0 ; python_version >= "3.8" and python_version < "4.0" pluggy==1.0.0 ; python_version >= "3.8" and python_version < "4.0"
pyaes==1.6.1 ; python_version >= "3.8" and python_version < "4.0" pyaes==1.6.1 ; python_version >= "3.8" and python_version < "4.0"
pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0"
pydantic==1.10.6 ; python_version >= "3.8" and python_version < "4.0" pydantic==1.10.7 ; python_version >= "3.8" and python_version < "4.0"
pyee==8.1.0 ; python_version >= "3.8" and python_version < "4.0" pyee==8.1.0 ; python_version >= "3.8" and python_version < "4.0"
pygments==2.14.0 ; python_version >= "3.8" and python_version < "4.0" pygments==2.14.0 ; python_version >= "3.8" and python_version < "4.0"
pypng==0.20220715.0 ; python_version >= "3.8" and python_version < "4.0" pypng==0.20220715.0 ; python_version >= "3.8" and python_version < "4.0"
pyppeteer==1.0.2 ; python_version >= "3.8" and python_version < "4.0" pyppeteer==1.0.2 ; python_version >= "3.8" and python_version < "4.0"
pyrogram==2.0.102 ; python_version >= "3.8" and python_version < "4.0" pyrogram==2.0.102 ; python_version >= "3.8" and python_version < "4.0"
pysocks==1.7.1 ; python_version >= "3.8" and python_version < "4.0" pysocks==1.7.1 ; python_version >= "3.8" and python_version < "4.0"
pytest-asyncio==0.20.3 ; python_version >= "3.8" and python_version < "4.0" pytest-asyncio==0.21.0 ; python_version >= "3.8" and python_version < "4.0"
pytest==7.2.2 ; python_version >= "3.8" and python_version < "4.0" pytest==7.2.2 ; python_version >= "3.8" and python_version < "4.0"
python-dotenv==1.0.0 ; python_version >= "3.8" and python_version < "4.0" python-dotenv==1.0.0 ; python_version >= "3.8" and python_version < "4.0"
python-telegram-bot[ext,rate-limiter]==20.1 ; python_version >= "3.8" and python_version < "4.0" python-telegram-bot[ext,rate-limiter]==20.1 ; python_version >= "3.8" and python_version < "4.0"
@ -77,10 +78,10 @@ pytz-deprecation-shim==0.1.0.post0 ; python_version >= "3.8" and python_version
pytz==2022.7.1 ; python_version >= "3.8" and python_version < "4.0" pytz==2022.7.1 ; python_version >= "3.8" and python_version < "4.0"
pyyaml==6.0 ; python_version >= "3.8" and python_version < "4.0" pyyaml==6.0 ; python_version >= "3.8" and python_version < "4.0"
qrcode==7.4.2 ; python_version >= "3.8" and python_version < "4.0" qrcode==7.4.2 ; python_version >= "3.8" and python_version < "4.0"
redis==4.5.1 ; python_version >= "3.8" and python_version < "4.0" redis==4.5.3 ; python_version >= "3.8" and python_version < "4.0"
rfc3986[idna2008]==1.5.0 ; python_version >= "3.8" and python_version < "4.0" rfc3986[idna2008]==1.5.0 ; python_version >= "3.8" and python_version < "4.0"
rich==13.3.2 ; python_version >= "3.8" and python_version < "4.0" rich==13.3.2 ; python_version >= "3.8" and python_version < "4.0"
sentry-sdk==1.16.0 ; python_version >= "3.8" and python_version < "4.0" sentry-sdk==1.17.0 ; python_version >= "3.8" and python_version < "4.0"
setuptools==67.6.0 ; python_version >= "3.8" and python_version < "4.0" setuptools==67.6.0 ; python_version >= "3.8" and python_version < "4.0"
six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0"
smmap==5.0.0 ; python_version >= "3.8" and python_version < "4.0" smmap==5.0.0 ; python_version >= "3.8" and python_version < "4.0"
@ -98,10 +99,10 @@ tornado==6.2 ; python_version >= "3.8" and python_version < "4.0"
tqdm==4.65.0 ; python_version >= "3.8" and python_version < "4.0" tqdm==4.65.0 ; python_version >= "3.8" and python_version < "4.0"
typing-extensions==4.5.0 ; python_version >= "3.8" and python_version < "4.0" typing-extensions==4.5.0 ; python_version >= "3.8" and python_version < "4.0"
tzdata==2022.7 ; python_version >= "3.8" and python_version < "4.0" tzdata==2022.7 ; python_version >= "3.8" and python_version < "4.0"
tzlocal==4.2 ; python_version >= "3.8" and python_version < "4.0" tzlocal==4.3 ; python_version >= "3.8" and python_version < "4.0"
ujson==5.7.0 ; python_version >= "3.8" and python_version < "4.0" ujson==5.7.0 ; python_version >= "3.8" and python_version < "4.0"
urllib3==1.26.15 ; python_version >= "3.8" and python_version < "4.0" urllib3==1.26.15 ; python_version >= "3.8" and python_version < "4.0"
uvicorn[standard]==0.21.0 ; python_version >= "3.8" and python_version < "4.0" uvicorn[standard]==0.21.1 ; python_version >= "3.8" and python_version < "4.0"
uvloop==0.17.0 ; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy" and python_version >= "3.8" and python_version < "4.0" uvloop==0.17.0 ; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy" and python_version >= "3.8" and python_version < "4.0"
watchfiles==0.18.1 ; python_version >= "3.8" and python_version < "4.0" watchfiles==0.18.1 ; python_version >= "3.8" and python_version < "4.0"
websockets==10.4 ; python_version >= "3.8" and python_version < "4.0" websockets==10.4 ; python_version >= "3.8" and python_version < "4.0"

View File

@ -1,3 +1,4 @@
DRIVER_NAME=mysql+asyncmy
DB_PORT=3306 DB_PORT=3306
DB_USERNAME=root DB_USERNAME=root
DB_PASSWORD=123456test DB_PASSWORD=123456test

View File

@ -4,7 +4,7 @@ import pytest
import pytest_asyncio import pytest_asyncio
from core.config import config from core.config import config
from core.dependence.mysql import MySQL from core.dependence.database import Database
from core.dependence.redisdb import RedisDB from core.dependence.redisdb import RedisDB
@ -18,8 +18,8 @@ def event_loop():
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def mysql(): def database():
return MySQL.from_config(config=config) return Database.from_config(config=config)
@pytest.fixture(scope="session") @pytest.fixture(scope="session")

View File

@ -11,11 +11,11 @@ logger.info("%s", PlayersDataBase.__name__)
# noinspection PyShadowingNames # noinspection PyShadowingNames
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_mysql(mysql): async def test_mysql(database):
assert mysql assert database
async def test_init_create_all(mysql): async def test_init_create_all(database):
async with mysql.engine.begin() as conn: async with database.engine.begin() as conn:
await conn.run_sync(SQLModel.metadata.drop_all) await conn.run_sync(SQLModel.metadata.drop_all)
await conn.run_sync(SQLModel.metadata.create_all) await conn.run_sync(SQLModel.metadata.create_all)

View File

@ -11,8 +11,8 @@ logger = logging.getLogger("TestPlayersService")
@pytest_asyncio.fixture(scope="class", name="players_service") @pytest_asyncio.fixture(scope="class", name="players_service")
def service(mysql): def service(database):
repository = PlayersRepository(mysql) repository = PlayersRepository(database)
_players_service = PlayersService(repository) _players_service = PlayersService(repository)
return _players_service return _players_service