rustio-admin 0.24.0

Django Admin, but for Rust. A small, focused admin framework.
Documentation
[package]
name = "rustio-admin"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
authors.workspace = true
description = "Django Admin, but for Rust. A small, focused admin framework."
readme = "../../README.md"

[dependencies]
rustio-admin-macros = { workspace = true }

# runtime
tokio = { version = "1", features = [
    "net",
    "rt-multi-thread",
    "macros",
    "sync",
    "signal",
    "time",
    "fs",
] }
hyper = { version = "1", features = ["http1", "server"] }
hyper-util = { version = "0.1", features = ["tokio"] }
http-body-util = "0.1"
bytes = "1"

# data
sqlx = { version = "0.8", default-features = false, features = [
    "runtime-tokio",
    "postgres",
    "chrono",
    "uuid",
    "json",
    "macros",
] }
chrono = { version = "0.4", default-features = false, features = [
    "clock",
    "std",
    "serde",
] }
uuid = { version = "1", features = ["v4", "v7", "serde"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"

# templates
minijinja = { version = "2", features = ["loader"] }
# Markdown renderer for the built-in `/admin/docs` page (project
# operators read framework docs inside the admin chrome). Pure
# Rust, no C deps, MIT/Apache-2.0. Used only at render time โ€”
# no Cargo build-step touch.
pulldown-cmark = { version = "0.13", default-features = false, features = ["html"] }

# middleware
flate2 = "1"
dashmap = "6"
base64 = "0.22"
rand = "0.8"
subtle = "2"

# auth
argon2 = { version = "0.5", default-features = false, features = [
    "alloc",
    "password-hash",
    "rand",
] }
sha2 = "0.10"
# AES-256-GCM AEAD for TOTP secret encryption at rest (R3 / D1).
# `default-features = false` drops the `std` and `getrandom`
# auto-features; we drive nonce generation from the existing
# `rand` crate for consistency with session-token generation in
# `auth::sessions::random_token`.
aes-gcm = { version = "0.10", default-features = false, features = ["aes", "alloc"] }
# HMAC-SHA1 for RFC 6238 TOTP (R3 / commit #5). Authenticator
# apps (Google Authenticator, Authy, 1Password, Bitwarden,
# Aegis, Raivo, etc.) default to SHA-1; `algorithm=SHA256`
# variants exist but interop is best with the SHA-1 default.
# `hmac` and `sha1` are RustCrypto traits โ€” same family as the
# already-pulled `sha2`. Tiny dep tree, MIT/Apache-2.0.
hmac = "0.12"
sha1 = "0.10"
once_cell = "1"
thiserror = "1"

# utils
urlencoding = "2"
log = "0.4"

# Integration-test harness. Optional so a regular
# `cargo build` / `cargo test --workspace` (no feature) does NOT
# pull the dep tree. Cargo doesn't permit optional dev-dependencies,
# so these live in `[dependencies]` with `optional = true`; the
# `integration-test` feature below activates them. The library
# code itself never references testcontainers โ€” only the
# `tests/integration_*.rs` files (which are also gated on the
# feature) do.
testcontainers = { version = "0.23", optional = true }
testcontainers-modules = { version = "0.11", optional = true, features = ["postgres"] }

[features]
# Enables the testcontainers Postgres integration suite under
# `tests/integration_*.rs`. CI runs `cargo test --workspace
# --features integration-test`; local `cargo test --workspace`
# (no flag) skips them and keeps the unit-test gate fast.
# See `DESIGN_R2_ORGANISATIONAL.md` ยง10.3.
integration-test = ["dep:testcontainers", "dep:testcontainers-modules"]