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
at doc 63 lines 2.0 kB view raw
1{ 2 lib, 3 mkFlake, 4 evalMod, 5 ... 6}: 7{ 8 9 flake.tests."test provides" = 10 let 11 flake = mkFlake { 12 flake.aspects = 13 { aspects, ... }: 14 { 15 aspectOne.includes = with aspects.aspectTwo.provides; [ 16 foo 17 bar 18 ]; 19 aspectOne.classOne = { }; # must be present for mixing dependencies. 20 aspectTwo = { 21 classOne.bar = [ "class one not included" ]; 22 classTwo.bar = [ "class two not included" ]; 23 provides.foo = 24 { class, aspect-chain }: 25 { 26 name = "aspectTwo.foo"; 27 description = "aspectTwo foo provided"; 28 includes = [ 29 aspects.aspectThree.provides.moo 30 aspects.aspectTwo.provides.baz 31 ]; 32 classOne.bar = [ "two:${class}:${lib.concatStringsSep "/" (lib.map (x: x.name) aspect-chain)}" ]; 33 classTwo.bar = [ "foo class two not included" ]; 34 }; 35 # a provider can be immediately an aspect object. 36 provides.bar = { 37 # classOne is missing on bar 38 classTwo.bar = [ "bar class two not included" ]; 39 }; 40 # _ is an shortcut alias of provides. 41 _.baz = { 42 # classOne is missing on bar 43 classTwo.bar = [ "baz" ]; 44 }; 45 }; 46 aspectThree.provides.moo = 47 { aspect-chain, class }: 48 { 49 classOne.bar = [ "three:${class}:${lib.concatStringsSep "/" (lib.map (x: x.name) aspect-chain)}" ]; 50 }; 51 }; 52 }; 53 expr = lib.sort (a: b: a < b) (evalMod "classOne" flake.modules.classOne.aspectOne).bar; 54 expected = [ 55 "three:classOne:aspectOne/aspectTwo.foo" 56 "two:classOne:aspectOne" 57 ]; 58 in 59 { 60 inherit expr expected; 61 }; 62 63}