diff --git a/modules/aspects/batteries/pkgs.nix b/modules/aspects/batteries/pkgs.nix new file mode 100644 index 000000000..5b4c48aab --- /dev/null +++ b/modules/aspects/batteries/pkgs.nix @@ -0,0 +1,79 @@ +{ den, ... }: +let + description = '' + Includes a package at User and Home levels. + + Works in NixOS/Darwin and standalone Home-Manager + + ## Usage + + # for NixOS/Darwin + den.aspects.my-user.includes = [ (den._.user-packages [ "hello" ]) ] + + # for standalone home-manager + den.aspects.my-home.includes = [ den._.user-packages [ "hello" ]) ] + + or globally (automatically applied depending on context): + + den.default.includes = [ den._.user-packages [ "hello" ]) ] + ''; + + hostPackages = + getPkgs: + let + nixos = { pkgs, ... }: { + environment.systemPackages = getPkgs pkgs; + }; + darwin = nixos; + in + { + inherit nixos darwin; + }; + + userPackages = + getPkgs: + let + nixos = { user, pkgs, ... }: { + users.users.${user.name}.packages = getPkgs pkgs; + }; + darwin = nixos; + in + { + inherit nixos darwin; + }; + + homePackages = + getPkgs: + let + homeManager = { pkgs, ... }: { + home.packages = getPkgs pkgs; + }; + in + { + inherit homeManager; + }; + + to-host = getPkgs: { host, ... }: hostPackages getPkgs; + to-host-only = getPkgs: { host }: hostPackages getPkgs; + to-user = userPackages; + to-home = homePackages; + + __functor = _self: getPkgs: { + includes = [ + (to-host-only getPkgs) + (to-user getPkgs) + (to-home getPkgs) + ]; + }; + +in +{ + den.batteries.pkgs = { + inherit + description + __functor + to-host + to-user + to-home; + }; +} \ No newline at end of file diff --git a/templates/ci/modules/features/pkgs.nix b/templates/ci/modules/features/pkgs.nix new file mode 100644 index 000000000..331969579 --- /dev/null +++ b/templates/ci/modules/features/pkgs.nix @@ -0,0 +1,97 @@ +{ denTest, ... }: +{ + flake.tests.pkgs = { + + test-pkgs-set-on-host = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.igloo.includes = [ (den.batteries.pkgs (pkgs: [pkgs.hello])) ]; + + expr = builtins.elem "hello" (builtins.map (pkg: (builtins.head (builtins.splitVersion pkg.name))) igloo.environment.systemPackages); + expected = true; + } + ); + + test-pkgs-set-on-user = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den.batteries.pkgs (pkgs: [pkgs.hello])) ]; + + expr = builtins.elem "hello" (builtins.map (pkg: pkg.pname) igloo.users.users.tux.packages); + expected = true; + } + ); + + test-pkgs-set-on-home-manager = denTest ( + { den, tuxHm, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux.classes = [ "homeManager" ]; + den.default.homeManager.home.stateVersion = "25.11"; + den.aspects.tux.includes = [ (den.batteries.pkgs (pkgs: [pkgs.hello])) ]; + + expr = builtins.elem "hello" (builtins.map (pkg: (builtins.head (builtins.splitVersion pkg.name))) tuxHm.home.packages); + expected = true; + } + ); + + test-pkgs-to-host-set-on-host = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den.batteries.pkgs.to-host (pkgs: [pkgs.hello])) ]; + + expr = builtins.elem "hello" (builtins.map (pkg: (builtins.head (builtins.splitVersion pkg.name))) igloo.environment.systemPackages); + expected = true; + } + ); + + test-pkgs-to-user-set-on-user = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den.batteries.pkgs.to-user (pkgs: [pkgs.hello])) ]; + + expr = builtins.elem "hello" (builtins.map (pkg: pkg.pname) igloo.users.users.tux.packages); + expected = true; + } + ); + + test-pkgs-to-home-set-on-home-manager = denTest ( + { den, tuxHm, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux.classes = [ "homeManager" ]; + den.default.homeManager.home.stateVersion = "25.11"; + den.aspects.tux.includes = [ (den.batteries.pkgs.to-home (pkgs: [pkgs.hello])) ]; + + expr = builtins.elem "hello" (builtins.map (pkg: (builtins.head (builtins.splitVersion pkg.name))) tuxHm.home.packages); + expected = true; + } + ); + + test-pkgs-set-on-user-not-on-host = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den.batteries.pkgs (pkgs: [pkgs.hello])) ]; + + expr = builtins.elem "hello" (builtins.map (pkg: (builtins.head (builtins.splitVersion pkg.name))) igloo.environment.systemPackages); + expected = false; + } + ); + + test-pkgs-set-on-home-manager-not-on-user = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux.classes = [ "homeManager" ]; + den.default.homeManager.home.stateVersion = "25.11"; + den.aspects.tux.includes = [ (den.batteries.pkgs (pkgs: [pkgs.hello])) ]; + + expr = builtins.elem "hello" (builtins.map (pkg: pkg.pname) igloo.users.users.tux.packages); + expected = false; + } + ); + + }; +}