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: adapters.trace = (filterIncludes traceNames) (#407)

`adapters.trace`, like default, uses `filterIncludes` but with
`traceNames`. This was being repeated in many places, also simplifies
documentation for debugging.

authored by

Victor Borja and committed by
GitHub
ca9f7e4f 37297dd1

+145 -163
+2 -3
docs/src/content/docs/guides/debug.md
··· 41 41 ```nix 42 42 let 43 43 inherit (den.lib.aspects) resolve adapters; 44 - adapter = adapters.filterIncludes adapters.traceName; 45 - aspect = den.ctx.host { host = igloo; }; 44 + aspect = den.hosts.x86_64-linux.resolved; 46 45 in 47 - resolve.withAdapter adapter "nixos" aspect 46 + resolve.withAdapter adapters.trace "nixos" aspect 48 47 ``` 49 48 50 49 ## Trace Context
+3
nix/lib/aspects/adapters.nix
··· 93 93 { 94 94 trace = [ aspect.name ] ++ builtins.map (i: (recurse i).trace or [ ]) (aspect.includes or [ ]); 95 95 }; 96 + 97 + trace = filterIncludes traceName; 96 98 in 97 99 { 98 100 inherit ··· 103 105 mapAspect 104 106 mapIncludes 105 107 module 108 + trace 106 109 traceName 107 110 ; 108 111 }
+138 -154
templates/ci/modules/features/adapter-propagation.nix
··· 1 1 { denTest, lib, ... }: 2 2 { 3 - flake.tests.adapter-propagation = 4 - let 5 - traceName = 6 - { aspect, recurse, ... }: 7 - { 8 - trace = [ (aspect.name or null) ] ++ map (i: (recurse i).trace or [ ]) (aspect.includes or [ ]); 9 - }; 10 - in 11 - { 3 + flake.tests.adapter-propagation = { 12 4 13 - # --- Aspect-level meta.adapter --- 5 + # --- Aspect-level meta.adapter --- 14 6 15 - test-resolve-honors-meta-adapter = denTest ( 16 - { den, ... }: 17 - { 18 - den.aspects.foo.includes = [ den.aspects.bar ]; 19 - den.aspects.foo.meta.adapter = 20 - inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "bar") inherited; 21 - den.aspects.bar.nixos = { }; 7 + test-resolve-honors-meta-adapter = denTest ( 8 + { den, ... }: 9 + { 10 + den.aspects.foo.includes = [ den.aspects.bar ]; 11 + den.aspects.foo.meta.adapter = 12 + inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "bar") inherited; 13 + den.aspects.bar.nixos = { }; 22 14 23 - expr = (den.lib.aspects.resolve "nixos" den.aspects.foo) ? imports; 24 - expected = true; 25 - } 26 - ); 15 + expr = (den.lib.aspects.resolve "nixos" den.aspects.foo) ? imports; 16 + expected = true; 17 + } 18 + ); 27 19 28 - test-tags-includes-with-adapter = denTest ( 29 - { den, ... }: 30 - { 31 - den.aspects.parent.includes = [ den.aspects.child ]; 32 - den.aspects.parent.meta.adapter = 33 - inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "baz") inherited; 34 - den.aspects.child.includes = [ den.aspects.baz ]; 35 - den.aspects.baz.nixos = { }; 20 + test-tags-includes-with-adapter = denTest ( 21 + { den, ... }: 22 + { 23 + den.aspects.parent.includes = [ den.aspects.child ]; 24 + den.aspects.parent.meta.adapter = 25 + inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "baz") inherited; 26 + den.aspects.child.includes = [ den.aspects.baz ]; 27 + den.aspects.baz.nixos = { }; 36 28 37 - expr = 38 - den.lib.aspects.resolve.withAdapter (den.lib.aspects.adapters.filterIncludes traceName) "nixos" 39 - den.aspects.parent; 40 - expected.trace = [ 41 - "parent" 42 - [ "child" ] 43 - ]; 44 - } 45 - ); 29 + expr = with den.lib.aspects; resolve.withAdapter adapters.trace "nixos" den.aspects.parent; 30 + expected.trace = [ 31 + "parent" 32 + [ "child" ] 33 + ]; 34 + } 35 + ); 46 36 47 - test-child-inherits-parent-adapter = denTest ( 48 - { den, ... }: 49 - { 50 - den.aspects.parent.includes = [ den.aspects.child ]; 51 - den.aspects.parent.meta.adapter = 52 - inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "excluded") inherited; 53 - den.aspects.child.includes = [ 54 - den.aspects.kept 55 - den.aspects.excluded 56 - ]; 57 - den.aspects.kept.nixos = { }; 58 - den.aspects.excluded.nixos = { }; 37 + test-child-inherits-parent-adapter = denTest ( 38 + { den, ... }: 39 + { 40 + den.aspects.parent.includes = [ den.aspects.child ]; 41 + den.aspects.parent.meta.adapter = 42 + inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "excluded") inherited; 43 + den.aspects.child.includes = [ 44 + den.aspects.kept 45 + den.aspects.excluded 46 + ]; 47 + den.aspects.kept.nixos = { }; 48 + den.aspects.excluded.nixos = { }; 59 49 60 - expr = 61 - den.lib.aspects.resolve.withAdapter (den.lib.aspects.adapters.filterIncludes traceName) "nixos" 62 - den.aspects.parent; 63 - expected.trace = [ 64 - "parent" 65 - [ 66 - "child" 67 - [ "kept" ] 68 - ] 69 - ]; 70 - } 71 - ); 50 + expr = with den.lib.aspects; resolve.withAdapter adapters.trace "nixos" den.aspects.parent; 51 + expected.trace = [ 52 + "parent" 53 + [ 54 + "child" 55 + [ "kept" ] 56 + ] 57 + ]; 58 + } 59 + ); 72 60 73 - test-deep-chain-a-excludes-c-through-b = denTest ( 74 - { den, ... }: 75 - { 76 - den.aspects.a.includes = [ den.aspects.b ]; 77 - den.aspects.a.meta.adapter = 78 - inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "c") inherited; 79 - den.aspects.b.includes = [ 80 - den.aspects.c 81 - den.aspects.d 82 - ]; 83 - den.aspects.c.nixos = { }; 84 - den.aspects.d.nixos = { }; 61 + test-deep-chain-a-excludes-c-through-b = denTest ( 62 + { den, ... }: 63 + { 64 + den.aspects.a.includes = [ den.aspects.b ]; 65 + den.aspects.a.meta.adapter = 66 + inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "c") inherited; 67 + den.aspects.b.includes = [ 68 + den.aspects.c 69 + den.aspects.d 70 + ]; 71 + den.aspects.c.nixos = { }; 72 + den.aspects.d.nixos = { }; 85 73 86 - expr = 87 - den.lib.aspects.resolve.withAdapter (den.lib.aspects.adapters.filterIncludes traceName) "nixos" 88 - den.aspects.a; 89 - expected.trace = [ 90 - "a" 91 - [ 92 - "b" 93 - [ "d" ] 94 - ] 95 - ]; 96 - } 97 - ); 74 + expr = with den.lib.aspects; resolve.withAdapter adapters.trace "nixos" den.aspects.a; 75 + expected.trace = [ 76 + "a" 77 + [ 78 + "b" 79 + [ "d" ] 80 + ] 81 + ]; 82 + } 83 + ); 98 84 99 - test-diamond-a-excludes-d-through-both-paths = denTest ( 100 - { den, ... }: 101 - { 102 - den.aspects.a.includes = [ 103 - den.aspects.b 104 - den.aspects.c 105 - ]; 106 - den.aspects.a.meta.adapter = 107 - inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "d") inherited; 108 - den.aspects.b.includes = [ den.aspects.d ]; 109 - den.aspects.c.includes = [ den.aspects.d ]; 110 - den.aspects.d.nixos = { }; 85 + test-diamond-a-excludes-d-through-both-paths = denTest ( 86 + { den, ... }: 87 + { 88 + den.aspects.a.includes = [ 89 + den.aspects.b 90 + den.aspects.c 91 + ]; 92 + den.aspects.a.meta.adapter = 93 + inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "d") inherited; 94 + den.aspects.b.includes = [ den.aspects.d ]; 95 + den.aspects.c.includes = [ den.aspects.d ]; 96 + den.aspects.d.nixos = { }; 111 97 112 - expr = 113 - den.lib.aspects.resolve.withAdapter (den.lib.aspects.adapters.filterIncludes traceName) "nixos" 114 - den.aspects.a; 115 - expected.trace = [ 116 - "a" 117 - [ "b" ] 118 - [ "c" ] 119 - ]; 120 - } 121 - ); 98 + expr = with den.lib.aspects; resolve.withAdapter adapters.trace "nixos" den.aspects.a; 99 + expected.trace = [ 100 + "a" 101 + [ "b" ] 102 + [ "c" ] 103 + ]; 104 + } 105 + ); 122 106 123 - # --- Context-level meta.adapter --- 107 + # --- Context-level meta.adapter --- 124 108 125 - test-ctx-carries-meta-adapter = denTest ( 126 - { den, ... }: 127 - { 128 - den.hosts.x86_64-linux.igloo = { }; 109 + test-ctx-carries-meta-adapter = denTest ( 110 + { den, ... }: 111 + { 112 + den.hosts.x86_64-linux.igloo = { }; 129 113 130 - den.ctx.host.meta.adapter = 131 - inherited: den.lib.aspects.adapters.filter (a: a.name != "foo") inherited; 114 + den.ctx.host.meta.adapter = 115 + inherited: den.lib.aspects.adapters.filter (a: a.name != "foo") inherited; 132 116 133 - expr = (den.ctx.host { host = den.hosts.x86_64-linux.igloo; }).meta.adapter != null; 134 - expected = true; 135 - } 136 - ); 117 + expr = (den.ctx.host { host = den.hosts.x86_64-linux.igloo; }).meta.adapter != null; 118 + expected = true; 119 + } 120 + ); 137 121 138 - test-ctx-meta-adapter-null-when-unset = denTest ( 139 - { den, ... }: 140 - { 141 - den.hosts.x86_64-linux.igloo = { }; 122 + test-ctx-meta-adapter-null-when-unset = denTest ( 123 + { den, ... }: 124 + { 125 + den.hosts.x86_64-linux.igloo = { }; 142 126 143 - expr = (den.ctx.host { host = den.hosts.x86_64-linux.igloo; }).meta.adapter; 144 - expected = null; 145 - } 146 - ); 127 + expr = (den.ctx.host { host = den.hosts.x86_64-linux.igloo; }).meta.adapter; 128 + expected = null; 129 + } 130 + ); 147 131 148 - # --- Cross-stage: host adapter filters at user level --- 132 + # --- Cross-stage: host adapter filters at user level --- 149 133 150 - # Host context adapter transitively filters nested aspects. 151 - # blocked-deep is two levels below igloo but still excluded. 152 - test-ctx-host-adapter-filters-transitively = denTest ( 153 - { den, igloo, ... }: 154 - { 155 - den.hosts.x86_64-linux.igloo.users.tux = { }; 134 + # Host context adapter transitively filters nested aspects. 135 + # blocked-deep is two levels below igloo but still excluded. 136 + test-ctx-host-adapter-filters-transitively = denTest ( 137 + { den, igloo, ... }: 138 + { 139 + den.hosts.x86_64-linux.igloo.users.tux = { }; 156 140 157 - den.ctx.host.meta.adapter = 158 - inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "blocked") inherited; 141 + den.ctx.host.meta.adapter = 142 + inherited: den.lib.aspects.adapters.filter (a: (a.name or null) != "blocked") inherited; 159 143 160 - den.aspects.igloo.includes = [ den.aspects.parent ]; 161 - den.aspects.parent.includes = [ 162 - den.aspects.allowed 163 - den.aspects.blocked 164 - ]; 165 - den.aspects.allowed.nixos.environment.sessionVariables.ALLOWED = "yes"; 166 - den.aspects.blocked.nixos.environment.sessionVariables.BLOCKED = "yes"; 144 + den.aspects.igloo.includes = [ den.aspects.parent ]; 145 + den.aspects.parent.includes = [ 146 + den.aspects.allowed 147 + den.aspects.blocked 148 + ]; 149 + den.aspects.allowed.nixos.environment.sessionVariables.ALLOWED = "yes"; 150 + den.aspects.blocked.nixos.environment.sessionVariables.BLOCKED = "yes"; 167 151 168 - expr = { 169 - hasAllowed = igloo.environment.sessionVariables ? ALLOWED; 170 - hasBlocked = igloo.environment.sessionVariables ? BLOCKED; 171 - }; 172 - expected = { 173 - hasAllowed = true; 174 - hasBlocked = false; 175 - }; 176 - } 177 - ); 152 + expr = { 153 + hasAllowed = igloo.environment.sessionVariables ? ALLOWED; 154 + hasBlocked = igloo.environment.sessionVariables ? BLOCKED; 155 + }; 156 + expected = { 157 + hasAllowed = true; 158 + hasBlocked = false; 159 + }; 160 + } 161 + ); 178 162 179 - }; 163 + }; 180 164 }
+2 -6
templates/ci/modules/features/aspect-adapter.nix
··· 14 14 den.aspects.bar.nixos = { }; 15 15 den.aspects.baz.nixos = { }; 16 16 17 - expr = 18 - with den.lib.aspects; 19 - resolve.withAdapter (adapters.filterIncludes adapters.traceName) "nixos" den.aspects.foo; 17 + expr = with den.lib.aspects; resolve.withAdapter adapters.trace "nixos" den.aspects.foo; 20 18 expected.trace = [ 21 19 "foo" 22 20 [ "bar" ] ··· 37 35 den.aspects.bar.nixos = { }; 38 36 den.aspects.baz.nixos = { }; 39 37 40 - expr = 41 - with den.lib.aspects; 42 - resolve.withAdapter (adapters.filterIncludes adapters.traceName) "nixos" den.aspects.root; 38 + expr = with den.lib.aspects; resolve.withAdapter adapters.trace "nixos" den.aspects.root; 43 39 expected.trace = [ 44 40 "root" 45 41 [