[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "soosef" version = "0.1.0" description = "Soo Security Fieldkit — offline-first security toolkit for journalists, NGOs, and at-risk organizations" readme = "README.md" license = "MIT" requires-python = ">=3.11" authors = [ { name = "Aaron D. Lee" } ] keywords = [ "steganography", "provenance", "attestation", "security", "privacy", "fieldkit", "airgap", "offline", ] classifiers = [ "Development Status :: 2 - Pre-Alpha", "Environment :: Console", "Environment :: Web Environment", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Security :: Cryptography", "Topic :: Multimedia :: Graphics", ] dependencies = [ "pillow>=10.0.0", "cryptography>=41.0.0", "argon2-cffi>=23.0.0", "zstandard>=0.22.0", "cbor2>=5.6.0", "uuid-utils>=0.9.0", ] [project.optional-dependencies] stego-dct = [ "numpy>=2.0.0", "scipy>=1.10.0", "jpeglib>=1.0.0", "reedsolo>=1.7.0", ] stego-audio = [ "pydub>=0.25.0", "numpy>=2.0.0", "scipy>=1.10.0", "soundfile>=0.12.0", "reedsolo>=1.7.0", ] stego-compression = [ "lz4>=4.0.0", ] attest = [ "imagehash>=4.3.0", "lmdb>=1.4.0", "exifread>=3.0.0", ] cli = [ "click>=8.0.0", "rich>=13.0.0", "qrcode>=7.30", "piexif>=1.1.0", ] web = [ "flask>=3.0.0", "flask-wtf>=1.2.0", "waitress>=3.0.0", "gunicorn>=21.0.0", "qrcode>=7.3.0", "pyzbar>=0.1.9", "piexif>=1.1.0", "soosef[attest,stego-dct]", ] api = [ "fastapi>=0.109.0", "uvicorn[standard]>=0.27.0", "python-multipart>=0.0.6", "soosef[stego-dct]", ] fieldkit = [ "watchdog>=4.0.0", "pyudev>=0.24.0", ] federation = [ "aiohttp>=3.9.0", ] rpi = [ "soosef[web,cli,fieldkit]", "gpiozero>=2.0", ] all = [ "soosef[stego-dct,stego-audio,stego-compression,attest,cli,web,api,fieldkit,federation]", ] dev = [ "soosef[all]", "pytest>=7.0.0", "pytest-cov>=4.0.0", "black>=23.0.0", "ruff>=0.1.0", "mypy>=1.0.0", ] [project.scripts] soosef = "soosef.cli:main" [project.urls] Homepage = "https://github.com/alee/soosef" Repository = "https://github.com/alee/soosef" [tool.hatch.build.targets.sdist] include = [ "/src", "/frontends", ] [tool.hatch.build.targets.wheel] packages = ["src/soosef", "frontends"] [tool.hatch.build.targets.wheel.sources] "src" = "" [tool.hatch.build.targets.wheel.force-include] "src/soosef/stegasoo/data/bip39-words.txt" = "soosef/stegasoo/data/bip39-words.txt" [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] addopts = "-v --cov=soosef --cov-report=term-missing" [tool.black] line-length = 100 target-version = ["py311", "py312", "py313"] [tool.ruff] line-length = 100 [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP"] ignore = ["E501"] [tool.ruff.lint.per-file-ignores] # YCbCr colorspace variables (R, G, B, Y, Cb, Cr) are standard names "src/soosef/stegasoo/dct_steganography.py" = ["N803", "N806"] # MDCT transform variables (N, X) are standard mathematical names "src/soosef/stegasoo/spread_steganography.py" = ["N803", "N806"] # Package __init__.py has imports after try/except and aliases - intentional structure "src/soosef/stegasoo/__init__.py" = ["E402"] [tool.mypy] python_version = "3.11" warn_return_any = true warn_unused_configs = true ignore_missing_imports = true