python3.pkgs.beets: use fixed-point arguments (#477084)

This commit is contained in:
Doron Behar
2026-01-21 13:11:27 +00:00
committed by GitHub
2 changed files with 82 additions and 40 deletions
@@ -7,7 +7,7 @@
hatchling,
# native
beets,
beets-minimal,
# dependencies
markdownify,
@@ -35,7 +35,7 @@ buildPythonPackage rec {
];
nativeBuildInputs = [
beets
beets-minimal
];
pythonRelaxDeps = true;
@@ -19,13 +19,15 @@
** };
** };
** }
**
** For an example adding a builtin plugin, see
** passthru.tests.with-new-builtin-plugin below
*/
{
lib,
stdenv,
buildPythonPackage,
fetchFromGitHub,
beets,
# build-system
poetry-core,
@@ -104,24 +106,16 @@
# passthru.tests
runCommand,
beets,
}:
let
# Avoid using `rec`, so that using e.g `passthru` or any other attributes
# defined inside, will have to be done via the beets argument, which can be
# overriden. Until `finalAttrs` support reaches `buildPythonPackage`, there
# is no way to avoid this. See:
#
# https://github.com/NixOS/nixpkgs/issues/258246
version = "2.5.1";
in
buildPythonPackage {
buildPythonPackage (finalAttrs: {
pname = "beets";
version = "2.5.1";
src = fetchFromGitHub {
owner = "beetbox";
repo = "beets";
tag = "v${version}";
tag = "v${finalAttrs.version}";
hash = "sha256-H3jcEHyK13+RHVlV4zp+8M3LZ0Jc2FdmAbLpekGozLA=";
};
pyproject = true;
@@ -154,7 +148,9 @@ buildPythonPackage {
typing-extensions
lap
]
++ (lib.concatMap (p: p.propagatedBuildInputs) (lib.attrValues beets.passthru.plugins.enabled));
++ (lib.concatMap (p: p.propagatedBuildInputs) (
lib.attrValues finalAttrs.finalPackage.passthru.plugins.enabled
));
nativeBuildInputs = [
gobject-introspection
@@ -195,7 +191,7 @@ buildPythonPackage {
makeWrapperArgs = [
"--set GI_TYPELIB_PATH \"$GI_TYPELIB_PATH\""
"--set GST_PLUGIN_SYSTEM_PATH_1_0 \"$GST_PLUGIN_SYSTEM_PATH_1_0\""
"--prefix PATH : ${lib.makeBinPath beets.passthru.plugins.wrapperBins}"
"--prefix PATH : ${lib.makeBinPath finalAttrs.finalPackage.passthru.plugins.wrapperBins}"
];
nativeCheckInputs = [
@@ -208,12 +204,12 @@ buildPythonPackage {
pillow
writableTmpDirAsHomeHook
]
++ beets.passthru.plugins.wrapperBins;
++ finalAttrs.finalPackage.passthru.plugins.wrapperBins;
__darwinAllowLocalNetworking = true;
disabledTestPaths =
beets.passthru.plugins.disabledTestPaths
finalAttrs.finalPackage.passthru.plugins.disabledTestPaths
++ [
# touches network
"test/plugins/test_aura.py"
@@ -255,14 +251,14 @@ buildPythonPackage {
\( -name '*.py' -o -path 'beetsplug/*/__init__.py' \) -print \
| sed -n -re 's|^beetsplug/([^/.]+).*|\1|p' \
| sort -u > plugins_available
${diffPlugins (lib.attrNames beets.passthru.plugins.builtins) "plugins_available"}
${diffPlugins (lib.attrNames finalAttrs.finalPackage.passthru.plugins.builtins) "plugins_available"}
export BEETS_TEST_SHELL="${lib.getExe bashInteractive} --norc"
env EDITOR="${writeScript "beetconfig.sh" ''
#!${runtimeShell}
cat > "$1" <<CFG
plugins: ${lib.concatStringsSep " " (lib.attrNames beets.passthru.plugins.enabled)}
plugins: ${lib.concatStringsSep " " (lib.attrNames finalAttrs.finalPackage.passthru.plugins.enabled)}
CFG
''}" "$out/bin/beet" config -e
env EDITOR=true "$out/bin/beet" config -e
@@ -442,30 +438,39 @@ buildPythonPackage {
testPaths = [ ];
};
};
base = lib.mapAttrs (_: a: { builtin = true; } // a) beets.passthru.plugins.builtins;
base = lib.mapAttrs (
_: a: { builtin = true; } // a
) finalAttrs.finalPackage.passthru.plugins.builtins;
overrides = lib.mapAttrs (
plugName:
lib.throwIf (beets.passthru.plugins.builtins.${plugName}.deprecated or false)
lib.throwIf (finalAttrs.finalPackage.passthru.plugins.builtins.${plugName}.deprecated or false)
"beets evaluation error: Plugin ${plugName} was enabled in pluginOverrides, but it has been removed. Remove the override to fix evaluation."
) pluginOverrides;
all = lib.mapAttrs (
n: a:
{
name = n;
enable = !disableAllPlugins;
builtin = false;
propagatedBuildInputs = [ ];
testPaths = [ "test/plugins/test_${n}.py" ];
wrapperBins = [ ];
}
// a
) (lib.recursiveUpdate beets.passthru.plugins.base beets.passthru.plugins.overrides);
enabled = lib.filterAttrs (_: p: p.enable) beets.passthru.plugins.all;
disabled = lib.filterAttrs (_: p: !p.enable) beets.passthru.plugins.all;
all =
lib.mapAttrs
(
n: a:
{
name = n;
enable = !disableAllPlugins;
builtin = false;
propagatedBuildInputs = [ ];
testPaths = [ "test/plugins/test_${n}.py" ];
wrapperBins = [ ];
}
// a
)
(
lib.recursiveUpdate finalAttrs.finalPackage.passthru.plugins.base finalAttrs.finalPackage.passthru.plugins.overrides
);
enabled = lib.filterAttrs (_: p: p.enable) finalAttrs.finalPackage.passthru.plugins.all;
disabled = lib.filterAttrs (_: p: !p.enable) finalAttrs.finalPackage.passthru.plugins.all;
disabledTestPaths = lib.flatten (
lib.attrValues (lib.mapAttrs (_: v: v.testPaths) beets.passthru.plugins.disabled)
lib.attrValues (lib.mapAttrs (_: v: v.testPaths) finalAttrs.finalPackage.passthru.plugins.disabled)
);
wrapperBins = lib.concatMap (p: p.wrapperBins) (
lib.attrValues finalAttrs.finalPackage.passthru.plugins.enabled
);
wrapperBins = lib.concatMap (p: p.wrapperBins) (lib.attrValues beets.passthru.plugins.enabled);
};
tests = {
gstreamer =
@@ -483,8 +488,45 @@ buildPythonPackage {
backend: gstreamer
EOF
${beets}/bin/beet -c $out/config.yaml > /dev/null
${finalAttrs.finalPackage}/bin/beet -c $out/config.yaml > /dev/null
'';
with-new-builtin-plugin = finalAttrs.finalPackage.overrideAttrs (
newAttrs: oldAttrs: {
postPatch = (oldAttrs.postPatch or "") + ''
mkdir -p beetsplug/my_special_plugin
touch beetsplug/my_special_plugin/__init__.py
'';
passthru = lib.recursiveUpdate oldAttrs.passthru {
plugins.builtins.my_special_plugin = { };
};
}
);
# Test that disabling
with-mpd-plugins-disabled = beets.override {
pluginOverrides = {
# These two plugins require mpd2 Python dependency. If they are
# disabled, this dependency shouldn't be pulled, and the `runCommand`
# test below should fail with a `ModuleNotFoundError`
mpdstats.enable = false;
mpdupdate.enable = false;
};
};
mpd-plugins-really-disabled = runCommand "beets-mpd-plugins-disabled-test" { } ''
set -euo pipefail
export HOME=$(mktemp -d)
mkdir $out
cat << EOF > $out/config.yaml
plugins:
- mpdstats
EOF
${finalAttrs.finalPackage.passthru.tests.with-mpd-plugins-disabled}/bin/beet \
-c $out/config.yaml \
--help 2> $out/help-stderr || true
${finalAttrs.finalPackage.passthru.tests.with-mpd-plugins-disabled}/bin/beet \
-c $out/config.yaml \
mpdstats --help 2> $out/mpdstats-help-stderr || true
'';
};
};
@@ -501,4 +543,4 @@ buildPythonPackage {
platforms = lib.platforms.linux ++ lib.platforms.darwin;
mainProgram = "beet";
};
}
})