Skip to content

Commit

Permalink
ncmpcpp: add module
Browse files Browse the repository at this point in the history
  • Loading branch information
olmokramer authored and rycee committed Sep 1, 2020
1 parent 4fe5afa commit 4b702bf
Show file tree
Hide file tree
Showing 14 changed files with 282 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@

/modules/programs/mpv.nix @tadeokondrak

/modules/programs/ncmpcpp.nix @olmokramer
/tests/modules/programs/ncmpcpp @olmokramer
/tests/modules/programs/ncmpcpp-linux @olmokramer

/modules/programs/ne.nix @cwyc
/tests/modules/programs/ne @cwyc

Expand Down
6 changes: 6 additions & 0 deletions modules/lib/maintainers.nix
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,10 @@
fingerprint = "D446 E58D 87A0 31C7 EC15 88D7 B461 2924 45C6 E696";
}];
};
olmokramer = {
name = "Olmo Kramer";
email = "[email protected]";
github = "olmokramer";
githubId = 3612514;
};
}
7 changes: 7 additions & 0 deletions modules/misc/news.nix
Original file line number Diff line number Diff line change
Expand Up @@ -1642,6 +1642,13 @@ in
A new module is available: 'programs.mcfly'
'';
}

{
time = "2020-09-01T18:38:18+00:00";
message = ''
A new module is available: 'programs.ncmpcpp'
'';
}
];
};
}
1 change: 1 addition & 0 deletions modules/modules.nix
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ let
(loadModule ./programs/mercurial.nix { })
(loadModule ./programs/mpv.nix { })
(loadModule ./programs/msmtp.nix { })
(loadModule ./programs/ncmpcpp.nix { })
(loadModule ./programs/ne.nix { })
(loadModule ./programs/neomutt.nix { })
(loadModule ./programs/neovim.nix { })
Expand Down
135 changes: 135 additions & 0 deletions modules/programs/ncmpcpp.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
{ config, lib, pkgs, ... }:

with lib;

let

cfg = config.programs.ncmpcpp;

renderSettings = settings:
concatStringsSep "\n" (mapAttrsToList renderSetting settings);

renderSetting = name: value: "${name}=${renderValue value}";

renderValue = option:
{
int = toString option;
bool = if option then "yes" else "no";
string = option;
}.${builtins.typeOf option};

renderBindings = bindings: concatStringsSep "\n" (map renderBinding bindings);

renderBinding = { key, command }:
concatStringsSep "\n " ([ ''def_key "${key}"'' ] ++ maybeWrapList command);

maybeWrapList = xs: if isList xs then xs else [ xs ];

valueType = with types; oneOf [ bool int str ];

bindingType = types.submodule ({ name, config, ... }: {
options = {
key = mkOption {
type = types.str;
description = "Key to bind.";
example = "j";
};

command = mkOption {
type = with types; either str (listOf str);
description = "Command or sequence of commands to be executed.";
example = "scroll_down";
};
};
});

