lib/types: submodule fix description with freeformType (#443134)

authored by Johannes Kirschbauer and committed by GitHub 2b2df960 7e0bcb51

Changed files
+470 -1
lib
+3
lib/tests/modules.sh
··· 210 210 checkConfigError 'A definition for option .nested\.right\.left. is not of type .signed integer.' config.nested.right.left ./types-attrTag.nix 211 211 checkConfigError 'In attrTag, each tag value must be an option, but tag int was a bare type, not wrapped in mkOption.' config.opt.int ./types-attrTag-wrong-decl.nix 212 212 213 + # types 214 + checkConfigOutput '"ok"' config.assertions ./types.nix 215 + 213 216 # types.pathInStore 214 217 checkConfigOutput '".*/store/0lz9p8xhf89kb1c1kk6jxrzskaiygnlh-bash-5.2-p15.drv"' config.pathInStore.ok1 ./types.nix 215 218 checkConfigOutput '".*/store/0fb3ykw9r5hpayd05sr0cizwadzq1d8q-bash-5.2-p15"' config.pathInStore.ok2 ./types.nix
+459
lib/tests/modules/types.nix
··· 1 + # Run with: 2 + # cd nixpkgs 3 + # ./lib/tests/modules.sh 1 4 { lib, ... }: 2 5 let 3 6 inherit (builtins) ··· 7 10 types 8 11 mkOption 9 12 ; 13 + 10 14 in 11 15 { 12 16 options = { 13 17 pathInStore = mkOption { type = types.lazyAttrsOf types.pathInStore; }; 18 + assertions = mkOption { }; 14 19 }; 15 20 config = { 16 21 pathInStore.ok1 = "${storeDir}/0lz9p8xhf89kb1c1kk6jxrzskaiygnlh-bash-5.2-p15.drv"; ··· 21 26 pathInStore.bad3 = "${storeDir}/"; 22 27 pathInStore.bad4 = "${storeDir}/.links"; # technically true, but not reasonable 23 28 pathInStore.bad5 = "/foo/bar"; 29 + 30 + assertions = 31 + with lib.types; 32 + 33 + assert str.description == "string"; 34 + assert int.description == "signed integer"; 35 + assert (attrsOf str).description == "attribute set of string"; 36 + assert (attrsOf (attrsOf str)).description == "attribute set of attribute set of string"; 37 + assert 38 + (oneOf [ 39 + (attrsOf str) 40 + int 41 + bool 42 + ]).description == "(attribute set of string) or signed integer or boolean"; 43 + assert 44 + (enum [ 45 + true 46 + null 47 + false 48 + ]).description == "one of true, <null>, false"; 49 + assert 50 + (submodule { freeformType = attrsOf str; }).description 51 + == "open submodule of attribute set of string"; 52 + # Comprehensive type constructor description tests 53 + assert (attrsOf int).description == "attribute set of signed integer"; 54 + assert (attrsOf bool).description == "attribute set of boolean"; 55 + assert (attrsOf (either int str)).description == "attribute set of (signed integer or string)"; 56 + assert (attrsOf (nullOr str)).description == "attribute set of (null or string)"; 57 + assert (attrsOf (listOf str)).description == "attribute set of list of string"; 58 + assert (attrsOf (attrsOf int)).description == "attribute set of attribute set of signed integer"; 59 + assert (attrsOf ints.positive).description == "attribute set of (positive integer, meaning >0)"; 60 + 61 + # Test type constructors as attrsOf item types 62 + assert 63 + (attrsOf (enum [ 64 + "a" 65 + "b" 66 + ])).description == "attribute set of (one of \"a\", \"b\")"; 67 + assert 68 + (attrsOf (strMatching "[0-9]+")).description 69 + == "attribute set of string matching the pattern [0-9]+"; 70 + assert (attrsOf (nonEmptyListOf str)).description == "attribute set of non-empty (list of string)"; # TODO: reduce parentheses? 71 + assert 72 + (attrsOf (oneOf [ 73 + str 74 + int 75 + ])).description == "attribute set of (string or signed integer)"; 76 + assert 77 + (attrsOf (coercedTo str abort int)).description 78 + == "attribute set of (signed integer or string convertible to it)"; 79 + assert 80 + (attrsOf (functionTo str)).description == "attribute set of function that evaluates to a(n) string"; 81 + assert 82 + (attrsOf (passwdEntry str)).description 83 + == "attribute set of (string, not containing newlines or colons)"; 84 + assert (attrsOf (uniq str)).description == "attribute set of string"; 85 + assert (attrsOf (unique { message = "test"; } str)).description == "attribute set of string"; 86 + assert 87 + (attrsOf (pathWith { 88 + absolute = true; 89 + })).description == "attribute set of absolute path"; 90 + assert 91 + (attrsOf (separatedString ",")).description == "attribute set of strings concatenated with \",\""; 92 + assert (attrsOf (loaOf str)).description == "attribute set of attribute set of string"; 93 + assert (attrsOf (lazyAttrsOf str)).description == "attribute set of lazy attribute set of string"; 94 + assert (attrsOf (submodule { })).description == "attribute set of (submodule)"; # FIXME: extra parentheses around submodule 95 + assert 96 + (attrsOf (submodule { 97 + freeformType = attrsOf str; 98 + })).description == "attribute set of (open submodule of attribute set of string)"; 99 + assert (attrsOf (addCheck str (x: true))).description == "attribute set of string"; 100 + assert (attrsOf (enum [ ])).description == "attribute set of impossible (empty enum)"; 101 + assert 102 + (attrsOf ints.u32).description 103 + == "attribute set of 32 bit unsigned integer; between 0 and 4294967295 (both inclusive)"; 104 + assert 105 + (attrsOf numbers.positive).description 106 + == "attribute set of (positive integer or floating point number, meaning >0)"; 107 + 108 + assert (attrsWith { elemType = str; }).description == "attribute set of string"; 109 + assert (attrsWith { elemType = int; }).description == "attribute set of signed integer"; 110 + assert (attrsWith { elemType = bool; }).description == "attribute set of boolean"; 111 + assert 112 + (attrsWith { elemType = either int str; }).description 113 + == "attribute set of (signed integer or string)"; 114 + assert (attrsWith { elemType = nullOr str; }).description == "attribute set of (null or string)"; 115 + assert (attrsWith { elemType = listOf str; }).description == "attribute set of list of string"; 116 + assert 117 + (attrsWith { elemType = attrsOf int; }).description 118 + == "attribute set of attribute set of signed integer"; 119 + assert 120 + (attrsWith { elemType = ints.positive; }).description 121 + == "attribute set of (positive integer, meaning >0)"; 122 + assert 123 + (attrsWith { 124 + elemType = str; 125 + lazy = true; 126 + }).description == "lazy attribute set of string"; 127 + # Additional attrsWith tests are covered above 128 + assert 129 + (attrsWith { 130 + elemType = str; 131 + lazy = false; 132 + }).description == "attribute set of string"; 133 + assert (coercedTo str abort int).description == "signed integer or string convertible to it"; 134 + assert (coercedTo int abort str).description == "string or signed integer convertible to it"; 135 + assert (coercedTo bool abort str).description == "string or boolean convertible to it"; 136 + assert 137 + (coercedTo (either int str) abort str).description 138 + == "string or (signed integer or string) convertible to it"; 139 + assert 140 + (coercedTo (nullOr str) abort str).description == "string or (null or string) convertible to it"; 141 + assert 142 + (coercedTo (listOf str) abort str).description == "string or (list of string) convertible to it"; 143 + assert 144 + (coercedTo (attrsOf int) abort str).description 145 + == "string or (attribute set of signed integer) convertible to it"; 146 + assert 147 + (coercedTo ints.positive abort str).description 148 + == "string or (positive integer, meaning >0) convertible to it"; 149 + assert 150 + (coercedTo (listOf str) abort (attrsOf str)).description 151 + == "(attribute set of string) or (list of string) convertible to it"; 152 + # Additional coercedTo tests covered above 153 + assert (either str int).description == "string or signed integer"; 154 + assert (either int str).description == "signed integer or string"; 155 + assert (either bool str).description == "boolean or string"; 156 + assert (either (either int str) bool).description == "signed integer or string or boolean"; 157 + assert (either (nullOr str) int).description == "null or string or signed integer"; 158 + assert (either (listOf str) int).description == "(list of string) or signed integer"; 159 + assert (either (attrsOf int) str).description == "(attribute set of signed integer) or string"; 160 + assert (either ints.positive str).description == "positive integer, meaning >0, or string"; 161 + assert (either (either bool str) int).description == "boolean or string or signed integer"; 162 + 163 + # Test type constructors as either bool t 164 + assert (either bool str).description == "boolean or string"; 165 + assert (either bool int).description == "boolean or signed integer"; 166 + assert 167 + (either bool (enum [ 168 + "a" 169 + "b" 170 + ])).description == "boolean or one of \"a\", \"b\""; 171 + assert 172 + (either bool (strMatching "[0-9]+")).description == "boolean or string matching the pattern [0-9]+"; 173 + assert (either bool (nonEmptyListOf str)).description == "boolean or non-empty (list of string)"; # TODO: reduce parentheses? 174 + assert 175 + (either bool (oneOf [ 176 + str 177 + int 178 + ])).description == "boolean or string or signed integer"; 179 + assert 180 + (either bool (coercedTo str abort int)).description 181 + == "boolean or (signed integer or string convertible to it)"; 182 + assert 183 + (either bool (functionTo str)).description == "boolean or function that evaluates to a(n) string"; 184 + assert 185 + (either bool (passwdEntry str)).description 186 + == "boolean or (string, not containing newlines or colons)"; 187 + assert (either bool (uniq str)).description == "boolean or string"; 188 + assert (either bool (unique { message = "test"; } str)).description == "boolean or string"; 189 + assert 190 + (either bool (pathWith { 191 + absolute = true; 192 + })).description == "boolean or absolute path"; 193 + assert 194 + (either bool (separatedString ",")).description == "boolean or strings concatenated with \",\""; 195 + assert (either bool (attrsOf str)).description == "boolean or attribute set of string"; 196 + assert (either bool (listOf str)).description == "boolean or list of string"; 197 + assert (either bool (nullOr str)).description == "boolean or null or string"; 198 + assert (either bool (lazyAttrsOf str)).description == "boolean or lazy attribute set of string"; 199 + assert (either bool (submodule { })).description == "boolean or (submodule)"; # FIXME: extra parentheses around submodule 200 + assert (either bool ints.positive).description == "boolean or (positive integer, meaning >0)"; 201 + assert 202 + (either bool numbers.positive).description 203 + == "boolean or (positive integer or floating point number, meaning >0)"; 204 + 205 + # Test type constructors as either t bool 206 + assert (either str bool).description == "string or boolean"; 207 + assert (either int bool).description == "signed integer or boolean"; 208 + assert 209 + (either (enum [ 210 + "a" 211 + "b" 212 + ]) bool).description == "one of \"a\", \"b\" or boolean"; 213 + assert 214 + (either (strMatching "[0-9]+") bool).description == "string matching the pattern [0-9]+ or boolean"; 215 + assert (either (nonEmptyListOf str) bool).description == "(non-empty (list of string)) or boolean"; # TODO: reduce parentheses? 216 + assert 217 + (either (oneOf [ 218 + str 219 + int 220 + ]) bool).description == "string or signed integer or boolean"; 221 + assert 222 + (either (coercedTo str abort int) bool).description 223 + == "(signed integer or string convertible to it) or boolean"; 224 + assert 225 + (either (functionTo str) bool).description == "(function that evaluates to a(n) string) or boolean"; 226 + assert 227 + (either (passwdEntry str) bool).description 228 + == "string, not containing newlines or colons, or boolean"; 229 + assert (either (uniq str) bool).description == "string or boolean"; 230 + assert (either (unique { message = "test"; } str) bool).description == "string or boolean"; 231 + assert (either (pathWith { absolute = true; }) bool).description == "absolute path or boolean"; 232 + assert 233 + (either (separatedString ",") bool).description == "strings concatenated with \",\" or boolean"; 234 + assert (either (attrsOf str) bool).description == "(attribute set of string) or boolean"; 235 + assert (either (listOf str) bool).description == "(list of string) or boolean"; 236 + assert (either (nullOr str) bool).description == "null or string or boolean"; 237 + assert (either (lazyAttrsOf str) bool).description == "(lazy attribute set of string) or boolean"; 238 + assert (either (submodule { }) bool).description == "(submodule) or boolean"; # FIXME: extra parentheses around submodule 239 + assert (either ints.positive bool).description == "positive integer, meaning >0, or boolean"; 240 + assert 241 + (either numbers.positive bool).description 242 + == "positive integer or floating point number, meaning >0, or boolean"; 243 + 244 + # Additional either tests covered above"; 245 + assert (enum [ ]).description == "impossible (empty enum)"; 246 + assert (enum [ "single" ]).description == "value \"single\" (singular enum)"; 247 + assert 248 + (enum [ 249 + "a" 250 + "b" 251 + ]).description == "one of \"a\", \"b\""; 252 + assert 253 + (enum [ 254 + true 255 + false 256 + ]).description == "one of true, false"; 257 + assert 258 + (enum [ 259 + 1 260 + 2 261 + 3 262 + ]).description == "one of 1, 2, 3"; 263 + assert (enum [ null ]).description == "value <null> (singular enum)"; 264 + assert (functionTo str).description == "function that evaluates to a(n) string"; 265 + assert (functionTo int).description == "function that evaluates to a(n) signed integer"; 266 + assert (functionTo bool).description == "function that evaluates to a(n) boolean"; 267 + assert 268 + (functionTo (either int str)).description 269 + == "function that evaluates to a(n) (signed integer or string)"; 270 + assert (functionTo (nullOr str)).description == "function that evaluates to a(n) (null or string)"; 271 + assert (functionTo (listOf str)).description == "function that evaluates to a(n) list of string"; 272 + assert 273 + (functionTo (attrsOf int)).description 274 + == "function that evaluates to a(n) attribute set of signed integer"; 275 + assert 276 + (functionTo ints.positive).description 277 + == "function that evaluates to a(n) (positive integer, meaning >0)"; 278 + assert (lazyAttrsOf str).description == "lazy attribute set of string"; 279 + assert (lazyAttrsOf int).description == "lazy attribute set of signed integer"; 280 + assert (lazyAttrsOf bool).description == "lazy attribute set of boolean"; 281 + assert 282 + (lazyAttrsOf (either int str)).description == "lazy attribute set of (signed integer or string)"; 283 + assert (lazyAttrsOf (nullOr str)).description == "lazy attribute set of (null or string)"; 284 + assert (lazyAttrsOf (listOf str)).description == "lazy attribute set of list of string"; 285 + assert 286 + (lazyAttrsOf (attrsOf int)).description == "lazy attribute set of attribute set of signed integer"; 287 + assert 288 + (lazyAttrsOf ints.positive).description == "lazy attribute set of (positive integer, meaning >0)"; 289 + assert (listOf str).description == "list of string"; 290 + assert (listOf int).description == "list of signed integer"; 291 + assert (listOf bool).description == "list of boolean"; 292 + assert (listOf (either int str)).description == "list of (signed integer or string)"; 293 + assert (listOf (nullOr str)).description == "list of (null or string)"; 294 + assert (listOf (listOf str)).description == "list of list of string"; 295 + assert (listOf (attrsOf int)).description == "list of attribute set of signed integer"; 296 + assert (listOf ints.positive).description == "list of (positive integer, meaning >0)"; 297 + assert (loaOf str).description == "attribute set of string"; 298 + assert (loaOf int).description == "attribute set of signed integer"; 299 + assert (loaOf bool).description == "attribute set of boolean"; 300 + assert (loaOf (either int str)).description == "attribute set of (signed integer or string)"; 301 + assert (loaOf (nullOr str)).description == "attribute set of (null or string)"; 302 + assert (loaOf (listOf str)).description == "attribute set of list of string"; 303 + assert (loaOf (attrsOf int)).description == "attribute set of attribute set of signed integer"; 304 + assert (loaOf ints.positive).description == "attribute set of (positive integer, meaning >0)"; 305 + assert (nonEmptyListOf str).description == "non-empty (list of string)"; # TODO: reduce parentheses? 306 + assert (nonEmptyListOf int).description == "non-empty (list of signed integer)"; # TODO: reduce parentheses? 307 + assert (nonEmptyListOf bool).description == "non-empty (list of boolean)"; # TODO: reduce parentheses? 308 + assert 309 + (nonEmptyListOf (either int str)).description == "non-empty (list of (signed integer or string))"; # TODO: reduce parentheses? 310 + assert (nonEmptyListOf (nullOr str)).description == "non-empty (list of (null or string))"; # TODO: reduce parentheses? 311 + assert (nonEmptyListOf (listOf str)).description == "non-empty (list of list of string)"; # TODO: reduce parentheses? 312 + assert 313 + (nonEmptyListOf (attrsOf int)).description 314 + == "non-empty (list of attribute set of signed integer)"; # TODO: reduce parentheses? 315 + assert 316 + (nonEmptyListOf ints.positive).description == "non-empty (list of (positive integer, meaning >0))"; # TODO: reduce parentheses? 317 + assert (nullOr str).description == "null or string"; 318 + assert (nullOr int).description == "null or signed integer"; 319 + assert (nullOr bool).description == "null or boolean"; 320 + assert (nullOr (either int str)).description == "null or signed integer or string"; 321 + assert (nullOr (nullOr str)).description == "null or null or string"; 322 + assert (nullOr (listOf str)).description == "null or (list of string)"; 323 + assert (nullOr (attrsOf int)).description == "null or (attribute set of signed integer)"; 324 + assert (nullOr ints.positive).description == "null or (positive integer, meaning >0)"; 325 + assert (oneOf [ str ]).description == "string"; 326 + assert (oneOf [ int ]).description == "signed integer"; 327 + assert (oneOf [ bool ]).description == "boolean"; 328 + assert (oneOf [ (either int str) ]).description == "signed integer or string"; 329 + assert (oneOf [ (nullOr str) ]).description == "null or string"; 330 + assert (oneOf [ (listOf str) ]).description == "list of string"; 331 + assert (oneOf [ (attrsOf int) ]).description == "attribute set of signed integer"; 332 + assert (oneOf [ ints.positive ]).description == "positive integer, meaning >0"; 333 + assert 334 + (oneOf [ 335 + str 336 + int 337 + ]).description == "string or signed integer"; 338 + assert 339 + (oneOf [ 340 + str 341 + int 342 + bool 343 + ]).description == "string or signed integer or boolean"; 344 + assert 345 + (oneOf [ 346 + (listOf str) 347 + int 348 + bool 349 + ]).description == "(list of string) or signed integer or boolean"; 350 + assert 351 + (oneOf [ 352 + ints.positive 353 + str 354 + ]).description == "positive integer, meaning >0, or string"; 355 + assert (passwdEntry str).description == "string, not containing newlines or colons"; 356 + assert (passwdEntry int).description == "signed integer, not containing newlines or colons"; 357 + assert (passwdEntry bool).description == "boolean, not containing newlines or colons"; 358 + assert 359 + (passwdEntry (either int str)).description 360 + == "(signed integer or string), not containing newlines or colons"; 361 + assert 362 + (passwdEntry (nullOr str)).description == "(null or string), not containing newlines or colons"; 363 + assert 364 + (passwdEntry (listOf str)).description == "(list of string), not containing newlines or colons"; 365 + assert 366 + (passwdEntry (attrsOf int)).description 367 + == "(attribute set of signed integer), not containing newlines or colons"; 368 + assert 369 + (passwdEntry ints.positive).description 370 + == "(positive integer, meaning >0), not containing newlines or colons"; 371 + assert (pathWith { }).description == "path"; 372 + assert (pathWith { absolute = true; }).description == "absolute path"; 373 + assert (pathWith { inStore = true; }).description == "path in the Nix store"; 374 + assert 375 + (pathWith { 376 + absolute = true; 377 + inStore = true; 378 + }).description == "absolute path in the Nix store"; 379 + assert (pathWith { absolute = false; }).description == "relative path"; 380 + assert (pathWith { absolute = null; }).description == "path"; 381 + assert (pathWith { inStore = false; }).description == "path not in the Nix store"; 382 + assert (pathWith { inStore = null; }).description == "path"; 383 + assert (separatedString "").description == "Concatenated string"; 384 + assert (separatedString ",").description == "strings concatenated with \",\""; 385 + assert (separatedString "\n").description == ''strings concatenated with "\n"''; 386 + assert (separatedString ":").description == "strings concatenated with \":\""; 387 + assert (strMatching "[a-z]+").description == "string matching the pattern [a-z]+"; 388 + assert 389 + (strMatching "[0-9]{3}-[0-9]{2}-[0-9]{4}").description 390 + == "string matching the pattern [0-9]{3}-[0-9]{2}-[0-9]{4}"; 391 + assert (strMatching ".*\\.txt").description == "string matching the pattern .*\\.txt"; 392 + assert 393 + (submodule { freeformType = attrsOf int; }).description 394 + == "open submodule of attribute set of signed integer"; 395 + assert 396 + (submodule { freeformType = attrsOf bool; }).description 397 + == "open submodule of attribute set of boolean"; 398 + assert 399 + (submodule { freeformType = attrsOf (either int str); }).description 400 + == "open submodule of attribute set of (signed integer or string)"; 401 + assert 402 + (submodule { freeformType = attrsOf (nullOr str); }).description 403 + == "open submodule of attribute set of (null or string)"; 404 + assert (submodule { freeformType = listOf str; }).description == "open submodule of list of string"; 405 + assert 406 + (submodule { freeformType = attrsOf ints.positive; }).description 407 + == "open submodule of attribute set of (positive integer, meaning >0)"; 408 + assert 409 + (submodule { freeformType = lazyAttrsOf str; }).description 410 + == "open submodule of lazy attribute set of string"; 411 + assert 412 + (submodule { freeformType = lazyAttrsOf int; }).description 413 + == "open submodule of lazy attribute set of signed integer"; 414 + assert 415 + (submodule { freeformType = lazyAttrsOf (listOf str); }).description 416 + == "open submodule of lazy attribute set of list of string"; 417 + assert (submodule { }).description == "submodule"; 418 + assert (submodule [ { options.foo = mkOption { type = str; }; } ]).description == "submodule"; 419 + assert (submodule [ ]).description == "submodule"; 420 + assert 421 + (submodule [ { freeformType = attrsOf str; } ]).description 422 + == "open submodule of attribute set of string"; 423 + assert 424 + (submodule [ { freeformType = lazyAttrsOf str; } ]).description 425 + == "open submodule of lazy attribute set of string"; 426 + assert 427 + (submodule [ { freeformType = lazyAttrsOf int; } ]).description 428 + == "open submodule of lazy attribute set of signed integer"; 429 + assert 430 + (submodule [ { freeformType = lazyAttrsOf (either int str); } ]).description 431 + == "open submodule of lazy attribute set of (signed integer or string)"; 432 + assert 433 + (submoduleWith { modules = [ { freeformType = attrsOf str; } ]; }).description 434 + == "open submodule of attribute set of string"; 435 + assert 436 + (submoduleWith { modules = [ { freeformType = attrsOf int; } ]; }).description 437 + == "open submodule of attribute set of signed integer"; 438 + assert 439 + (submoduleWith { modules = [ { freeformType = attrsOf bool; } ]; }).description 440 + == "open submodule of attribute set of boolean"; 441 + assert 442 + (submoduleWith { modules = [ { freeformType = attrsOf (either int str); } ]; }).description 443 + == "open submodule of attribute set of (signed integer or string)"; 444 + assert 445 + (submoduleWith { modules = [ { freeformType = attrsOf (nullOr str); } ]; }).description 446 + == "open submodule of attribute set of (null or string)"; 447 + assert 448 + (submoduleWith { modules = [ { freeformType = listOf str; } ]; }).description 449 + == "open submodule of list of string"; 450 + assert 451 + (submoduleWith { modules = [ { freeformType = lazyAttrsOf str; } ]; }).description 452 + == "open submodule of lazy attribute set of string"; 453 + assert 454 + (submoduleWith { modules = [ { freeformType = lazyAttrsOf int; } ]; }).description 455 + == "open submodule of lazy attribute set of signed integer"; 456 + assert 457 + (submoduleWith { modules = [ { freeformType = lazyAttrsOf (either int str); } ]; }).description 458 + == "open submodule of lazy attribute set of (signed integer or string)"; 459 + assert 460 + (submoduleWith { modules = [ { freeformType = attrsOf ints.positive; } ]; }).description 461 + == "open submodule of attribute set of (positive integer, meaning >0)"; 462 + assert (submoduleWith { modules = [ ]; }).description == "submodule"; 463 + assert 464 + (submoduleWith { 465 + modules = [ ]; 466 + description = "custom"; 467 + }).description == "custom"; 468 + assert 469 + (submoduleWith { 470 + modules = [ ]; 471 + description = "custom module"; 472 + }).description == "custom module"; 473 + assert (uniq str).description == "string"; 474 + assert (uniq (either int str)).description == "signed integer or string"; 475 + assert (uniq (listOf str)).description == "list of string"; 476 + assert (unique { message = "test"; } str).description == "string"; 477 + assert (unique { message = ""; } (either int str)).description == "signed integer or string"; 478 + assert (unique { message = "custom"; } (listOf str)).description == "list of string"; 479 + assert (unique { message = "test"; } (either int str)).description == "signed integer or string"; 480 + assert (unique { message = "test"; } (listOf str)).description == "list of string"; 481 + # done 482 + "ok"; 24 483 }; 25 484 }
+8 -1
lib/types.nix
··· 1247 1247 let 1248 1248 docsEval = base.extendModules { modules = [ noCheckForDocsModule ]; }; 1249 1249 in 1250 - docsEval._module.freeformType.description or name; 1250 + if docsEval._module.freeformType ? description then 1251 + "open ${name} of ${ 1252 + optionDescriptionPhrase ( 1253 + class: class == "noun" || class == "composite" 1254 + ) docsEval._module.freeformType 1255 + }" 1256 + else 1257 + name; 1251 1258 inherit check; 1252 1259 merge = { 1253 1260 __functor =