[project] name = "BYCEPS" version = "0.0" description = "LAN party web platform" readme = "README.rst" authors = [ { name = "Jochen Kupperschmidt", email = "homework@nwsnet.de" }, ] license = { text = "Revised BSD License" } keywords = ["lanparty"] classifiers = [ "Environment :: Web Environment", "Framework :: Flask", "Intended Audience :: Developers", "Intended Audience :: Other Audience", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Natural Language :: German", "Programming Language :: JavaScript", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Communications", "Topic :: Games/Entertainment", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Content Management System", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards", "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: News/Diary", ] requires-python = ">=3.11" dependencies = [ "babel>=2.17.0", "bbcode==1.1.0", "blinker>=1.9.0", "bpython>=0.25", "click>=8.2.1", "flask-babel==4.0.0", "flask-sqlalchemy==3.1.1", "flask>=3.1.2", "hiredis>=3.2.1", "httpx[http2]>=0.28.1", "itsdangerous==2.2.0", "jinja2>=3.1.6", "markupsafe==3.0.2", "mistletoe==1.4.0", "paypal-checkout-serversdk==1.0.3", "paypalhttp==1.0.1", "pillow>=11.3.0", "psycopg[binary]>=3.2.9", "py-moneyed==3.0", "pydantic>=2.11.7", "python-dotenv>=1.1.1", "qrcode>=8.2", "redis>=6.4.0", "rq-dashboard>=0.8.4", "rq>=2.5.0", "rtoml==0.12.0", "schwifty>=2025.6.0", "secret-type>=0.3.0", "sentry-sdk[flask,httpx,rq,sqlalchemy]>=2.33.2", "sqlalchemy>=2.0.43", "stripe==5.4.0", "structlog>=25.4.0", "tenacity>=9.1.2", "uuid6>=2025.0.1", "werkzeug>=3.1.3", "wtforms==3.2.1", ] [dependency-groups] dev = [ "flask-debugtoolbar==0.16.0", "mypy>=1.15.0", "ruff>=0.11.7", "types-freezegun==1.1.10", "types-redis==4.6.0.20241004", ] docs = [ "furo>=2025.7.19", "sphinx>=8.2.3", ] test = [ "coverage>=7.10.6", "freezegun>=1.5.5", "pyfakefs>=5.9.3", "pytest>=8.4.1", "respx>=0.22.0", ] [project.optional-dependencies] wsgiserver = [ "uwsgi>=2.0.30", ] [project.scripts] byceps = "byceps.cli.cli:cli" [project.urls] Homepage = "https://byceps.nwsnet.de/" Documentation = "https://byceps.readthedocs.io/" Repository = "https://github.com/byceps/byceps" [build-system] requires = ["uv_build>=0.8.11,<0.9.0"] build-backend = "uv_build" [tool.mypy] python_version = "3.11" plugins = "sqlalchemy.ext.mypy.plugin" ignore_missing_imports = true no_implicit_optional = true [tool.pytest.ini_options] addopts = "-vv -ra" testpaths = ["tests/unit", "tests/integration"] [tool.ruff] line-length = 80 [tool.ruff.format] quote-style = "single" line-ending = "lf" [tool.ruff.lint] select = [ "B", "E", "EXE", "F", "G", "ICN", "ISC", "PLE", "PLW", "PTH", "PYI", "Q", "RSE", "S", "TID", "UP", "W", "YTT", ] ignore = [ "E501", # Line too long "ISC001", # Conflict with Ruff's formatter "Q001", # Conflict with Ruff's formatter "W291", # Trailing whitespace (because of email signature, `-- `) ] [tool.ruff.lint.flake8-quotes] inline-quotes = "single" multiline-quotes = "single" [tool.ruff.lint.isort] combine-as-imports = true force-sort-within-sections = true forced-separate = ["tests"] lines-after-imports = 2 order-by-type = false [tool.ruff.lint.per-file-ignores] "tests/**/*.py" = ["S101", "S105", "S106", "S107"] [tool.uv] default-groups = [] required-version = ">=0.8.11" [tool.uv.build-backend] module-name = "byceps" module-root = ""