From 514acaebb90dc18ccb577d91faef9089242c9ca0 Mon Sep 17 00:00:00 2001 From: Tad Fisher Date: Mon, 22 Mar 2021 17:12:02 -0700 Subject: [PATCH] lieer: change settings to freeform type Also add missing options. --- modules/programs/lieer-accounts.nix | 69 ------ modules/programs/lieer.nix | 231 ++++++++++++++++-- modules/services/lieer-accounts.nix | 25 -- modules/services/lieer.nix | 10 +- .../programs/lieer/lieer-expected.json | 19 +- tests/modules/programs/lieer/lieer.nix | 10 +- 6 files changed, 241 insertions(+), 123 deletions(-) delete mode 100644 modules/programs/lieer-accounts.nix delete mode 100644 modules/services/lieer-accounts.nix diff --git a/modules/programs/lieer-accounts.nix b/modules/programs/lieer-accounts.nix deleted file mode 100644 index 23804906..00000000 --- a/modules/programs/lieer-accounts.nix +++ /dev/null @@ -1,69 +0,0 @@ -{ lib, ... }: - -with lib; - -{ - options.lieer = { - enable = mkEnableOption "lieer Gmail synchronization for notmuch"; - - timeout = mkOption { - type = types.ints.unsigned; - default = 0; - description = '' - HTTP timeout in seconds. 0 means forever or system timeout. - ''; - }; - - replaceSlashWithDot = mkOption { - type = types.bool; - default = false; - description = '' - Replace '/' with '.' in Gmail labels. - ''; - }; - - dropNonExistingLabels = mkOption { - type = types.bool; - default = false; - description = '' - Allow missing labels on the Gmail side to be dropped. - ''; - }; - - ignoreTagsLocal = mkOption { - type = types.listOf types.str; - default = [ ]; - description = '' - Set custom tags to ignore when syncing from local to - remote (after translations). - ''; - }; - - ignoreTagsRemote = mkOption { - type = types.listOf types.str; - default = [ - "CATEGORY_FORUMS" - "CATEGORY_PROMOTIONS" - "CATEGORY_UPDATES" - "CATEGORY_SOCIAL" - "CATEGORY_PERSONAL" - ]; - description = '' - Set custom tags to ignore when syncing from remote to - local (before translations). - ''; - }; - - notmuchSetupWarning = mkOption { - type = types.bool; - default = true; - description = '' - Warn if Notmuch is not also enabled for this account. - - This can safely be disabled if notmuch init - has been used to configure this account outside of Home - Manager. - ''; - }; - }; -} diff --git a/modules/programs/lieer.nix b/modules/programs/lieer.nix index e34a247a..e0369ffc 100644 --- a/modules/programs/lieer.nix +++ b/modules/programs/lieer.nix @@ -23,30 +23,231 @@ let map (name: "accounts.email.accounts.${name}.notmuch.enable = true;") missingNotmuchAccounts; + settingsFormat = pkgs.formats.json { }; + configFile = account: { name = "${account.maildir.absPath}/.gmailieer.json"; - value = { - text = builtins.toJSON { - inherit (account.lieer) timeout; - account = account.address; - replace_slash_with_dot = account.lieer.replaceSlashWithDot; - drop_non_existing_label = account.lieer.dropNonExistingLabels; - ignore_tags = account.lieer.ignoreTagsLocal; - ignore_remote_labels = account.lieer.ignoreTagsRemote; - } + "\n"; + value.source = settingsFormat.generate "lieer-${account.address}.json" + ({ account = account.address; } // account.lieer.settings); + }; + + settingsOpts = { + drop_non_existing_label = mkOption { + type = types.bool; + default = false; + description = '' + Allow missing labels on the Gmail side to be dropped. + ''; + }; + + file_extension = mkOption { + type = types.str; + default = ""; + example = "mbox"; + description = '' + Extension to include in local file names, which can be useful + for indexing with third-party programs. + ''; + }; + + ignore_empty_history = mkOption { + type = types.bool; + default = false; + description = '' + Work around a Gmail API quirk where an empty change history + is sometimes returned. + + See this + GitHub issue + for more details. + ''; + }; + + ignore_remote_labels = mkOption { + type = types.listOf types.str; + default = [ + "CATEGORY_FORUMS" + "CATEGORY_PROMOTIONS" + "CATEGORY_UPDATES" + "CATEGORY_SOCIAL" + "CATEGORY_PERSONAL" + ]; + description = '' + Set Gmail labels to ignore when syncing from remote labels to + local tags (before translations). + ''; + }; + + ignore_tags = mkOption { + type = types.listOf types.str; + default = [ ]; + description = '' + Set labels to ignore when syncing from local tags to + remote labels (after translations). + ''; + }; + + local_trash_tag = mkOption { + type = types.str; + default = "trash"; + description = '' + Local tag to which the remote Gmail 'TRASH' label is translated. + ''; + }; + + remove_local_messages = mkOption { + type = types.bool; + default = true; + description = '' + Remove local messages that have been deleted on the remote. + ''; + }; + + replace_slash_with_dot = mkOption { + type = types.bool; + default = false; + description = '' + Replace '/' with '.' in Gmail labels. + ''; + }; + + timeout = mkOption { + type = types.ints.unsigned; + default = 600; + description = '' + HTTP timeout in seconds. 0 means forever or system timeout. + ''; }; }; + syncOpts = { + enable = mkEnableOption "lieer synchronization service"; + + frequency = mkOption { + type = types.str; + default = "*:0/5"; + description = '' + How often to synchronize the account. + + This value is passed to the systemd timer configuration as the + onCalendar option. See + + systemd.time + 7 + + for more information about the format. + ''; + }; + }; + + lieerOpts = { + enable = mkEnableOption "lieer Gmail synchronization for notmuch"; + + notmuchSetupWarning = mkOption { + type = types.bool; + default = true; + description = '' + Warn if Notmuch is not also enabled for this account. + + This can safely be disabled if notmuch init + has been used to configure this account outside of Home + Manager. + ''; + }; + + settings = mkOption { + type = types.submodule { + freeformType = settingsFormat.type; + options = settingsOpts; + }; + default = { }; + description = '' + Settings which are applied to .gmailieer.json + for the account. + + See the lieer manual + for documentation of settings not explicitly covered by this module. + ''; + }; + + sync = syncOpts; + }; + + lieerModule = types.submodule { + imports = [ + (mkRenamedOptionModule [ "lieer" "dropNonExistingLabels" ] [ + "lieer" + "settings" + "drop_non_existing_label" + ]) + (mkRenamedOptionModule [ "lieer" "ignoreTagsRemote" ] [ + "lieer" + "settings" + "ignore_remote_labels" + ]) + (mkRenamedOptionModule [ "lieer" "ignoreTagsLocal" ] [ + "lieer" + "settings" + "ignore_tags" + ]) + (mkRenamedOptionModule [ "lieer" "timeout" ] [ + "lieer" + "settings" + "timeout" + ]) + (mkRenamedOptionModule [ "lieer" "replaceSlashWithDot" ] [ + "lieer" + "settings" + "replace_slash_with_dot" + ]) + ]; + + options = { + lieer = lieerOpts; + + warnings = mkOption { + type = types.listOf types.str; + default = [ ]; + internal = true; + visible = false; + }; + }; + }; + + renamedOptions = account: + let prefix = [ "accounts" "email" "accounts" account.name "lieer" ]; + in [ + (mkRenamedOptionModule (prefix ++ [ "dropNonExistingLabels" ]) + (prefix ++ [ "settings" "drop_non_existing_label" ])) + (mkRenamedOptionModule (prefix ++ [ "ignoreTagsRemote" ]) + (prefix ++ [ "settings" "ignore_remote_labels" ])) + (mkRenamedOptionModule (prefix ++ [ "ignoreTagsLocal" ]) + (prefix ++ [ "settings" "ignore_tags" ])) + (mkRenamedOptionModule (prefix ++ [ "timeout" ]) + (prefix ++ [ "settings" "timeout" ])) + (mkRenamedOptionModule (prefix ++ [ "replaceSlashWithDot" ]) + (prefix ++ [ "settings" "replace_slash_with_dot" ])) + ]; + in { meta.maintainers = [ maintainers.tadfisher ]; options = { - programs.lieer.enable = - mkEnableOption "lieer Gmail synchronization for notmuch"; + programs.lieer = { + enable = mkEnableOption "lieer Gmail synchronization for notmuch"; - accounts.email.accounts = mkOption { - type = with types; attrsOf (submodule (import ./lieer-accounts.nix)); + package = mkOption { + type = types.package; + default = pkgs.gmailieer; + defaultText = "pkgs.gmailieer"; + description = '' + lieer package to use. + ''; + }; }; + + accounts.email.accounts = + mkOption { type = with types; attrsOf lieerModule; }; }; config = mkIf cfg.enable (mkMerge [ @@ -82,7 +283,9 @@ in { ''; }]; - home.packages = [ pkgs.gmailieer ]; + warnings = flatten (map (account: account.warnings) lieerAccounts); + + home.packages = [ cfg.package ]; # Notmuch should ignore non-mail files created by lieer. programs.notmuch.new.ignore = [ "/.*[.](json|lock|bak)$/" ]; diff --git a/modules/services/lieer-accounts.nix b/modules/services/lieer-accounts.nix deleted file mode 100644 index 187f7dff..00000000 --- a/modules/services/lieer-accounts.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ lib, ... }: - -with lib; - -{ - options.lieer.sync = { - enable = mkEnableOption "lieer synchronization service"; - - frequency = mkOption { - type = types.str; - default = "*:0/5"; - description = '' - How often to synchronize the account. - - This value is passed to the systemd timer configuration as the - onCalendar option. See - - systemd.time - 7 - - for more information about the format. - ''; - }; - }; -} diff --git a/modules/services/lieer.nix b/modules/services/lieer.nix index 9dd8c15e..6e4be8ca 100644 --- a/modules/services/lieer.nix +++ b/modules/services/lieer.nix @@ -51,14 +51,8 @@ let in { meta.maintainers = [ maintainers.tadfisher ]; - options = { - services.lieer.enable = - mkEnableOption "lieer Gmail synchronization service"; - - accounts.email.accounts = mkOption { - type = with types; attrsOf (submodule (import ./lieer-accounts.nix)); - }; - }; + options.services.lieer.enable = + mkEnableOption "lieer Gmail synchronization service"; config = mkIf cfg.enable { assertions = [ diff --git a/tests/modules/programs/lieer/lieer-expected.json b/tests/modules/programs/lieer/lieer-expected.json index e7318f65..332e2d59 100644 --- a/tests/modules/programs/lieer/lieer-expected.json +++ b/tests/modules/programs/lieer/lieer-expected.json @@ -1 +1,18 @@ -{"account":"hm@example.com","drop_non_existing_label":false,"ignore_remote_labels":["CATEGORY_FORUMS","CATEGORY_PROMOTIONS","CATEGORY_UPDATES","CATEGORY_SOCIAL","CATEGORY_PERSONAL"],"ignore_tags":[],"replace_slash_with_dot":false,"timeout":0} +{ + "account": "hm@example.com", + "drop_non_existing_label": false, + "file_extension": "", + "ignore_empty_history": false, + "ignore_remote_labels": [ + "CATEGORY_FORUMS", + "CATEGORY_PROMOTIONS", + "CATEGORY_UPDATES", + "CATEGORY_SOCIAL", + "CATEGORY_PERSONAL" + ], + "ignore_tags": [], + "local_trash_tag": "trash", + "remove_local_messages": true, + "replace_slash_with_dot": false, + "timeout": 600 +} diff --git a/tests/modules/programs/lieer/lieer.nix b/tests/modules/programs/lieer/lieer.nix index c5771b67..c19521d1 100644 --- a/tests/modules/programs/lieer/lieer.nix +++ b/tests/modules/programs/lieer/lieer.nix @@ -7,6 +7,7 @@ with lib; config = { programs.lieer.enable = true; + programs.lieer.package = pkgs.writeScriptBin "dummy-gmailieer" ""; accounts.email.accounts."hm@example.com" = { flavor = "gmail.com"; @@ -14,14 +15,11 @@ with lib; notmuch.enable = true; }; - nixpkgs.overlays = [ - (self: super: { gmailieer = pkgs.writeScriptBin "dummy-gmailieer" ""; }) - ]; - nmt.script = '' assertFileExists home-files/Mail/hm@example.com/.gmailieer.json - assertFileContent home-files/Mail/hm@example.com/.gmailieer.json \ - ${./lieer-expected.json} + assertFileContent home-files/Mail/hm@example.com/.gmailieer.json ${ + ./lieer-expected.json + } ''; }; }