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: Add adapters.traceName and re-use at tests (#404)

Move our `traceName` adapter into lib, it is useful at tests but could
also be used by people for debugging. Updated existing tests to use it,
and formatted code afterwards.

authored by

Victor Borja and committed by
GitHub
f9ef7e5d 083be369

+162 -157
+14
docs/src/content/docs/guides/debug.md
··· 33 33 nix-repl> den.ctx 34 34 ``` 35 35 36 + ## Trace Aspect Includes 37 + 38 + Use the following example code to get a trace 39 + (list of nested `aspect.name`) of included aspects. 40 + 41 + ```nix 42 + let 43 + inherit (den.lib.aspects) resolve adapters; 44 + adapter = adapters.filterIncludes adapters.traceName; 45 + aspect = den.ctx.host { host = igloo; }; 46 + in 47 + resolve.withAdapter adapter "nixos" aspect 48 + ``` 49 + 36 50 ## Trace Context 37 51 38 52 Print context values during evaluation:
+7
nix/lib/aspects/adapters.nix
··· 87 87 else 88 88 inner args; 89 89 90 + # Utility for debugging. Traces aspect.name as nested lists per includes. 91 + traceName = 92 + { aspect, recurse, ... }: 93 + { 94 + trace = [ aspect.name ] ++ builtins.map (i: (recurse i).trace or [ ]) (aspect.includes or [ ]); 95 + }; 90 96 in 91 97 { 92 98 inherit ··· 97 103 mapAspect 98 104 mapIncludes 99 105 module 106 + traceName 100 107 ; 101 108 }
+69 -77
templates/ci/modules/features/aspect-adapter.nix
··· 1 1 { denTest, lib, ... }: 2 2 { 3 - flake.tests.aspect-adapter = 4 - let 5 - traceName = 6 - { aspect, recurse, ... }: 7 - { 8 - trace = [ aspect.name ] ++ map (i: (recurse i).trace or [ ]) (aspect.includes or [ ]); 9 - }; 10 - in 11 - { 3 + flake.tests.aspect-adapter = { 12 4 13 - test-meta-adapter-filters-subtree = denTest ( 14 - { den, ... }: 15 - { 16 - den.aspects.foo.includes = [ 17 - den.aspects.bar 18 - den.aspects.baz 19 - ]; 20 - den.aspects.foo.meta.adapter = 21 - inherited: den.lib.aspects.adapters.filter (a: a.name != "baz") inherited; 22 - den.aspects.bar.nixos = { }; 23 - den.aspects.baz.nixos = { }; 5 + test-meta-adapter-filters-subtree = denTest ( 6 + { den, ... }: 7 + { 8 + den.aspects.foo.includes = [ 9 + den.aspects.bar 10 + den.aspects.baz 11 + ]; 12 + den.aspects.foo.meta.adapter = 13 + inherited: den.lib.aspects.adapters.filter (a: a.name != "baz") inherited; 14 + den.aspects.bar.nixos = { }; 15 + den.aspects.baz.nixos = { }; 24 16 25 - expr = 26 - den.lib.aspects.resolve.withAdapter (den.lib.aspects.adapters.filterIncludes traceName) "nixos" 27 - den.aspects.foo; 28 - expected.trace = [ 29 - "foo" 30 - [ "bar" ] 31 - ]; 32 - } 33 - ); 17 + expr = 18 + with den.lib.aspects; 19 + resolve.withAdapter (adapters.filterIncludes adapters.traceName) "nixos" den.aspects.foo; 20 + expected.trace = [ 21 + "foo" 22 + [ "bar" ] 23 + ]; 24 + } 25 + ); 34 26 35 - test-meta-adapter-only-affects-subtree = denTest ( 36 - { den, ... }: 37 - { 38 - den.aspects.root.includes = [ 39 - den.aspects.foo 40 - den.aspects.baz 41 - ]; 42 - den.aspects.foo.includes = [ den.aspects.bar ]; 43 - den.aspects.foo.meta.adapter = 44 - inherited: den.lib.aspects.adapters.filter (a: a.name != "baz") inherited; 45 - den.aspects.bar.nixos = { }; 46 - den.aspects.baz.nixos = { }; 27 + test-meta-adapter-only-affects-subtree = denTest ( 28 + { den, ... }: 29 + { 30 + den.aspects.root.includes = [ 31 + den.aspects.foo 32 + den.aspects.baz 33 + ]; 34 + den.aspects.foo.includes = [ den.aspects.bar ]; 35 + den.aspects.foo.meta.adapter = 36 + inherited: den.lib.aspects.adapters.filter (a: a.name != "baz") inherited; 37 + den.aspects.bar.nixos = { }; 38 + den.aspects.baz.nixos = { }; 47 39 48 - expr = 49 - den.lib.aspects.resolve.withAdapter (den.lib.aspects.adapters.filterIncludes traceName) "nixos" 50 - den.aspects.root; 51 - expected.trace = [ 52 - "root" 53 - [ 54 - "foo" 55 - [ "bar" ] 56 - ] 57 - [ "baz" ] 58 - ]; 59 - } 60 - ); 40 + expr = 41 + with den.lib.aspects; 42 + resolve.withAdapter (adapters.filterIncludes adapters.traceName) "nixos" den.aspects.root; 43 + expected.trace = [ 44 + "root" 45 + [ 46 + "foo" 47 + [ "bar" ] 48 + ] 49 + [ "baz" ] 50 + ]; 51 + } 52 + ); 61 53 62 - test-meta-adapter-composes-with-caller = denTest ( 63 - { den, ... }: 64 - { 65 - den.aspects.foo.includes = [ 66 - den.aspects.bar 67 - den.aspects.baz 68 - ]; 69 - den.aspects.foo.meta.adapter = 70 - inherited: den.lib.aspects.adapters.filter (a: a.name != "bar") inherited; 71 - den.aspects.bar.nixos = { }; 72 - den.aspects.baz.nixos = { }; 54 + test-meta-adapter-composes-with-caller = denTest ( 55 + { den, ... }: 56 + { 57 + den.aspects.foo.includes = [ 58 + den.aspects.bar 59 + den.aspects.baz 60 + ]; 61 + den.aspects.foo.meta.adapter = 62 + inherited: den.lib.aspects.adapters.filter (a: a.name != "bar") inherited; 63 + den.aspects.bar.nixos = { }; 64 + den.aspects.baz.nixos = { }; 73 65 74 - expr = 75 - let 76 - outerAdapter = den.lib.aspects.adapters.filter (a: a.name != "baz") traceName; 77 - in 78 - den.lib.aspects.resolve.withAdapter (den.lib.aspects.adapters.filterIncludes outerAdapter) "nixos" 79 - den.aspects.foo; 80 - expected.trace = [ 81 - "foo" 82 - ]; 83 - } 84 - ); 66 + expr = 67 + let 68 + inherit (den.lib.aspects) resolve adapters; 69 + outerAdapter = adapters.filter (a: a.name != "baz") adapters.traceName; 70 + in 71 + resolve.withAdapter (adapters.filterIncludes outerAdapter) "nixos" den.aspects.foo; 72 + expected.trace = [ 73 + "foo" 74 + ]; 75 + } 76 + ); 85 77 86 - }; 78 + }; 87 79 }
+72 -80
templates/ci/modules/features/resolve-adapters.nix
··· 1 1 { denTest, lib, ... }: 2 2 { 3 - flake.tests.resolve-adapters = 4 - let 5 - traceName = 6 - { aspect, recurse, ... }: 7 - { 8 - trace = [ aspect.name ] ++ map (i: (recurse i).trace or [ ]) (aspect.includes or [ ]); 9 - }; 10 - in 11 - { 3 + flake.tests.resolve-adapters = { 12 4 13 - test-basic-trace-includes = denTest ( 14 - { den, lib, ... }: 15 - { 5 + test-basic-trace-includes = denTest ( 6 + { den, lib, ... }: 7 + { 16 8 17 - den.aspects.foo.includes = [ den.aspects.bar ]; 18 - den.aspects.bar.includes = [ den.aspects.baz ]; 19 - den.aspects.baz.nixos = { }; 9 + den.aspects.foo.includes = [ den.aspects.bar ]; 10 + den.aspects.bar.includes = [ den.aspects.baz ]; 11 + den.aspects.baz.nixos = { }; 20 12 21 - expr = den.lib.aspects.resolve.withAdapter traceName "nixos" den.aspects.foo; 22 - expected.trace = [ 23 - "foo" 24 - [ 25 - "bar" 26 - [ "baz" ] 27 - ] 28 - ]; 29 - } 30 - ); 13 + expr = with den.lib.aspects; resolve.withAdapter adapters.traceName "nixos" den.aspects.foo; 14 + expected.trace = [ 15 + "foo" 16 + [ 17 + "bar" 18 + [ "baz" ] 19 + ] 20 + ]; 21 + } 22 + ); 31 23 32 - test-filter-compose-with-trace-includes = denTest ( 33 - { den, lib, ... }: 34 - { 24 + test-filter-compose-with-trace-includes = denTest ( 25 + { den, lib, ... }: 26 + { 35 27 36 - den.aspects.foo.includes = [ den.aspects.bar ]; 37 - den.aspects.bar.includes = [ den.aspects.baz ]; 38 - den.aspects.baz.nixos = { }; 28 + den.aspects.foo.includes = [ den.aspects.bar ]; 29 + den.aspects.bar.includes = [ den.aspects.baz ]; 30 + den.aspects.baz.nixos = { }; 39 31 40 - expr = 41 - let 42 - inherit (den.lib.aspects) resolve adapters; 43 - notBar = adapters.filter (aspect: aspect.name != "bar"); 44 - composed = notBar traceName; 45 - in 46 - resolve.withAdapter composed "nixos" den.aspects.foo; 47 - expected.trace = [ 48 - "foo" 49 - [ ] 50 - ]; 51 - } 52 - ); 32 + expr = 33 + let 34 + inherit (den.lib.aspects) resolve adapters; 35 + notBar = adapters.filter (aspect: aspect.name != "bar"); 36 + composed = notBar adapters.traceName; 37 + in 38 + resolve.withAdapter composed "nixos" den.aspects.foo; 39 + expected.trace = [ 40 + "foo" 41 + [ ] 42 + ]; 43 + } 44 + ); 53 45 54 - test-host-conditional-aspect-inclusion = denTest ( 55 - { 56 - den, 57 - lib, 58 - iceberg, 59 - ... 60 - }: 61 - { 62 - den.hosts.x86_64-linux.igloo = { }; 63 - den.hosts.x86_64-linux.iceberg = { }; 46 + test-host-conditional-aspect-inclusion = denTest ( 47 + { 48 + den, 49 + lib, 50 + iceberg, 51 + ... 52 + }: 53 + { 54 + den.hosts.x86_64-linux.igloo = { }; 55 + den.hosts.x86_64-linux.iceberg = { }; 64 56 65 - den.aspects.foo.meta.key = "foo"; 66 - den.aspects.foo.nixos.environment.sessionVariables.message = "foo"; 57 + den.aspects.foo.meta.key = "foo"; 58 + den.aspects.foo.nixos.environment.sessionVariables.message = "foo"; 67 59 68 - den.aspects.bar.nixos.environment.sessionVariables.message = "bar"; 60 + den.aspects.bar.nixos.environment.sessionVariables.message = "bar"; 69 61 70 - # host igloo includes foo 71 - den.aspects.igloo.includes = [ den.aspects.foo ]; 62 + # host igloo includes foo 63 + den.aspects.igloo.includes = [ den.aspects.foo ]; 72 64 73 - # host iceberg feature detects if foo is available at host igloo 74 - den.aspects.iceberg.includes = 75 - let 76 - inherit (den.lib.aspects) resolve; 77 - inherit (den.hosts.x86_64-linux) igloo; 65 + # host iceberg feature detects if foo is available at host igloo 66 + den.aspects.iceberg.includes = 67 + let 68 + inherit (den.lib.aspects) resolve; 69 + inherit (den.hosts.x86_64-linux) igloo; 78 70 79 - iglooAspect = den.ctx.host { host = igloo; }; 80 - detectFoo = resolve.withAdapter (hasAspectWithKey "foo") "nixos" iglooAspect; 71 + iglooAspect = den.ctx.host { host = igloo; }; 72 + detectFoo = resolve.withAdapter (hasAspectWithKey "foo") "nixos" iglooAspect; 81 73 82 - hasAspectWithKey = 83 - key: 84 - { aspect, recurse, ... }: 85 - { 86 - found = 87 - aspect.meta.key or null == key || lib.any (i: (recurse i).found or false) (aspect.includes or [ ]); 88 - }; 74 + hasAspectWithKey = 75 + key: 76 + { aspect, recurse, ... }: 77 + { 78 + found = 79 + aspect.meta.key or null == key || lib.any (i: (recurse i).found or false) (aspect.includes or [ ]); 80 + }; 89 81 90 - in 91 - lib.optional detectFoo.found den.aspects.bar; 82 + in 83 + lib.optional detectFoo.found den.aspects.bar; 92 84 93 - expr = iceberg.environment.sessionVariables.message; 94 - expected = "bar"; 95 - } 96 - ); 85 + expr = iceberg.environment.sessionVariables.message; 86 + expected = "bar"; 87 + } 88 + ); 97 89 98 - }; 90 + }; 99 91 }