From baea3cc3b3541f10c8ad713179160c90857ce20f Mon Sep 17 00:00:00 2001 From: Jaka Hudoklin Date: Sat, 12 Oct 2019 15:22:38 +0200 Subject: [PATCH] feat(submodules): allow to match defaults by module version --- modules/submodules.nix | 42 +++++++++++++++++++++++------------ tests/submodules/defaults.nix | 19 ++++++++++++++++ 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/modules/submodules.nix b/modules/submodules.nix index 4543960..42d60d2 100644 --- a/modules/submodules.nix +++ b/modules/submodules.nix @@ -6,16 +6,24 @@ let cfg = config.submodules; parentConfig = config; - getDefaults = {name, tags, features}: - catAttrs "default" (filter (submodule: - (submodule.name == null || submodule.name == name) && + matchesVersion = requiredVersion: version: + if requiredVersion != null then + if hasPrefix "~" requiredVersion + then (builtins.match (removePrefix "~" requiredVersion) version) != null + else requiredVersion == version + else true; + + getDefaults = {name, version, tags, features}: + catAttrs "default" (filter (submoduleDefault: + (submoduleDefault.name == null || submoduleDefault.name == name) && + (matchesVersion submoduleDefault.version version) && ( - (length submodule.tags == 0) || - (length (intersectLists submodule.tags tags)) > 0 + (length submoduleDefault.tags == 0) || + (length (intersectLists submoduleDefault.tags tags)) > 0 ) && ( - (length submodule.features == 0) || - (length (intersectLists submodule.features features)) > 0 + (length submoduleDefault.features == 0) || + (length (intersectLists submoduleDefault.features features)) > 0 ) ) config.submodules.defaults); @@ -26,11 +34,7 @@ let findSubmodule = {name, version ? null, latest ? true}: let matchingSubmodules = filter (el: el.definition.name == name && - (if version != null then - if hasPrefix "~" version - then (builtins.match (removePrefix "~" version) el.definition.version) != null - else el.definition.version == version - else true) + (matchesVersion version el.definition.version) ) cfg.imports; versionSortedSubmodules = sort (s1: s2: @@ -72,13 +76,22 @@ in { type = types.listOf (types.submodule ({config, ...}: { options = { name = mkOption { - description = "Name of the submodule to apply defaults to"; + description = "Name of the submodule to apply defaults for"; + type = types.nullOr types.str; + default = null; + }; + + version = mkOption { + description = '' + Version of submodule to apply defaults for. If version starts with + "~" it is threated as regex pattern for example "~1.0.* + ''; type = types.nullOr types.str; default = null; }; tags = mkOption { - description = "List of tags to apply defaults to"; + description = "List of tags to apply defaults for"; type = types.listOf types.str; default = []; }; @@ -181,6 +194,7 @@ in { # submodule defaults defaults = getDefaults { name = submoduleDefinition.name; + version = submoduleDefinition.version; tags = submoduleDefinition.tags; features = submodule.features; }; diff --git a/tests/submodules/defaults.nix b/tests/submodules/defaults.nix index 23715fa..1398330 100644 --- a/tests/submodules/defaults.nix +++ b/tests/submodules/defaults.nix @@ -8,6 +8,7 @@ let instance3 = config.submodules.instances.instance3; instance4 = config.submodules.instances.instance4; instance5 = config.submodules.instances.instance5; + versioned-submodule = config.submodules.instances.versioned-submodule; submodule = {name, ...}: { imports = [ kubenix.modules.submodule ]; @@ -53,6 +54,9 @@ in { } { message = "should apply defaults by custom condition"; assertion = instance5.config.submodule.args.defaultValue == "my-custom-value"; + } { + message = "should apply defaults to versioned submodule"; + assertion = versioned-submodule.config.submodule.args.defaultValue == "versioned-submodule"; }]; }; @@ -90,6 +94,13 @@ in { }; submodule.args.value = "custom-value"; }]; + } { + modules = [submodule { + submodule = { + name = "versioned-submodule"; + version = "2.0.0"; + }; + }]; }]; submodules.defaults = [{ @@ -107,6 +118,10 @@ in { default = {config, ...}: { submodule.args.defaultValue = mkIf (config.submodule.args.value == "custom-value") "my-custom-value"; }; + } { + name = "versioned-submodule"; + version = "2.0.0"; + default.submodule.args.value = mkDefault "versioned"; }]; submodules.instances.instance1.submodule = "submodule1"; @@ -117,4 +132,8 @@ in { }; submodules.instances.instance4.submodule = "submodule4"; submodules.instances.instance5.submodule = "submodule5"; + submodules.instances.versioned-submodule = { + submodule = "versioned-submodule"; + args.defaultValue = "versioned-submodule"; + }; }