From 1b9ad4483d24c4bd2a57f134ed9e56936426ac96 Mon Sep 17 00:00:00 2001 From: Charles Lachance Date: Mon, 18 May 2026 01:52:50 -0400 Subject: [PATCH 1/5] Preliminary work to update to the new patterns. --- modules/aspects/batteries/pkgs.nix | 77 ++++++++++++++++++++++++++ templates/ci/modules/features/pkgs.nix | 74 +++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 modules/aspects/batteries/pkgs.nix create mode 100644 templates/ci/modules/features/pkgs.nix diff --git a/modules/aspects/batteries/pkgs.nix b/modules/aspects/batteries/pkgs.nix new file mode 100644 index 000000000..a1a76b208 --- /dev/null +++ b/modules/aspects/batteries/pkgs.nix @@ -0,0 +1,77 @@ +{ 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: user: + let + nixos = { pkgs, ... }: { + users.users.${user.userName}.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 = getPkgs: { host, user }: userPackages getPkgs user; + to-home = getPkgs: { home }: homePackages getPkgs; + + __functor = _self: getPkgs: { + includes = [ + (to-host-only getPkgs) + (to-user getPkgs) + (to-home getPkgs) + ]; + }; + +in +{ + den.batteries.pkgs = { + inherit description __functor; + provides = { + inherit 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..c708e9af9 --- /dev/null +++ b/templates/ci/modules/features/pkgs.nix @@ -0,0 +1,74 @@ +{ 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._.pkgs (pkgs: pkgs.discord)) ]; + + expr = igloo.config.environment.systemPackages; + expected = [ "discord" ]; + } + ); + + test-pkgs-set-on-user = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den._.pkgs (pkgs: pkgs.discord)) ]; + + expr = igloo.config.users.users.tux.packages; + expected = [ "discord" ]; + } + ); + + test-pkgs-set-on-home-manager = denTest ( + { den, tuxHm, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.default.homeManager.home.stateVersion = "25.11"; + den.aspects.tux.includes = [ (den._.pkgs (pkgs: pkgs.discord)) ]; + + expr = tuxHm.config.home.packages; + expected = [ "discord" ]; + } + ); + + test-pkgs-to-host-set-on-host = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den._.pkgs._.to-host (pkgs: pkgs.discord)) ]; + + expr = igloo.config.environment.systemPackages; + expected = [ "discord" ]; + } + ); + + test-pkgs-to-user-set-on-user = denTest ( + { den, igloo, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.aspects.tux.includes = [ (den._.pkgs._.to-user (pkgs: pkgs.discord)) ]; + + expr = igloo.config.users.users.tux.packages; + expected = [ "discord" ]; + } + ); + + test-pkgs-to-home-set-on-home-manager = denTest ( + { den, tuxHm, ... }: + { + den.hosts.x86_64-linux.igloo.users.tux = { }; + den.default.homeManager.home.stateVersion = "25.11"; + den.aspects.tux.includes = [ (den._.pkgs._.to-home (pkgs: pkgs.discord)) ]; + + expr = tuxHm.config.home.packages; + expected = [ "discord" ]; + } + ); + + }; +} From f8bc7856d07905d7a6886d482d0b607837206663 Mon Sep 17 00:00:00 2001 From: Charles Lachance Date: Tue, 19 May 2026 01:05:30 -0400 Subject: [PATCH 2/5] Updated pkgs battery to use new context injection. --- modules/aspects/batteries/pkgs.nix | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/aspects/batteries/pkgs.nix b/modules/aspects/batteries/pkgs.nix index a1a76b208..39acbd305 100644 --- a/modules/aspects/batteries/pkgs.nix +++ b/modules/aspects/batteries/pkgs.nix @@ -31,10 +31,10 @@ let }; userPackages = - getPkgs: user: + getPkgs: let - nixos = { pkgs, ... }: { - users.users.${user.userName}.packages = getPkgs pkgs; + nixos = { user, pkgs, ... }: { + users.users.${user.name}.packages = getPkgs pkgs; }; darwin = nixos; in @@ -55,8 +55,8 @@ let to-host = getPkgs: { host, ... }: hostPackages getPkgs; to-host-only = getPkgs: { host }: hostPackages getPkgs; - to-user = getPkgs: { host, user }: userPackages getPkgs user; - to-home = getPkgs: { home }: homePackages getPkgs; + to-user = userPackages; + to-home = homePackages; __functor = _self: getPkgs: { includes = [ From 4945660c364ffc11b5761410532a95ede768208d Mon Sep 17 00:00:00 2001 From: Charles Lachance Date: Tue, 19 May 2026 01:05:45 -0400 Subject: [PATCH 3/5] Updated tests. --- templates/ci/modules/features/pkgs.nix | 47 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/templates/ci/modules/features/pkgs.nix b/templates/ci/modules/features/pkgs.nix index c708e9af9..f981e00d1 100644 --- a/templates/ci/modules/features/pkgs.nix +++ b/templates/ci/modules/features/pkgs.nix @@ -6,10 +6,10 @@ { den, igloo, ... }: { den.hosts.x86_64-linux.igloo.users.tux = { }; - den.aspects.igloo.includes = [ (den._.pkgs (pkgs: pkgs.discord)) ]; + den.aspects.igloo.includes = [ (den.batteries.pkgs (pkgs: [pkgs.hello])) ]; - expr = igloo.config.environment.systemPackages; - expected = [ "discord" ]; + expr = builtins.elem "hello" (builtins.map (pkg: (builtins.head (builtins.splitVersion pkg.name))) igloo.environment.systemPackages); + expected = true; } ); @@ -17,10 +17,10 @@ { den, igloo, ... }: { den.hosts.x86_64-linux.igloo.users.tux = { }; - den.aspects.tux.includes = [ (den._.pkgs (pkgs: pkgs.discord)) ]; + den.aspects.tux.includes = [ (den.batteries.pkgs (pkgs: [pkgs.hello])) ]; - expr = igloo.config.users.users.tux.packages; - expected = [ "discord" ]; + expr = builtins.elem "hello" (builtins.map (pkg: pkg.pname) igloo.users.users.tux.packages); + expected = true; } ); @@ -29,10 +29,10 @@ { den.hosts.x86_64-linux.igloo.users.tux = { }; den.default.homeManager.home.stateVersion = "25.11"; - den.aspects.tux.includes = [ (den._.pkgs (pkgs: pkgs.discord)) ]; + den.aspects.tux.includes = [ (den.batteries.pkgs (pkgs: [pkgs.hello])) ]; - expr = tuxHm.config.home.packages; - expected = [ "discord" ]; + expr = builtins.elem "hello" (builtins.map (pkg: (builtins.head (builtins.splitVersion pkg.name))) tuxHm.home.packages); + expected = true; } ); @@ -40,10 +40,10 @@ { den, igloo, ... }: { den.hosts.x86_64-linux.igloo.users.tux = { }; - den.aspects.tux.includes = [ (den._.pkgs._.to-host (pkgs: pkgs.discord)) ]; + den.aspects.tux.includes = [ (den.batteries.pkgs.to-host (pkgs: [pkgs.hello])) ]; - expr = igloo.config.environment.systemPackages; - expected = [ "discord" ]; + expr = builtins.elem "hello" (builtins.map (pkg: (builtins.head (builtins.splitVersion pkg.name))) igloo.environment.systemPackages); + expected = true; } ); @@ -51,10 +51,10 @@ { den, igloo, ... }: { den.hosts.x86_64-linux.igloo.users.tux = { }; - den.aspects.tux.includes = [ (den._.pkgs._.to-user (pkgs: pkgs.discord)) ]; + den.aspects.tux.includes = [ (den.batteries.pkgs.to-user (pkgs: [pkgs.hello])) ]; - expr = igloo.config.users.users.tux.packages; - expected = [ "discord" ]; + expr = builtins.elem "hello" (builtins.map (pkg: pkg.pname) igloo.users.users.tux.packages); + expected = true; } ); @@ -63,10 +63,21 @@ { den.hosts.x86_64-linux.igloo.users.tux = { }; den.default.homeManager.home.stateVersion = "25.11"; - den.aspects.tux.includes = [ (den._.pkgs._.to-home (pkgs: pkgs.discord)) ]; + den.aspects.tux.includes = [ (den.batteries.pkgs.to-home (pkgs: [pkgs.hello])) ]; - expr = tuxHm.config.home.packages; - expected = [ "discord" ]; + 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: pkg.pname) igloo.users.users.tux.packages); + expected = false; } ); From dea78ce6a450347daf0b600ea098e1a30e39b6be Mon Sep 17 00:00:00 2001 From: Charles Lachance Date: Tue, 19 May 2026 01:15:25 -0400 Subject: [PATCH 4/5] Removed uneeded provides. --- modules/aspects/batteries/pkgs.nix | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/aspects/batteries/pkgs.nix b/modules/aspects/batteries/pkgs.nix index 39acbd305..5b4c48aab 100644 --- a/modules/aspects/batteries/pkgs.nix +++ b/modules/aspects/batteries/pkgs.nix @@ -69,9 +69,11 @@ let in { den.batteries.pkgs = { - inherit description __functor; - provides = { - inherit to-host to-user to-home; - }; + inherit + description + __functor + to-host + to-user + to-home; }; } \ No newline at end of file From f10d1be02ec9c76523b839aa55a78c6771c8c365 Mon Sep 17 00:00:00 2001 From: Charles Lachance Date: Tue, 19 May 2026 15:40:58 -0400 Subject: [PATCH 5/5] Updated tests. --- templates/ci/modules/features/pkgs.nix | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/templates/ci/modules/features/pkgs.nix b/templates/ci/modules/features/pkgs.nix index f981e00d1..331969579 100644 --- a/templates/ci/modules/features/pkgs.nix +++ b/templates/ci/modules/features/pkgs.nix @@ -27,7 +27,7 @@ test-pkgs-set-on-home-manager = denTest ( { den, tuxHm, ... }: { - den.hosts.x86_64-linux.igloo.users.tux = { }; + 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])) ]; @@ -61,7 +61,7 @@ test-pkgs-to-home-set-on-home-manager = denTest ( { den, tuxHm, ... }: { - den.hosts.x86_64-linux.igloo.users.tux = { }; + 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])) ]; @@ -76,6 +76,18 @@ 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; }