[build-system] requires = ["setuptools>=69.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "pageparse" version = "0.2.0" description = "Any handwritten page → clean structured data. On CPU. Fully offline." license = { text = "AGPL-3.0-or-later" } readme = "README.md" requires-python = ">=3.11" authors = [ { name = "Team Centurions" }, ] dependencies = [ "opencv-python>=4.8.0", "onnxruntime>=1.16.0", "llama-cpp-python>=0.2.0", "pydantic>=2.0", "typer>=0.9.0", "fastapi>=0.100.0", "uvicorn>=0.23.0", "psutil>=5.9.0", "Pillow>=10.0.0", "pypdfium2>=4.30.0", "tokenizers>=0.15.0", "structlog>=24.0.0", "prometheus-client>=0.19.0", "httpx>=0.27.0", "pyzbar>=0.1.9", "pandas>=2.0.0", "openpyxl>=3.1.0", ] [project.optional-dependencies] dev = [ "pytest>=7.0", "pytest-asyncio>=0.23.0", "ruff>=0.1.0", "mypy>=1.6.0", "bandit>=1.7.0", "pip-audit>=2.7.0", "detect-secrets>=1.4.0", "gitlint>=0.19.0", "yamllint>=1.33.0", "pre-commit>=3.5.0", "playwright>=1.40.0", ] web = [ "fastapi>=0.100.0", "uvicorn>=0.23.0", "jinja2>=3.1.0", "python-multipart>=0.0.6", ] desktop = [ "pywebview>=4.0.0", ] tts = [ "pyttsx3>=2.90", ] [project.scripts] pageparse = "pageparse.cli:app" [tool.setuptools.packages.find] where = ["src"] [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP"] ignore = ["E501"] [tool.mypy] python_version = "3.12" ignore_missing_imports = true disallow_untyped_decorators = false disallow_untyped_defs = false check_untyped_defs = true [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] [tool.bandit] exclude_dirs = ["tests", ".venv"] skips = ["B101", "B110", "B310", "B314", "B608"]