Files
clan-core/lib
Valentin Gagarin e28681c4f2 lib/jsonschema: make attrs required
Before the change, modules of the form

```nix
{ lib, ... }: {
  foo.bar = lib.mkOption {
    # ...
  };
}
```

or

```nix
{ lib, ... }: {
  foo = lib.mkOption {
    type = lib.types.subModule {
      bar = lib.mkOption {
        # ...
      };
    };
  };
}
```

would not render with `foo` as required, which is not faithful to the
module system's semantics.

This change also tests that fields with defaults are not marked required.
Note that submodule options cannot have their defaults rendered to JSON
schema, and are therefore always marked required.

Architecturally this change is rather unfortunate: So far the checks for
defaults happen in the rendering (using `isDefault`) and not in the parsing,
but here we're adding a field to `$exportedModuleInfo`. While strictly
speaking we probably don't want to consider requiredness as module-level
information, it seems more reasonable to me to do it that way since at
the JSON schema level we have lost the distinction between `attrs`,
`attrsOf`, `submodule`.
2025-04-16 13:20:00 +02:00
..
2024-07-09 15:23:26 +02:00

ClanLib

This folder is supposed to contain clan specific nix functions.

Such as:

  • build-clan function
  • select
  • build-inventory function
  • json-schema-converter

Structure

Similar to nixpkgs/lib this produces a recursive attribute set in a fixed-point. Functions within lib can depend on each other to create new abstractions.

Conventions

Note: This is not consistently enforced yet. If you start a new feature, or refactoring/touching existing ones, please help us to move towards the below illustrated.

A single feature-set/module may be organized like this:

#     ↓ The final clanLib
{lib, clanLib, ...}:
# ↓ portion to add to clanLib
{
    inventory.resolveTags = tags: inventory.machines; # implementation
    inventory.buildMachines = x: clanLib.inventory.resolveTags x; # implementation
}

Every bigger feature should live in a subfolder with the feature name. It should contain two files:

  • impl.nix
  • test.nix
  • Everything else may be adopted as needed.
Example filetree
.
├── default.nix
├── build-clan
│   ├── default.nix
│   └── test.nix
└── inventory
    ├── default.nix
    ├── services-subfeature
    │   ├── default.nix
    │   └── test.nix
    ├── instances-subfeature # <- We immediately see that this feature is not tested on itself.
    │   └── default.nix
    └── test.nix
# default.nix
{lib, clanLib, ...}:
{
    inventory.resolveTags = import ./resolveTags { inherit lib clanLib; };
}

Testing

For testing we use nix-unit

TODO: define a helper that automatically hooks up tests in flake.legacyPackages and a corresponding buildable checks attribute