python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / pkgs / tools / audio / beets / common.nix
blob968544f2790eac014094d575359008284b08b320
1 { stdenv
2 , bashInteractive
3 , diffPlugins
4 , glibcLocales
5 , gobject-introspection
6 , gst_all_1
7 , lib
8 , python3Packages
9 , runtimeShell
10 , writeScript
12   # plugin deps
13 , aacgain
14 , essentia-extractor
15 , ffmpeg
16 , flac
17 , imagemagick
18 , keyfinder-cli
19 , mp3gain
20 , mp3val
22 , src
23 , version
24 , pluginOverrides ? { }
25 , disableAllPlugins ? false
27   # tests
28 , runCommand
29 , beets
30 }@inputs:
31 let
32   inherit (lib) attrNames attrValues concatMap;
34   mkPlugin = { enable ? !disableAllPlugins, builtin ? false, propagatedBuildInputs ? [ ], testPaths ? [ ], wrapperBins ? [ ] }: {
35     inherit enable builtin propagatedBuildInputs testPaths wrapperBins;
36   };
38   basePlugins = lib.mapAttrs (_: a: { builtin = true; } // a) (import ./builtin-plugins.nix inputs);
39   allPlugins = lib.mapAttrs (_: mkPlugin) (lib.recursiveUpdate basePlugins pluginOverrides);
40   builtinPlugins = lib.filterAttrs (_: p: p.builtin) allPlugins;
41   enabledPlugins = lib.filterAttrs (_: p: p.enable) allPlugins;
42   disabledPlugins = lib.filterAttrs (_: p: !p.enable) allPlugins;
44   pluginWrapperBins = concatMap (p: p.wrapperBins) (attrValues enabledPlugins);
46 python3Packages.buildPythonApplication rec {
47   pname = "beets";
48   inherit src version;
50   patches = [
51     # Bash completion fix for Nix
52     ./patches/bash-completion-always-print.patch
53   ];
55   propagatedBuildInputs = with python3Packages; [
56     confuse
57     gobject-introspection
58     gst-python
59     jellyfish
60     mediafile
61     munkres
62     musicbrainzngs
63     mutagen
64     pygobject3
65     pyyaml
66     reflink
67     unidecode
68   ] ++ (concatMap (p: p.propagatedBuildInputs) (attrValues enabledPlugins));
70   # see: https://github.com/NixOS/nixpkgs/issues/56943#issuecomment-1131643663
71   nativeBuildInputs = [
72     gobject-introspection
73   ];
75   buildInputs = [
76   ] ++ (with gst_all_1; [
77     gst-plugins-base
78     gst-plugins-good
79     gst-plugins-ugly
80   ]);
82   postInstall = ''
83     mkdir -p $out/share/zsh/site-functions
84     cp extra/_beet $out/share/zsh/site-functions/
85   '';
87   doInstallCheck = true;
89   installCheckPhase = ''
90     runHook preInstallCheck
92     tmphome="$(mktemp -d)"
94     EDITOR="${writeScript "beetconfig.sh" ''
95       #!${runtimeShell}
96       cat > "$1" <<CFG
97       plugins: ${lib.concatStringsSep " " (attrNames enabledPlugins)}
98       CFG
99     ''}" HOME="$tmphome" "$out/bin/beet" config -e
100     EDITOR=true HOME="$tmphome" "$out/bin/beet" config -e
102     runHook postInstallCheck
103   '';
105   makeWrapperArgs = [
106     "--set GI_TYPELIB_PATH \"$GI_TYPELIB_PATH\""
107     "--set GST_PLUGIN_SYSTEM_PATH_1_0 \"$GST_PLUGIN_SYSTEM_PATH_1_0\""
108     "--prefix PATH : ${lib.makeBinPath pluginWrapperBins}"
109   ];
111   checkInputs = with python3Packages; [
112     pytest
113     mock
114     rarfile
115     responses
116   ] ++ pluginWrapperBins;
118   disabledTestPaths = lib.flatten (attrValues (lib.mapAttrs (n: v: v.testPaths ++ [ "test/test_${n}.py" ]) disabledPlugins));
120   checkPhase = ''
121     runHook preCheck
123     # Check for undefined plugins
124     find beetsplug -mindepth 1 \
125       \! -path 'beetsplug/__init__.py' -a \
126       \( -name '*.py' -o -path 'beetsplug/*/__init__.py' \) -print \
127       | sed -n -re 's|^beetsplug/([^/.]+).*|\1|p' \
128       | sort -u > plugins_available
129     ${diffPlugins (attrNames builtinPlugins) "plugins_available"}
131     export BEETS_TEST_SHELL="${bashInteractive}/bin/bash --norc"
132     export HOME="$(mktemp -d)"
134     args=" -m pytest -r fEs"
135     eval "disabledTestPaths=($disabledTestPaths)"
136     for path in ''${disabledTestPaths[@]}; do
137       if [ -e "$path" ]; then
138         args+=" --ignore $path"
139       else
140         echo "Skipping non-existent test path '$path'"
141       fi
142     done
144     python $args
146     runHook postCheck
147   '';
150   passthru.plugins = allPlugins;
152   passthru.tests.gstreamer = runCommand "beets-gstreamer-test" {
153     meta.timeout = 60;
154   }
155   ''
156   set -euo pipefail
157   export HOME=$(mktemp -d)
158   mkdir $out
160   cat << EOF > $out/config.yaml
161 replaygain:
162   backend: gstreamer
165   echo $out/config.yaml
166   ${beets}/bin/beet -c $out/config.yaml > /dev/null
167   '';
169   meta = with lib; {
170     description = "Music tagger and library organizer";
171     homepage = "https://beets.io";
172     license = licenses.mit;
173     maintainers = with maintainers; [ aszlig doronbehar lovesegfault pjones ];
174     platforms = platforms.linux;
175   };