From 44635279a0dfca43d2b980422f295def1aca0c08 Mon Sep 17 00:00:00 2001 From: Bernardo Meurer Date: Thu, 5 Oct 2023 16:01:18 -0400 Subject: [PATCH] bat: allow setting themes/syntaxes without IFD The way the `bat` module is currently written makes it essentially impossible to use themes and syntaxes without IFD, since you must provide the contents as string, instead of just giving a path to be linked. With this change, setting themes/syntaxes by-string will start issuing warnings, and a new attribute model is added, lightly inspired by how `programs.zsh.plugins` avoided this issue. --- modules/programs/bat.nix | 124 +++++++++++++----- tests/modules/programs/bat/bat.nix | 4 +- tests/modules/programs/bat/default.nix | 5 +- .../programs/bat/deprecated-options.nix | 67 ++++++++++ 4 files changed, 164 insertions(+), 36 deletions(-) create mode 100644 tests/modules/programs/bat/deprecated-options.nix diff --git a/modules/programs/bat.nix b/modules/programs/bat.nix index a4197cc21..a5bf3481b 100644 --- a/modules/programs/bat.nix +++ b/modules/programs/bat.nix @@ -43,16 +43,33 @@ in { }; themes = mkOption { - type = types.attrsOf types.lines; + type = types.attrsOf (types.either types.lines (types.submodule { + options = { + src = mkOption { + type = types.path; + description = "Path to the theme folder."; + }; + + file = mkOption { + type = types.nullOr types.str; + default = null; + description = + "Subpath of the theme file within the source, if needed."; + }; + }; + })); default = { }; example = literalExpression '' { - dracula = builtins.readFile (pkgs.fetchFromGitHub { - owner = "dracula"; - repo = "sublime"; # Bat uses sublime syntax for its themes - rev = "26c57ec282abcaa76e57e055f38432bd827ac34e"; - sha256 = "019hfl4zbn4vm4154hh3bwk6hm7bdxbr1hdww83nabxwjn99ndhv"; - } + "/Dracula.tmTheme"); + dracula = { + src = pkgs.fetchFromGitHub { + owner = "dracula"; + repo = "sublime"; # Bat uses sublime syntax for its themes + rev = "26c57ec282abcaa76e57e055f38432bd827ac34e"; + sha256 = "019hfl4zbn4vm4154hh3bwk6hm7bdxbr1hdww83nabxwjn99ndhv"; + }; + file = "Dracula.tmTheme"; + }; } ''; description = '' @@ -61,43 +78,84 @@ in { }; syntaxes = mkOption { - type = types.attrsOf types.lines; + type = types.attrsOf (types.either types.lines (types.submodule { + options = { + src = mkOption { + type = types.path; + description = "Path to the syntax folder."; + }; + file = mkOption { + type = types.nullOr types.str; + default = null; + description = + "Subpath of the syntax file within the source, if needed."; + }; + }; + })); default = { }; example = literalExpression '' { - syntaxes.gleam = builtins.readFile (pkgs.fetchFromGitHub { - owner = "molnarmark"; - repo = "sublime-gleam"; - rev = "2e761cdb1a87539d827987f997a20a35efd68aa9"; - hash = "sha256-Zj2DKTcO1t9g18qsNKtpHKElbRSc9nBRE2QBzRn9+qs="; - } + "/syntax/gleam.sublime-syntax"); + gleam = { + src = pkgs.fetchFromGitHub { + owner = "molnarmark"; + repo = "sublime-gleam"; + rev = "2e761cdb1a87539d827987f997a20a35efd68aa9"; + hash = "sha256-Zj2DKTcO1t9g18qsNKtpHKElbRSc9nBRE2QBzRn9+qs="; + }; + file = "syntax/gleam.sublime-syntax"; + }; } ''; description = '' Additional syntaxes to provide. ''; }; - }; - config = mkIf cfg.enable { - home.packages = [ package ] ++ cfg.extraPackages; + config = mkIf cfg.enable (mkMerge [ + (mkIf (any isString (attrValues cfg.themes)) { + warnings = ['' + Using programs.bat.themes as a string option is deprecated and will be + removed in the future. Please change to using it as an attribute set + instead. + '']; + }) + (mkIf (any isString (attrValues cfg.syntaxes)) { + warnings = ['' + Using programs.bat.syntaxes as a string option is deprecated and will be + removed in the future. Please change to using it as an attribute set + instead. + '']; + }) + { + home.packages = [ package ] ++ cfg.extraPackages; - xdg.configFile = mkMerge ([{ - "bat/config" = - mkIf (cfg.config != { }) { text = toConfigFile cfg.config; }; - }] ++ flip mapAttrsToList cfg.themes - (name: body: { "bat/themes/${name}.tmTheme" = { text = body; }; }) - ++ flip mapAttrsToList cfg.syntaxes (name: body: { - "bat/syntaxes/${name}.sublime-syntax" = { text = body; }; - })); + xdg.configFile = mkMerge ([({ + "bat/config" = + mkIf (cfg.config != { }) { text = toConfigFile cfg.config; }; + })] ++ (flip mapAttrsToList cfg.themes (name: val: { + "bat/themes/${name}.tmTheme" = if isString val then { + text = val; + } else { + source = + if isNull val.file then "${val.src}" else "${val.src}/${val.file}"; + }; + })) ++ (flip mapAttrsToList cfg.syntaxes (name: val: { + "bat/syntaxes/${name}.sublime-syntax" = if isString val then { + text = val; + } else { + source = + if isNull val.file then "${val.src}" else "${val.src}/${val.file}"; + }; + }))); - home.activation.batCache = hm.dag.entryAfter [ "linkGeneration" ] '' - ( - export XDG_CACHE_HOME=${escapeShellArg config.xdg.cacheHome} - $VERBOSE_ECHO "Rebuilding bat theme cache" - $DRY_RUN_CMD ${lib.getExe package} cache --build - ) - ''; - }; + home.activation.batCache = hm.dag.entryAfter [ "linkGeneration" ] '' + ( + export XDG_CACHE_HOME=${escapeShellArg config.xdg.cacheHome} + $VERBOSE_ECHO "Rebuilding bat theme cache" + $DRY_RUN_CMD ${lib.getExe package} cache --build + ) + ''; + } + ]); } diff --git a/tests/modules/programs/bat/bat.nix b/tests/modules/programs/bat/bat.nix index 88b2a40cd..d6b2374c1 100644 --- a/tests/modules/programs/bat/bat.nix +++ b/tests/modules/programs/bat/bat.nix @@ -13,11 +13,11 @@ with lib; map-syntax = [ "*.jenkinsfile:Groovy" "*.props:Java Properties" ]; }; - themes.testtheme = '' + themes.testtheme.src = pkgs.writeText "testtheme.tmTheme" '' This is a test theme. ''; - syntaxes.testsyntax = '' + syntaxes.testsyntax.src = pkgs.writeText "testsyntax.sublime-syntax" '' This is a test syntax. ''; }; diff --git a/tests/modules/programs/bat/default.nix b/tests/modules/programs/bat/default.nix index 001d4bca6..c1c91d344 100644 --- a/tests/modules/programs/bat/default.nix +++ b/tests/modules/programs/bat/default.nix @@ -1 +1,4 @@ -{ bat = ./bat.nix; } +{ + bat = ./bat.nix; + bat-deprecated-options = ./deprecated-options.nix; +} diff --git a/tests/modules/programs/bat/deprecated-options.nix b/tests/modules/programs/bat/deprecated-options.nix new file mode 100644 index 000000000..31a10413a --- /dev/null +++ b/tests/modules/programs/bat/deprecated-options.nix @@ -0,0 +1,67 @@ +{ config, lib, pkgs, ... }: + +with lib; + +{ + config = { + programs.bat = { + enable = true; + + config = { + theme = "TwoDark"; + pager = "less -FR"; + map-syntax = [ "*.jenkinsfile:Groovy" "*.props:Java Properties" ]; + }; + + themes.testtheme = '' + This is a test theme. + ''; + + syntaxes.testsyntax = '' + This is a test syntax. + ''; + }; + + test.stubs.bat = { }; + + test.asserts.warnings.enable = true; + test.asserts.warnings.expected = [ + '' + Using programs.bat.themes as a string option is deprecated and will be + removed in the future. Please change to using it as an attribute set + instead. + '' + '' + Using programs.bat.syntaxes as a string option is deprecated and will be + removed in the future. Please change to using it as an attribute set + instead. + '' + ]; + + nmt.script = '' + assertFileExists home-files/.config/bat/config + assertFileContent home-files/.config/bat/config ${ + pkgs.writeText "bat.expected" '' + --map-syntax='*.jenkinsfile:Groovy' + --map-syntax='*.props:Java Properties' + --pager='less -FR' + --theme='TwoDark' + '' + } + + assertFileExists home-files/.config/bat/themes/testtheme.tmTheme + assertFileContent home-files/.config/bat/themes/testtheme.tmTheme ${ + pkgs.writeText "bat.expected" '' + This is a test theme. + '' + } + + assertFileExists home-files/.config/bat/syntaxes/testsyntax.sublime-syntax + assertFileContent home-files/.config/bat/syntaxes/testsyntax.sublime-syntax ${ + pkgs.writeText "bat.expected" '' + This is a test syntax. + '' + } + ''; + }; +}