Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set module class to "homeManager" #5339

Closed
wants to merge 1 commit into from

Conversation

roberth
Copy link
Contributor

@roberth roberth commented Apr 26, 2024

Motivation

Enable a basic type check for module imports, so that a simple error appears when e.g. a NixOS module is loaded into Home Manager.

While currently almost no modules are "typed" like this yet, this will increase to a non-zero fraction, so supporting this feature will be beneficial.

It is important for applications (including Home Manager) to initiate this improvement, by choosing a name for class, as we can not expect others to guess the name and hope for the best.

Description

This enables a module system feature documented here: https://nixos.org/manual/nixpkgs/stable/index.html#module-system-lib-evalModules-param-class

For example, it allows a mistake to be caught, which is loading a NixOS module into home-manager. This only works when the offending module declares what it's for with a _class attribute.

It is not expected that users declare the _type, because the payoff is small. It is only expected to be set by generic code, such as functions or libraries that help with the "publishing" of modules (e.g. flake-parts, flake-utils).

The class feature has been available in the module system since NixOS/nixpkgs#197547, merged May 6, 2023. It has been part of all releases since 23.05-beta. The last NixOS release that did not support it has been end-of-life for close to a year now.

Example:

(lib.homeManagerConfiguration {
  pkgs = nixpkgs.legacyPackages.x86_64-linux;
  modules = [{ _class = "nixos"; imports = [ ./foo.nix ]; }];
}).activation-script

Corresponding error:

error: The module <unknown-file> was imported into homeManager instead of nixos.

(<unknown-file> can be improved by also setting _file, if known;
a much older feature)

Checklist

  • Change is backwards compatible.

    • Down to Nixpkgs lib 23.05.
  • Code formatted with ./format.

  • Code tested through nix-shell --pure tests -A run.all or nix develop --ignore-environment .#all using Flakes.

    • You've made me grep -v OK. Would appreciate a summary of the test result at the end.
  • Test cases updated/added. See example.

    • Yes, assuming your entrypoint (homeManagerConfiguration or modules/default.nix) is tested.
    • The class feature itself is tested upstream and it's a simple feature, for which I (personally) would not require a test.
  • Commit messages are formatted like

    {component}: {description}
    
    {long description}
    

    See CONTRIBUTING for more information and recent commit messages for examples.

  • If this PR adds a new module

    • N/A Added myself as module maintainer. See example.

Maintainer CC

This enables a module system feature documented here:
https://nixos.org/manual/nixpkgs/stable/index.html#module-system-lib-evalModules-param-class

For example, it allows a mistake to be caught, which is loading
a NixOS module into home-manager.
This only works when the offending module declares what it's for
with a `_class` attribute.

It is not expected that users declare the `_type`, because the payoff
is small. It is only expected to be set by generic code, such as
functions or libraries that help with the "publishing" of modules
(e.g. flake-parts, flake-utils).

The class feature has been available in the module system since
NixOS/nixpkgs#197547, merged May 6, 2023.
It has been part of all releases since 23.05-beta.
The last NixOS release that did _not_ support it has been end-of-life
for close to a year now.

Example:

    (lib.homeManagerConfiguration {
      pkgs = nixpkgs.legacyPackages.x86_64-linux;
      modules = [{ _class = "nixos"; imports = [ ./foo.nix ]; }];
    }).activation-script

Corresponding error:

    error: The module <unknown-file> was imported into homeManager instead of nixos.

(`<unknown-file>` can be improved by also setting `_file`, if known;
 a much older feature)
rycee pushed a commit that referenced this pull request Apr 27, 2024
This enables a module system feature documented here:
https://nixos.org/manual/nixpkgs/stable/index.html#module-system-lib-evalModules-param-class

For example, it allows a mistake to be caught, which is loading a
NixOS module into home-manager. This only works when the offending
module declares what it's for with a `_class` attribute.

It is not expected that users declare the `_type`, because the payoff
is small. It is only expected to be set by generic code, such as
functions or libraries that help with the "publishing" of modules
(e.g. flake-parts, flake-utils).

The class feature has been available in the module system since
NixOS/nixpkgs#197547, merged May 6, 2023. It
has been part of all releases since 23.05-beta. The last NixOS release
that did _not_ support it has been end-of-life for close to a year
now.

Example:

    (lib.homeManagerConfiguration {
      pkgs = nixpkgs.legacyPackages.x86_64-linux;
      modules = [{ _class = "nixos"; imports = [ ./foo.nix ]; }];
    }).activation-script

Corresponding error:

    error: The module <unknown-file> was imported into homeManager instead of nixos.

(`<unknown-file>` can be improved by also setting `_file`, if known; a
much older feature)

PR #5339
@rycee
Copy link
Member

rycee commented Apr 27, 2024

Thanks! Looks great. Rebased to master in 26e72d8.

@rycee rycee closed this Apr 27, 2024
@roberth
Copy link
Contributor Author

roberth commented Apr 27, 2024

Ok, great, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants