Modular, context-aware and aspect-oriented dendritic Nix configurations. Discussions: https://oeiuwq.zulipchat.com/join/nqp26cd4kngon6mo3ncgnuap/ den.oeiuwq.com
configurations den dendritic nix aspect oriented
8
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(class): Test top-level forward allows multiple aspects (#325)

authored by

Victor Borja and committed by
GitHub
3516c776 907fdc48

+102 -29
+49 -18
modules/aspects/provides/forward.nix
··· 56 56 intoClass = fwd.intoClass item; 57 57 intoPath = fwd.intoPath item; 58 58 59 - sourceModule = den.lib.aspects.resolve fromClass [ ] (fwd.fromAspect item); 59 + asp = fwd.fromAspect item; 60 + 61 + sourceModule = den.lib.aspects.resolve fromClass [ asp ] asp; 60 62 61 63 freeformMod = { 62 - config._module.freeformType = lib.types.lazyAttrsOf lib.types.unspecified; 64 + config._module.freeformType = lib.types.lazyAttrsOf lib.types.anything; 63 65 }; 64 66 65 67 adapterKey = lib.concatStringsSep "/" ( ··· 106 108 }; 107 109 }; 108 110 111 + extraArgsFor = 112 + args: 113 + if adaptArgs == null then { } else builtins.removeAttrs (adaptArgs args) (builtins.attrNames args); 114 + 115 + wrapTree = 116 + gApply: outerArgs: node: 117 + if builtins.isAttrs node && node ? imports then 118 + { imports = map (wrapTree gApply outerArgs) node.imports; } 119 + else 120 + _modArgs: 121 + let 122 + result = if lib.isFunction node then node outerArgs else node; 123 + in 124 + { 125 + config = gApply result; 126 + }; 127 + 128 + evalImport = 129 + args: 130 + let 131 + extraArgs = extraArgsFor args; 132 + specialArgs = 133 + builtins.removeAttrs args [ 134 + "config" 135 + "options" 136 + "lib" 137 + ] 138 + // extraArgs; 139 + evaluated = lib.evalModules { 140 + inherit specialArgs; 141 + modules = (if adapterModule == null then [ freeformMod ] else [ adapterModule ]) ++ [ 142 + sourceModule 143 + ]; 144 + }; 145 + in 146 + guardFn args evaluated.config; 147 + 148 + canDirectImport = adapterModule == null; 149 + 109 150 topLevelAdapter.${intoClass} = { 110 151 __functionArgs = guardArgs; 111 152 __functor = 112 153 _: args: 113 154 let 114 - extraArgs = 115 - if adaptArgs == null then { } else builtins.removeAttrs (adaptArgs args) (builtins.attrNames args); 116 - specialArgs = 117 - builtins.removeAttrs args [ 118 - "config" 119 - "options" 120 - "lib" 121 - ] 122 - // extraArgs; 123 - evaluated = lib.evalModules { 124 - inherit specialArgs; 125 - modules = (if adapterModule == null then [ freeformMod ] else [ adapterModule ]) ++ [ 126 - sourceModule 127 - ]; 128 - }; 155 + gApply = if guard == null then lib.id else guardFn args; 156 + fullArgs = args // extraArgsFor args; 129 157 in 130 - guardFn args evaluated.config; 158 + if canDirectImport then 159 + { imports = [ (wrapTree gApply fullArgs sourceModule) ]; } 160 + else 161 + evalImport args; 131 162 }; 132 163 133 164 needsAdapter = guard != null || adaptArgs != null || adapterModule != null;
+1 -1
nix/lib/types.nix
··· 250 250 let 251 251 asp = intent { ${name} = from; }; 252 252 in 253 - den.lib.aspects.resolve (from.class) [ ] asp; 253 + den.lib.aspects.resolve (from.class) [ asp ] asp; 254 254 in 255 255 { 256 256 inherit hostsOption homesOption;
+52 -10
templates/ci/modules/features/forward-alias-class.nix
··· 7 7 den, 8 8 lib, 9 9 igloo, 10 + tuxHm, 10 11 ... 11 12 }: 12 13 let ··· 18 19 intoClass = _: "homeManager"; 19 20 intoPath = _: [ ]; 20 21 fromAspect = _: lib.head aspect-chain; 22 + guard = { pkgs, ... }: true; 21 23 adaptArgs = 22 24 { config, ... }: 23 25 { ··· 31 33 den.aspects.igloo.nixos.networking.hostName = "storm"; 32 34 33 35 den.aspects.tux = { 34 - includes = [ forwarded ]; 35 - home = 36 - { osConfig, ... }: 37 - { 38 - programs.fish.enable = true; 39 - home.keyboard.model = osConfig.networking.hostName; 40 - }; 36 + includes = [ 37 + forwarded 38 + den.aspects.foo 39 + ]; 41 40 }; 41 + 42 + den.aspects.foo.includes = [ 43 + den.aspects.bar 44 + den.aspects.baz 45 + ]; 46 + den.aspects.bar.home = 47 + { osConfig, pkgs, ... }: 48 + { 49 + programs.fish.enable = true; 50 + home.keyboard.model = osConfig.networking.hostName; 51 + home.packages = [ pkgs.hello ]; 52 + }; 53 + 54 + den.aspects.baz.home = 55 + { pkgs, ... }: 56 + { 57 + home.packages = [ pkgs.direnv ]; 58 + }; 42 59 43 60 expr = { 44 - enable = igloo.home-manager.users.tux.programs.fish.enable; 45 - model = igloo.home-manager.users.tux.home.keyboard.model; 61 + enable = tuxHm.programs.fish.enable; 62 + model = tuxHm.home.keyboard.model; 63 + hello = lib.any (p: "hello" == lib.getName p) tuxHm.home.packages; 64 + direnv = lib.any (p: "direnv" == lib.getName p) tuxHm.home.packages; 46 65 }; 47 66 expected = { 48 67 enable = true; 49 68 model = "storm"; 69 + hello = true; 70 + direnv = true; 50 71 }; 51 72 } 52 73 ); ··· 107 128 lib, 108 129 igloo, 109 130 apple, 131 + tuxHm, 110 132 ... 111 133 }: 112 134 let ··· 134 156 den.hosts.aarch64-darwin.apple.users.tux = { }; 135 157 136 158 den.aspects.tux = { 137 - includes = [ forwarded ]; 159 + includes = [ 160 + forwarded 161 + den.aspects.foo 162 + den.aspects.bar 163 + ]; 138 164 hmLinux.home.keyboard.model = "freedom"; 139 165 hmDarwin.home.keyboard.model = "closed"; 140 166 }; 141 167 168 + den.aspects.foo.hmLinux = 169 + { pkgs, ... }: 170 + { 171 + home.packages = [ pkgs.hello ]; 172 + }; 173 + 174 + den.aspects.bar.hmLinux = 175 + { pkgs, ... }: 176 + { 177 + home.packages = [ pkgs.direnv ]; 178 + }; 179 + 142 180 expr = { 143 181 linux = igloo.home-manager.users.tux.home.keyboard.model; 144 182 darwin = apple.home-manager.users.tux.home.keyboard.model; 183 + hello = lib.any (p: "hello" == lib.getName p) tuxHm.home.packages; 184 + direnv = lib.any (p: "direnv" == lib.getName p) tuxHm.home.packages; 145 185 }; 146 186 expected = { 147 187 linux = "freedom"; 148 188 darwin = "closed"; 189 + hello = true; 190 + direnv = true; 149 191 }; 150 192 } 151 193 );