Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions modules/aspects/batteries/pkgs.nix
Original file line number Diff line number Diff line change
@@ -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;
};
}
97 changes: 97 additions & 0 deletions templates/ci/modules/features/pkgs.nix
Original file line number Diff line number Diff line change
@@ -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;
}
);

};
}