{ 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; } ); 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 ]; }; }); }; }