Files
clan-core/pkgs/clan-cli/flake-module.nix
2025-10-21 21:01:06 +02:00

166 lines
5.1 KiB
Nix

{
inputs,
self,
lib,
...
}:
{
imports = [ ./clan_cli/tests/flake-module.nix ];
perSystem =
{
self',
pkgs,
system,
...
}:
let
clanCoreWithVendoredDeps = self'.packages.clan-core-flake.override {
clanCore = self.filter {
include = [
"clanModules"
"flakeModules"
"lib"
"modules"
"nixosModules"
"flake.lock"
"templates"
"clanServices"
"pkgs/zerotierone"
"pkgs/minifakeroot"
"pkgs/clan-cli/clan_cli/tests/flake-module.nix"
# needed for test_generate_test_vars.py
"checks/service-dummy-test"
"checks/flake-module.nix"
];
};
};
# We need to add the paths of the templates to the nix store such that they are available
# only adding clanCoreWithVendoredDeps to the nix store is not enough
templateDerivation = pkgs.closureInfo {
rootPaths =
builtins.attrValues (self.inputs.nix-select.lib.select "clan.templates.clan.*.path" self)
++ builtins.attrValues (self.inputs.nix-select.lib.select "clan.templates.machine.*.path" self);
};
in
{
devShells.clan-cli = pkgs.callPackage ./shell.nix {
inherit self' self;
inherit (self'.packages) clan-cli;
};
packages = {
clan-cli = pkgs.callPackage ./default.nix {
inherit (inputs) nixpkgs nix-select;
inherit (self.legacyPackages.${system}) setupNixInNix;
inherit (self'.packages) zerotierone minifakeroot;
templateDerivation = templateDerivation;
pythonRuntime = pkgs.python3;
clan-core-path = clanCoreWithVendoredDeps;
includedRuntimeDeps = [
"age"
"git"
"nix"
];
inherit (self) nixosConfigurations;
};
clan-cli-full = pkgs.callPackage ./default.nix {
inherit (inputs) nixpkgs nix-select;
inherit (self.legacyPackages.${system}) setupNixInNix;
inherit (self'.packages) zerotierone minifakeroot;
clan-core-path = clanCoreWithVendoredDeps;
templateDerivation = templateDerivation;
pythonRuntime = pkgs.python3;
includedRuntimeDeps = lib.importJSON ./clan_lib/nix/allowed-packages.json;
inherit (self) nixosConfigurations;
};
clan-cli-docs = pkgs.stdenv.mkDerivation {
name = "clan-cli-docs";
src = ./.;
buildInputs = [
# TODO: see postFixup clan-cli/default.nix:L188
pkgs.python3
self'.packages.clan-cli.propagatedBuildInputs
];
installPhase = ''
python docs.py reference
mkdir -p $out
cp -r out/* $out
ls -lah $out
'';
};
clan-ts-api = pkgs.stdenv.mkDerivation {
name = "clan-ts-api";
src = ./.;
buildInputs = [
pkgs.python3
pkgs.json2ts
pkgs.jq
];
installPhase = ''
mkdir -p $out
# Retrieve python API Typescript types
python api.py > $out/API.json
json2ts --input $out/API.json > $out/API.ts
# Substitute '{}' with 'Record<string, never>' because typescript is like that
# It treats it not as the type of an empty object, but as non-nullish.
# Should be fixed in json2ts: https://github.com/bcherny/json-schema-to-typescript/issues/557
sed -i -e 's/{}/Record<string, never>/g' $out/API.ts
'';
};
clan-lib-openapi = pkgs.stdenv.mkDerivation {
name = "clan-lib-openapi";
src = ./.;
buildInputs = [
pkgs.python3
];
installPhase = ''
export INPUT_PATH=${self'.packages.clan-ts-api}/API.json
python openapi.py
cp openapi.json $out
'';
};
default = self'.packages.clan-cli;
};
checks = self'.packages.clan-cli.tests // {
inventory-classes-up-to-date = pkgs.stdenv.mkDerivation {
name = "inventory-classes-up-to-date";
src = ./clan_lib/nix_models;
env = {
classFile = "clan.py";
};
installPhase = ''
${self'.packages.classgen}/bin/classgen ${self'.legacyPackages.schemas.clanSchemaJson}/schema.json b_classes.py
file1=$classFile
file2=b_classes.py
echo "Comparing $file1 and $file2"
if cmp -s "$file1" "$file2"; then
echo "Files are identical"
echo "Classes file is up to date"
else
echo "Classes file is out of date or has been modified"
echo "run 'direnv reload' in the pkgs/clan-cli directory to refresh the classes file"
echo "--------------------------------\n"
diff "$file1" "$file2"
echo "--------------------------------\n\n"
exit 1
fi
touch $out
'';
};
};
};
}