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.

feat(core): Use a parametric default functor (#243)

Closes #242

authored by

Victor Borja and committed by
GitHub
72e86602 31bccfec

+220 -43
+8 -1
nix/lib.nix
··· 100 100 }; 101 101 parametric.__functor = _: parametric.withOwn parametric.atLeast; 102 102 103 - aspects = inputs.flake-aspects.lib lib; 103 + aspects = 104 + let 105 + fa-lib = inputs.flake-aspects.lib lib; 106 + defaultFunctor = (parametric { }).__functor; 107 + typesConf = { inherit defaultFunctor; }; 108 + types = lib.mapAttrs (n: v: v typesConf) fa-lib.types; 109 + in 110 + fa-lib // { inherit types; }; 104 111 105 112 __findFile = import ./den-brackets.nix { inherit lib config; }; 106 113
+6 -6
templates/bogus/flake.lock
··· 2 2 "nodes": { 3 3 "den": { 4 4 "locked": { 5 - "lastModified": 1773187119, 6 - "narHash": "sha256-uAm7krbbxAk9+XpDabEN7DyMUT/7wEnv8HaCB7AUbHQ=", 5 + "lastModified": 1773264589, 6 + "narHash": "sha256-njJMeKzoSb6XTUHXIX3JezJEysJFq/y46v6qAlzRQrQ=", 7 7 "owner": "vic", 8 8 "repo": "den", 9 - "rev": "ba7ab0634b2ea4c8cb75a4ce7fd36f0454fca39a", 9 + "rev": "31bccfecba02c192627f3acb65bdeebcd6c19af7", 10 10 "type": "github" 11 11 }, 12 12 "original": { ··· 18 18 }, 19 19 "flake-aspects": { 20 20 "locked": { 21 - "lastModified": 1773185256, 22 - "narHash": "sha256-e3YqMwdQ2EpVTuWRkK2rkrHywp8QCpkj7x2U53SNoIA=", 21 + "lastModified": 1773272797, 22 + "narHash": "sha256-sSdYZiIeo98LmdnCR5GMN8B8bsHFgWA+1l9ZEpwXrFU=", 23 23 "owner": "vic", 24 24 "repo": "flake-aspects", 25 - "rev": "81a51a8997abe392b9d0794424a4823adc9bd3af", 25 + "rev": "cc5a09d16af05210afe01c22f6b868929a4163b6", 26 26 "type": "github" 27 27 }, 28 28 "original": {
+6 -6
templates/ci/flake.lock
··· 22 22 }, 23 23 "den": { 24 24 "locked": { 25 - "lastModified": 1773187119, 26 - "narHash": "sha256-uAm7krbbxAk9+XpDabEN7DyMUT/7wEnv8HaCB7AUbHQ=", 25 + "lastModified": 1773264589, 26 + "narHash": "sha256-njJMeKzoSb6XTUHXIX3JezJEysJFq/y46v6qAlzRQrQ=", 27 27 "owner": "vic", 28 28 "repo": "den", 29 - "rev": "ba7ab0634b2ea4c8cb75a4ce7fd36f0454fca39a", 29 + "rev": "31bccfecba02c192627f3acb65bdeebcd6c19af7", 30 30 "type": "github" 31 31 }, 32 32 "original": { ··· 37 37 }, 38 38 "flake-aspects": { 39 39 "locked": { 40 - "lastModified": 1773185256, 41 - "narHash": "sha256-e3YqMwdQ2EpVTuWRkK2rkrHywp8QCpkj7x2U53SNoIA=", 40 + "lastModified": 1773272797, 41 + "narHash": "sha256-sSdYZiIeo98LmdnCR5GMN8B8bsHFgWA+1l9ZEpwXrFU=", 42 42 "owner": "vic", 43 43 "repo": "flake-aspects", 44 - "rev": "81a51a8997abe392b9d0794424a4823adc9bd3af", 44 + "rev": "cc5a09d16af05210afe01c22f6b868929a4163b6", 45 45 "type": "github" 46 46 }, 47 47 "original": {
+170
templates/ci/modules/features/auto-parametric.nix
··· 1 + { denTest, ... }: 2 + { 3 + flake.tests.auto-parametric = { 4 + 5 + # Helper aspect NOT linked to any host but included transitively. 6 + # Without auto-parametric, its __functor.__functionArgs = { aspect = false } 7 + # so canTake.atLeast { host } helper → false → silently dropped. 8 + test-helper-aspect-dispatches-with-host-ctx = denTest ( 9 + { den, igloo, ... }: 10 + { 11 + den.aspects.my-helper.includes = [ 12 + ( 13 + { host, ... }: 14 + { 15 + nixos.networking.hostName = host.name; 16 + } 17 + ) 18 + ]; 19 + den.aspects.igloo.includes = [ den.aspects.my-helper ]; 20 + den.hosts.x86_64-linux.igloo = { }; 21 + 22 + expr = igloo.networking.hostName; 23 + expected = "igloo"; 24 + } 25 + ); 26 + 27 + # Chained helper: igloo → a → b, all with { host } includes. 28 + test-helper-chain-propagates-host-ctx = denTest ( 29 + { den, igloo, ... }: 30 + { 31 + den.aspects.b.includes = [ 32 + ( 33 + { host, ... }: 34 + { 35 + nixos.networking.hostName = "${host.name}-ok"; 36 + } 37 + ) 38 + ]; 39 + den.aspects.a.includes = [ den.aspects.b ]; 40 + den.aspects.igloo.includes = [ den.aspects.a ]; 41 + den.hosts.x86_64-linux.igloo = { }; 42 + 43 + expr = igloo.networking.hostName; 44 + expected = "igloo-ok"; 45 + } 46 + ); 47 + 48 + # Anonymous attrset aspect in includes also works without explicit parametric. 49 + test-anon-fn-include-in-helper = denTest ( 50 + { den, igloo, ... }: 51 + { 52 + den.aspects.my-helper.includes = [ 53 + ( 54 + { host, ... }: 55 + { 56 + nixos.users.users.tux.description = host.name; 57 + } 58 + ) 59 + ]; 60 + den.aspects.igloo.includes = [ den.aspects.my-helper ]; 61 + den.hosts.x86_64-linux.igloo.users.tux = { }; 62 + 63 + expr = igloo.users.users.tux.description; 64 + expected = "igloo"; 65 + } 66 + ); 67 + 68 + # Explicit parametric.exactly on a helper must NOT be overridden. 69 + test-explicit-exactly-not-overridden-by-default = denTest ( 70 + { den, igloo, ... }: 71 + { 72 + den.aspects.strict-helper = den.lib.parametric.exactly { 73 + includes = [ 74 + ( 75 + { host, user, ... }: 76 + { 77 + nixos.users.users.${user.name}.description = "strict-${host.name}"; 78 + } 79 + ) 80 + ]; 81 + }; 82 + den.aspects.igloo.includes = [ den.aspects.strict-helper ]; 83 + den.hosts.x86_64-linux.igloo.users.tux = { }; 84 + 85 + # strict-helper requires exactly { host, user } — since ctx.host only provides 86 + # { host }, strict-helper is skipped at host level (by exactly semantics). 87 + # At user level, { host, user } matches → description is set. 88 + expr = igloo.users.users.tux.description; 89 + expected = "strict-igloo"; 90 + } 91 + ); 92 + 93 + # Helper with own class-specific config (owned) also flows correctly. 94 + test-helper-owned-config-preserved = denTest ( 95 + { den, igloo, ... }: 96 + { 97 + den.aspects.helper-with-owned = { 98 + nixos.networking.hostName = "from-helper-owned"; 99 + includes = [ ]; 100 + }; 101 + den.aspects.igloo.includes = [ den.aspects.helper-with-owned ]; 102 + den.hosts.x86_64-linux.igloo = { }; 103 + 104 + expr = igloo.networking.hostName; 105 + expected = "from-helper-owned"; 106 + } 107 + ); 108 + 109 + test-second-level-helper-owned-config-preserved = denTest ( 110 + { den, igloo, ... }: 111 + { 112 + den.hosts.x86_64-linux.igloo.users.tux = { }; 113 + 114 + den.aspects.second-with-owned = { 115 + nixos.networking.hostName = "from-second-owned"; 116 + includes = [ 117 + ( 118 + { host, user }: 119 + { 120 + nixos.users.users.${user.name}.description = host.name; 121 + } 122 + ) 123 + ]; 124 + }; 125 + den.aspects.helper.includes = [ den.aspects.second-with-owned ]; 126 + den.aspects.igloo.includes = [ den.aspects.helper ]; 127 + 128 + expr = [ 129 + igloo.networking.hostName 130 + igloo.users.users.tux.description 131 + ]; 132 + expected = [ 133 + "from-second-owned" 134 + "igloo" 135 + ]; 136 + } 137 + ); 138 + 139 + test-second-provides-helper-owned-config-preserved = denTest ( 140 + { den, igloo, ... }: 141 + { 142 + den.hosts.x86_64-linux.igloo.users.tux = { }; 143 + 144 + den.aspects.second.provides.with-owned = { 145 + nixos.networking.hostName = "from-second-owned"; 146 + includes = [ 147 + ( 148 + { host, user }: 149 + { 150 + nixos.users.users.${user.name}.description = host.name; 151 + } 152 + ) 153 + ]; 154 + }; 155 + den.aspects.helper.includes = [ den.aspects.second.provides.with-owned ]; 156 + den.aspects.igloo.includes = [ den.aspects.helper ]; 157 + 158 + expr = [ 159 + igloo.networking.hostName 160 + igloo.users.users.tux.description 161 + ]; 162 + expected = [ 163 + "from-second-owned" 164 + "igloo" 165 + ]; 166 + } 167 + ); 168 + 169 + }; 170 + }
+6 -6
templates/default/flake.lock
··· 2 2 "nodes": { 3 3 "den": { 4 4 "locked": { 5 - "lastModified": 1773187119, 6 - "narHash": "sha256-uAm7krbbxAk9+XpDabEN7DyMUT/7wEnv8HaCB7AUbHQ=", 5 + "lastModified": 1773264589, 6 + "narHash": "sha256-njJMeKzoSb6XTUHXIX3JezJEysJFq/y46v6qAlzRQrQ=", 7 7 "owner": "vic", 8 8 "repo": "den", 9 - "rev": "ba7ab0634b2ea4c8cb75a4ce7fd36f0454fca39a", 9 + "rev": "31bccfecba02c192627f3acb65bdeebcd6c19af7", 10 10 "type": "github" 11 11 }, 12 12 "original": { ··· 17 17 }, 18 18 "flake-aspects": { 19 19 "locked": { 20 - "lastModified": 1773185256, 21 - "narHash": "sha256-e3YqMwdQ2EpVTuWRkK2rkrHywp8QCpkj7x2U53SNoIA=", 20 + "lastModified": 1773272797, 21 + "narHash": "sha256-sSdYZiIeo98LmdnCR5GMN8B8bsHFgWA+1l9ZEpwXrFU=", 22 22 "owner": "vic", 23 23 "repo": "flake-aspects", 24 - "rev": "81a51a8997abe392b9d0794424a4823adc9bd3af", 24 + "rev": "cc5a09d16af05210afe01c22f6b868929a4163b6", 25 25 "type": "github" 26 26 }, 27 27 "original": {
+6 -6
templates/example/flake.lock
··· 22 22 }, 23 23 "den": { 24 24 "locked": { 25 - "lastModified": 1773187119, 26 - "narHash": "sha256-uAm7krbbxAk9+XpDabEN7DyMUT/7wEnv8HaCB7AUbHQ=", 25 + "lastModified": 1773264589, 26 + "narHash": "sha256-njJMeKzoSb6XTUHXIX3JezJEysJFq/y46v6qAlzRQrQ=", 27 27 "owner": "vic", 28 28 "repo": "den", 29 - "rev": "ba7ab0634b2ea4c8cb75a4ce7fd36f0454fca39a", 29 + "rev": "31bccfecba02c192627f3acb65bdeebcd6c19af7", 30 30 "type": "github" 31 31 }, 32 32 "original": { ··· 37 37 }, 38 38 "flake-aspects": { 39 39 "locked": { 40 - "lastModified": 1773185256, 41 - "narHash": "sha256-e3YqMwdQ2EpVTuWRkK2rkrHywp8QCpkj7x2U53SNoIA=", 40 + "lastModified": 1773272797, 41 + "narHash": "sha256-sSdYZiIeo98LmdnCR5GMN8B8bsHFgWA+1l9ZEpwXrFU=", 42 42 "owner": "vic", 43 43 "repo": "flake-aspects", 44 - "rev": "81a51a8997abe392b9d0794424a4823adc9bd3af", 44 + "rev": "cc5a09d16af05210afe01c22f6b868929a4163b6", 45 45 "type": "github" 46 46 }, 47 47 "original": {
+6 -6
templates/microvm/flake.lock
··· 2 2 "nodes": { 3 3 "den": { 4 4 "locked": { 5 - "lastModified": 1773187119, 6 - "narHash": "sha256-uAm7krbbxAk9+XpDabEN7DyMUT/7wEnv8HaCB7AUbHQ=", 5 + "lastModified": 1773264589, 6 + "narHash": "sha256-njJMeKzoSb6XTUHXIX3JezJEysJFq/y46v6qAlzRQrQ=", 7 7 "owner": "vic", 8 8 "repo": "den", 9 - "rev": "ba7ab0634b2ea4c8cb75a4ce7fd36f0454fca39a", 9 + "rev": "31bccfecba02c192627f3acb65bdeebcd6c19af7", 10 10 "type": "github" 11 11 }, 12 12 "original": { ··· 17 17 }, 18 18 "flake-aspects": { 19 19 "locked": { 20 - "lastModified": 1773185256, 21 - "narHash": "sha256-e3YqMwdQ2EpVTuWRkK2rkrHywp8QCpkj7x2U53SNoIA=", 20 + "lastModified": 1773272797, 21 + "narHash": "sha256-sSdYZiIeo98LmdnCR5GMN8B8bsHFgWA+1l9ZEpwXrFU=", 22 22 "owner": "vic", 23 23 "repo": "flake-aspects", 24 - "rev": "81a51a8997abe392b9d0794424a4823adc9bd3af", 24 + "rev": "cc5a09d16af05210afe01c22f6b868929a4163b6", 25 25 "type": "github" 26 26 }, 27 27 "original": {
+6 -6
templates/minimal/flake.lock
··· 2 2 "nodes": { 3 3 "den": { 4 4 "locked": { 5 - "lastModified": 1773187119, 6 - "narHash": "sha256-uAm7krbbxAk9+XpDabEN7DyMUT/7wEnv8HaCB7AUbHQ=", 5 + "lastModified": 1773264589, 6 + "narHash": "sha256-njJMeKzoSb6XTUHXIX3JezJEysJFq/y46v6qAlzRQrQ=", 7 7 "owner": "vic", 8 8 "repo": "den", 9 - "rev": "ba7ab0634b2ea4c8cb75a4ce7fd36f0454fca39a", 9 + "rev": "31bccfecba02c192627f3acb65bdeebcd6c19af7", 10 10 "type": "github" 11 11 }, 12 12 "original": { ··· 17 17 }, 18 18 "flake-aspects": { 19 19 "locked": { 20 - "lastModified": 1773185256, 21 - "narHash": "sha256-e3YqMwdQ2EpVTuWRkK2rkrHywp8QCpkj7x2U53SNoIA=", 20 + "lastModified": 1773272797, 21 + "narHash": "sha256-sSdYZiIeo98LmdnCR5GMN8B8bsHFgWA+1l9ZEpwXrFU=", 22 22 "owner": "vic", 23 23 "repo": "flake-aspects", 24 - "rev": "81a51a8997abe392b9d0794424a4823adc9bd3af", 24 + "rev": "cc5a09d16af05210afe01c22f6b868929a4163b6", 25 25 "type": "github" 26 26 }, 27 27 "original": {
+6 -6
templates/noflake/npins/sources.json
··· 9 9 }, 10 10 "branch": "main", 11 11 "submodules": false, 12 - "revision": "ba7ab0634b2ea4c8cb75a4ce7fd36f0454fca39a", 13 - "url": "https://github.com/vic/den/archive/ba7ab0634b2ea4c8cb75a4ce7fd36f0454fca39a.tar.gz", 14 - "hash": "sha256-uAm7krbbxAk9+XpDabEN7DyMUT/7wEnv8HaCB7AUbHQ=" 12 + "revision": "31bccfecba02c192627f3acb65bdeebcd6c19af7", 13 + "url": "https://github.com/vic/den/archive/31bccfecba02c192627f3acb65bdeebcd6c19af7.tar.gz", 14 + "hash": "sha256-njJMeKzoSb6XTUHXIX3JezJEysJFq/y46v6qAlzRQrQ=" 15 15 }, 16 16 "flake-aspects": { 17 17 "type": "Git", ··· 22 22 }, 23 23 "branch": "main", 24 24 "submodules": false, 25 - "revision": "81a51a8997abe392b9d0794424a4823adc9bd3af", 26 - "url": "https://github.com/vic/flake-aspects/archive/81a51a8997abe392b9d0794424a4823adc9bd3af.tar.gz", 27 - "hash": "sha256-e3YqMwdQ2EpVTuWRkK2rkrHywp8QCpkj7x2U53SNoIA=" 25 + "revision": "cc5a09d16af05210afe01c22f6b868929a4163b6", 26 + "url": "https://github.com/vic/flake-aspects/archive/cc5a09d16af05210afe01c22f6b868929a4163b6.tar.gz", 27 + "hash": "sha256-sSdYZiIeo98LmdnCR5GMN8B8bsHFgWA+1l9ZEpwXrFU=" 28 28 }, 29 29 "import-tree": { 30 30 "type": "Git",