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.

fix(namespaces): test that deeply nested parametric aspects work across flakes (#259)

…ss flakes

authored by

Victor Borja and committed by
GitHub
76966206 0b4c1ad6

+256 -34
+3 -2
.github/workflows/semantic-pr.yml
··· 38 38 ctx 39 39 docs 40 40 core 41 + repo 41 42 class 42 43 homes 43 44 tests 44 45 template 45 - battery 46 - repo 46 + batteries 47 + namespaces
+41 -2
nix/namespace.nix
··· 8 8 name 9 9 ]) (builtins.filter builtins.isAttrs from); 10 10 11 + internals = [ 12 + "_" 13 + "modules" 14 + "resolve" 15 + "__functor" 16 + ]; 17 + 18 + stripAspect = 19 + v: 20 + if !builtins.isAttrs v then 21 + v 22 + else 23 + (builtins.removeAttrs v internals) 24 + // lib.optionalAttrs (v ? provides) { provides = lib.mapAttrs (_: stripAspect) v.provides; }; 25 + 26 + stripNamespace = lib.mapAttrs (_: stripAspect); 27 + 28 + functorModules = 29 + aspectPath: v: 30 + lib.optionals (builtins.isAttrs v) ( 31 + lib.optional (v ? __functor) { 32 + config = lib.setAttrByPath aspectPath { __functor = v.__functor; }; 33 + } 34 + ++ lib.concatMap ( 35 + pname: 36 + functorModules ( 37 + aspectPath 38 + ++ [ 39 + "provides" 40 + pname 41 + ] 42 + ) v.provides.${pname} 43 + ) (lib.attrNames (v.provides or { })) 44 + ); 45 + 46 + namespaceFunctorModules = 47 + ns: lib.concatMap (aname: functorModules [ "den" "ful" name aname ] ns.${aname}) (lib.attrNames ns); 48 + 11 49 sourceModule = { 12 - config.den.ful.${name} = lib.mkMerge denfuls; 50 + config.den.ful.${name} = lib.mkMerge (map stripNamespace denfuls); 13 51 }; 14 52 15 53 aliasModule = lib.mkAliasOptionModule [ name ] [ "den" "ful" name ]; ··· 27 65 sourceModule 28 66 aliasModule 29 67 outputModule 30 - ]; 68 + ] 69 + ++ lib.concatMap namespaceFunctorModules denfuls; 31 70 config._module.args.${name} = config.den.ful.${name}; 32 71 }
-29
templates/ci/modules/features/deadbugs/_external-namespace-deep-aspect.nix
··· 1 - { denTest, inputs, ... }: 2 - { 3 - 4 - flake.tests.deadbugs.namespace-deep-aspect = { 5 - 6 - test-external-flake = denTest ( 7 - { 8 - den, 9 - provider, 10 - igloo, 11 - ... 12 - }: 13 - { 14 - imports = [ 15 - (inputs.den.namespace "provider" [ 16 - true 17 - inputs.provider 18 - ]) 19 - ]; 20 - den.hosts.x86_64-linux.igloo.users.tux = { }; 21 - den.aspects.igloo.includes = [ provider.tools._.dev._.editors ]; 22 - expr = igloo.programs.vim.enable; 23 - expected = true; 24 - } 25 - ); 26 - 27 - }; 28 - 29 - }
+96
templates/ci/modules/features/deadbugs/external-namespace-deep-aspect.nix
··· 1 + { denTest, inputs, ... }: 2 + { 3 + 4 + flake.tests.deadbugs.namespace-deep-aspect = { 5 + 6 + test-tools-has-underscore = denTest ( 7 + { provider, ... }: 8 + { 9 + imports = [ 10 + (inputs.den.namespace "provider" [ 11 + true 12 + inputs.provider 13 + ]) 14 + ]; 15 + expr = provider.tools ? _; 16 + expected = true; 17 + } 18 + ); 19 + 20 + test-dev-has-underscore = denTest ( 21 + { provider, ... }: 22 + { 23 + imports = [ 24 + (inputs.den.namespace "provider" [ 25 + true 26 + inputs.provider 27 + ]) 28 + ]; 29 + expr = provider.tools._.dev ? _; 30 + expected = true; 31 + } 32 + ); 33 + 34 + test-external-flake = denTest ( 35 + { 36 + provider, 37 + igloo, 38 + ... 39 + }: 40 + { 41 + imports = [ 42 + (inputs.den.namespace "provider" [ 43 + true 44 + inputs.provider 45 + ]) 46 + ]; 47 + den.hosts.x86_64-linux.igloo.users.tux = { }; 48 + den.aspects.igloo.includes = [ provider.tools._.dev._.editors ]; 49 + expr = igloo.programs.vim.enable; 50 + expected = true; 51 + } 52 + ); 53 + 54 + test-functor-atLeast-fires-with-host-context = denTest ( 55 + { 56 + provider, 57 + igloo, 58 + ... 59 + }: 60 + { 61 + imports = [ 62 + (inputs.den.namespace "provider" [ 63 + true 64 + inputs.provider 65 + ]) 66 + ]; 67 + den.hosts.x86_64-linux.igloo.users.tux = { }; 68 + den.aspects.igloo.includes = [ provider.tools._.dev._.host-stamp ]; 69 + expr = igloo.environment.sessionVariables.PROVIDER_HOST; 70 + expected = "igloo"; 71 + } 72 + ); 73 + 74 + test-functor-exactly-fires-only-in-user-context = denTest ( 75 + { 76 + provider, 77 + igloo, 78 + ... 79 + }: 80 + { 81 + imports = [ 82 + (inputs.den.namespace "provider" [ 83 + true 84 + inputs.provider 85 + ]) 86 + ]; 87 + den.hosts.x86_64-linux.igloo.users.tux = { }; 88 + den.aspects.igloo.includes = [ provider.tools._.dev._.user-stamp ]; 89 + expr = igloo.users.users.tux.description; 90 + expected = "user-of-igloo"; 91 + } 92 + ); 93 + 94 + }; 95 + 96 + }
+93
templates/ci/provider/flake.lock
··· 1 + { 2 + "nodes": { 3 + "den": { 4 + "locked": { 5 + "lastModified": 1773233709, 6 + "narHash": "sha256-ciy+jL9R1ThzRUpvYnG8wO37b9lGTaM3svnCCsiR1gY=", 7 + "owner": "vic", 8 + "repo": "den", 9 + "rev": "0b4c1ad6f7b93483203b07955cc00a94861420a7", 10 + "type": "github" 11 + }, 12 + "original": { 13 + "owner": "vic", 14 + "repo": "den", 15 + "type": "github" 16 + } 17 + }, 18 + "flake-aspects": { 19 + "locked": { 20 + "lastModified": 1773185256, 21 + "narHash": "sha256-e3YqMwdQ2EpVTuWRkK2rkrHywp8QCpkj7x2U53SNoIA=", 22 + "owner": "vic", 23 + "repo": "flake-aspects", 24 + "rev": "81a51a8997abe392b9d0794424a4823adc9bd3af", 25 + "type": "github" 26 + }, 27 + "original": { 28 + "owner": "vic", 29 + "repo": "flake-aspects", 30 + "type": "github" 31 + } 32 + }, 33 + "flake-parts": { 34 + "inputs": { 35 + "nixpkgs-lib": [ 36 + "nixpkgs" 37 + ] 38 + }, 39 + "locked": { 40 + "lastModified": 1772408722, 41 + "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=", 42 + "owner": "hercules-ci", 43 + "repo": "flake-parts", 44 + "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3", 45 + "type": "github" 46 + }, 47 + "original": { 48 + "owner": "hercules-ci", 49 + "repo": "flake-parts", 50 + "type": "github" 51 + } 52 + }, 53 + "import-tree": { 54 + "locked": { 55 + "lastModified": 1772999353, 56 + "narHash": "sha256-dPb0WxUhFaz6wuR3B6ysqFJpsu8txKDPZvS47AT2XLI=", 57 + "owner": "vic", 58 + "repo": "import-tree", 59 + "rev": "545a4df146fce44d155573e47f5a777985acf912", 60 + "type": "github" 61 + }, 62 + "original": { 63 + "owner": "vic", 64 + "repo": "import-tree", 65 + "type": "github" 66 + } 67 + }, 68 + "nixpkgs": { 69 + "locked": { 70 + "lastModified": 1772956932, 71 + "narHash": "sha256-ng4mTBcXO6Nc1cTlXxCPkI49nDJbwFNg/DBhx7YkymE=", 72 + "rev": "608d0cadfed240589a7eea422407a547ad626a14", 73 + "type": "tarball", 74 + "url": "https://releases.nixos.org/nixpkgs/nixpkgs-26.05pre960315.608d0cadfed2/nixexprs.tar.xz" 75 + }, 76 + "original": { 77 + "type": "tarball", 78 + "url": "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz" 79 + } 80 + }, 81 + "root": { 82 + "inputs": { 83 + "den": "den", 84 + "flake-aspects": "flake-aspects", 85 + "flake-parts": "flake-parts", 86 + "import-tree": "import-tree", 87 + "nixpkgs": "nixpkgs" 88 + } 89 + } 90 + }, 91 + "root": "root", 92 + "version": 7 93 + }
+23 -1
templates/ci/provider/modules/den.nix
··· 1 - { inputs, ... }: 1 + { inputs, den, ... }: 2 2 { 3 3 systems = [ 4 4 "x86_64-linux" ··· 18 18 { 19 19 home.packages = [ pkgs.vim ]; 20 20 }; 21 + }; 22 + 23 + provider.tools._.dev._.host-stamp = den.lib.parametric { 24 + includes = [ 25 + ( 26 + { host, ... }: 27 + { 28 + nixos.environment.sessionVariables.PROVIDER_HOST = host.name; 29 + } 30 + ) 31 + ]; 32 + }; 33 + 34 + provider.tools._.dev._.user-stamp = den.lib.parametric.exactly { 35 + includes = [ 36 + ( 37 + { host, user, ... }: 38 + { 39 + nixos.users.users.${user.userName}.description = "user-of-${host.name}"; 40 + } 41 + ) 42 + ]; 21 43 }; 22 44 }