[project] name = "bracket-backend" version = "0.0.1" requires-python = ">=3.12" dependencies = [ "aiofiles==25.1.0", "aiohttp==3.13.4", "aiopg==1.4.0", "alembic==1.18.0", "asyncpg==0.31.0", "bcrypt==5.0.0", "click==8.3.0", "databases[asyncpg]==0.9.0", "fastapi==0.135.3", "fastapi-sso==0.21.0", "gunicorn==25.3.0", "heliclockter==3.0.1", "parameterized==0.9.0", "passlib==1.7.4", "pydantic==2.12.4", "pydantic_settings==2.13.0", "pyjwt==2.12.0", "python-dotenv==1.2.2", "python-multipart==0.0.27", "sentry-sdk==2.57.0", "sqlalchemy==2.0.44", "sqlalchemy-stubs==0.4", "starlette==1.0.0", "types-aiofiles==25.1.0.20251011", "types-passlib==1.7.7.20241221", "types-simplejson==3.20.0.20250218", "uvicorn==0.44.0", ] [tool.pytest.ini_options] addopts = [ '--junitxml=.junit_report.xml', ] junit_family = 'xunit2' asyncio_mode = 'auto' filterwarnings = [ 'error', 'ignore:The SelectBase.c and SelectBase.columns attributes are deprecated.*:DeprecationWarning', 'ignore:pkg_resources is deprecated as an API.*:DeprecationWarning', 'ignore:Deprecated call to `pkg_resources.declare_namespace(.*)`.*:DeprecationWarning', 'ignore:.*:pytest.PytestDeprecationWarning', 'ignore:.*pytest-asyncio detected an unclosed event loop.*:DeprecationWarning', 'ignore:.*The event_loop fixture provided by pytest-asyncio has been redefined.*:DeprecationWarning', 'ignore:.*Please use `import python_multipart` instead.*:PendingDeprecationWarning', ] [dependency-groups] dev = [ "aioresponses==0.7.4", "mypy==1.20.0", "pluggy==1.6.0", "pylint==4.0.2", "pyrefly==0.60.0", "pytest-asyncio==1.3.0", "pytest-cov==7.1.0", "pytest-xdist==3.8.0", "pytest==9.0.3", "ruff==0.15.0", "vulture==2.16", ] [tool.mypy] junit_xml = '.junit_report.xml' follow_imports = 'silent' disallow_any_explicit = false disallow_any_generics = true check_untyped_defs = true disallow_untyped_defs = true disallow_incomplete_defs = true disallow_untyped_decorators = false warn_unused_configs = true disallow_subclassing_any = false disallow_untyped_calls = false no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true warn_return_any = true no_implicit_reexport = true show_error_codes = true [tool.uv] package = false [[tool.uv.index]] name = "pypi" url = "https://pypi.org/simple" [tool.pydantic-mypy] init_forbid_extra = true init_typed = true warn_required_dynamic_aliases = true warn_untyped_fields = true [[tool.mypy.overrides]] module = ['aioresponses.*'] disallow_any_explicit = false disallow_any_generics = false [[tool.mypy.overrides]] module = ['fastapi_sso.*'] ignore_missing_imports = true [tool.pylint.'MESSAGES CONTROL'] disable = [ 'broad-except', 'broad-exception-raised', 'consider-iterating-dictionary', 'contextmanager-generator-missing-cleanup', # Gives false positives. 'dangerous-default-value', 'duplicate-code', 'fixme', 'not-callable', 'import-outside-toplevel', 'invalid-name', 'logging-fstring-interpolation', 'missing-docstring', 'no-name-in-module', # Gives false positives. 'protected-access', 'too-few-public-methods', 'too-many-arguments', 'too-many-locals', 'too-many-nested-blocks', 'too-many-positional-arguments', 'unspecified-encoding', 'unused-argument', # Gives false positives. 'wrong-import-position', 'unused-import', # Ruff checks this ] [tool.bandit] skips = [ 'B101', 'B106', 'B108' ] [tool.ruff] line-length = 100 respect-gitignore = false show-fixes = true output-format = "full" target-version = "py313" exclude = [".venv", ".mypy_cache", ".pytest_cache", "__pycache__"] [tool.ruff.lint] select = [ "E", "EXE", # "ERA", TODO "F", "FA", "FIX", "I", "ISC", "PGH", "PIE", "PLE", "PLW", "RUF100", "T20", "TCH", "TD", "TID", "UP", "W", ] ignore = ["FIX002", "TD002", "TD003", "TC001", "TC002", "TC003", "ISC001"] [tool.vulture] min_confidence = 0 paths = ["."] exclude = [".venv"] ignore_decorators = ["@pytest.*", "@*router*", "@app.*", "@*validator*", "@cli.command*"] ignore_names = [ "RestartableUvicornWorker", "_generate_next_value_", "downgrade", "startup_and_shutdown_uvicorn_server", "todo*", "upgrade", ] sort_by_size = true [tool.pyrefly] ignore-missing-imports = ["fastapi_sso.*"]