diff --git a/flake.nix b/flake.nix index 2867118..878bc74 100644 --- a/flake.nix +++ b/flake.nix @@ -167,6 +167,26 @@ inventory = self.lib.derivationsInventory "development environment" false; }; + devShellSchema = { + version = 1; + doc = '' + The `devShell` flake output contains a derivation that provides a development environment for `nix develop`. + ''; + roles.nix-develop = { }; + appendSystem = true; + defaultAttrPath = [ ]; + inventory = output: + self.lib.mkChildren ( + builtins.mapAttrs (systemType: devShellForSystem: { + forSystems = [ systemType ]; + shortDescription = devShellForSystem.meta.description or ""; + derivationAttrPath = [ ]; + what = "development environment"; + isFlakeCheck = false; + }) output + ); + }; + formatterSchema = { version = 1; doc = '' @@ -427,6 +447,7 @@ schemas.packages = packagesSchema; schemas.legacyPackages = legacyPackagesSchema; schemas.checks = checksSchema; + schemas.devShell = devShellSchema; schemas.devShells = devShellsSchema; schemas.formatter = formatterSchema; schemas.templates = templatesSchema; diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..7bb62b8 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,18 @@ +Adding a test case: + +Create a directory in the tests directory with a flake.nix and flake.lock. +Do not have any external dependencies or flake inputs. +Construct your test and then capture the output with `add-test.sh`: + +``` +./add-test.sh directoryName +``` + +like: + +``` +./add-test.sh devShellWithDevShellsAndPackages +``` + +This will create a `directoryName.json` and `directoryName.check-err` file. +If the test is not specific to the error output handling, delete the check-err file. diff --git a/tests/add-test.sh b/tests/add-test.sh new file mode 100755 index 0000000..7cacdc5 --- /dev/null +++ b/tests/add-test.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +flake=$1 + +nix flake show --offline --json --legacy --default-flake-schemas "../" "./$flake" \ + | jq \ + | tee "$flake.json" + +nix flake check --offline --no-build --default-flake-schemas "../" "./$flake" --no-eval-cache 2>&1 \ + | (grep -v '^evaluating ' || true) \ + | tee "$flake.check-err" diff --git a/tests/devShell.json b/tests/devShell.json new file mode 100644 index 0000000..c9c2f1a --- /dev/null +++ b/tests/devShell.json @@ -0,0 +1,18 @@ +{ + "inventory": { + "devShell": { + "doc": "The `devShell` flake output contains a derivation that provides a development environment for `nix develop`.\n", + "output": { + "children": { + "x86_64-linux": { + "filtered": true + } + } + } + }, + "lib": { + "unknown": true + } + }, + "version": 2 +} diff --git a/tests/devShell/flake.lock b/tests/devShell/flake.lock new file mode 100644 index 0000000..5999137 --- /dev/null +++ b/tests/devShell/flake.lock @@ -0,0 +1,7 @@ +{ + "nodes": { + "root": {} + }, + "root": "root", + "version": 7 +} diff --git a/tests/devShell/flake.nix b/tests/devShell/flake.nix new file mode 100644 index 0000000..de4ee27 --- /dev/null +++ b/tests/devShell/flake.nix @@ -0,0 +1,13 @@ +{ + outputs = { self, ... }: + { + lib.makeShellTestCase = name: derivation { + inherit name; + system = "x86_64-linux"; + builder = "/bin/bash"; + args = [ "-c" "echo $name; echo $name; echo $name; echo $name; echo $name; " ]; + }; + + devShell.x86_64-linux = self.lib.makeShellTestCase "devShell-legacy"; + }; +} diff --git a/tests/devShellWithDevShells.json b/tests/devShellWithDevShells.json new file mode 100644 index 0000000..4e34fdd --- /dev/null +++ b/tests/devShellWithDevShells.json @@ -0,0 +1,28 @@ +{ + "inventory": { + "devShell": { + "doc": "The `devShell` flake output contains a derivation that provides a development environment for `nix develop`.\n", + "output": { + "children": { + "x86_64-linux": { + "filtered": true + } + } + } + }, + "devShells": { + "doc": "The `devShells` flake output contains derivations that provide a development environment for `nix develop`.\n", + "output": { + "children": { + "x86_64-linux": { + "filtered": true + } + } + } + }, + "lib": { + "unknown": true + } + }, + "version": 2 +} diff --git a/tests/devShellWithDevShells/flake.lock b/tests/devShellWithDevShells/flake.lock new file mode 100644 index 0000000..5999137 --- /dev/null +++ b/tests/devShellWithDevShells/flake.lock @@ -0,0 +1,7 @@ +{ + "nodes": { + "root": {} + }, + "root": "root", + "version": 7 +} diff --git a/tests/devShellWithDevShells/flake.nix b/tests/devShellWithDevShells/flake.nix new file mode 100644 index 0000000..24397df --- /dev/null +++ b/tests/devShellWithDevShells/flake.nix @@ -0,0 +1,14 @@ +{ + outputs = { self, ... }: + { + lib.makeShellTestCase = name: derivation { + inherit name; + system = "x86_64-linux"; + builder = "/bin/bash"; + args = [ "-c" "echo $name; echo $name; echo $name; echo $name; echo $name; " ]; + }; + + devShell.x86_64-linux = self.lib.makeShellTestCase "devShell-legacy"; + devShells.x86_64-linux.default = self.lib.makeShellTestCase "devShells-preferred-over-legacy"; + }; +} diff --git a/tests/devShellWithDevShellsAndPackages.json b/tests/devShellWithDevShellsAndPackages.json new file mode 100644 index 0000000..1be814d --- /dev/null +++ b/tests/devShellWithDevShellsAndPackages.json @@ -0,0 +1,38 @@ +{ + "inventory": { + "devShell": { + "doc": "The `devShell` flake output contains a derivation that provides a development environment for `nix develop`.\n", + "output": { + "children": { + "x86_64-linux": { + "filtered": true + } + } + } + }, + "devShells": { + "doc": "The `devShells` flake output contains derivations that provide a development environment for `nix develop`.\n", + "output": { + "children": { + "x86_64-linux": { + "filtered": true + } + } + } + }, + "lib": { + "unknown": true + }, + "packages": { + "doc": "The `packages` flake output contains packages that can be added to a shell using `nix shell`.\n", + "output": { + "children": { + "x86_64-linux": { + "filtered": true + } + } + } + } + }, + "version": 2 +} diff --git a/tests/devShellWithDevShellsAndPackages/flake.lock b/tests/devShellWithDevShellsAndPackages/flake.lock new file mode 100644 index 0000000..5999137 --- /dev/null +++ b/tests/devShellWithDevShellsAndPackages/flake.lock @@ -0,0 +1,7 @@ +{ + "nodes": { + "root": {} + }, + "root": "root", + "version": 7 +} diff --git a/tests/devShellWithDevShellsAndPackages/flake.nix b/tests/devShellWithDevShellsAndPackages/flake.nix new file mode 100644 index 0000000..1d62894 --- /dev/null +++ b/tests/devShellWithDevShellsAndPackages/flake.nix @@ -0,0 +1,15 @@ +{ + outputs = { self, ... }: + { + lib.makeShellTestCase = name: derivation { + inherit name; + system = "x86_64-linux"; + builder = "/bin/bash"; + args = [ "-c" "echo $name; echo $name; echo $name; echo $name; echo $name; " ]; + }; + + devShell.x86_64-linux = self.lib.makeShellTestCase "devShell-legacy"; + devShells.x86_64-linux.default = self.lib.makeShellTestCase "devShells-preferred-over-legacy-and-packages"; + packages.x86_64-linux.default = self.lib.makeShellTestCase "packages"; + }; +} diff --git a/tests/devShellWithPackages.json b/tests/devShellWithPackages.json new file mode 100644 index 0000000..3e451c1 --- /dev/null +++ b/tests/devShellWithPackages.json @@ -0,0 +1,28 @@ +{ + "inventory": { + "devShell": { + "doc": "The `devShell` flake output contains a derivation that provides a development environment for `nix develop`.\n", + "output": { + "children": { + "x86_64-linux": { + "filtered": true + } + } + } + }, + "lib": { + "unknown": true + }, + "packages": { + "doc": "The `packages` flake output contains packages that can be added to a shell using `nix shell`.\n", + "output": { + "children": { + "x86_64-linux": { + "filtered": true + } + } + } + } + }, + "version": 2 +} diff --git a/tests/devShellWithPackages/flake.lock b/tests/devShellWithPackages/flake.lock new file mode 100644 index 0000000..5999137 --- /dev/null +++ b/tests/devShellWithPackages/flake.lock @@ -0,0 +1,7 @@ +{ + "nodes": { + "root": {} + }, + "root": "root", + "version": 7 +} diff --git a/tests/devShellWithPackages/flake.nix b/tests/devShellWithPackages/flake.nix new file mode 100644 index 0000000..47c8607 --- /dev/null +++ b/tests/devShellWithPackages/flake.nix @@ -0,0 +1,14 @@ +{ + outputs = { self, ... }: + { + lib.makeShellTestCase = name: derivation { + inherit name; + system = "x86_64-linux"; + builder = "/bin/bash"; + args = [ "-c" "echo $name; echo $name; echo $name; echo $name; echo $name; " ]; + }; + + devShell.x86_64-linux = self.lib.makeShellTestCase "devShell-legacy-preferred-over-packages"; + packages.x86_64-linux.default = self.lib.makeShellTestCase "packages"; + }; +} diff --git a/tests/flake.nix b/tests/flake.nix index f590d0a..d89616d 100644 --- a/tests/flake.nix +++ b/tests/flake.nix @@ -89,6 +89,20 @@ fi done + if [ $system = "x86_64-linux" ]; then + # Check that `nix develop` reads devShell.system if no other option is available + nix develop --system x86_64-linux --offline --default-flake-schemas "$src" "$src/tests/devShell" --no-eval-cache 2>&1 | tee /dev/stderr | grep -q "devShell-legacy" + + # Check that `nix develop` reads devShells.system.default over devShell.system + nix develop --system x86_64-linux --offline --default-flake-schemas "$src" "$src/tests/devShellWithDevShells" --no-eval-cache 2>&1 | tee /dev/stderr | grep -q "devShells-preferred-over-legacy" + + # Check that `nix develop` reads devShell.system when packages.system.default is also available + nix develop --system x86_64-linux --offline --default-flake-schemas "$src" "$src/tests/devShellWithPackages" --no-eval-cache 2>&1 | tee /dev/stderr | grep -q "devShell-legacy-preferred-over-packages" + + # Check that `nix develop` reads devShells.system.default over devShell.system and packages. + nix develop --system x86_64-linux --offline --default-flake-schemas "$src" "$src/tests/devShellWithDevShellsAndPackages" --no-eval-cache 2>&1 | tee /dev/stderr | grep -q "devShells-preferred-over-legacy-and-packages" + fi + mkdir "$out" ''; }