[build-system] requires = ["setuptools==84.2.1"] build-backend = "setuptools.build_meta" [project] name = "peach" dynamic = ["version"] description = "Local-first media library, behavior ledger, and discovery application" readme = "README.md" # SPDX 表达式必须和 `LICENSE` 全文一致,换许可证要先改 ADR-0023 第 4 阶段; # `tests/test_repo_hygiene.py` 钉住 LICENSE 那一侧。 license = "AGPL-3.0-or-later" requires-python = ">=3.14" # `Private :: Do Not Upload` 不是修饰语:Peach 只自托管、不发 PyPI # (`.github/workflows/test.yml`),PyPI 拒收带这枚 classifier 的包, # 所以误跑 `twine upload` 会在传上去之前就被挡住。 classifiers = [ "Private :: Do Not Upload", "Environment :: Web Environment", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.14", "Topic :: Database :: Front-Ends", "Topic :: Multimedia :: Video", ] dependencies = [ "itsdangerous==2.2.0", "filelock==4.2.9", "tldextract==5.4.0", "APScheduler==3.11.3", "beautifulsoup4==4.15.0", "bencode2==0.3.38", "browserexport==0.4.4", "pyahocorasick==2.3.1", "curl_cffi==0.17.0", "fastapi==0.162.2", # grpcio 与 protobuf 给云下载调 CloudDrive2 的 gRPC 接口(`downloads_clouddrive.py`)。 # 消息代码由 grpcio-tools 1.84.0 生成后提交,它自带的 protoc 对应 protobuf 7.35.1, # 运行时 protobuf 必须同一大版本且不低于它。 "grpcio==1.85.1", "httpx==0.28.1", "m3u8==6.0.0", "pillow==13.0.0", "protobuf==7.36.2", "psutil==7.2.2", "pystray==0.19.5", # 配置页让手机扫码下载本机 CA(`routes_configuration.certificate_payload`);只取模块矩阵,不走 Pillow 出图。 "qrcode==8.2", "pydantic==2.14.3", "resvg-py==0.5.0", "sentry-sdk==2.74.0", "socksio==1.0.0", "starlette==1.10.0", "torznab==0.2.1", "tzlocal==5.4.5", "uvicorn==0.54.0", "watchdog==7.1.0", "zeroconf==0.154.0", "smbprotocol==1.17.0", # 应用内更新校验发布签名(Ed25519,ADR-0137)。 "cryptography==50.0.2", ] [project.urls] Homepage = "https://github.com/peach-mitao/peach" Repository = "https://github.com/peach-mitao/peach" Issues = "https://github.com/peach-mitao/peach/issues" [project.scripts] peach = "peach.error_reporting:cli_main" peach-tray = "peach.error_reporting:tray_main" [project.optional-dependencies] dev = [ "filelock==4.2.9", "httpx2==2.16.0", "ruff==0.17.4", "seiso==0.4.0", ] build = [ "pyinstaller==6.22.3", "dmgbuild==1.6.7; sys_platform == 'darwin'", ] macos = ["pyobjc-framework-Cocoa==12.2.2; sys_platform == 'darwin'"] # numpy 本来就是 opencv 的传递依赖,这里显式钉住:`face_detect.decode` 直接 import 它 # 把字节喂给 `cv2.imdecode`,被 import 的外部模块必须有声明的归属。 vision = ["opencv-python-headless==5.0.0.93", "numpy==2.5.4"] maintenance-115 = ["p115client==0.0.9.7.2"] # 字形复核与英文媒体文件名分词工具。 naming = [ "opencc==1.4.2", "wordninja-enhanced==3.2.0", ] [tool.setuptools] package-dir = {"" = "src"} [tool.uv] # 只设下限:uv 是工具不是依赖,它的版本不进依赖图(scripts/test_runner.py 的 # dependency_inputs 也不算它)。Homebrew、winget 与官方脚本都只装最新版,写死等号 # 会让每台新机器上的 uv 连 `--no-project` 的钩子都拒绝运行;CI 想复现就在 setup-uv 里给 version。 required-version = ">=0.12.13" cache-keys = [{file = "pyproject.toml"}, {file = "setup.py"}, {file = "src/peach/__init__.py"}, {file = "README.md"}] [tool.setuptools.dynamic] version = {attr = "peach.__version__"} [tool.setuptools.packages.find] where = ["src"] [tool.ruff] target-version = "py314" extend-exclude = ["src/peach/downloads_clouddrive_pb2.py"] [tool.ruff.lint] select = ["F", "PLE", "B006", "B012", "B018", "B023", "W605"]