[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "TagStudio" description = "A User-Focused Photo & File Management System." version = "9.5.1" license = "GPL-3.0-only" readme = "README.md" dependencies = [ "chardet==5.2.0", "ffmpeg-python==0.2.0", "humanfriendly==10.0", "mutagen==1.47.0", "numpy==2.1.0", "opencv_python==4.10.0.84", "Pillow==10.3.0", "pillow-heif==0.16.0", "pillow-jxl-plugin==1.3.0", "pydub==0.25.1", "PySide6==6.8.0.1", "rawpy==0.22.0", "Send2Trash==1.8.3", "SQLAlchemy==2.0.34", "structlog==24.4.0", "typing_extensions>=3.10.0.0,<4.11.0", "ujson>=5.8.0,<5.9.0", "vtf2img==0.1.0", "toml==0.10.2", "pydantic==2.9.2", ] [project.optional-dependencies] dev = ["tagstudio[mkdocs,mypy,pre-commit,pyinstaller,pytest,ruff]"] mkdocs = ["mkdocs-material[imaging]==9.*"] mypy = ["mypy==1.11.2", "mypy-extensions==1.*", "types-ujson>=5.8.0,<5.9.0"] pre-commit = ["pre-commit==3.7.0"] pyinstaller = ["Pyinstaller==6.6.0"] pytest = [ "pytest==8.2.0", "pytest-cov==5.0.0", "pytest-qt==4.4.0", "syrupy==4.7.1", ] ruff = ["ruff==0.8.1"] [project.gui-scripts] tagstudio = "tagstudio.main:main" [tool.hatch.build.targets.wheel] packages = ["src/tagstudio"] [tool.mypy] mypy_path = ["src/tagstudio"] disable_error_code = [ "annotation-unchecked", "func-returns-value", "import-untyped", ] explicit_package_bases = true ignore_missing_imports = true implicit_optional = true strict_optional = false warn_unused_ignores = true exclude = ["build", "dist"] [[tool.mypy.overrides]] module = "tagstudio.qt.main_window" ignore_errors = true [[tool.mypy.overrides]] module = "tagstudio.qt.ui.home_ui" ignore_errors = true [[tool.mypy.overrides]] module = "tagstudio.core.ts_core" ignore_errors = true [tool.pytest.ini_options] #addopts = "-m 'not qt'" qt_api = "pyside6" [tool.pyright] ignore = [".venv/**"] include = ["src/tagstudio/**"] reportAny = false reportIgnoreCommentWithoutRule = false reportImplicitStringConcatenation = false reportMissingTypeArgument = false # reportOptionalMemberAccess = false reportUnannotatedClassAttribute = false reportUnknownArgumentType = false reportUnknownMemberType = false reportUnusedCallResult = false [tool.ruff] exclude = ["main_window.py", "home_ui.py", "resources.py", "resources_rc.py"] line-length = 100 [tool.ruff.lint] select = ["B", "D", "E", "F", "FBT003", "I", "N", "SIM", "T20", "UP"] ignore = ["D100", "D101", "D102", "D103", "D104", "D105", "D106", "D107"] [tool.ruff.lint.per-file-ignores] "tests/**" = ["D", "E402"] "src/tagstudio/qt/helpers/vendored/**" = ["B", "E", "N", "UP", "SIM115"] [tool.ruff.lint.pydocstyle] convention = "google"