[build-system] requires = ["setuptools", "setuptools-scm"] build-backend = "setuptools.build_meta" [project] name = "swingmusic" description = "Swing Music" readme = "README.md" requires-python = ">=3.11" dynamic = ["version"] dependencies = [ "pillow>=11.1.0", "Flask>=3.1.0", "Flask-Cors>=3.0.10", "requests>=2.27.1", "colorgram.py>=1.2.0", "tqdm>=4.65.0", "tinytag>=2.1.1", "Unidecode>=1.3.6", "psutil>=5.9.4", "show-in-file-manager>=1.1.4", "flask-compress>=1.13", "tabulate>=0.9.0", "setproctitle>=1.3.2", "locust>=2.20.1", "watchdog>=4.0.0", "flask-jwt-extended>=4.6.0", "flask-limiter>=3.5.0", "sqlalchemy>=2.0.31", "memory-profiler>=0.61.0", "sortedcontainers>=2.4.0", "xxhash>=3.4.1", "ffmpeg-python>=0.2.0", "schedule>=1.2.2", "pillow>=11.1.0", "flask-openapi3==4.3.2", "rapidfuzz==3.14.5", "pendulum>=3.0.0", "pystray>=0.19.5", "waitress>=3.0.2; sys_platform == 'win32'", "bjoern >=3.2.2; sys_platform != 'win32'", "aiohttp>=3.13.3", "aiofiles>=25.1.0", "redis>=5.2.1", ] [project.optional-dependencies] build = [ "pyinstaller" ] [tool.uv] dependency-metadata = [ { name = "waitress", version = "3.0.2", requires-dist = [], requires-python = ">=3.11" }, { name = "bjoern", version="3.2.2", requires-dist = [], requires-python = ">=3.11"} ] [project.scripts] swingmusic = "swingmusic.__main__:run" [project.urls] Homepage = "https://swingmx.com/" Repository = "https://github.com/swingmx/swingmusic" Documentation = "https://swingmx.com/guide/introduction.html" Issues = "https://github.com/swingmx/swingmusic/issues" [tool.setuptools_scm] version_scheme = "only-version" local_scheme = "no-local-version" fallback_version = "v0.0.0" [dependency-groups] dev = [ "twine>=6.1.0", "pytest>=8.0.0", "pytest-cov>=5.0.0", "ruff>=0.8.0", "mypy>=1.13.0", ] # =========================================== # RUFF CONFIGURATION # =========================================== [tool.ruff] target-version = "py311" line-length = 88 exclude = [ ".git", ".venv", "__pycache__", "*.egg-info", "node_modules", "build", "dist", ] [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # Pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "SIM", # flake8-simplify ] ignore = [ "E501", # line too long (handled by formatter) "B008", # do not perform function calls in argument defaults "B023", # Function definition does not bind loop variable "SIM102", # Use a single `if` statement instead of nested `if` statements "SIM115", # Use a context manager for opening files "SIM117", # Use a single `with` statement with multiple contexts ] [tool.ruff.lint.isort] known-first-party = ["swingmusic"] [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false # =========================================== # MYPY CONFIGURATION # =========================================== [tool.mypy] python_version = "3.11" warn_return_any = true warn_unused_configs = true ignore_missing_imports = true exclude = [ "tests/", "build/", "dist/", ]