Euler source The code that runs the solver shell and this site, version 4.34.2 Repository on GitHub

Project Euler Solver: the content site (public and per-user) and the auth service

56 lines of TOML Raw file Open on GitHub

# euler-site: the content site and the auth service (docs/package-guide.md § 1).
# Imports the solver's domain modules (problems, the progress parser, paths, auth policy),
# never its shell; nothing here imports the web shell.
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"

[project]
name = "euler-site"
dynamic = ["version"]
description = "Project Euler Solver: the content site (public and per-user) and the auth service"
authors = [{ name = "Vikas Munshi", email = "vikas.munshi@gmail.com" }]
license = "MIT"
requires-python = ">=3.14"
# Lockstep (Q5): the pin is rewritten by scripts/version/release.sh with every version.py.
dependencies = [
    "euler-solver==4.34.2",
    # aiohttp is the one framework across the app services; Jinja2 (via aiohttp-jinja2,
    # autoescape on) renders every page.
    "aiohttp",
    "aiohttp-jinja2",
    "jinja2",
    # The guides' and blogs' Markdown.
    "markdown-it-py",
    # The code viewer's highlighting (/code/, euler_site.site.code). Already in every venv
    # through rich (euler-solver); named here because this package imports it.
    "pygments",
    # The `.html` save gate: sanitize-and-store-clean (abi3 wheel, no Rust toolchain).
    "nh3",
    # Reading the ink of a cached problem diagram (content._image_ink); its absence
    # degrades to "no plate".
    "pillow",
    # Argon2id for the SRP private key x (auth/srp.py). The browser derives x for a sign-in,
    # so the service needs it only to mint or check a verifier locally (verify_password, tests).
    "argon2-cffi",
]

[tool.setuptools.dynamic]
version = { attr = "euler_site.version.__version__" }

[tool.setuptools.packages.find]
where = ["."]
include = ["euler_site*"]

[tool.setuptools.package-data]
euler_site = [
    "templates/*.html",      # the auth pages
    # The start page's summary — tracked, generated by `update-docs` from the README's HOME
    # slice. It ships because euler-auth renders the start page with no clone to read.
    "content/home-summary.md",
    # The static tree the edge serves: shipped so the services can hash it into the
    # templates' asset URLs (euler_site/assets.py) from the very bytes this build installs.
    "content/assets/*",
    "content/vendor/**/*",
]
"euler_site.site" = ["templates/*.html"]