Files
remnashop/pyproject.toml
Ilay 5cf9d4ca09 fix: subscription stats, plan flow error handling and misc fixes
- added total_disabled and total_limited fields to SubscriptionStatsDto and PlanSubStatsDto
- fixed is_unlimited condition: changed or_ to and_ in subscription stats query
- excluded DELETED subscriptions from stats queries
- fixed PlanSubStatsDto field names: total_subs/active_subs/expired_subs → total/total_active/total_expired
- replaced raise ValueError with redirect to Subscription.MAIN when PlanDto missing in dialog data
- replaced raise ValueError with redirect to Subscription.MAIN when plan not found on selection
- fixed migration 0019: added explicit COMMIT/BEGIN, fixed invalid menu button payloads
- fixed broadcast text-too-long translation: $max_limit variable reference
- fixed user_name_clean: strip remaining HTML special chars
- added limit=50 to get_recent_registered_users call
- bumped remnapy to f442fb6
- minor import cleanups across multiple files
2026-03-29 08:53:34 +05:00

103 lines
2.2 KiB
TOML

[project]
name = "remnashop"
version = "0.0.0"
description = "This is a Telegram bot for selling VPN subscriptions. It works with Remnawave"
authors = [{ name = "snoups" }]
readme = "README.md"
license = "MIT"
requires-python = ">=3.12,<3.13"
dependencies = [
"greenlet>=3.2.4",
"uvicorn>=0.38.0",
"fastapi>=0.120.2",
"remnapy==2.6.3",
#
"dishka~=1.7.2",
"adaptix==3.0.0b11",
"aiogram~=3.25.0",
"aiogram-dialog~=2.5.0",
"fluentogram~=1.2.1",
#
"asyncpg~=0.30.0",
"alembic~=1.16.5",
"sqlalchemy[mypy]>=2.0.0",
"redis~=7.0.0",
"taskiq[orjson]~=0.12.1",
"taskiq-redis~=1.2.1",
#
"pydantic-settings~=2.11.0",
"loguru~=0.7.3",
"msgspec~=0.19.0",
"cryptography>=46.0.3",
"qrcode[pil]>=8.2",
]
[tool.uv.sources]
remnapy = { git = "https://github.com/snoups/remnapy", rev = "f442fb6" }
[project.urls]
homepage = "https://t.me/@remna_shop"
repository = "https://github.com/snoups/remnashop"
[dependency-groups]
dev = [
"aiogram-dialog[tools]~=2.5.0",
"mypy>=1.18.2",
"ruff>=0.14.2",
"pytest>=8.4.2",
"watchfiles>=1.1.1",
"ftl-extract>=0.9.0",
"types-cachetools",
"pytest-asyncio",
]
[tool.ruff]
target-version = "py312"
line-length = 100
lint.select = [
"C",
"DTZ",
"E",
"F",
"I",
"ICN",
"N",
"PLC",
"PLE",
"Q",
"T",
"W",
"YTT",
]
lint.ignore = ["N805"]
exclude = ["venv", ".venv", ".idea"]
[tool.mypy]
packages = ["src"]
plugins = ["sqlalchemy.ext.mypy.plugin", "pydantic.mypy"]
exclude = ["venv", ".venv", ".idea", "tests"]
warn_unused_configs = true
disallow_subclassing_any = true
disallow_untyped_calls = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
warn_unused_ignores = true
warn_return_any = true
no_implicit_reexport = true
strict_equality = true
extra_checks = true
explicit_package_bases = true
[[tool.mypy.overrides]]
module = ["fluentogram.*", "remnawave.*", "qrcode.*", "remnapy.*"]
follow_untyped_imports = true
[[tool.mypy.overrides]]
module = ["app.telegram.handlers.*"]
strict_optional = false
warn_return_any = false
disable_error_code = ["union-attr"]