From d4305aa206e28ad4f585274dc894079ac3cb8aa0 Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Thu, 19 Oct 2023 06:20:06 +0800 Subject: [PATCH 1/4] test.overriding: modularize Python tests Test with pip, which is less likely to fail. Modularize the transforming function and testing function. Co-authored-by: Sandro --- pkgs/test/overriding.nix | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/pkgs/test/overriding.nix b/pkgs/test/overriding.nix index 9ccc84e033560..1bcb4e32e0899 100644 --- a/pkgs/test/overriding.nix +++ b/pkgs/test/overriding.nix @@ -7,6 +7,15 @@ let tests = tests-stdenv // tests-go // tests-python; + # We are testing the overriding result of these packages without building them. + pkgsAllowingBroken = pkgs.extend ( + finalAttrs: previousAttrs: { + config = previousAttrs.config // { + allowBroken = true; + }; + } + ); + tests-stdenv = let addEntangled = @@ -184,13 +193,26 @@ let tests-python = let - p = pkgs.python3Packages.xpybutil.overridePythonAttrs (_: { - dontWrapPythonPrograms = true; - }); + inherit (pkgsAllowingBroken.python3Packages) pip; + applyOverridePythonAttrs = + p: + p.overridePythonAttrs (_: { + dontWrapPythonPrograms = true; + }); + revertOverridePythonAttrs = + p: + p.overridePythonAttrs (_: { + dontWrapPythonPrograms = false; + }); + checkOverridePythonAttrs = p: !lib.hasInfix "wrapPythonPrograms" p.postFixup; in { overridePythonAttrs = { - expr = !lib.hasInfix "wrapPythonPrograms" p.postFixup; + expr = checkOverridePythonAttrs (applyOverridePythonAttrs pip); + expected = true; + }; + overridePythonAttrs-nested = { + expr = revertOverridePythonAttrs (applyOverridePythonAttrs pip) == pip; expected = true; }; }; From eeb8f3ce11e443f33121efbdbd4ab81c65e64288 Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Mon, 29 May 2023 05:15:57 +0800 Subject: [PATCH 2/4] python-packages-base.nix: pkgs.lib -> lib --- pkgs/development/interpreters/python/python-packages-base.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/development/interpreters/python/python-packages-base.nix b/pkgs/development/interpreters/python/python-packages-base.nix index 19c230a0b94ec..7c4cb0fcedb76 100644 --- a/pkgs/development/interpreters/python/python-packages-base.nix +++ b/pkgs/development/interpreters/python/python-packages-base.nix @@ -27,7 +27,7 @@ let }) (_: origArgs) ); result = f args; - overrideWith = newArgs: args // (if pkgs.lib.isFunction newArgs then newArgs args else newArgs); + overrideWith = newArgs: args // (if lib.isFunction newArgs then newArgs args else newArgs); in if builtins.isAttrs result then result From 0f423d97b6f40773f185cc44685c706f045eb47d Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Mon, 29 May 2023 06:17:36 +0800 Subject: [PATCH 3/4] makeOverridablePythonPackage: add functionArgs to overridePythonAttrs --- .../interpreters/python/python-packages-base.nix | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pkgs/development/interpreters/python/python-packages-base.nix b/pkgs/development/interpreters/python/python-packages-base.nix index 7c4cb0fcedb76..47466d3171fe4 100644 --- a/pkgs/development/interpreters/python/python-packages-base.nix +++ b/pkgs/development/interpreters/python/python-packages-base.nix @@ -16,24 +16,29 @@ let # This function introduces `overridePythonAttrs` and it overrides the call to `buildPythonPackage`. makeOverridablePythonPackage = f: - lib.mirrorFunctionArgs f ( + let + mirrorArgs = lib.mirrorFunctionArgs f; + in + mirrorArgs ( origArgs: let args = lib.fix ( lib.extends (_: previousAttrs: { passthru = (previousAttrs.passthru or { }) // { - overridePythonAttrs = newArgs: makeOverridablePythonPackage f (overrideWith newArgs); + inherit overridePythonAttrs; }; }) (_: origArgs) ); result = f args; - overrideWith = newArgs: args // (if lib.isFunction newArgs then newArgs args else newArgs); + + overrideWith = newArgs: args // lib.toFunction newArgs args; + overridePythonAttrs = mirrorArgs (newArgs: makeOverridablePythonPackage f (overrideWith newArgs)); in if builtins.isAttrs result then result else if builtins.isFunction result then { - overridePythonAttrs = newArgs: makeOverridablePythonPackage f (overrideWith newArgs); + inherit overridePythonAttrs; __functor = self: result; } else From 9cca6884b6acd0975146c096c02d803b85a4985c Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Sat, 28 Oct 2023 01:56:02 +0000 Subject: [PATCH 4/4] makeOverridablePythonPackage: take care of overrideAttrs Make it possible to mix overridePythonAttrs and overrideAttrs, i.e. ((.overrideAttrs (_: { foo = "a"; })).overridePythonAttrs (_: { })).foo now works --- .../python/python-packages-base.nix | 9 ++++++++ pkgs/test/overriding.nix | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/pkgs/development/interpreters/python/python-packages-base.nix b/pkgs/development/interpreters/python/python-packages-base.nix index 47466d3171fe4..5569606f113aa 100644 --- a/pkgs/development/interpreters/python/python-packages-base.nix +++ b/pkgs/development/interpreters/python/python-packages-base.nix @@ -14,6 +14,9 @@ let # Derivations built with `buildPythonPackage` can already be overridden with `override`, `overrideAttrs`, and `overrideDerivation`. # This function introduces `overridePythonAttrs` and it overrides the call to `buildPythonPackage`. + # + # Overridings specified through `overridePythonAttrs` will always be applied + # before those specified by `overrideAttrs`, even if invoked after them. makeOverridablePythonPackage = f: let @@ -33,9 +36,15 @@ let overrideWith = newArgs: args // lib.toFunction newArgs args; overridePythonAttrs = mirrorArgs (newArgs: makeOverridablePythonPackage f (overrideWith newArgs)); + + # Change the result of the function call by applying g to it + overrideResult = g: makeOverridablePythonPackage (mirrorArgs (args: g (f args))) origArgs; in if builtins.isAttrs result then result + // lib.optionalAttrs (result ? overrideAttrs) { + overrideAttrs = fdrv: overrideResult (drv: drv.overrideAttrs fdrv); + } else if builtins.isFunction result then { inherit overridePythonAttrs; diff --git a/pkgs/test/overriding.nix b/pkgs/test/overriding.nix index 1bcb4e32e0899..14b67f44fb7c2 100644 --- a/pkgs/test/overriding.nix +++ b/pkgs/test/overriding.nix @@ -205,6 +205,15 @@ let dontWrapPythonPrograms = false; }); checkOverridePythonAttrs = p: !lib.hasInfix "wrapPythonPrograms" p.postFixup; + overrideAttrsFooBar = + drv: + drv.overrideAttrs ( + finalAttrs: previousAttrs: { + FOO = "a"; + BAR = finalAttrs.FOO; + } + ); + checkAttrsFooBar = drv: drv.FOO == "a" && drv.BAR == "a"; in { overridePythonAttrs = { @@ -215,6 +224,20 @@ let expr = revertOverridePythonAttrs (applyOverridePythonAttrs pip) == pip; expected = true; }; + overrideAttrs-overridePythonAttrs-test-overrideAttrs = { + expr = checkAttrsFooBar (applyOverridePythonAttrs (overrideAttrsFooBar pip)); + expected = true; + }; + overrideAttrs-overridePythonAttrs-test-overridePythonAttrs = { + expr = checkOverridePythonAttrs (applyOverridePythonAttrs (overrideAttrsFooBar pip)); + expected = true; + }; + overrideAttrs-overridePythonAttrs-test-commutation = { + expr = + (applyOverridePythonAttrs (overrideAttrsFooBar pip)) + == (overrideAttrsFooBar (applyOverridePythonAttrs pip)); + expected = true; + }; }; in