81df4790bf
Tests use real FUSE operations against mounted beetfs filesystem: - test_smoke: mount/unmount lifecycle - test_nested_bug: detects critical indentation bug (13 failures) - test_readdir: directory listing - test_read: metadata overlay verification - test_stat: file/directory attributes - test_write: metadata modification - test_error_handling: ENOENT, EOPNOTSUPP Also includes: - conftest.py with BeetFSTestCase base class and synthetic FLAC generator - e2e-test-plan.md with Oracle-reviewed test strategy - flake.nix updated with ffmpeg/flac for test fixtures Run: cd tests && nix develop ../ --command python -m unittest discover
116 lines
3.2 KiB
Nix
116 lines
3.2 KiB
Nix
{
|
|
description = "beetfs - FUSE filesystem for beets with metadata overlay (Python 2.7)";
|
|
|
|
inputs = {
|
|
# Using nixos-18.09 - has all Python 2 packages: fuse, mutagen, jellyfish, munkres
|
|
# Mark as non-flake since 18.09 predates flakes
|
|
nixpkgs-old = {
|
|
url = "github:NixOS/nixpkgs/nixos-18.09";
|
|
flake = false;
|
|
};
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
};
|
|
|
|
outputs = { self, nixpkgs-old, flake-utils }:
|
|
flake-utils.lib.eachDefaultSystem (system:
|
|
let
|
|
pkgs = import nixpkgs-old {
|
|
inherit system;
|
|
};
|
|
|
|
# Build beets 1.4.9 for Python 2 (last Python 2 compatible version)
|
|
# Using minimal deps - autotagger features (munkres, jellyfish) not needed for beetfs
|
|
beets-py2 = pkgs.python2Packages.buildPythonPackage rec {
|
|
pname = "beets";
|
|
version = "1.4.9";
|
|
|
|
# Use legacy setup.py install (not pip/wheel)
|
|
format = "other";
|
|
|
|
src = pkgs.fetchFromGitHub {
|
|
owner = "beetbox";
|
|
repo = "beets";
|
|
rev = "v${version}";
|
|
sha256 = "sha256-KO5jtqxw82ylbSKsJgUGr3bfxUPH8vanf/+kv//CreM=";
|
|
};
|
|
|
|
# No patching needed - nixpkgs-18.09 has all required Python 2 packages
|
|
|
|
nativeBuildInputs = with pkgs.python2Packages; [ setuptools ];
|
|
|
|
buildPhase = "true"; # No build needed
|
|
|
|
installPhase = ''
|
|
# Direct copy to avoid dependency resolution
|
|
mkdir -p $out/lib/python2.7/site-packages
|
|
cp -r beets $out/lib/python2.7/site-packages/
|
|
cp -r beetsplug $out/lib/python2.7/site-packages/
|
|
|
|
# Create version file
|
|
echo "__version__ = '${version}'" >> $out/lib/python2.7/site-packages/beets/__init__.py
|
|
|
|
# Create beet command wrapper
|
|
mkdir -p $out/bin
|
|
cat > $out/bin/beet << 'EOF'
|
|
#!${pkgs.python2.interpreter}
|
|
import sys
|
|
from beets.ui import main
|
|
main()
|
|
EOF
|
|
chmod +x $out/bin/beet
|
|
'';
|
|
|
|
propagatedBuildInputs = with pkgs.python2Packages; [
|
|
pyyaml
|
|
mutagen
|
|
unidecode
|
|
enum34
|
|
six
|
|
musicbrainzngs
|
|
jellyfish
|
|
munkres
|
|
];
|
|
|
|
# Disable tests for faster builds
|
|
doCheck = false;
|
|
|
|
meta = {
|
|
description = "Music library manager and tagger";
|
|
homepage = "https://beets.io/";
|
|
};
|
|
};
|
|
|
|
pythonEnv = pkgs.python2.withPackages (ps: with ps; [
|
|
fuse
|
|
mutagen
|
|
pyyaml
|
|
enum34
|
|
six
|
|
jellyfish
|
|
munkres
|
|
unidecode
|
|
musicbrainzngs
|
|
] ++ [ beets-py2 ]);
|
|
|
|
in {
|
|
devShells.default = pkgs.mkShell {
|
|
buildInputs = [
|
|
pythonEnv
|
|
pkgs.fuse
|
|
pkgs.ffmpeg
|
|
pkgs.flac
|
|
];
|
|
|
|
shellHook = ''
|
|
unset PYTHONPATH
|
|
export PYTHONPATH="$PWD/beetsplug:$PWD/tests"
|
|
echo "beetfs development environment (Python 2.7)"
|
|
echo " Python: $(python --version 2>&1)"
|
|
echo " Run tests: cd tests && python -m unittest discover"
|
|
echo " Mount: beet mount <mountpoint>"
|
|
'';
|
|
};
|
|
}
|
|
);
|
|
}
|