fake.modules transposition for aspect-oriented Dendritic Nix. with cross-aspect dependencies. Discussions: https://oeiuwq.zulipchat.com/join/nqp26cd4kngon6mo3ncgnuap/ dendrix.oeiuwq.com/Dendritic.html
dendritic nix aspect oriented

test aspect providers (#5)

* test aspect providers

* fix test

authored by oeiuwq.com and committed by

GitHub dbc6c306 2a349d79

+41 -6
+4 -5
README.md
··· 213 213 They are actually `[ config.bar.provides.itself config.baz.provides.itself ]`. 214 214 215 215 but you can also define custom providers that can inspect the argument's `aspect` and `class` 216 - and return some another aspect accordingly. 216 + and return some set of modules accordingly. you can also use this feature to have aspects that 217 + like as proxy/routers of dependencies. 217 218 218 219 ```nix 219 - flake.aspects.alice.provides.os-user = { aspect, class, ... }: { 220 - # perhaps regexp matching on aspect or class. eg, match all "hosts" aspects. 221 - nixos = { }; 222 - } 220 + flake.aspects.alice.provides.os-user = { aspect, class }: 221 + if someCondition aspect && class == "nixos" then { nixos = { ... }; } else { } 223 222 ``` 224 223 225 224 the `os-user` provider can be now included in a `requires` list:
+37 -1
checkmate.nix
··· 116 116 inherit expr expected; 117 117 }; 118 118 119 - aspects."test providers" = 119 + aspects."test requirements on aspects" = 120 120 let 121 121 flake = mkFlake ({ 122 122 flake.aspects = ··· 138 138 expected = [ 139 139 "os" 140 140 "user" 141 + ]; 142 + in 143 + { 144 + inherit expr expected; 145 + }; 146 + 147 + aspects."test provider arguments" = 148 + let 149 + flake = mkFlake ({ 150 + flake.aspects = 151 + { config, ... }: 152 + { 153 + aspectOne.requires = with config.aspectTwo.provides; [ 154 + foo 155 + bar 156 + ]; 157 + aspectOne.classOne = { }; # required for mixing dependencies. 158 + aspectTwo = { 159 + classOne.bar = [ "class one not included" ]; 160 + classTwo.bar = [ "class two not included" ]; 161 + provides.foo = 162 + { class, aspect }: 163 + { 164 + classOne.bar = [ "foo:${aspect}:${class}" ]; 165 + classTwo.bar = [ "foo class two not included" ]; 166 + }; 167 + provides.bar = _: { 168 + # classOne is missing on bar 169 + classTwo.bar = [ "bar class two not included" ]; 170 + }; 171 + }; 172 + }; 173 + }); 174 + expr = lib.sort (a: b: a < b) (evalMod "classOne" flake.modules.classOne.aspectOne).bar; 175 + expected = [ 176 + "foo:aspectOne:classOne" 141 177 ]; 142 178 in 143 179 {