166 lines
4.7 KiB
Nix
166 lines
4.7 KiB
Nix
{ lib
|
|
, stdenv
|
|
, callPackage
|
|
, fetchFromGitHub
|
|
, makeWrapper
|
|
, nixosTests
|
|
, python3Packages
|
|
, writeShellScript
|
|
}:
|
|
|
|
let
|
|
version = "2.2.0";
|
|
src = fetchFromGitHub {
|
|
owner = "mealie-recipes";
|
|
repo = "mealie";
|
|
rev = "v${version}";
|
|
hash = "sha256-t4YYvj8dG8o9PVAlDxdxVBi2omBGQ2h53/IVv089778=";
|
|
};
|
|
|
|
frontend = callPackage (import ./mealie-frontend.nix src version) { };
|
|
|
|
pythonpkgs = python3Packages;
|
|
python = pythonpkgs.python;
|
|
|
|
crfpp = stdenv.mkDerivation {
|
|
pname = "mealie-crfpp";
|
|
version = "unstable-2024-02-12";
|
|
src = fetchFromGitHub {
|
|
owner = "mealie-recipes";
|
|
repo = "crfpp";
|
|
rev = "c56dd9f29469c8a9f34456b8c0d6ae0476110516";
|
|
hash = "sha256-XNps3ZApU8m07bfPEnvip1w+3hLajdn9+L5+IpEaP0c=";
|
|
};
|
|
|
|
# Can remove once the `register` keyword is removed from source files
|
|
# Configure overwrites CXXFLAGS so patch it in the Makefile
|
|
postConfigure = lib.optionalString stdenv.cc.isClang ''
|
|
substituteInPlace Makefile \
|
|
--replace-fail "CXXFLAGS = " "CXXFLAGS = -std=c++14 "
|
|
'';
|
|
};
|
|
in
|
|
|
|
pythonpkgs.buildPythonApplication rec {
|
|
pname = "mealie";
|
|
inherit version src;
|
|
pyproject = true;
|
|
|
|
build-system = with pythonpkgs; [ poetry-core ];
|
|
|
|
nativeBuildInputs = [ makeWrapper ];
|
|
|
|
dontWrapPythonPrograms = true;
|
|
|
|
pythonRelaxDeps = true;
|
|
|
|
dependencies = with pythonpkgs; [
|
|
aiofiles
|
|
alembic
|
|
aniso8601
|
|
appdirs
|
|
apprise
|
|
authlib
|
|
bcrypt
|
|
extruct
|
|
fastapi
|
|
gunicorn
|
|
html2text
|
|
httpx
|
|
itsdangerous
|
|
jinja2
|
|
lxml
|
|
openai
|
|
orjson
|
|
paho-mqtt
|
|
pillow
|
|
pillow-heif
|
|
psycopg2
|
|
pydantic-settings
|
|
pyhumps
|
|
pyjwt
|
|
python-dotenv
|
|
python-ldap
|
|
python-multipart
|
|
python-slugify
|
|
pyyaml
|
|
rapidfuzz
|
|
recipe-scrapers
|
|
sqlalchemy
|
|
tzdata
|
|
uvicorn
|
|
];
|
|
|
|
postPatch = ''
|
|
rm -rf dev # Do not need dev scripts & code
|
|
|
|
substituteInPlace mealie/__init__.py \
|
|
--replace-fail '__version__ = ' '__version__ = "v${version}" #'
|
|
|
|
substituteInPlace mealie/services/backups_v2/alchemy_exporter.py \
|
|
--replace-fail 'PROJECT_DIR = ' "PROJECT_DIR = Path('$out') #"
|
|
|
|
substituteInPlace mealie/db/init_db.py \
|
|
--replace-fail 'PROJECT_DIR = ' "PROJECT_DIR = Path('$out') #"
|
|
|
|
substituteInPlace mealie/services/backups_v2/alchemy_exporter.py \
|
|
--replace-fail '"script_location", path.join(PROJECT_DIR, "alembic")' '"script_location", "${src}/alembic"'
|
|
'';
|
|
|
|
postInstall = let
|
|
start_script = writeShellScript "start-mealie" ''
|
|
${lib.getExe pythonpkgs.gunicorn} "$@" -k uvicorn.workers.UvicornWorker mealie.app:app;
|
|
'';
|
|
init_db = writeShellScript "init-mealie-db" ''
|
|
${python.interpreter} $OUT/${python.sitePackages}/mealie/scripts/install_model.py
|
|
${python.interpreter} $OUT/${python.sitePackages}/mealie/db/init_db.py
|
|
'';
|
|
in ''
|
|
mkdir -p $out/bin $out/libexec
|
|
rm -f $out/bin/*
|
|
|
|
substitute ${src}/alembic.ini $out/alembic.ini \
|
|
--replace-fail 'script_location = alembic' 'script_location = ${src}/alembic'
|
|
|
|
makeWrapper ${start_script} $out/bin/mealie \
|
|
--set PYTHONPATH "$out/${python.sitePackages}:${pythonpkgs.makePythonPath dependencies}" \
|
|
--set LD_LIBRARY_PATH "${crfpp}/lib" \
|
|
--set STATIC_FILES "${frontend}" \
|
|
--set PATH "${lib.makeBinPath [ crfpp ]}"
|
|
|
|
makeWrapper ${init_db} $out/libexec/init_db \
|
|
--set PYTHONPATH "$out/${python.sitePackages}:${pythonpkgs.makePythonPath dependencies}" \
|
|
--set OUT "$out"
|
|
'';
|
|
|
|
nativeCheckInputs = with pythonpkgs; [ pytestCheckHook ];
|
|
|
|
disabledTestPaths = [
|
|
# KeyError: 'alembic_version'
|
|
"tests/unit_tests/services_tests/backup_v2_tests/test_backup_v2.py"
|
|
"tests/unit_tests/services_tests/backup_v2_tests/test_alchemy_exporter.py"
|
|
# sqlite3.OperationalError: no such table
|
|
"tests/unit_tests/services_tests/scheduler/tasks/test_create_timeline_events.py"
|
|
"tests/unit_tests/test_ingredient_parser.py"
|
|
"tests/unit_tests/test_security.py"
|
|
];
|
|
|
|
passthru.tests = {
|
|
inherit (nixosTests) mealie;
|
|
};
|
|
|
|
meta = with lib; {
|
|
description = "Self hosted recipe manager and meal planner";
|
|
longDescription = ''
|
|
Mealie is a self hosted recipe manager and meal planner with a REST API and a reactive frontend
|
|
application built in NuxtJS for a pleasant user experience for the whole family. Easily add recipes into your
|
|
database by providing the URL and Mealie will automatically import the relevant data or add a family recipe with
|
|
the UI editor.
|
|
'';
|
|
homepage = "https://mealie.io";
|
|
changelog = "https://github.com/mealie-recipes/mealie/releases/tag/${src.rev}";
|
|
license = licenses.agpl3Only;
|
|
maintainers = with maintainers; [ litchipi anoa ];
|
|
mainProgram = "mealie";
|
|
};
|
|
}
|