From 4d29e16bf2dcf642dc1ad4ceb066a6fcc5b4ac73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=BCtz?= Date: Wed, 19 Dec 2018 14:53:12 +0100 Subject: [PATCH] python.pkgs.graphviz: hardcode path to graphviz's bin/ --- .../python-modules/graphviz/default.nix | 44 +++++++-- .../graphviz/hardcode-graphviz-path.patch | 95 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 4 +- 3 files changed, 133 insertions(+), 10 deletions(-) create mode 100644 pkgs/development/python-modules/graphviz/hardcode-graphviz-path.patch diff --git a/pkgs/development/python-modules/graphviz/default.nix b/pkgs/development/python-modules/graphviz/default.nix index 3e9ee8b17f7..572fdcaee51 100644 --- a/pkgs/development/python-modules/graphviz/default.nix +++ b/pkgs/development/python-modules/graphviz/default.nix @@ -1,25 +1,51 @@ -{ stdenv +{ lib , buildPythonPackage -, fetchPypi -, pkgs +, fetchFromGitHub +, substituteAll +, graphviz +, makeFontsConf +, freefont_ttf +, mock +, pytest +, pytest-mock +, pytestcov }: buildPythonPackage rec { pname = "graphviz"; version = "0.10.1"; - src = fetchPypi { - inherit pname version; - extension = "zip"; - sha256 = "d311be4fddfe832a56986ac5e1d6e8715d7fcb0208560da79d1bb0f72abef41f"; + # patch does not apply to PyPI tarball due to different line endings + src = fetchFromGitHub { + owner = "xflr6"; + repo = "graphviz"; + rev = version; + sha256 = "1vqk4xy45c72la56j24z9jmjp5a0aa2k32fybnlbkzqjvvbl72d8"; }; - propagatedBuildInputs = [ pkgs.graphviz ]; + patches = [ + (substituteAll { + src = ./hardcode-graphviz-path.patch; + inherit graphviz; + }) + ]; - meta = with stdenv.lib; { + # Fontconfig error: Cannot load default config file + FONTCONFIG_FILE = makeFontsConf { + fontDirectories = [ freefont_ttf ]; + }; + + checkInputs = [ mock pytest pytest-mock pytestcov ]; + + checkPhase = '' + pytest + ''; + + meta = with lib; { description = "Simple Python interface for Graphviz"; homepage = https://github.com/xflr6/graphviz; license = licenses.mit; + maintainers = with maintainers; [ dotlambda ]; }; } diff --git a/pkgs/development/python-modules/graphviz/hardcode-graphviz-path.patch b/pkgs/development/python-modules/graphviz/hardcode-graphviz-path.patch new file mode 100644 index 00000000000..ad632974c28 --- /dev/null +++ b/pkgs/development/python-modules/graphviz/hardcode-graphviz-path.patch @@ -0,0 +1,95 @@ +diff --git a/graphviz/backend.py b/graphviz/backend.py +index 704017b..fe4aefe 100644 +--- a/graphviz/backend.py ++++ b/graphviz/backend.py +@@ -114,7 +114,7 @@ def command(engine, format, filepath=None, renderer=None, formatter=None): + suffix = '.'.join(reversed(format_arg)) + format_arg = ':'.join(format_arg) + +- cmd = [engine, '-T%s' % format_arg] ++ cmd = [os.path.join('@graphviz@/bin', engine), '-T%s' % format_arg] + rendered = None + if filepath is not None: + cmd.extend(['-O', filepath]) +@@ -217,7 +217,7 @@ def version(): + subprocess.CalledProcessError: If the exit status is non-zero. + RuntimmeError: If the output cannot be parsed into a version number. + """ +- cmd = ['dot', '-V'] ++ cmd = ['@graphviz@/bin/dot', '-V'] + out, _ = run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + info = out.decode('ascii') +diff --git a/tests/test_backend.py b/tests/test_backend.py +index 7ec12f7..2e8550d 100644 +--- a/tests/test_backend.py ++++ b/tests/test_backend.py +@@ -47,6 +47,7 @@ def test_render_formatter_unknown(): + render('dot', 'ps', 'nonfilepath', 'ps', '') + + ++@pytest.mark.skip(reason='empty $PATH has no effect') + @pytest.mark.usefixtures('empty_path') + def test_render_missing_executable(): + with pytest.raises(ExecutableNotFound, match=r'execute'): +@@ -85,7 +86,7 @@ def test_render_mocked(capsys, mocker, Popen, quiet): + + assert render('dot', 'pdf', 'nonfilepath', quiet=quiet) == 'nonfilepath.pdf' + +- Popen.assert_called_once_with(['dot', '-Tpdf', '-O', 'nonfilepath'], ++ Popen.assert_called_once_with(['@graphviz@/bin/dot', '-Tpdf', '-O', 'nonfilepath'], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + startupinfo=mocker.ANY) +@@ -94,6 +95,7 @@ def test_render_mocked(capsys, mocker, Popen, quiet): + assert capsys.readouterr() == ('', '' if quiet else 'stderr') + + ++@pytest.mark.skip(reason='empty $PATH has no effect') + @pytest.mark.usefixtures('empty_path') + def test_pipe_missing_executable(): + with pytest.raises(ExecutableNotFound, match=r'execute'): +@@ -143,7 +145,7 @@ def test_pipe_pipe_invalid_data_mocked(mocker, py2, Popen, quiet): # noqa: N803 + assert e.value.returncode is mocker.sentinel.returncode + assert e.value.stdout is mocker.sentinel.out + assert e.value.stderr is err +- Popen.assert_called_once_with(['dot', '-Tpng'], ++ Popen.assert_called_once_with(['@graphviz@/bin/dot', '-Tpng'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, +@@ -166,7 +168,7 @@ def test_pipe_mocked(capsys, mocker, Popen, quiet): # noqa: N803 + + assert pipe('dot', 'png', b'nongraph', quiet=quiet) is mocker.sentinel.out + +- Popen.assert_called_once_with(['dot', '-Tpng'], ++ Popen.assert_called_once_with(['@graphviz@/bin/dot', '-Tpng'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, +@@ -176,6 +178,7 @@ def test_pipe_mocked(capsys, mocker, Popen, quiet): # noqa: N803 + assert capsys.readouterr() == ('', '' if quiet else 'stderr') + + ++@pytest.mark.skip(reason='empty $PATH has no effect') + @pytest.mark.usefixtures('empty_path') + def test_version_missing_executable(): + with pytest.raises(ExecutableNotFound, match=r'execute'): +@@ -196,7 +199,7 @@ def test_version_parsefail_mocked(mocker, Popen): + with pytest.raises(RuntimeError): + version() + +- Popen.assert_called_once_with(['dot', '-V'], ++ Popen.assert_called_once_with(['@graphviz@/bin/dot', '-V'], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + startupinfo=mocker.ANY) +@@ -211,7 +214,7 @@ def test_version_mocked(mocker, Popen): + + assert version() == (1, 2, 3) + +- Popen.assert_called_once_with(['dot', '-V'], ++ Popen.assert_called_once_with(['@graphviz@/bin/dot', '-V'], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + startupinfo=mocker.ANY) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 66ca01dc7b4..143bbe3b97c 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -3067,7 +3067,9 @@ in { pyte = callPackage ../development/python-modules/pyte { }; - graphviz = callPackage ../development/python-modules/graphviz { }; + graphviz = callPackage ../development/python-modules/graphviz { + inherit (pkgs) graphviz; + }; pygraphviz = callPackage ../development/python-modules/pygraphviz { graphviz = pkgs.graphviz; # not the python package