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
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}