diff --git a/pkgs/development/python-modules/cnvkit/default.nix b/pkgs/development/python-modules/cnvkit/default.nix index 4911f8b004cd..eb6375367297 100644 --- a/pkgs/development/python-modules/cnvkit/default.nix +++ b/pkgs/development/python-modules/cnvkit/default.nix @@ -3,9 +3,9 @@ buildPythonPackage, fetchFromGitHub, fetchpatch, - + python, + makeWrapper, # dependencies - R, biopython, matplotlib, numpy, @@ -13,15 +13,15 @@ pomegranate, pyfaidx, pysam, - rPackages, reportlab, + rPackages, scikit-learn, scipy, - + R, # tests pytestCheckHook, -}: +}: buildPythonPackage rec { pname = "cnvkit"; version = "0.9.12"; @@ -47,11 +47,38 @@ buildPythonPackage rec { "pomegranate" ]; - # Numpy 2 compatibility - postPatch = '' - substituteInPlace skgenome/intersect.py \ - --replace-fail "np.string_" "np.bytes_" - ''; + nativeBuildInputs = [ + makeWrapper + ]; + + buildInputs = [ + R + ]; + + postPatch = + let + rscript = lib.getExe' R "Rscript"; + in + # Numpy 2 compatibility + '' + substituteInPlace skgenome/intersect.py \ + --replace-fail "np.string_" "np.bytes_" + '' + # Patch shebang lines in R scripts + + '' + substituteInPlace cnvlib/segmentation/flasso.py \ + --replace-fail "#!/usr/bin/env Rscript" "#!${rscript}" + + substituteInPlace cnvlib/segmentation/cbs.py \ + --replace-fail "#!/usr/bin/env Rscript" "#!${rscript}" + + substituteInPlace cnvlib/segmentation/__init__.py \ + --replace-fail 'rscript_path="Rscript"' 'rscript_path="${rscript}"' + + substituteInPlace cnvlib/commands.py \ + --replace-fail 'default="Rscript"' 'default="${rscript}"' + + ''; dependencies = [ biopython @@ -61,12 +88,42 @@ buildPythonPackage rec { pomegranate pyfaidx pysam - rPackages.DNAcopy reportlab + rPackages.DNAcopy scikit-learn scipy ]; + # Make sure R can find the DNAcopy package + postInstall = '' + wrapProgram $out/bin/cnvkit.py \ + --set R_LIBS_SITE "${rPackages.DNAcopy}/library" \ + --set MPLCONFIGDIR "/tmp/matplotlib-config" + ''; + + installCheckPhase = '' + runHook preInstallCheck + + ${python.executable} -m pytest --deselect=test/test_commands.py::CommandTests::test_batch \ + --deselect=test/test_commands.py::CommandTests::test_segment_hmm + + cd test + # Set matplotlib config directory for the tests + export MPLCONFIGDIR="/tmp/matplotlib-config" + export HOME="/tmp" + mkdir -p "$MPLCONFIGDIR" + + # Use the installed binary - it's already wrapped with R_LIBS_SITE + make cnvkit="$out/bin/cnvkit.py" || { + echo "Make tests failed" + exit 1 + } + + runHook postInstallCheck + ''; + + doInstallCheck = true; + pythonImportsCheck = [ "cnvlib" ]; nativeCheckInputs = [ @@ -74,13 +131,6 @@ buildPythonPackage rec { R ]; - disabledTests = [ - # AttributeError: module 'pomegranate' has no attribute 'NormalDistribution' - # https://github.com/etal/cnvkit/issues/815 - "test_batch" - "test_segment_hmm" - ]; - meta = { homepage = "https://cnvkit.readthedocs.io"; description = "Python library and command-line software toolkit to infer and visualize copy number from high-throughput DNA sequencing data";