[project] name = "negpy" description = "A tool for processing film negatives." readme = "README.md" license = "GPL-3.0" authors = [ { name = "marcinz606" }, { name = "NegPy Contributors" } ] dynamic = ["version"] requires-python = ">=3.13" dependencies = [ "rawpy==0.27.0", "tifffile==2026.6.1", "imagecodecs==2026.6.6", "imageio==2.37.3", "jinja2==3.1.6", "numba==0.65.1", "numpy==2.4.4", "opencv-python-headless==4.13.0.92", "pillow==12.2.0", "pyqt6==6.11.0", "pyqt6-charts==6.11.0", "piexif==1.1.3", "qtawesome==1.4.2", "wgpu==0.31.1", "pyserial>=3.5", ] classifiers = [ "Development Status :: 3 - Alpha", "Environment :: GPU", "Intended Audience :: End Users/Desktop", "Operating System :: Microsoft :: Windows", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3.13", "Topic :: Multimedia :: Graphics :: Graphics Conversion", "Topic :: Multimedia :: Graphics :: Viewers", "Topic :: Scientific/Engineering :: Image Processing" ] [dependency-groups] dev = [ "pyinstaller>=6.18.0", "pytest==9.0.2", "pytest-cov>=7.0", "ruff==0.14.10", "ty>=0.0.26", ] scanner = [ "python-sane>=2.9", ] camera = [ # Tethered camera scanning. libgphoto2 has no Windows build, so the wheels — and the # Camera Scanning tab with them — are macOS and Linux only. "gphoto2>=2.5 ; sys_platform != 'win32'", ] [project.urls] Homepage = "https://github.com/marcinz606/NegPy" Documentation = "https://github.com/marcinz606/NegPy/docs" Repository = "https://github.com/marcinz606/NegPy.git" Issues = "https://github.com/marcinz606/NegPy/issues" [build-system] requires = ["setuptools~=80.10.2"] build-backend = "setuptools.build_meta" [tool.setuptools] packages = ["negpy"] [tool.setuptools.dynamic] version = { file = "VERSION" } [tool.pytest.ini_options] markers = [ "slow: wall-clock tests that require I/O or a real RAW file (deselect with '-m not slow')", "metrics: opt-in performance metrics tests", ] addopts = "-m 'not slow'" # Lets test modules share helpers via `from conftest import ...` (FakeRepo/FakeController). pythonpath = ["tests"] [tool.ruff] line-length = 140 exclude = [ "venv", ".venv", "__pycache__", ".git", ".github", "user", "docs", ".streamlit", ".pytest_cache", "icc", "processed", "node_modules", "dist", "desktop/bin", "build", ] [tool.coverage.run] source = ["negpy"]