in {
meta.maintainers = with maintainers; [ olmokramer ];

options.programs.ncmpcpp = {
enable =
mkEnableOption "ncmpcpp - an ncurses Music Player Daemon (MPD) client";

package = mkOption {
type = types.package;
default = pkgs.ncmpcpp;
defaultText = literalExample "pkgs.ncmpcpp";
description = ''
Package providing the <code>ncmpcpp</code> command.
'';
example =
literalExample "pkgs.ncmpcpp.override { visualizerSupport = true; }";
};

mpdMusicDir = mkOption {
type = types.nullOr types.path;
default = let mpdCfg = config.services.mpd;
in if pkgs.stdenv.hostPlatform.isLinux && mpdCfg.enable then
mpdCfg.musicDirectory
else
null;
defaultText = literalExample ''
if pkgs.stdenv.hostPlatform.isLinux && config.services.mpd.enable then
config.services.mpd.musicDirectory
else
null
'';
description = ''
Value of the <code>mpd_music_dir</code> setting. On Linux platforms the
value of <varname>services.mpd.musicDirectory</varname> is used as the
default if <varname>services.mpd.enable</varname> is
<literal>true</literal>.
'';
example = "~/music";
};

settings = mkOption {
type = types.attrsOf valueType;
default = { };
description = ''
Attribute set from name of a setting to its value. For available options
see
<citerefentry>
<refentrytitle>ncmpcpp</refentrytitle>
<manvolnum>1</manvolnum>
</citerefentry>.
'';
example = { ncmpcpp_directory = "~/.local/share/ncmpcpp"; };
};

bindings = mkOption {
type = types.listOf bindingType;
default = [ ];
description = "List of keybindings.";
example = literalExample ''
[
{ key = "j"; command = "scroll_down"; }
{ key = "k"; command = "scroll_up"; }
{ key = "J"; command = [ "select_item" "scroll_down" ]; }
{ key = "K"; command = [ "select_item" "scroll_up" ]; }
]
'';
};
};

config = mkIf cfg.enable {
warnings = mkIf (cfg.settings ? mpd_music_dir && cfg.mpdMusicDir != null) [
("programs.ncmpcpp.settings.mpd_music_dir will be overridden by"
+ " programs.ncmpcpp.mpdMusicDir.")
];

home.packages = [ cfg.package ];

xdg.configFile = {
"ncmpcpp/config" = let
settings = cfg.settings // optionalAttrs (cfg.mpdMusicDir != null) {
mpd_music_dir = toString cfg.mpdMusicDir;
};
in mkIf (settings != { }) { text = renderSettings settings + "\n"; };

"ncmpcpp/bindings" = mkIf (cfg.bindings != [ ]) {
text = renderBindings cfg.bindings + "\n";
};
};
};
}
2 changes: 2 additions & 0 deletions tests/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import nmt {
./modules/programs/lf
./modules/programs/lieer
./modules/programs/mbsync
./modules/programs/ncmpcpp
./modules/programs/ne
./modules/programs/neomutt
./modules/programs/newsboat
Expand Down Expand Up @@ -81,6 +82,7 @@ import nmt {
./modules/programs/firefox
./modules/programs/getmail
./modules/services/lieer
./modules/programs/ncmpcpp-linux
./modules/programs/rofi
./modules/programs/waybar
./modules/services/kanshi
Expand Down
1 change: 1 addition & 0 deletions tests/modules/programs/ncmpcpp-linux/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ ncmpcpp-use-mpd-config = ./ncmpcpp-use-mpd-config.nix; }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
mpd_music_dir=/home/user/music
25 changes: 25 additions & 0 deletions tests/modules/programs/ncmpcpp-linux/ncmpcpp-use-mpd-config.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{ pkgs, ... }:

{
config = {
programs.ncmpcpp.enable = true;

services.mpd.enable = true;
services.mpd.musicDirectory = "/home/user/music";

nixpkgs.overlays = [
(self: super: {
ncmpcpp = pkgs.writeScriptBin "dummy-ncmpcpp" "";
mpd = pkgs.writeScriptBin "dummy-mpd" "";
})
];

nmt.script = ''
assertFileContent \
home-files/.config/ncmpcpp/config \
${./ncmpcpp-use-mpd-config-expected-config}
assertPathNotExists home-files/.config/ncmpcpp/bindings
'';
};
}
4 changes: 4 additions & 0 deletions tests/modules/programs/ncmpcpp/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
ncmpcpp-empty-settings = ./ncmpcpp-empty-settings.nix;
ncmpcpp-example-settings = ./ncmpcpp-example-settings.nix;
}
16 changes: 16 additions & 0 deletions tests/modules/programs/ncmpcpp/ncmpcpp-empty-settings.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{ pkgs, ... }:

{
config = {
programs.ncmpcpp.enable = true;

nixpkgs.overlays =
[ (self: super: { ncmpcpp = pkgs.writeScriptBin "dummy-ncmpcpp" ""; }) ];

nmt.script = ''
assertPathNotExists home-files/.config/ncmpcpp/config
assertPathNotExists home-files/.config/ncmpcpp/bindings
'';
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
def_key "j"
scroll_down
def_key "k"
scroll_up
def_key "J"
select_item
scroll_down
def_key "K"
select_item
scroll_up
def_key "x"
delete_playlist_items
def_key "x"
delete_browser_items
def_key "x"
delete_stored_playlist
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
display_volume_level=no
mpd_music_dir=/home/user/music
playlist_disable_highlight_delay=0
user_interface=alternative
60 changes: 60 additions & 0 deletions tests/modules/programs/ncmpcpp/ncmpcpp-example-settings.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{ pkgs, ... }:

{
config = {
programs.ncmpcpp = {
enable = true;
mpdMusicDir = "/home/user/music";

settings = {
user_interface = "alternative";
display_volume_level = false;
playlist_disable_highlight_delay = 0;
};

bindings = [
{
key = "j";
command = "scroll_down";
}
{
key = "k";
command = "scroll_up";
}
{
key = "J";
command = [ "select_item" "scroll_down" ];
}
{
key = "K";
command = [ "select_item" "scroll_up" ];
}
{
key = "x";
command = "delete_playlist_items";
}
{
key = "x";
command = "delete_browser_items";
}
{
key = "x";
command = "delete_stored_playlist";
}
];
};

nixpkgs.overlays =
[ (self: super: { ncmpcpp = pkgs.writeScriptBin "dummy-ncmpcpp" ""; }) ];

nmt.script = ''
assertFileContent \
home-files/.config/ncmpcpp/config \
${./ncmpcpp-example-settings-expected-config}
assertFileContent \
home-files/.config/ncmpcpp/bindings \
${./ncmpcpp-example-settings-expected-bindings}
'';
};
}

0 comments on commit 4b702bf

Please sign in to comment.