nixpkgs/lib
Jade Lovelace a1d3882307 nixos/modules: Add declarationPositions
What it does: line and column level *declaration* position information:

$ nix repl .
nix-repl> :p nixosConfigurations.micro.options.environment.systemPackages.declarationPositions
[ { column = 7; file = "/nix/store/24aj3k7fgqv3ly7qkbf98qvphasrw9nb-source/nixos/modules/config/system-path.nix"; line = 63; } ]

Use cases:
- ctags over NixOS options, as will be presented at NixCon 2023 ;)
- improving the documentation pages to go to the exact line of the
  declarations.

Related work:
- https://github.com/NixOS/nixpkgs/pull/65024

  This one does it for all *definitions* rather than declarations, and
  it was not followed through with due to performance worries.
- https://github.com/NixOS/nixpkgs/pull/208173

  The basis for this change. This change is just a rebase of that one.
  I split it out to add the capability before adding users of it, in
  order to simplify review. However, the ctags script in there is a
  sample user of this feature.

Benchmarks: conducted by evaluating my own reasonably complex NixOS
configuration with the command:
`hyperfine -S none -w 1 -- "nix eval .#nixosConfigurations.snowflake.config.system.build.toplevel.outPath"`

```
Benchmark 1: nix eval .#nixosConfigurations.snowflake.config.system.build.toplevel.outPath
  Time (mean ± σ):      8.971 s ±  0.254 s    [User: 5.872 s, System: 1.388 s]
  Range (min … max):    8.574 s …  9.327 s    10 runs

Benchmark 1: nix eval .#nixosConfigurations.snowflake.config.system.build.toplevel.outPath
  Time (mean ± σ):      8.766 s ±  0.160 s    [User: 5.873 s, System: 1.346 s]
  Range (min … max):    8.496 s …  9.033 s    10 runs
```

Summary of results: it seems to be in the noise, this does not cause any
visible regression in times.
2023-09-08 11:48:40 +02:00
..
path Merge pull request #247825 from tweag/lib.path-md 2023-08-12 08:10:15 +02:00
systems Merge pull request #244330 from thillux/bluefield2-remove-cpu 2023-07-24 05:50:46 +00:00
tests nixos/modules: Add declarationPositions 2023-09-08 11:48:40 +02:00
ascii-table.nix strings: add escapeQuery for url encoding 2023-03-03 20:48:55 +01:00
asserts.nix doc: auto-generate asserts and attrset library docs 2022-12-08 22:58:22 +01:00
attrsets.nix lib.attrsets.mergeAttrsList: init 2023-07-18 20:27:15 +02:00
cli.nix
customisation.nix Revert "lib.customisation: uncurry makeScopeWithSplicing" 2023-07-28 23:04:09 +02:00
debug.nix lib/debug: remove unused let bindings 2023-06-23 09:41:04 +00:00
default.nix lib/options: remove literalDocBook 2023-06-13 16:56:30 +02:00
deprecated.nix lib.closePropagation: Remove the quadratic behavior in lib.closePropagation 2022-10-07 18:03:42 +02:00
derivations.nix lib.derivations: fix comment typo 2023-06-02 23:57:30 +08:00
fetchers.nix
filesystem.nix lib/filesystem: remove unused let bindings 2023-06-23 09:41:04 +00:00
fixed-points.nix doc: Render lib.fixedPoints 2023-07-08 18:46:08 +02:00
flake.nix
generators.nix lib/generators/toKeyValue: add indent parameter 2023-07-22 13:49:30 +02:00
kernel.nix lib.kernel.unset: init 2023-05-01 10:23:42 +00:00
licenses.nix licenses: add Hippocratic License v3.0 2023-07-07 12:37:12 +02:00
lists.nix lib.lists.commonPrefix: init 2023-07-20 22:42:01 +02:00
meta.nix treewide: update mainProgram docs 2023-08-04 20:31:16 +03:00
minver.nix
modules.nix nixos/modules: Add declarationPositions 2023-09-08 11:48:40 +02:00
options.nix lib: turn *MD functions into aliases 2023-06-13 16:56:32 +02:00
README.md lib: Add README 2023-07-18 17:22:42 +02:00
source-types.nix
sources.nix lib/sources: remove unused let bindings 2023-06-23 09:41:04 +00:00
strings-with-deps.nix
strings.nix lib: simplify stringToCharacters 2023-06-22 18:27:15 -04:00
trivial.nix Merge pull request #235625 from ShamrockLee/lib-doc-tidy 2023-08-10 12:00:36 +02:00
types.nix lib.types.string: Use lib.warn instead of deprecationMessage 2023-08-10 06:31:36 +02:00
versions.nix lib/versions: add pad 2022-12-21 12:58:21 +01:00
zip-int-bits.nix

Nixpkgs lib

This directory contains the implementation, documentation and tests for the Nixpkgs lib library.

Overview

The evaluation entry point for lib is default.nix. This file evaluates to an attribute set containing two separate kinds of attributes:

  • Sub-libraries: Attribute sets grouping together similar functionality. Each sub-library is defined in a separate file usually matching its attribute name.

    Example: lib.lists is a sub-library containing list-related functionality such as lib.lists.take and lib.lists.imap0. These are defined in the file lists.nix.

  • Aliases: Attributes that point to an attribute of the same name in some sub-library.

    Example: lib.take is an alias for lib.lists.take.

Most files in this directory are definitions of sub-libraries, but there are a few others:

  • minver.nix: A string of the minimum version of Nix that is required to evaluate Nixpkgs.
  • tests: Tests, see Running tests
    • release.nix: A derivation aggregating all tests
    • misc.nix: Evaluation unit tests for most sub-libraries
    • *.sh: Bash scripts that run tests for specific sub-libraries
    • All other files in this directory exist to support the tests
  • systems: The lib.systems sub-library, structured into a directory instead of a file due to its complexity
  • path: The lib.path sub-library, which includes tests as well as a document describing the design goals of lib.path
  • All other files in this directory are sub-libraries

Module system

The module system spans multiple sub-libraries:

  • modules.nix: lib.modules for the core functions and anything not relating to option definitions
  • options.nix: lib.options for anything relating to option definitions
  • types.nix: lib.types for module system types

Reference documentation

Reference documentation for library functions is written above each function as a multi-line comment. These comments are processed using nixdoc and rendered in the Nixpkgs manual. The nixdoc README describes the comment format.

See the chapter on contributing to the Nixpkgs manual for how to build the manual.

Running tests

All library tests can be run by building the derivation in tests/release.nix:

nix-build tests/release.nix

Some commands for quicker iteration over parts of the test suite are also available:

# Run all evaluation unit tests in tests/misc.nix
# if the resulting list is empty, all tests passed
nix-instantiate --eval --strict tests/misc.nix

# Run the module system tests
tests/modules.sh

# Run the lib.sources tests
tests/sources.sh

# Run the lib.filesystem tests
tests/filesystem.sh

# Run the lib.path property tests
path/tests/prop.sh