[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "Mac-letterhead" dynamic = ["version"] description = "A macOS utility to merge letterhead with PDF documents using a drag-and-drop interface" readme = "README.md" requires-python = ">=3.10" license = "MIT" authors = [ { name = "Erik", email = "" } ] classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Operating System :: MacOS", "Environment :: MacOS X :: Cocoa", "Topic :: Office/Business", "Topic :: Text Processing :: Markup :: Markdown", "Intended Audience :: End Users/Desktop", ] dependencies = [ "pyobjc-framework-Quartz>=11.1,<12", "pyobjc-framework-Cocoa>=11.1,<12", "pyobjc-core>=11.1,<13", "importlib-resources; python_version < '3.9'", "pymupdf>=1.25.4,<2", "reportlab>=3.6.0", "markdown>=3.7", "pycmarkgfm>=1.2.0", "html5lib>=1.1,<2", "weasyprint>=68.1", "pillow>=12.2.0", # CVE-2026-40192: FITS decompression bomb "webencodings>=0.5.1,<2", "cffi>=1.15.0", "cssselect2>=0.7.0", "fonttools>=4.59.2", "pydyf>=0.5.0", "pyphen>=0.13.0", "tinycss2>=1.5.0", "pygments>=2.20.0", # CVE-2026-4539: ReDoS in GUID lexer "brotli>=1.2.0", # CVE-2025-6176 ] # Keep empty optional dependencies section for backward compatibility [project.optional-dependencies] markdown = [] mcp = [ "mcp>=2.0.0", "starlette>=0.49.1", # CVE-2025-62727 "python-multipart>=0.0.26", # CVE-2026-24486, CVE-2026-40347: multipart DoS "pyjwt>=2.12.0", # CVE-2026-32597: crit header bypass (patched in 2.12.0) "cryptography>=46.0.7", # CVE-2026-39892: buffer overflow; CVE-2026-34073: DNS cert bypass "python-dotenv>=1.2.2", # CVE-2026-28684: symlink file overwrite (transitive via pydantic-settings) ] dev = [ "pytest>=9.0.3", # CVE-2025-71176: insecure tmpdir creation "pytest-cov>=4.0.0", ] [project.scripts] mac-letterhead = "letterhead_pdf.main:main" [tool.hatch.version] path = "letterhead_pdf/__init__.py" [tool.hatch.build.targets.wheel] packages = ["letterhead_pdf"] include = ["letterhead_pdf/resources/**/*"] # We're moving to using only in-package resources # to follow Python best practices for package resources