matrix-ops-bot/flake.nix

242 lines
6.9 KiB
Nix

{
description = "matrix-ops-bot - webhook daemon for Matrix operations";
inputs = {
nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1";
pyproject-nix = {
url = "github:pyproject-nix/pyproject.nix";
inputs.nixpkgs.follows = "nixpkgs";
};
uv2nix = {
url = "github:pyproject-nix/uv2nix";
inputs.pyproject-nix.follows = "pyproject-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
pyproject-build-systems = {
url = "github:pyproject-nix/build-system-pkgs";
inputs.pyproject-nix.follows = "pyproject-nix";
inputs.uv2nix.follows = "uv2nix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{
self,
nixpkgs,
pyproject-nix,
uv2nix,
pyproject-build-systems,
...
}:
let
systems = [ "x86_64-linux" ];
forAllSystems = fn: nixpkgs.lib.genAttrs systems (system: fn nixpkgs.legacyPackages.${system});
workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; };
overlay = workspace.mkPyprojectOverlay { sourcePreference = "wheel"; };
pyprojectOverrides = final: prev: {
atomicwrites = prev.atomicwrites.overrideAttrs (old: {
nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ final.setuptools ];
});
termcolor = prev.termcolor.overrideAttrs (old: {
nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ final.setuptools ];
});
};
mkModuleWithDefaultPackage =
modulePath:
{
lib,
pkgs,
...
}:
let
system = pkgs.stdenv.hostPlatform.system;
in
{
imports = [ modulePath ];
services.matrix-ops-bot.package = lib.mkDefault (
if builtins.hasAttr system self.packages then self.packages.${system}.default else null
);
};
mkPackage =
pkgs:
let
pythonSet =
(pkgs.callPackage pyproject-nix.build.packages {
python = pkgs.python311;
}).overrideScope
(
pkgs.lib.composeManyExtensions [
pyproject-build-systems.overlays.default
overlay
pyprojectOverrides
]
);
baseVenv = pythonSet.mkVirtualEnv "matrix-ops-bot-env" workspace.deps.default;
testVenv = pythonSet.mkVirtualEnv "matrix-ops-bot-test-env" {
matrix-ops-bot = [ "dev" ];
};
tests = pkgs.stdenv.mkDerivation {
name = "matrix-ops-bot-tests";
src = ./.;
dontConfigure = true;
dontBuild = true;
nativeBuildInputs = [ testVenv ];
checkPhase = ''
runHook preCheck
export HOME="$(mktemp -d)"
pytest tests/ -v
runHook postCheck
'';
doCheck = true;
installPhase = ''
mkdir -p "$out"
touch "$out/passed"
'';
};
templateAssets = pkgs.runCommand "matrix-ops-bot-templates" { } ''
mkdir -p $out/share/matrix-ops-bot
cp -r ${./templates} $out/share/matrix-ops-bot/templates
'';
runtimeEntrypoint = pkgs.writeShellScriptBin "matrix-ops-bot" ''
exec "${baseVenv}/bin/python" -m ops_bot.main "$@"
'';
runtimePackage = pkgs.symlinkJoin {
name = "matrix-ops-bot-env";
paths = [
baseVenv
templateAssets
runtimeEntrypoint
];
};
in
pkgs.runCommand "matrix-ops-bot-env"
{
inherit (runtimePackage) meta;
passthru = {
inherit tests testVenv runtimePackage;
};
}
''
test -f "${tests}/passed"
ln -s "${runtimePackage}" "$out"
'';
in
{
formatter = forAllSystems (pkgs: pkgs.nixfmt);
nixosModules = {
default = mkModuleWithDefaultPackage ./nix/modules/nixos;
matrix-ops-bot = mkModuleWithDefaultPackage ./nix/modules/nixos/services/matrix-ops-bot.nix;
};
packages = forAllSystems (
pkgs:
let
pkg = mkPackage pkgs;
in
{
matrix-ops-bot = pkg;
default = pkg;
}
);
apps = forAllSystems (
pkgs:
let
package = self.packages.${pkgs.stdenv.hostPlatform.system}.matrix-ops-bot;
in
{
matrix-ops-bot = {
type = "app";
program = "${package}/bin/matrix-ops-bot";
meta.description = "Matrix Ops Bot runtime";
};
default = {
type = "app";
program = "${package}/bin/matrix-ops-bot";
meta.description = "Matrix Ops Bot runtime";
};
}
);
checks = forAllSystems (
pkgs:
let
system = pkgs.stdenv.hostPlatform.system;
exportedPackage = self.packages.${system}.default;
testVenv = exportedPackage.testVenv;
src = ./.;
ruffCheck = pkgs.stdenv.mkDerivation {
name = "matrix-ops-bot-ruff";
inherit src;
dontConfigure = true;
dontBuild = true;
nativeBuildInputs = [ testVenv ];
checkPhase = ''
runHook preCheck
ruff check ops_bot/ tests/
ruff format --check ops_bot/ tests/
runHook postCheck
'';
doCheck = true;
installPhase = ''
mkdir -p "$out"
touch "$out/passed"
'';
};
pyrightCheck = pkgs.stdenv.mkDerivation {
name = "matrix-ops-bot-pyright";
inherit src;
dontConfigure = true;
dontBuild = true;
nativeBuildInputs = [
testVenv
pkgs.nodejs
];
checkPhase = ''
runHook preCheck
export HOME="$(mktemp -d)"
pyright ops_bot/
runHook postCheck
'';
doCheck = true;
installPhase = ''
mkdir -p "$out"
touch "$out/passed"
'';
};
in
{
package-default = exportedPackage;
tests = exportedPackage.tests;
ruff = ruffCheck;
pyright = pyrightCheck;
}
// pkgs.lib.optionalAttrs pkgs.stdenv.isLinux {
nixos-module = pkgs.testers.runNixOSTest (import ./nix/tests/matrix-ops-bot.nix self);
}
);
devShells = forAllSystems (pkgs: {
default = pkgs.mkShell {
packages = [
pkgs.python311
pkgs.uv
pkgs.ruff
pkgs.pyright
];
env.LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [
pkgs.stdenv.cc.cc
];
};
});
};
}