Unverified Commit 348e5028 authored by Johannes Kirschbauer's avatar Johannes Kirschbauer Committed by GitHub
Browse files

lib/types: minimal fix for the regression of either when used in freeformType (#440459)

parents bff347d6 b3cf9ce0
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -244,8 +244,13 @@

### Deprecations {#sec-nixpkgs-release-25.11-lib-deprecations}

- Create the first release note entry in this section!
- `types.either` silently accepted mismatching types when used in `freeformType`. Module maintainers should fix the used type
  In most cases wrapping `either` with `attrsOf` should be sufficient.

  Since types.either was used to bootstrap other types. This also affects the following types:
  - `oneOf`
  - `number`
  - `numbers.*`

### Additions and Improvements {#sec-nixpkgs-release-25.11-lib-additions-improvements}

+22 −0
Original line number Diff line number Diff line
@@ -550,6 +550,28 @@ checkConfigOutput '/freeform-submodules.nix"$' config.fooDeclarations.0 ./freefo
checkConfigOutput '^10$' config.free.xxx.foo ./freeform-submodules.nix
checkConfigOutput '^10$' config.free.yyy.bar ./freeform-submodules.nix

# Regression of either, due to freeform not beeing checked previously
checkConfigOutput '^"foo"$' config.either.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong.nix
NIX_ABORT_ON_WARN=1 checkConfigError "One or more definitions did not pass the type-check of the \'either\' type" config.either.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong.nix
checkConfigOutput '^"foo"$' config.eitherBehindNullor.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong.nix
NIX_ABORT_ON_WARN=1 checkConfigError "One or more definitions did not pass the type-check of the \'either\' type" config.eitherBehindNullor.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong.nix
checkConfigOutput '^"foo"$' config.oneOf.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong.nix
NIX_ABORT_ON_WARN=1 checkConfigError "One or more definitions did not pass the type-check of the \'either\' type" config.oneOf.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong.nix
checkConfigOutput '^"foo"$' config.number.str ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong.nix
NIX_ABORT_ON_WARN=1 checkConfigError "One or more definitions did not pass the type-check of the \'either\' type" config.number.str ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong.nix

checkConfigOutput '^42$' config.either.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong2.nix
NIX_ABORT_ON_WARN=1 checkConfigError "One or more definitions did not pass the type-check of the \'either\' type" config.either.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong2.nix
checkConfigOutput '^42$' config.eitherBehindNullor.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong2.nix
NIX_ABORT_ON_WARN=1 checkConfigError "One or more definitions did not pass the type-check of the \'either\' type" config.eitherBehindNullor.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong2.nix
checkConfigOutput '^42$' config.oneOf.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong2.nix
NIX_ABORT_ON_WARN=1 checkConfigError "One or more definitions did not pass the type-check of the \'either\' type" config.oneOf.int ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong2.nix
checkConfigOutput '^42$' config.number.str ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong2.nix
NIX_ABORT_ON_WARN=1 checkConfigError "One or more definitions did not pass the type-check of the \'either\' type" config.number.str ./freeform-deprecated-malicous.nix ./freeform-deprecated-malicous-wrong2.nix
# Value OK: Fail if a warning is emitted
NIX_ABORT_ON_WARN=1 checkConfigOutput "^42$" config.number.int ./freeform-attrsof-either.nix


## types.anything
# Check that attribute sets are merged recursively
checkConfigOutput '^null$' config.value.foo ./types-anything/nested-attrs.nix
+14 −0
Original line number Diff line number Diff line
{ lib, ... }:
let
  inherit (lib) types mkOption;
in
{
  options.number = mkOption {
    type = types.submodule ({
      freeformType = types.attrsOf (types.either types.int types.int);
    });
    default = {
      int = 42;
    }; # should not emit a warning
  };
}
+18 −0
Original line number Diff line number Diff line
# Obviously wrong typed
{
  config.either = {
    int = "foo";
  };

  config.eitherBehindNullor = {
    int = "foo";
  };

  config.oneOf = {
    int = "foo";
  };

  config.number = {
    str = "foo";
  };
}
+19 −0
Original line number Diff line number Diff line
# freeeformType should have been (attrsOf either)
# This should also print the warning
{
  config.either = {
    int = 42;
  };

  config.eitherBehindNullor = {
    int = 42;
  };

  config.oneOf = {
    int = 42;
  };

  config.number = {
    str = 42;
  };
}
Loading