* fix(bbcode): fix ReDos of imagemap parsing * fix(bbcode): use `regex` and add timeout to avoid too long time to parse * feat(bbcode): use `make_tag` to generate HTML tags * docs(bbcode): add docstrings for BBCodeService * fix(user): validate BBCode content before processing userpage update * fix(bbcode): catch timeout errors in BBCode parsing with MaliciousBBCodeError * fix(bbcode): resolve reviews * fix(bbcode): use `make_tag` in `_parse_size` Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix(bbcode): fix using `make_tag` in `_parse_size` --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
139 lines
3.4 KiB
TOML
139 lines
3.4 KiB
TOML
[project]
|
|
name = "g0v0-server"
|
|
version = "0.1.0"
|
|
description = "3rd-party osu!lazer private server which supports the latest osu!lazer."
|
|
readme = "README.md"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"aioboto3>=15.0.0",
|
|
"aiofiles>=24.1.0",
|
|
"aiomysql>=0.2.0",
|
|
"alembic>=1.12.1",
|
|
"apscheduler>=3.11.0",
|
|
"bcrypt>=4.1.2",
|
|
"bleach>=6.1.0",
|
|
"cryptography>=41.0.7",
|
|
"fastapi>=0.104.1",
|
|
"fastapi-limiter>=0.1.6",
|
|
"httpx>=0.28.1",
|
|
"jinja2>=3.1.0",
|
|
"loguru>=0.7.3",
|
|
"mailersend>=2.0.0",
|
|
"maxminddb>=2.8.2",
|
|
"newrelic>=10.1.0",
|
|
"osupyparser>=1.0.7",
|
|
"passlib[bcrypt]>=1.7.4",
|
|
"pillow>=11.3.0",
|
|
"pydantic-settings>=2.10.1",
|
|
"pydantic[email]>=2.5.0",
|
|
"pyotp>=2.9.0",
|
|
"python-dotenv>=1.0.0",
|
|
"python-jose[cryptography]>=3.3.0",
|
|
"python-multipart>=0.0.6",
|
|
"redis>=5.0.1",
|
|
"regex>=2025.11.3",
|
|
"sentry-sdk[fastapi,httpx,loguru,sqlalchemy]>=2.34.1",
|
|
"sqlalchemy>=2.0.23",
|
|
"sqlmodel>=0.0.24",
|
|
"tinycss2>=1.4.0",
|
|
"uvicorn[standard]>=0.24.0",
|
|
]
|
|
authors = [{ name = "GooGuTeam" }]
|
|
|
|
[project.optional-dependencies]
|
|
rosu = [
|
|
"rosu-pp-py>=3.1.0",
|
|
]
|
|
|
|
[tool.ruff]
|
|
line-length = 120
|
|
target-version = "py312"
|
|
|
|
[tool.ruff.format]
|
|
line-ending = "lf"
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"F", # Pyflakes
|
|
"W", # pycodestyle warnings
|
|
"E", # pycodestyle errors
|
|
"I", # isort
|
|
"UP", # pyupgrade
|
|
"ASYNC", # flake8-async
|
|
"C4", # flake8-comprehensions
|
|
"T10", # flake8-debugger
|
|
"PYI", # flake8-pyi
|
|
"PT", # flake8-pytest-style
|
|
"Q", # flake8-quotes
|
|
"TID", # flake8-tidy-imports
|
|
"RUF", # Ruff-specific rules
|
|
"FAST", # FastAPI
|
|
"YTT", # flake8-2020
|
|
"S", # flake8-bandit
|
|
"INP", # flake8-no-pep420
|
|
"SIM", # flake8-simplify
|
|
"ARG", # flake8-unused-arguments
|
|
"PTH", # flake8-use-pathlib
|
|
"N", # pep8-naming
|
|
"FURB" # refurb
|
|
]
|
|
ignore = [
|
|
"E402", # module-import-not-at-top-of-file
|
|
"UP037", # quoted-annotation
|
|
"RUF001", # ambiguous-unicode-character-string
|
|
"RUF002", # ambiguous-unicode-character-docstring
|
|
"RUF003", # ambiguous-unicode-character-comment
|
|
"S101", # assert
|
|
"S311", # suspicious-non-cryptographic-random-usage
|
|
]
|
|
|
|
[tool.ruff.lint.extend-per-file-ignores]
|
|
"tools/*.py" = ["PTH", "INP001"]
|
|
"scripts/*.py" = ["PTH", "INP001"]
|
|
"migrations/**/*.py" = ["INP001"]
|
|
"app/achievements/*.py" = ["INP001", "ARG"]
|
|
"app/router/**/*.py" = ["ARG001"]
|
|
|
|
[tool.ruff.lint.isort]
|
|
force-sort-within-sections = true
|
|
force-wrap-aliases = true
|
|
combine-as-imports = true
|
|
order-by-type = true
|
|
relative-imports-order = "closest-to-furthest"
|
|
extra-standard-library = ["typing_extensions"]
|
|
section-order = ["future", "standard-library", "first-party", "local-folder", "third-party"]
|
|
|
|
[tool.ruff.lint.flake8-pytest-style]
|
|
fixture-parentheses = false
|
|
mark-parentheses = false
|
|
|
|
[tool.ruff.lint.pyupgrade]
|
|
keep-runtime-typing = true
|
|
|
|
[tool.pyright]
|
|
pythonVersion = "3.12"
|
|
pythonPlatform = "All"
|
|
|
|
typeCheckingMode = "standard"
|
|
disableBytesTypePromotions = true
|
|
reportIncompatibleMethodOverride = false
|
|
reportIncompatibleVariableOverride = false
|
|
exclude = ["migrations/", ".venv/", "venv/"]
|
|
|
|
[tool.uv.workspace]
|
|
members = [
|
|
"packages/osupyparser",
|
|
]
|
|
|
|
[tool.uv.sources]
|
|
osupyparser = { git = "https://github.com/MingxuanGame/osupyparser.git" }
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"datamodel-code-generator>=0.35.0",
|
|
"pre-commit>=4.2.0",
|
|
"pyright>=1.1.404",
|
|
"ruff>=0.12.4",
|
|
"types-aioboto3[aioboto3,essential]>=15.0.0",
|
|
]
|