Commit graph

78 commits

Author SHA1 Message Date
Robert Helgesson
08e8701673
lib.types: fix loaOf behavior for long lists
Assigning a list of 10 or more elements to an option having the type
`loaOf a` produces a configuration value that is not honoring the
order of the original list. This commit fixes this and a related issue
arising when 10 or more lists are merged into this type of option.
2018-05-07 20:23:52 +02:00
Silvan Mosberger
facd51575e lib/types: remove unnecessary coerceFunc assertion 2018-05-06 23:58:36 +02:00
Silvan Mosberger
cd5736116c lib/types: clear up coercedTo description 2018-05-06 23:58:36 +02:00
Silvan Mosberger
ef8996f15e lib/types: Fix coercedTo check
Without this change

  (coercedTo str toInt int).check "foo"

would evaluate to true, even though

  (coercedTo str toInt int).merge {} [{ value = "foo"; }]

will throw an error because "foo" can't be coerced to an int.
2018-05-06 23:58:36 +02:00
Robert Schütz
c65e36c9ca lib/types: add types.nonEmptyListOf 2018-02-08 10:01:49 +01:00
Ryan Trinkle
83048c4fe0 nixpkgs.lib: Add types.strMatching 2017-12-02 13:28:00 -05:00
Tuomas Tynkkynen
8c190c3f7d lib/types.nix: Disable 32-bit integer types for now
This file doesn't evaluate in 32-bit versions of Nix because the integer
type is a signed 32-bit integer there, so 4294967296 causes an 'invalid
integer' error.  I see no other way around than commenting this out :(

(s32 could be made to work by tweaking the expressions a bit, but didn't
do that for now since it'd be asymmetric to have s32 but no u32).
2017-11-05 22:47:09 +02:00
Profpatsch
213bd2847b lib/types: fix up documentation formatting a bit 2017-11-05 15:56:32 +01:00
Profpatsch
462c048c77 lib/types: add ints.positive.
For values that are positive, but cannot be 0.
2017-11-05 15:56:32 +01:00
Profpatsch
1158910676 lib/types: match lowercase descriptions of other types 2017-11-05 15:56:32 +01:00
Profpatsch
77648da233 lib/types: signed -> s, unsigned -> u, remove signed alias
Mirrors the way it’s done in modern low-level languages like Rust (by input of
@nbp).
Removes the signed alias for int.
2017-11-05 15:56:32 +01:00
Profpatsch
7fcd3892a9 lib/types: remove port type again
Will be introduced as a taggedUnion, once that type is in nixpkgs.
2017-11-05 15:56:32 +01:00
Profpatsch
c776489cac lib/types: add port type 2017-11-05 15:56:32 +01:00
Profpatsch
281d071b6a lib/types: add various signed/unsigned int types
It is sometimes necessary to restrict the domain of integers for configurations,
as well as restricting them to unsigned/positive values.
2017-11-05 15:56:32 +01:00
Profpatsch
c53d874277 lib/types: add intBetween
An int type that checks the value range.
2017-11-05 15:56:32 +01:00
Nicolas B. Pierron
1d56d0c8a7 types.submodule: Fix the NixOS Manual, by escaping the <> symbols. 2017-10-30 17:52:00 +00:00
Nicolas B. Pierron
d8987135c2 types.submodule: Replace a friendly comment by a more gentle one. 2017-10-30 13:06:18 +01:00
tv
bc03222bde types: remove loeOf 2017-10-05 21:06:48 +02:00
Graham Christensen
152c63c9ff
Convert libs to a fixed-point
This does break the API of being able to import any lib file and get
its libs, however I'm not sure people did this.

I made this while exploring being able to swap out docFn with a stub
in #2305, to avoid functor performance problems. I don't know if that
is going to move forward (or if it is a problem or not,) but after
doing all this work figured I'd put it up anyway :)

Two notable advantages to this approach:

1. when a lib inherits another lib's functions, it doesn't
   automatically get put in to the scope of lib
2. when a lib implements a new obscure functions, it doesn't
   automatically get put in to the scope of lib

Using the test script (later in this commit) I got the following diff
on the API:

  + diff master fixed-lib
  11764a11765,11766
  > .types.defaultFunctor
  > .types.defaultTypeMerge
  11774a11777,11778
  > .types.isOptionType
  > .types.isType
  11781a11786
  > .types.mkOptionType
  11788a11794
  > .types.setType
  11795a11802
  > .types.types

This means that this commit _adds_ to the API, however I can't find a
way to fix these last remaining discrepancies. At least none are
_removed_.

Test script (run with nix-repl in the PATH):

  #!/bin/sh

  set -eux

  repl() {
      suff=${1:-}
      echo "(import ./lib)$suff" \
          | nix-repl 2>&1
  }

  attrs_to_check() {
      repl "${1:-}" \
          | tr ';'  $'\n' \
          | grep "\.\.\." \
          | cut -d' ' -f2 \
          | sed -e "s/^/${1:-}./" \
          | sort
  }

  summ() {
      repl "${1:-}" \
          | tr ' ' $'\n' \
          | sort \
          | uniq
  }

  deep_summ() {
      suff="${1:-}"
      depth="${2:-4}"
      depth=$((depth - 1))
      summ "$suff"

      for attr in $(attrs_to_check "$suff" | grep -v "types.types"); do
          if [ $depth -eq 0 ]; then
              summ "$attr" | sed -e "s/^/$attr./"
          else
              deep_summ "$attr" "$depth" | sed -e "s/^/$attr./"
          fi
      done
  }

  (
      cd nixpkgs

      #git add .
      #git commit -m "Auto-commit, sorry" || true
      git checkout fixed-lib
      deep_summ > ../fixed-lib
      git checkout master
      deep_summ > ../master
  )

  if diff master fixed-lib; then
      echo "SHALLOW MATCH!"
  fi

  (
      cd nixpkgs
      git checkout fixed-lib
      repl .types
  )
2017-09-16 21:36:43 -04:00
zimbatm
4d545297d8 lib: introduce imap0, imap1 (#25543)
* lib: introduce imap0, imap1

For historical reasons, imap starts counting at 1 and it's not
consistent with the rest of the lib.

So for now we split imap into imap0 that starts counting at zero and
imap1 that starts counting at 1. And imap is marked as deprecated.

See c71e2d4235 (commitcomment-21873221)

* replace uses of lib.imap

* lib: move imap to deprecated.nix
2017-07-04 23:29:23 +01:00
Nikolay Amiantov
63e0d50f16 types: add short docstrings
Fixes #26055
2017-05-25 19:24:05 +03:00
Nikolay Amiantov
ee4f8c2dc9 nixos doc: document coercedTo type
Also mention about docs in types.nix and fix a small error in related
documentation.

Fixes #26055.
2017-05-24 15:52:26 +03:00
Tom Saeger
5989515b94 lib: trivial spelling fixes 2017-04-19 19:37:55 -05:00
John Ericson
4c0d7da183 Get rid of all with { inherit... } and just used let inherit...
The old forms presumably predates, or were made in ignorance of,
`let inherit`. This way is better style as the scoping as more lexical,
something which Nix can (or might already!) take advantage of.
2017-03-30 03:05:05 -04:00
Benjamin Staffin
d9123a2329 lib: fix mixed tab/space indents, trailing whitespace, etc
Nix style seems to have settled on not using spaces between bound
variable names and the lambda : so I also tried to make those somewhat
more consistent throughout.
2017-03-11 17:48:43 -05:00
Nikolay Amiantov
5cbcd3af69 types library: add coercedTo 2017-02-02 01:53:00 +03:00
Eric Sagnes
cf2654b2e0 either type: improve merge function 2016-11-08 20:46:34 +01:00
Eric Sagnes
e14de56613 module system: extensible option types 2016-11-06 00:05:58 +01:00
Eric Sagnes
f923905346 optionSet type: enable deprecation message 2016-09-13 12:57:36 +09:00
zimbatm
2974b6f4c8 Use shell packages to select the user's shell
The string type is still available for backward-compatiblity.
2016-06-12 20:35:34 +01:00
Eelco Dolstra
b056948c00 Improve types.listOf error message
If an option value is not a list, you now get

  The option value `bla' in `file.nix' is not a list.

rather than

  value is a string while a list was expected, at .../nixpkgs/lib/lists.nix:49:56
2016-05-25 11:39:17 +02:00
aszlig
009fd5ef77
lib/types: Revert handling submodules for "either"
This reverts commit 0f0805b, because @nbp had concerns about whether
this would be a good idea and pointed out problems with this.

We currently do not have a case where "either" is used in conjunction
with submodules, but I'm reverting it anyway to prevent people from
adding options using that type in that way.

This is now being reviewed in #14053.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
2016-03-19 19:11:31 +01:00
aszlig
0f0805b51a
lib/types: Handle submodules for type "either"
So far the "either" type only handled "flat" types, so you couldn't do
something like:

type = either int (submodule {
  options = ...;
});

Not only caused this the submodule's options not being checked but also
not show up in the documentation.

This was something we stumbled on with #13916.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-03-19 17:22:39 +01:00
Eelco Dolstra
f3d94cfc23 Revert "Add the tool "nixos-typecheck" that can check an option declaration to:"
This reverts commit cad8957eab. It
breaks NixOps, but more importantly, such major changes to the module
system really need to be reviewed.
2016-03-01 20:52:06 +01:00
Thomas Strobel
cad8957eab Add the tool "nixos-typecheck" that can check an option declaration to:
- Enforce that an option declaration has a "defaultText" if and only if the
   type of the option derives from "package", "packageSet" or "nixpkgsConfig"
   and if a "default" attribute is defined.

 - Enforce that the value of the "example" attribute is wrapped with "literalExample"
   if the type of the option derives from "package", "packageSet" or "nixpkgsConfig".

 - Warn if a "defaultText" is defined in an option declaration if the type of
   the option does not derive from "package", "packageSet" or "nixpkgsConfig".

 - Warn if no "type" is defined in an option declaration.
2016-02-29 01:09:00 +01:00
aszlig
98faa0c8f3
lib/types: Set name of types.package to "package"
Nobody seems to have noticed this (except @Profpatsch) that options with
a "package" type do not get included in the manual.

So debugging this was a bit more involving because while generating the
manual there is an optionList' attribute built from the collected
attributes of all the option declarations.

Up to that point everything is fine except if it comes to
builtins.toXML, where attributes with { type = "derivation" } won't get
included, for example see here:

nix-repl> builtins.toXML { type = "derivation"; foo = "bar"; }
"<?xml version='1.0' encoding='utf-8'?>\n<expr>\n  <derivation>
 <repeated />\n  </derivation>\n</expr>\n"

nix-repl> builtins.toXML { type = "somethingelse"; foo = "bar"; }
"<?xml version='1.0' encoding='utf-8'?>\n<expr>\n  <attrs>
     <attr name=\"foo\">\n      <string value=\"bar\" />\n    </attr>
     <attr name=\"type\">\n      <string value=\"somethingelse\" />
     </attr>\n </attrs>\n</expr>\n"

The following function in libexpr/eval.cc (Nix) is responsible for toXML
dropping the attributes:

bool EvalState::isDerivation(Value & v)
{
    if (v.type != tAttrs) return false;
    Bindings::iterator i = v.attrs->find(sType);
    if (i == v.attrs->end()) return false;
    forceValue(*i->value);
    if (i->value->type != tString) return false;
    return strcmp(i->value->string.s, "derivation") == 0;
}

So I've renamed this now to "package" which is not only more consistent
with the option type but also shouldn't cause similar issues anymore.

Tested this on base of b60ceea, because building the dependencies on
recent libc/staging changes on master took too long.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Reported-by: Profpatsch <mail@profpatsch.de>
2016-02-17 21:12:24 +01:00
Igor Pashev
b078ae9c16 Use x == null instead of builtins.isNull x 2015-12-04 07:22:57 +03:00
Igor Pashev
363e6978ce Allow enum of integers (and any other type)
Closes #9826.
2015-12-04 07:15:14 +03:00
Jan Malakhovski
33ae3f2fe4 nixos,lib: move environment generation related copy-paste to lib 2015-09-18 18:48:49 +00:00
Benno Fünfstück
7cd6b3cf76 Revert change of path type
The change caused lots of evaluation errors, since it caused derivations to no longer be valid paths as well.
2015-08-15 15:38:12 +02:00
Benno Fünfstück
691f683c8c types.nix: better error message for non-paths
This improves error messages when a set or a list is used where a path
was expected. For an example, if you used a package set (as opposed to a
single package) in systemPackages before this commit, the error was:

```
cannot coerce a list to a string, at "/home/nixpkgs/lib/types.nix":103:37
```

Now, the error message reads:

```
The option value `environment.systemPackages' in `/etc/nixos/configuration.nix' is not a list of paths.
```
2015-08-15 13:05:57 +02:00
Eelco Dolstra
214d4fb73c Allow options with type "package" to be store paths
For example, this allows writing

  nix.package = /nix/store/786mlvhd17xvcp2r4jmmay6jj4wj6b7f-nix-1.10pre4206_896428c;

Also, document types.package in the manual.
2015-08-07 03:09:57 +02:00
Eelco Dolstra
637e35deb9 Use foldl' instead of fold in some places 2015-07-23 18:31:54 +02:00
Eelco Dolstra
e212e07cf6 Make types.bool complain on conflicting definitions
Previously, conflicting definitions would merge to "true". Now they
give an error, e.g.

  error: The option `hardware.enableAllFirmware' has conflicting definitions, in `/etc/nixos/configurations/misc/eelco/stuff.nix' and `/etc/nixos/configurations/misc/eelco/mandark.nix'.
2015-06-15 18:07:48 +02:00
Nicolas B. Pierron
05e8a48fb4 Document and rename internal option of modules. 2015-03-15 14:45:42 +01:00
Nicolas B. Pierron
ed91474e9b Share common code for merging option definitions.
This move idioms which were used in `evalOptionValue` and in the `merge`
functions of `listOf` and `attrsOf` types, such that we can use a names such
as `isDefined` and `optionalValue` instead or repeating identical
comparisons of `defsFinal == []`.
2015-03-12 23:42:58 +01:00
Shea Levy
0a0a29fd0b Add comments about the module system interface
Ideally the module system could be configured pretty much completely by
the contents of the modules themselves, so add comments about avoiding
complicating it further and possibly removing now-redundant
configurability from the existing interface.
2015-03-12 23:42:57 +01:00
Shea Levy
4f5c6330c9 types.loaOf: Update check function
This symplifies typechecking and allows properties to be used inside the
function body. It also makes possible checking the type of the result.
2015-03-12 23:42:57 +01:00
Shea Levy
8737d1783f types.attrsOf: Use mergeDefinitions to handle each element
This simplifes typechecking and allows properties to be used inside of
the attribute sets.

This fixes the empty synergy-client and synergy-server services
previously generated on systems with synergy disabled.
2015-03-12 23:42:57 +01:00
Shea Levy
e4bc2592f3 types.listOf: Use mergeDefinitions to handle each element
This simplifies typechecking and allows properties to be used inside the lists
2015-03-12 23:42:57 +01:00