xflr6 / graphviz

Simple Python interface for Graphviz
https://graphviz.readthedocs.io
MIT License
1.59k stars 209 forks source link

New version?๐Ÿค” #217

Closed kloczek closed 3 months ago

kloczek commented 3 months ago

Looking on https://github.com/xflr6/graphviz/compare/0.20.1...master I think that it would be good to flush all currently committed changes and release new version.

Doable? ๐Ÿค”

xflr6 commented 3 months ago

https://pypi.org/project/graphviz/0.20.2/

kloczek commented 3 months ago

Thank you.

Just started packaging your module and cannot pass pytest. Looks like it is some conflict between tests/backend/conftest.py and tests/conftest.py ๐Ÿค”

+ /usr/bin/pytest -ra -m 'not network'
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.9.18, pytest-8.1.1, pluggy-1.4.0
rootdir: /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2
configfile: setup.cfg
testpaths: README.rst, docs, graphviz, tests
plugins: hypothesis-6.99.6, mock-3.12.0
collected 369 items / 1 error

========================================================================================== ERRORS ===========================================================================================
____________________________________________________________________________ ERROR collecting tests/conftest.py _____________________________________________________________________________
import file mismatch:
imported module 'conftest' has this __file__ attribute:
  /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/backend/conftest.py
which is not the same as the test file we want to collect:
  /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/conftest.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
================================================================================== short test summary info ==================================================================================
ERROR tests/conftest.py
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
===================================================================================== 1 error in 1.10s ======================================================================================
kloczek commented 3 months ago

pytest passes scanning test units with --import-mode=importlib and it fails in two units and shows some warnings

Here is pytest output: ```console + PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-graphviz-0.20.2-2.fc36.x86_64/usr/lib64/python3.9/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-graphviz-0.20.2-2.fc36.x86_64/usr/lib/python3.9/site-packages + /usr/bin/pytest -ra -m 'not network' --import-mode=importlib ==================================================================================== test session starts ==================================================================================== platform linux -- Python 3.9.18, pytest-8.1.1, pluggy-1.4.0 rootdir: /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2 configfile: setup.cfg testpaths: README.rst, docs, graphviz, tests plugins: hypothesis-6.99.6, mock-3.12.0 collected 369 items README.rst::README.rst PASSED [ 0%] docs/api.rst::api.rst PASSED [ 0%] docs/attributes.rst::attributes.rst PASSED [ 0%] docs/basic_usage.rst::basic_usage.rst PASSED [ 1%] docs/custom_dot.rst::custom_dot.rst PASSED [ 1%] docs/engines.rst::engines.rst PASSED [ 1%] docs/escapes.rst::escapes.rst PASSED [ 1%] docs/existing_files.rst::existing_files.rst PASSED [ 2%] docs/formats.rst::formats.rst PASSED [ 2%] docs/integration_with_viewers.rst::integration_with_viewers.rst PASSED [ 2%] docs/neato_no_op.rst::neato_no_op.rst PASSED [ 2%] docs/node_ports.rst::node_ports.rst PASSED [ 3%] docs/piped_output.rst::piped_output.rst PASSED [ 3%] docs/quoting.rst::quoting.rst PASSED [ 3%] docs/raw_dot.rst::raw_dot.rst PASSED [ 4%] docs/styling.rst::styling.rst PASSED [ 4%] docs/subgraphs_and_clusters.rst::subgraphs_and_clusters.rst PASSED [ 4%] docs/unflatten.rst::unflatten.rst PASSED [ 4%] graphviz/__init__.py::graphviz PASSED [ 5%] graphviz/_tools.py::graphviz._tools.attach PASSED [ 5%] graphviz/_tools.py::graphviz._tools.mapping_items PASSED [ 5%] graphviz/backend/piping.py::graphviz.backend.piping.pipe PASSED [ 5%] graphviz/backend/piping.py::graphviz.backend.piping.pipe_lines PASSED [ 6%] graphviz/backend/piping.py::graphviz.backend.piping.pipe_lines_string PASSED [ 6%] graphviz/backend/piping.py::graphviz.backend.piping.pipe_string PASSED [ 6%] graphviz/backend/rendering.py::graphviz.backend.rendering.get_supported_formats PASSED [ 7%] graphviz/backend/rendering.py::graphviz.backend.rendering.get_supported_suffixes PASSED [ 7%] graphviz/backend/rendering.py::graphviz.backend.rendering.infer_format PASSED [ 7%] graphviz/backend/rendering.py::graphviz.backend.rendering.render PASSED [ 7%] graphviz/backend/upstream_version.py::graphviz.backend.upstream_version.version PASSED [ 8%] graphviz/graphs.py::graphviz.graphs PASSED [ 8%] graphviz/jupyter_integration.py::graphviz.jupyter_integration.JupyterIntegration._repr_mimebundle_ FAILED [ 8%] graphviz/piping.py::graphviz.piping.Pipe.pipe PASSED [ 8%] graphviz/quoting.py::graphviz.quoting.a_list PASSED [ 9%] graphviz/quoting.py::graphviz.quoting.attr_list PASSED [ 9%] graphviz/quoting.py::graphviz.quoting.escape PASSED [ 9%] graphviz/quoting.py::graphviz.quoting.nohtml PASSED [ 10%] graphviz/quoting.py::graphviz.quoting.quote PASSED [ 10%] graphviz/quoting.py::graphviz.quoting.quote_edge PASSED [ 10%] graphviz/rendering.py::graphviz.rendering.Render.render PASSED [ 10%] tests/backend/test_execute.py::test_missing_executable[render-args0] PASSED [ 11%] tests/backend/test_execute.py::test_missing_executable[pipe-args1] PASSED [ 11%] tests/backend/test_execute.py::test_missing_executable[unflatten-args2] PASSED [ 11%] tests/backend/test_execute.py::test_missing_executable[version-args3] PASSED [ 11%] tests/backend/test_execute.py::test_run_check_oserror PASSED [ 12%] tests/backend/test_execute.py::test_run_check_called_process_error_mocked[quiet=False] PASSED [ 12%] tests/backend/test_execute.py::test_run_check_called_process_error_mocked[quiet=True] PASSED [ 12%] tests/backend/test_execute.py::test_run_check_input_lines_mocked PASSED [ 13%] tests/backend/test_piping.py::test_pipe_invalid_data[quiet=False] PASSED [ 13%] tests/backend/test_piping.py::test_pipe_invalid_data[quiet=True] PASSED [ 13%] tests/backend/test_piping.py::test_pipe_pipe_invalid_data_mocked[quiet=False] PASSED [ 13%] tests/backend/test_piping.py::test_pipe_pipe_invalid_data_mocked[quiet=True] PASSED [ 14%] tests/backend/test_piping.py::test_pipe[dot-svg-None-None-(?s)^<\\?xml .+\\s*$] PASSED [ 14%] tests/backend/test_piping.py::test_pipe[dot-ps-ps-core-%!PS-] PASSED [ 14%] tests/backend/test_piping.py::test_pipe[sfdp-svg-None-None-(?s)^<\\?xml .+\\s*$] FAILED [ 14%] tests/backend/test_piping.py::test_pipe_mocked[quiet=False] PASSED [ 15%] tests/backend/test_piping.py::test_pipe_mocked[quiet=True] PASSED [ 15%] tests/backend/test_piping.py::test_pipe_string_mocked[quiet=False] PASSED [ 15%] tests/backend/test_piping.py::test_pipe_string_mocked[quiet=True] PASSED [ 15%] tests/backend/test_piping.py::test_pipe_lines_mocked[quiet=False] PASSED [ 16%] tests/backend/test_piping.py::test_pipe_lines_mocked[quiet=True] PASSED [ 16%] tests/backend/test_piping.py::test_pipe_lines_string_mocked[quiet=False] PASSED [ 16%] tests/backend/test_piping.py::test_pipe_lines_string_mocked[quiet=True] PASSED [ 17%] tests/backend/test_rendering.py::test_render_missing_file[quiet=False] PASSED [ 17%] tests/backend/test_rendering.py::test_render_missing_file[quiet=True] PASSED [ 17%] tests/backend/test_rendering.py::test_render_unknown_parameter_raises[args0-ValueError-unknown engine] PASSED [ 17%] tests/backend/test_rendering.py::test_render_unknown_parameter_raises[args1-ValueError-unknown format] PASSED [ 18%] tests/backend/test_rendering.py::test_render_unknown_parameter_raises[args2-ValueError-unknown renderer] PASSED [ 18%] tests/backend/test_rendering.py::test_render_unknown_parameter_raises[args3-RequiredArgumentError-without renderer] PASSED [ 18%] tests/backend/test_rendering.py::test_render_unknown_parameter_raises[args4-ValueError-unknown formatter] PASSED [ 18%] tests/backend/test_rendering.py::test_render[dot-pdf-None-None-pdf] PASSED [ 19%] tests/backend/test_rendering.py::test_render[dot-plain-dot-core-core.dot.plain] PASSED [ 19%] tests/backend/test_rendering.py::test_render_img PASSED [ 19%] tests/backend/test_rendering.py::test_render_outfile_differnt_parent PASSED [ 20%] tests/backend/test_rendering.py::test_render_mocked[quiet=False-None] PASSED [ 20%] tests/backend/test_rendering.py::test_render_mocked[quiet=False-dot_sources] PASSED [ 20%] tests/backend/test_rendering.py::test_render_mocked[quiet=True-None] PASSED [ 20%] tests/backend/test_rendering.py::test_render_mocked[quiet=True-dot_sources] PASSED [ 21%] tests/backend/test_rendering.py::test_render_raises_mocked[args0-kwargs0-RequiredArgumentError-filepath: \\(required] PASSED [ 21%] tests/backend/test_rendering.py::test_render_raises_mocked[args1-kwargs1-RequiredArgumentError-filepath: \\(required] PASSED [ 21%] tests/backend/test_rendering.py::test_render_raises_mocked[args2-kwargs2-RequiredArgumentError-format: \\(required] PASSED [ 21%] tests/backend/test_rendering.py::test_render_raises_mocked[args3-kwargs3-RequiredArgumentError-filepath: \\(required] PASSED [ 22%] tests/backend/test_rendering.py::test_render_raises_mocked[args4-kwargs4-ValueError-outfile 'spam\\.gv' must be different from input file 'spam\\.gv'] PASSED [ 22%] tests/backend/test_rendering.py::test_render_raises_mocked[args5-kwargs5-ValueError-overwrite_filepath cannot be combined with raise_if_result_exists] PASSED [ 22%] tests/backend/test_rendering.py::test_render_raises_mocked[args6-kwargs6-FileExistsError-output file exists: 'spam.png'] PASSED [ 23%] tests/backend/test_rendering.py::test_get_outfile[spam.gv-kwargs0-spam.gv.pdf] PASSED [ 23%] tests/backend/test_rendering.py::test_get_outfile[spam.gv-kwargs1-spam.gv.dot.plain] PASSED [ 23%] tests/backend/test_rendering.py::test_get_filepath[spam.pdf-spam.gv] PASSED [ 23%] tests/backend/test_rendering.py::test_get_filepath[spam-spam.gv] PASSED [ 24%] tests/backend/test_rendering.py::test_get_format[spam.gv.pdf-None-pdf] PASSED [ 24%] tests/backend/test_rendering.py::test_get_format[spam.jpeg-None-jpeg] PASSED [ 24%] tests/backend/test_rendering.py::test_get_format[spam.SVG-None-svg] PASSED [ 24%] tests/backend/test_rendering.py::test_get_format[spam.pdf-None-pdf] PASSED [ 25%] tests/backend/test_rendering.py::test_get_format[spam.pdf-pdf-pdf] PASSED [ 25%] tests/backend/test_rendering.py::test_get_format_warns[spam.jpg-jpeg-jpeg-FormatSuffixMismatchWarning-expected format 'jpg' from outfile differs from given format: 'jpeg'] PASSED [ 25%] tests/backend/test_rendering.py::test_get_format_warns[spam.dot-plain-plain-FormatSuffixMismatchWarning-expected format 'dot' from outfile differs from given format: 'plain'] PASSED [ 26%] tests/backend/test_rendering.py::test_get_format_warns[spam-svg-svg-UnknownSuffixWarning-unknown outfile suffix '' \\(expected: '\\.svg'\\)] PASSED [ 26%] tests/backend/test_rendering.py::test_get_format_warns[spam.peng-png-png-UnknownSuffixWarning-unknown outfile suffix '.peng' \\(expected: '\\.png'\\)] PASSED [ 26%] tests/backend/test_rendering.py::test_get_format_warns[spam-pdf-pdf-UnknownSuffixWarning-unknown outfile suffix '' \\(expected: '\\.pdf'\\)] PASSED [ 26%] tests/backend/test_rendering.py::test_get_format_raises[spam-RequiredArgumentError-cannot infer rendering format from suffix '' of outfile: 'spam'] PASSED [ 27%] tests/backend/test_rendering.py::test_get_format_raises[spam.peng-RequiredArgumentError-cannot infer rendering format from suffix '.peng' of outfile: 'spam.peng'] PASSED [ 27%] tests/backend/test_rendering.py::test_get_format_raises[spam.wav-RequiredArgumentError-cannot infer rendering format from suffix '.wav' of outfile: 'spam.wav'] PASSED [ 27%] tests/backend/test_unflattening.py::test_unflatten_stagger_missing PASSED [ 27%] tests/backend/test_unflattening.py::test_unflatten[digraph {1 -> 2; 1 -> 3; 1 -> 4}-kwargs0-digraph { 1 -> 2 [minlen=1]; 1 -> 3 [minlen=2]; 1 -> 4 [minlen=3]; }] PASSED [ 28%] tests/backend/test_unflattening.py::test_unflatten_mocked PASSED [ 28%] tests/backend/test_upstream_version.py::test_version PASSED [ 28%] tests/backend/test_upstream_version.py::test_version_mocked[dot - graphviz version 1.2.3 (mocked)-expected0] PASSED [ 28%] tests/backend/test_upstream_version.py::test_version_mocked[dot - graphviz version 2.43.20190912.0211 (20190912.0211)\n-expected1] PASSED [ 29%] tests/backend/test_upstream_version.py::test_version_mocked[dot - graphviz version 2.44.2~dev.20200927.0217 (20200927.0217)\n-expected2] PASSED [ 29%] tests/backend/test_upstream_version.py::test_version_mocked[dot - graphviz version 2.44.1 (mocked)\n-expected3] PASSED [ 29%] tests/backend/test_upstream_version.py::test_version_mocked[dot - graphviz version 2.44.2~dev.20200704.1652 (mocked)\n-expected4] PASSED [ 30%] tests/backend/test_upstream_version.py::test_version_parsefail_mocked PASSED [ 30%] tests/backend/test_viewing.py::test_view_unknown_platform PASSED [ 30%] tests/backend/test_viewing.py::test_view_mocked[platform='darwin'-quiet=False] PASSED [ 30%] tests/backend/test_viewing.py::test_view_mocked[platform='darwin'-quiet=True] PASSED [ 31%] tests/backend/test_viewing.py::test_view_mocked[platform='freebsd'-quiet=False] PASSED [ 31%] tests/backend/test_viewing.py::test_view_mocked[platform='freebsd'-quiet=True] PASSED [ 31%] tests/backend/test_viewing.py::test_view_mocked[platform='linux'-quiet=False] PASSED [ 31%] tests/backend/test_viewing.py::test_view_mocked[platform='linux'-quiet=True] PASSED [ 32%] tests/backend/test_viewing.py::test_view_mocked[platform='windows'-quiet=False] PASSED [ 32%] tests/backend/test_viewing.py::test_view_mocked[platform='windows'-quiet=True] PASSED [ 32%] tests/test_all_classes.py::test_copy[Graph] PASSED [ 33%] tests/test_all_classes.py::test_copy[Digraph] PASSED [ 33%] tests/test_all_classes.py::test_copy[Source] PASSED [ 33%] tests/test_all_classes.py::test_str[Graph] PASSED [ 33%] tests/test_all_classes.py::test_str[Digraph] PASSED [ 34%] tests/test_all_classes.py::test_str[Source] PASSED [ 34%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Graph-engine-ValueError-unknown engine] PASSED [ 34%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Graph-format-ValueError-unknown format] PASSED [ 34%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Graph-renderer-ValueError-unknown renderer] PASSED [ 35%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Graph-formatter-ValueError-unknown formatter] PASSED [ 35%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Graph-encoding-LookupError-encoding] PASSED [ 35%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Digraph-engine-ValueError-unknown engine] PASSED [ 36%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Digraph-format-ValueError-unknown format] PASSED [ 36%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Digraph-renderer-ValueError-unknown renderer] PASSED [ 36%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Digraph-formatter-ValueError-unknown formatter] PASSED [ 36%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Digraph-encoding-LookupError-encoding] PASSED [ 37%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Source-engine-ValueError-unknown engine] PASSED [ 37%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Source-format-ValueError-unknown format] PASSED [ 37%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Source-renderer-ValueError-unknown renderer] PASSED [ 37%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Source-formatter-ValueError-unknown formatter] PASSED [ 38%] tests/test_all_classes.py::test_invalid_parameter_raises_valuerror[Source-encoding-LookupError-encoding] PASSED [ 38%] tests/test_all_classes.py::test_encoding_none[Graph] PASSED [ 38%] tests/test_all_classes.py::test_encoding_none[Digraph] PASSED [ 39%] tests/test_all_classes.py::test_encoding_none[Source] PASSED [ 39%] tests/test_all_classes.py::test_render_raises_before_save[Graph-kwargs0] PASSED [ 39%] tests/test_all_classes.py::test_render_raises_before_save[Digraph-kwargs0] PASSED [ 39%] tests/test_all_classes.py::test_render_raises_before_save[Source-kwargs0] PASSED [ 40%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Graph-kwargs0] PASSED [ 40%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Graph-kwargs1] PASSED [ 40%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Graph-kwargs2] PASSED [ 40%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Graph-kwargs3] PASSED [ 41%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Digraph-kwargs0] PASSED [ 41%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Digraph-kwargs1] PASSED [ 41%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Digraph-kwargs2] PASSED [ 42%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Digraph-kwargs3] PASSED [ 42%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Source-kwargs0] PASSED [ 42%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Source-kwargs1] PASSED [ 42%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Source-kwargs2] PASSED [ 43%] tests/test_all_classes.py::test_render_raises_before_save_mocked[Source-kwargs3] PASSED [ 43%] tests/test_all_classes.py::test_render_mocked[Graph] PASSED [ 43%] tests/test_all_classes.py::test_render_mocked[Digraph] PASSED [ 43%] tests/test_all_classes.py::test_render_mocked[Source] PASSED [ 44%] tests/test_all_classes.py::test_render_outfile_mocked[Graph] PASSED [ 44%] tests/test_all_classes.py::test_render_outfile_mocked[Digraph] PASSED [ 44%] tests/test_all_classes.py::test_render_outfile_mocked[Source] PASSED [ 44%] tests/test_all_classes.py::test_format_renderer_formatter_mocked[quiet=False-Graph] PASSED [ 45%] tests/test_all_classes.py::test_format_renderer_formatter_mocked[quiet=False-Digraph] PASSED [ 45%] tests/test_all_classes.py::test_format_renderer_formatter_mocked[quiet=False-Source] PASSED [ 45%] tests/test_all_classes.py::test_format_renderer_formatter_mocked[quiet=True-Graph] PASSED [ 46%] tests/test_all_classes.py::test_format_renderer_formatter_mocked[quiet=True-Digraph] PASSED [ 46%] tests/test_all_classes.py::test_format_renderer_formatter_mocked[quiet=True-Source] PASSED [ 46%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Graph-None] PASSED [ 46%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Graph-False] PASSED [ 47%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Graph-True] PASSED [ 47%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Graph-0] PASSED [ 47%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Graph-1] PASSED [ 47%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Graph-2] PASSED [ 48%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Digraph-None] PASSED [ 48%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Digraph-False] PASSED [ 48%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Digraph-True] PASSED [ 49%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Digraph-0] PASSED [ 49%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Digraph-1] PASSED [ 49%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Digraph-2] PASSED [ 49%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Source-None] PASSED [ 50%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Source-False] PASSED [ 50%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Source-True] PASSED [ 50%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Source-0] PASSED [ 50%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Source-1] PASSED [ 51%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=False-Source-2] PASSED [ 51%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Graph-None] PASSED [ 51%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Graph-False] PASSED [ 52%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Graph-True] PASSED [ 52%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Graph-0] PASSED [ 52%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Graph-1] PASSED [ 52%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Graph-2] PASSED [ 53%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Digraph-None] PASSED [ 53%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Digraph-False] PASSED [ 53%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Digraph-True] PASSED [ 53%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Digraph-0] PASSED [ 54%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Digraph-1] PASSED [ 54%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Digraph-2] PASSED [ 54%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Source-None] PASSED [ 55%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Source-False] PASSED [ 55%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Source-True] PASSED [ 55%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Source-0] PASSED [ 55%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Source-1] PASSED [ 56%] tests/test_all_classes.py::test_neato_no_op_mocked[quiet=True-Source-2] PASSED [ 56%] tests/test_all_classes.py::test_save_mocked[Graph] PASSED [ 56%] tests/test_all_classes.py::test_save_mocked[Digraph] PASSED [ 56%] tests/test_all_classes.py::test_save_mocked[Source] PASSED [ 57%] tests/test_all_classes.py::test_pipe[Graph] PASSED [ 57%] tests/test_all_classes.py::test_pipe[Digraph] PASSED [ 57%] tests/test_all_classes.py::test_pipe[Source] PASSED [ 57%] tests/test_all_classes.py::test_pipe_mocked[quiet=False-Graph-None] PASSED [ 58%] tests/test_all_classes.py::test_pipe_mocked[quiet=False-Graph-ascii] PASSED [ 58%] tests/test_all_classes.py::test_pipe_mocked[quiet=False-Graph-utf-8] PASSED [ 58%] tests/test_all_classes.py::test_pipe_mocked[quiet=False-Digraph-None] PASSED [ 59%] tests/test_all_classes.py::test_pipe_mocked[quiet=False-Digraph-ascii] PASSED [ 59%] tests/test_all_classes.py::test_pipe_mocked[quiet=False-Digraph-utf-8] PASSED [ 59%] tests/test_all_classes.py::test_pipe_mocked[quiet=False-Source-None] PASSED [ 59%] tests/test_all_classes.py::test_pipe_mocked[quiet=False-Source-ascii] PASSED [ 60%] tests/test_all_classes.py::test_pipe_mocked[quiet=False-Source-utf-8] PASSED [ 60%] tests/test_all_classes.py::test_pipe_mocked[quiet=True-Graph-None] PASSED [ 60%] tests/test_all_classes.py::test_pipe_mocked[quiet=True-Graph-ascii] PASSED [ 60%] tests/test_all_classes.py::test_pipe_mocked[quiet=True-Graph-utf-8] PASSED [ 61%] tests/test_all_classes.py::test_pipe_mocked[quiet=True-Digraph-None] PASSED [ 61%] tests/test_all_classes.py::test_pipe_mocked[quiet=True-Digraph-ascii] PASSED [ 61%] tests/test_all_classes.py::test_pipe_mocked[quiet=True-Digraph-utf-8] PASSED [ 62%] tests/test_all_classes.py::test_pipe_mocked[quiet=True-Source-None] PASSED [ 62%] tests/test_all_classes.py::test_pipe_mocked[quiet=True-Source-ascii] PASSED [ 62%] tests/test_all_classes.py::test_pipe_mocked[quiet=True-Source-utf-8] PASSED [ 62%] tests/test_all_classes.py::test_pipe_lines_mocked[Graph] PASSED [ 63%] tests/test_all_classes.py::test_pipe_lines_mocked[Digraph] PASSED [ 63%] tests/test_all_classes.py::test_pipe_lines_mocked[Source] PASSED [ 63%] tests/test_all_classes.py::test_pipe_lines_called_process_error[Graph] PASSED [ 63%] tests/test_all_classes.py::test_pipe_lines_called_process_error[Digraph] PASSED [ 64%] tests/test_all_classes.py::test_pipe_lines_called_process_error[Source] PASSED [ 64%] tests/test_all_classes.py::test_pipe_lines_called_process_error_mocked[Graph] PASSED [ 64%] tests/test_all_classes.py::test_pipe_lines_called_process_error_mocked[Digraph] PASSED [ 65%] tests/test_all_classes.py::test_pipe_lines_called_process_error_mocked[Source] PASSED [ 65%] tests/test_all_classes.py::test_repr_mimebundle_image_svg_xml_mocked[Graph] PASSED [ 65%] tests/test_all_classes.py::test_repr_mimebundle_image_svg_xml_mocked[Digraph] PASSED [ 65%] tests/test_all_classes.py::test_repr_mimebundle_image_svg_xml_mocked[Source] PASSED [ 66%] tests/test_all_classes.py::test_repr_mimebundle_image_png_mocked[Graph] PASSED [ 66%] tests/test_all_classes.py::test_repr_mimebundle_image_png_mocked[Digraph] PASSED [ 66%] tests/test_all_classes.py::test_repr_mimebundle_image_png_mocked[Source] PASSED [ 66%] tests/test_all_classes.py::test_repr_mimebundle_image_jpeg_mocked[Graph] PASSED [ 67%] tests/test_all_classes.py::test_repr_mimebundle_image_jpeg_mocked[Digraph] PASSED [ 67%] tests/test_all_classes.py::test_repr_mimebundle_image_jpeg_mocked[Source] PASSED [ 67%] tests/test_all_classes.py::test_unflatten[Graph] PASSED [ 68%] tests/test_all_classes.py::test_unflatten[Digraph] PASSED [ 68%] tests/test_all_classes.py::test_unflatten[Source] PASSED [ 68%] tests/test_all_classes.py::test_unflatten_mocked[Graph] PASSED [ 68%] tests/test_all_classes.py::test_unflatten_mocked[Digraph] PASSED [ 69%] tests/test_all_classes.py::test_unflatten_mocked[Source] PASSED [ 69%] tests/test_all_classes.py::test_view_mocked[Graph] PASSED [ 69%] tests/test_all_classes.py::test_view_mocked[Digraph] PASSED [ 69%] tests/test_all_classes.py::test_view_mocked[Source] PASSED [ 70%] tests/test_all_classes.py::test__view_unknown_platform[Graph] PASSED [ 70%] tests/test_all_classes.py::test__view_unknown_platform[Digraph] PASSED [ 70%] tests/test_all_classes.py::test__view_unknown_platform[Source] PASSED [ 71%] tests/test_all_classes.py::test__view_mocked[platform='darwin'-Graph] PASSED [ 71%] tests/test_all_classes.py::test__view_mocked[platform='darwin'-Digraph] PASSED [ 71%] tests/test_all_classes.py::test__view_mocked[platform='darwin'-Source] PASSED [ 71%] tests/test_all_classes.py::test__view_mocked[platform='freebsd'-Graph] PASSED [ 72%] tests/test_all_classes.py::test__view_mocked[platform='freebsd'-Digraph] PASSED [ 72%] tests/test_all_classes.py::test__view_mocked[platform='freebsd'-Source] PASSED [ 72%] tests/test_all_classes.py::test__view_mocked[platform='linux'-Graph] PASSED [ 72%] tests/test_all_classes.py::test__view_mocked[platform='linux'-Digraph] PASSED [ 73%] tests/test_all_classes.py::test__view_mocked[platform='linux'-Source] PASSED [ 73%] tests/test_all_classes.py::test__view_mocked[platform='windows'-Graph] PASSED [ 73%] tests/test_all_classes.py::test__view_mocked[platform='windows'-Digraph] PASSED [ 73%] tests/test_all_classes.py::test__view_mocked[platform='windows'-Source] PASSED [ 74%] tests/test_graphs.py::test_init_filename[Graph] PASSED [ 74%] tests/test_graphs.py::test_init_filename[Digraph] PASSED [ 74%] tests/test_graphs.py::test_init_body[Graph-...-...] PASSED [ 75%] tests/test_graphs.py::test_init_body[Digraph-...-...] PASSED [ 75%] tests/test_graphs.py::test_subgraph_render[Graph-...] PASSED [ 75%] tests/test_graphs.py::test_subgraph_render[Digraph-...] PASSED [ 75%] tests/test_graphs.py::test_clear[Graph-False] PASSED [ 76%] tests/test_graphs.py::test_clear[Graph-True] PASSED [ 76%] tests/test_graphs.py::test_clear[Digraph-False] PASSED [ 76%] tests/test_graphs.py::test_clear[Digraph-True] PASSED [ 76%] tests/test_graphs.py::test_iter_subgraph_strict[Graph] PASSED [ 77%] tests/test_graphs.py::test_iter_subgraph_strict[Digraph] PASSED [ 77%] tests/test_graphs.py::test_iter_strict[Graph-...] PASSED [ 77%] tests/test_graphs.py::test_iter_strict[Digraph-...] PASSED [ 78%] tests/test_graphs.py::test_attr_invalid_kw[Graph] PASSED [ 78%] tests/test_graphs.py::test_attr_invalid_kw[Digraph] PASSED [ 78%] tests/test_graphs.py::test_attr_kw_none[Graph-...] PASSED [ 78%] tests/test_graphs.py::test_attr_kw_none[Digraph-...] PASSED [ 79%] tests/test_graphs.py::test_escaped_quotes_and_escapes[Graph-...] PASSED [ 79%] tests/test_graphs.py::test_escaped_quotes_and_escapes[Digraph-...] PASSED [ 79%] tests/test_graphs.py::test_subgraph_graph_none[Graph-...] PASSED [ 79%] tests/test_graphs.py::test_subgraph_graph_none[Digraph-...] PASSED [ 80%] tests/test_graphs.py::test_subgraph_graph_notsole[Graph] PASSED [ 80%] tests/test_graphs.py::test_subgraph_graph_notsole[Digraph] PASSED [ 80%] tests/test_graphs.py::test_subgraph_mixed[Graph, Digraph] PASSED [ 81%] tests/test_graphs.py::test_subgraph_mixed[Digraph, Graph] PASSED [ 81%] tests/test_graphs.py::test_subgraph_reflexive[Graph-...] PASSED [ 81%] tests/test_graphs.py::test_subgraph_reflexive[Digraph-...] PASSED [ 81%] tests/test_graphs.py::test_subgraph PASSED [ 82%] tests/test_graphs.py::test_label_html PASSED [ 82%] tests/test_init.py::test_set_default_engine_invalid PASSED [ 82%] tests/test_init.py::test_set_default_format_invalid PASSED [ 82%] tests/test_init.py::test_set_default_engine PASSED [ 83%] tests/test_init.py::test_set_default_format PASSED [ 83%] tests/test_init.py::test_set_jupyter_format PASSED [ 83%] tests/test_jupyter_integration.py::test_get_jupyter_format_mimetype_invalid_raises_unknown PASSED [ 84%] tests/test_jupyter_integration.py::test_get_jupyter_mimetype_format_normalizes PASSED [ 84%] tests/test_jupyter_integration.py::test_get_jupyter_mimetype_format_raises_unsupported PASSED [ 84%] tests/test_jupyter_integration.py::test_repr_image_svg_xml_encoding PASSED [ 84%] tests/test_jupyter_integration.py::test_repr_image_svg_xml_encoding_mocked[utf-8] PASSED [ 85%] tests/test_jupyter_integration.py::test_repr_image_svg_xml_encoding_mocked[ascii] PASSED [ 85%] tests/test_jupyter_integration.py::test_repr_image_svg_xml_encoding_mocked[latin1] PASSED [ 85%] tests/test_parameters.py::test_parameters[Graph] PASSED [ 85%] tests/test_parameters.py::test_parameters[Digraph] PASSED [ 86%] tests/test_parameters.py::test_parameters[Source] PASSED [ 86%] tests/test_parameters.py::test_verify_parameter_raises_unknown[verify_engine] PASSED [ 86%] tests/test_parameters.py::test_verify_parameter_raises_unknown[verify_format] PASSED [ 86%] tests/test_parameters.py::test_verify_parameter_raises_unknown[verify_renderer] PASSED [ 87%] tests/test_parameters.py::test_verify_parameter_raises_unknown[verify_formatter] PASSED [ 87%] tests/test_parameters.py::test_verify_parameter_none_required_false_passes[verify_engine] PASSED [ 87%] tests/test_parameters.py::test_verify_parameter_none_required_false_passes[verify_format] PASSED [ 88%] tests/test_parameters.py::test_verify_parameter_none_required_false_passes[verify_renderer] PASSED [ 88%] tests/test_parameters.py::test_verify_parameter_none_required_false_passes[verify_formatter] PASSED [ 88%] tests/test_parameters.py::test_verify_parameter_none_required_raises_missing[verify_engine] PASSED [ 88%] tests/test_parameters.py::test_verify_parameter_none_required_raises_missing[verify_format] PASSED [ 89%] tests/test_parameters.py::test_verify_parameter_none_required_raises_missing[verify_renderer] PASSED [ 89%] tests/test_parameters.py::test_verify_parameter_none_required_raises_missing[verify_formatter] PASSED [ 89%] tests/test_quoting.py::test_deprecated_escape[G] PASSED [ 89%] tests/test_quoting.py::test_deprecated_escape[E] PASSED [ 90%] tests/test_quoting.py::test_deprecated_escape[T] PASSED [ 90%] tests/test_quoting.py::test_deprecated_escape[H] PASSED [ 90%] tests/test_quoting.py::test_deprecated_escape[L] PASSED [ 91%] tests/test_quoting.py::test_deprecated_escape[l] PASSED [ 91%] tests/test_quoting.py::test_quote["spam"-"\\"spam\\""] PASSED [ 91%] tests/test_quoting.py::test_quote[node-"node"] PASSED [ 91%] tests/test_quoting.py::test_quote[EDGE-"EDGE"] PASSED [ 92%] tests/test_quoting.py::test_quote[Graph-"Graph"] PASSED [ 92%] tests/test_quoting.py::test_quote[\\G \\N \\E \\T \\H \\L-"\\G \\N \\E \\T \\H \\L"] PASSED [ 92%] tests/test_quoting.py::test_quote[\\n \\l \\r-"\\n \\l \\r"] PASSED [ 92%] tests/test_quoting.py::test_quote[\r\n-"\r\n"] PASSED [ 93%] tests/test_quoting.py::test_quote[\\\\n-"\\\\n"] PASSED [ 93%] tests/test_quoting.py::test_quote[\u0665.\u0660-"\u0665.\u0660"] PASSED [ 93%] tests/test_quoting.py::test_quote[\\"spam-"\\"spam"] PASSED [ 94%] tests/test_quoting.py::test_quote[\\\\"spam-"\\\\\\"spam"] PASSED [ 94%] tests/test_quoting.py::test_quote[\\\\\\"spam-"\\\\\\"spam"] PASSED [ 94%] tests/test_quoting.py::test_quote[\\\\\\\\"spam-"\\\\\\\\\\"spam"] PASSED [ 94%] tests/test_quoting.py::test_attr_list[attributes0- [spam=eggs]] PASSED [ 95%] tests/test_quoting.py::test_attr_list[attributes1- [spam=eggs]] PASSED [ 95%] tests/test_quoting.py::test_nohtml[spam-spam-spam] PASSED [ 95%] tests/test_quoting.py::test_nohtml[<>-*-<>-<>-*-<>-"<>-*-<>"] PASSED [ 95%] tests/test_saving.py::test_saves_source_from_file PASSED [ 96%] tests/test_sources.py::test_source_parameter[engine] PASSED [ 96%] tests/test_sources.py::test_source_parameter[format] PASSED [ 96%] tests/test_sources.py::test_source_parameter[encoding] PASSED [ 97%] tests/test_sources.py::test_init PASSED [ 97%] tests/test_sources.py::test_init_filename PASSED [ 97%] tests/test_sources.py::test_filepath PASSED [ 97%] tests/test_sources.py::test_from_file PASSED [ 98%] tests/test_sources.py::test_source_iter PASSED [ 98%] tests/test_tools.py::test_mkdirs_invalid PASSED [ 98%] tests/test_tools.py::test_mkdirs PASSED [ 98%] tests/test_tools.py::test_deprecate_positional_args[FutureWarning- third='third' ] PASSED [ 99%] tests/test_tools.py::test_deprecate_positional_args[DeprecationWarning- third='third' ] PASSED [ 99%] tests/test_tools.py::test_deprecate_positional_args[PendingDeprecationWarning- third='third' ] PASSED [ 99%] tests/test_tools.py::test_deprecate_positional_args[None-None] PASSED [100%] ========================================================================================= FAILURES ========================================================================================== ________________________________________________________ [doctest] graphviz.jupyter_integration.JupyterIntegration._repr_mimebundle_ ________________________________________________________ 075 >>> doctest_mark_exe() 076 >>> import graphviz 077 >>> dot = graphviz.Graph() 078 >>> dot._repr_mimebundle_() # doctest: +ELLIPSIS 079 {'image/svg+xml': '>> dot._repr_mimebundle_(include=['image/png']) # doctest: +ELLIPSIS 081 {'image/png': b'\x89PNG... 082 >>> dot._repr_mimebundle_(include=[]) 083 {} 084 >>> dot._repr_mimebundle_(include=['image/svg+xml', 'image/jpeg'], UNEXPECTED EXCEPTION: CalledProcessError(1, [PosixPath('dot'), '-Kdot', '-Tjpeg'], b'', b'Format: "jpeg" not recognized. Use one of: canon cmap cmapx cmapx_np dot dot_json eps fig gv imap imap_np ismap json json0 kitty kittyz mp pdf pic plain plain-ext png pov ps ps2 svg svg_inline svgz tk vt vt-24bit webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib\n') Traceback (most recent call last): File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/backend/execute.py", line 88, in run_check proc.check_returncode() File "/usr/lib64/python3.9/subprocess.py", line 460, in check_returncode raise CalledProcessError(self.returncode, self.args, self.stdout, subprocess.CalledProcessError: Command '[PosixPath('dot'), '-Kdot', '-Tjpeg']' returned non-zero exit status 1. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib64/python3.9/doctest.py", line 1334, in __run exec(compile(example.source, filename, "single", File "", line 1, in File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/jupyter_integration.py", line 98, in _repr_mimebundle_ return {mimetype: getattr(self, method_name)() File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/jupyter_integration.py", line 98, in return {mimetype: getattr(self, method_name)() File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/jupyter_integration.py", line 104, in _repr_image_jpeg return self.pipe(format='jpeg') File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/piping.py", line 104, in pipe return self._pipe_legacy(format, File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/_tools.py", line 176, in wrapper return func(*args, **kwargs) File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/piping.py", line 121, in _pipe_legacy return self._pipe_future(format, File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/piping.py", line 161, in _pipe_future return self._pipe_lines(*args, input_encoding=self.encoding, **kwargs) File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/backend/piping.py", line 161, in pipe_lines proc = execute.run_check(cmd, capture_output=True, quiet=quiet, **kwargs) File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/backend/execute.py", line 90, in run_check raise CalledProcessError(*e.args) graphviz.backend.execute.CalledProcessError: Command '[PosixPath('dot'), '-Kdot', '-Tjpeg']' returned non-zero exit status 1. [stderr: b'Format: "jpeg" not recognized. Use one of: canon cmap cmapx cmapx_np dot dot_json eps fig gv imap imap_np ismap json json0 kitty kittyz mp pdf pic plain plain-ext png pov ps ps2 svg svg_inline svgz tk vt vt-24bit webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib\n'] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/jupyter_integration.py:84: UnexpectedException 078 >>> dot._repr_mimebundle_() # doctest: +ELLIPSIS 079 {'image/svg+xml': '>> dot._repr_mimebundle_(include=['image/png']) # doctest: +ELLIPSIS 081 {'image/png': b'\x89PNG... 082 >>> dot._repr_mimebundle_(include=[]) 083 {} 084 >>> dot._repr_mimebundle_(include=['image/svg+xml', 'image/jpeg'], 085 ... exclude=['image/svg+xml']) # doctest: +ELLIPSIS 086 {'image/jpeg': b'\xff... 087 >>> list(dot._repr_mimebundle_(include=['image/png', 'image/jpeg'])) UNEXPECTED EXCEPTION: CalledProcessError(1, [PosixPath('dot'), '-Kdot', '-Tjpeg'], b'', b'Format: "jpeg" not recognized. Use one of: canon cmap cmapx cmapx_np dot dot_json eps fig gv imap imap_np ismap json json0 kitty kittyz mp pdf pic plain plain-ext png pov ps ps2 svg svg_inline svgz tk vt vt-24bit webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib\n') Traceback (most recent call last): File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/backend/execute.py", line 88, in run_check proc.check_returncode() File "/usr/lib64/python3.9/subprocess.py", line 460, in check_returncode raise CalledProcessError(self.returncode, self.args, self.stdout, subprocess.CalledProcessError: Command '[PosixPath('dot'), '-Kdot', '-Tjpeg']' returned non-zero exit status 1. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib64/python3.9/doctest.py", line 1334, in __run exec(compile(example.source, filename, "single", File "", line 1, in File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/jupyter_integration.py", line 98, in _repr_mimebundle_ return {mimetype: getattr(self, method_name)() File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/jupyter_integration.py", line 98, in return {mimetype: getattr(self, method_name)() File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/jupyter_integration.py", line 104, in _repr_image_jpeg return self.pipe(format='jpeg') File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/piping.py", line 104, in pipe return self._pipe_legacy(format, File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/_tools.py", line 176, in wrapper return func(*args, **kwargs) File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/piping.py", line 121, in _pipe_legacy return self._pipe_future(format, File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/piping.py", line 161, in _pipe_future return self._pipe_lines(*args, input_encoding=self.encoding, **kwargs) File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/backend/piping.py", line 161, in pipe_lines proc = execute.run_check(cmd, capture_output=True, quiet=quiet, **kwargs) File "/home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/backend/execute.py", line 90, in run_check raise CalledProcessError(*e.args) graphviz.backend.execute.CalledProcessError: Command '[PosixPath('dot'), '-Kdot', '-Tjpeg']' returned non-zero exit status 1. [stderr: b'Format: "jpeg" not recognized. Use one of: canon cmap cmapx cmapx_np dot dot_json eps fig gv imap imap_np ismap json json0 kitty kittyz mp pdf pic plain plain-ext png pov ps ps2 svg svg_inline svgz tk vt vt-24bit webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib\n'] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/jupyter_integration.py:87: UnexpectedException ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ Format: "jpeg" not recognized. Use one of: canon cmap cmapx cmapx_np dot dot_json eps fig gv imap imap_np ismap json json0 kitty kittyz mp pdf pic plain plain-ext png pov ps ps2 svg svg_inline svgz tk vt vt-24bit webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib Format: "jpeg" not recognized. Use one of: canon cmap cmapx cmapx_np dot dot_json eps fig gv imap imap_np ismap json json0 kitty kittyz mp pdf pic plain plain-ext png pov ps ps2 svg svg_inline svgz tk vt vt-24bit webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- DEBUG graphviz.backend.execute:execute.py:61 run [PosixPath('dot'), '-Kdot', '-Tsvg'] DEBUG graphviz.backend.execute:execute.py:61 run [PosixPath('dot'), '-Kdot', '-Tpng'] DEBUG graphviz.backend.execute:execute.py:61 run [PosixPath('dot'), '-Kdot', '-Tjpeg'] DEBUG graphviz.backend.execute:execute.py:61 run [PosixPath('dot'), '-Kdot', '-Tjpeg'] _________________________________________________________________ test_pipe[sfdp-svg-None-None-(?s)^<\\?xml .+\\s*$] __________________________________________________________________ cmd = [PosixPath('dot'), '-Ksfdp', '-Tsvg'], input_lines = None, encoding = None, quiet = False, kwargs = {'capture_output': True, 'input': b'graph { spam }', 'startupinfo': None} proc = CompletedProcess(args=[PosixPath('dot'), '-Ksfdp', '-Tsvg'], returncode=1, stdout=b'spam\n\n\n\n', stderr=b'Error: remove_overlap: Graphviz not built with triangulation library\n') def run_check(cmd: typing.Sequence[typing.Union[os.PathLike, str]], *, input_lines: typing.Optional[BytesOrStrIterator] = None, encoding: typing.Optional[str] = None, quiet: bool = False, **kwargs) -> subprocess.CompletedProcess: """Run the command described by ``cmd`` with ``check=True`` and return its completed process. Raises: CalledProcessError: if the returncode of the subprocess is non-zero. """ log.debug('run %r', cmd) if not kwargs.pop('check', True): # pragma: no cover raise NotImplementedError('check must be True or omited') if encoding is not None: kwargs['encoding'] = encoding kwargs.setdefault('startupinfo', _compat.get_startupinfo()) try: if input_lines is not None: assert kwargs.get('input') is None assert iter(input_lines) is input_lines if kwargs.pop('capture_output'): kwargs['stdout'] = kwargs['stderr'] = subprocess.PIPE proc = _run_input_lines(cmd, input_lines, kwargs=kwargs) else: proc = subprocess.run(cmd, **kwargs) except OSError as e: if e.errno == errno.ENOENT: raise ExecutableNotFound(cmd) from e raise if not quiet and proc.stderr: _write_stderr(proc.stderr) try: > proc.check_returncode() graphviz/backend/execute.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CompletedProcess(args=[PosixPath('dot'), '-Ksfdp', '-Tsvg'], returncode=1, stdout=b'spam\n\n\n\n', stderr=b'Error: remove_overlap: Graphviz not built with triangulation library\n') def check_returncode(self): """Raise CalledProcessError if the exit code is non-zero.""" if self.returncode: > raise CalledProcessError(self.returncode, self.args, self.stdout, self.stderr) E subprocess.CalledProcessError: Command '[PosixPath('dot'), '-Ksfdp', '-Tsvg']' returned non-zero exit status 1. /usr/lib64/python3.9/subprocess.py:460: CalledProcessError During handling of the above exception, another exception occurred: capsys = <_pytest.capture.CaptureFixture object at 0x7fd2df0e46a0>, engine = 'sfdp', format_ = 'svg', renderer = None, formatter = None, pattern = '(?s)^<\\?xml .+\\s*$' data = b'graph { spam }' @pytest.mark.exe @pytest.mark.parametrize( 'engine, format_, renderer, formatter, pattern', [('dot', 'svg', None, None, SVG_PATTERN), ('dot', 'ps', 'ps', 'core', r'%!PS-'), # Error: remove_overlap: Graphviz not built with triangulation library pytest.param('sfdp', 'svg', None, None, SVG_PATTERN, marks=pytest.mark.xfail('graphviz.version() > (2, 38, 0)' " and platform.system().lower() == 'windows'", reason='https://gitlab.com/graphviz/graphviz/-/issues/1269'))]) def test_pipe(capsys, engine, format_, renderer, formatter, pattern, data=b'graph { spam }'): with pytest.deprecated_call(match=r'3 positional args'): > out = graphviz.pipe(engine, format_, data, renderer, formatter).decode('ascii') tests/backend/test_piping.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ graphviz/_tools.py:176: in wrapper return func(*args, **kwargs) graphviz/backend/piping.py:59: in pipe proc = execute.run_check(cmd, capture_output=True, quiet=quiet, **kwargs) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ cmd = [PosixPath('dot'), '-Ksfdp', '-Tsvg'], input_lines = None, encoding = None, quiet = False, kwargs = {'capture_output': True, 'input': b'graph { spam }', 'startupinfo': None} proc = CompletedProcess(args=[PosixPath('dot'), '-Ksfdp', '-Tsvg'], returncode=1, stdout=b'spam\n\n\n\n', stderr=b'Error: remove_overlap: Graphviz not built with triangulation library\n') def run_check(cmd: typing.Sequence[typing.Union[os.PathLike, str]], *, input_lines: typing.Optional[BytesOrStrIterator] = None, encoding: typing.Optional[str] = None, quiet: bool = False, **kwargs) -> subprocess.CompletedProcess: """Run the command described by ``cmd`` with ``check=True`` and return its completed process. Raises: CalledProcessError: if the returncode of the subprocess is non-zero. """ log.debug('run %r', cmd) if not kwargs.pop('check', True): # pragma: no cover raise NotImplementedError('check must be True or omited') if encoding is not None: kwargs['encoding'] = encoding kwargs.setdefault('startupinfo', _compat.get_startupinfo()) try: if input_lines is not None: assert kwargs.get('input') is None assert iter(input_lines) is input_lines if kwargs.pop('capture_output'): kwargs['stdout'] = kwargs['stderr'] = subprocess.PIPE proc = _run_input_lines(cmd, input_lines, kwargs=kwargs) else: proc = subprocess.run(cmd, **kwargs) except OSError as e: if e.errno == errno.ENOENT: raise ExecutableNotFound(cmd) from e raise if not quiet and proc.stderr: _write_stderr(proc.stderr) try: proc.check_returncode() except subprocess.CalledProcessError as e: > raise CalledProcessError(*e.args) E graphviz.backend.execute.CalledProcessError: Command '[PosixPath('dot'), '-Ksfdp', '-Tsvg']' returned non-zero exit status 1. [stderr: b'Error: remove_overlap: Graphviz not built with triangulation library\n'] graphviz/backend/execute.py:90: CalledProcessError ------------------------------------------------------------------------------------ Captured log setup ------------------------------------------------------------------------------------- DEBUG graphviz.backend.execute:execute.py:61 run [PosixPath('dot'), '-V'] ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ Error: remove_overlap: Graphviz not built with triangulation library ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- DEBUG graphviz.backend.execute:execute.py:61 run [PosixPath('dot'), '-V'] DEBUG graphviz.backend.execute:execute.py:61 run [PosixPath('dot'), '-Ksfdp', '-Tsvg'] DEBUG graphviz.backend.execute:execute.py:61 run [PosixPath('dot'), '-V'] ===================================================================================== warnings summary ====================================================================================== README.rst::README.rst /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/rendering.py:118: PendingDeprecationWarning: The signature of save will be reduced to 1 positional arg ['filename']: pass directory='doctest-output/round-table.gv' as keyword arg(s) filepath = self.save(filename, directory=directory, skip_existing=None) docs/basic_usage.rst: 1 warning docs/escapes.rst: 1 warning docs/formats.rst: 1 warning docs/neato_no_op.rst: 1 warning docs/quoting.rst: 1 warning docs/subgraphs_and_clusters.rst: 1 warning graphviz/rendering.py: 1 warning tests/test_all_classes.py: 3 warnings /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/rendering.py:118: PendingDeprecationWarning: The signature of save will be reduced to 1 positional arg ['filename']: pass directory=None as keyword arg(s) filepath = self.save(filename, directory=directory, skip_existing=None) docs/raw_dot.rst::raw_dot.rst :1: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='digraph "the holy hand grenade" { rankdir=LR; 1 -> 2 -> 3 -> lob }' as keyword arg(s) docs/raw_dot.rst::raw_dot.rst /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/rendering.py:118: PendingDeprecationWarning: The signature of save will be reduced to 1 positional arg ['filename']: pass directory='doctest-output/holy-grenade.gv' as keyword arg(s) filepath = self.save(filename, directory=directory, skip_existing=None) docs/unflatten.rst::unflatten.rst /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/unflattening.py:55: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='digraph wide {\n\t0 -> 1\t[minlen=1];\n\t0 -> 2\t[minlen=2];\n\t0 -> 3\t[minlen=3];\n\t0 -> 4\t[minlen=1];\n\t0 -> 5\t[minlen=2];\n\t0 -> 6\t[minlen=3];\n\t0 -> 7\t[minlen=1];\n\t0 -> 8\t[minlen=2];\n\t0 -> 9\t[minlen=3];\n}\n' as keyword arg(s) return sources.Source(out, docs/unflatten.rst::unflatten.rst /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/unflattening.py:55: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='digraph wide {\n\t0 -> 1\t[minlen=1];\n\t0 -> 2\t[minlen=2];\n\t0 -> 3\t[minlen=1];\n\t0 -> 4\t[minlen=2];\n\t0 -> 5\t[minlen=1];\n\t0 -> 6\t[minlen=2];\n\t0 -> 7\t[minlen=1];\n\t0 -> 8\t[minlen=2];\n\t0 -> 9\t[minlen=1];\n}\n' as keyword arg(s) return sources.Source(out, graphviz/graphs.py::graphviz.graphs /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/rendering.py:118: PendingDeprecationWarning: The signature of save will be reduced to 1 positional arg ['filename']: pass directory='doctest-output/m00se.gv' as keyword arg(s) filepath = self.save(filename, directory=directory, skip_existing=None) graphviz/piping.py::graphviz.piping.Pipe.pipe :1: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='graph { spam }' as keyword arg(s) graphviz/piping.py::graphviz.piping.Pipe.pipe :1: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='graph { spam }' as keyword arg(s) graphviz/piping.py::graphviz.piping.Pipe.pipe :1: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='graph { spam }' as keyword arg(s) graphviz/rendering.py::graphviz.rendering.Render.render /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/rendering.py:118: PendingDeprecationWarning: The signature of save will be reduced to 1 positional arg ['filename']: pass directory=PosixPath('doctest-output/spam.gv') as keyword arg(s) filepath = self.save(filename, directory=directory, skip_existing=None) tests/test_all_classes.py: 30 warnings /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_all_classes.py:23: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='digraph { hello -> world }\n' as keyword arg(s) return cls('digraph { hello -> world }\n') tests/test_all_classes.py::test_render_raises_before_save[Source-kwargs0] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_all_classes.py:74: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='graph { spam }' as keyword arg(s) dot = cls(*args, filename=filename, directory=tmp_path) tests/test_all_classes.py::test_render_raises_before_save_mocked[Source-kwargs0] tests/test_all_classes.py::test_render_raises_before_save_mocked[Source-kwargs1] tests/test_all_classes.py::test_render_raises_before_save_mocked[Source-kwargs2] tests/test_all_classes.py::test_render_raises_before_save_mocked[Source-kwargs3] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_all_classes.py:97: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='' as keyword arg(s) dot = cls(*args, filename=filename, directory=tmp_path) tests/test_all_classes.py::test_format_renderer_formatter_mocked[quiet=False-Source] tests/test_all_classes.py::test_format_renderer_formatter_mocked[quiet=True-Source] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_all_classes.py:162: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='' as keyword arg(s) dot = cls(*[''] if cls.__name__ == 'Source' else [], tests/test_all_classes.py: 12 warnings /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_all_classes.py:190: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='' as keyword arg(s) dot = cls(*[''] if cls.__name__ == 'Source' else [], tests/test_all_classes.py::test_pipe_lines_called_process_error[Source] tests/test_all_classes.py::test_pipe_lines_called_process_error_mocked[Source] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_all_classes.py:30: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='graph { spam -- \\ }' as keyword arg(s) return cls('graph { spam -- \\ }') tests/test_all_classes.py::test_unflatten[Graph] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/unflattening.py:55: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='graph {\n}\n' as keyword arg(s) return sources.Source(out, tests/test_all_classes.py::test_unflatten[Digraph] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/unflattening.py:55: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='digraph {\n}\n' as keyword arg(s) return sources.Source(out, tests/test_all_classes.py::test_unflatten[Source] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/unflattening.py:55: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='digraph {\n\thello -> world;\n}\n' as keyword arg(s) return sources.Source(out, tests/test_all_classes.py::test_unflatten_mocked[Graph] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/unflattening.py:55: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename= as keyword arg(s) return sources.Source(out, tests/test_all_classes.py::test_unflatten_mocked[Digraph] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/unflattening.py:55: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename= as keyword arg(s) return sources.Source(out, tests/test_all_classes.py::test_unflatten_mocked[Source] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/unflattening.py:55: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename= as keyword arg(s) return sources.Source(out, tests/test_graphs.py::test_subgraph_render[Graph-...] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/rendering.py:118: PendingDeprecationWarning: The signature of save will be reduced to 1 positional arg ['filename']: pass directory='/tmp/pytest-of-tkloczko/pytest-83/test_subgraph_render_Graph____0/s1.gv' as keyword arg(s) filepath = self.save(filename, directory=directory, skip_existing=None) tests/test_graphs.py::test_subgraph_render[Digraph-...] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/rendering.py:118: PendingDeprecationWarning: The signature of save will be reduced to 1 positional arg ['filename']: pass directory='/tmp/pytest-of-tkloczko/pytest-83/test_subgraph_render_Digraph__0/s1.gv' as keyword arg(s) filepath = self.save(filename, directory=directory, skip_existing=None) tests/test_parameters.py::test_parameters[Source] /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_parameters.py:17: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='' as keyword arg(s) dot = cls(*args, tests/test_saving.py::test_saves_source_from_file /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_saving.py:9: PendingDeprecationWarning: The signature of from_file will be reduced to 1 positional arg ['filename']: pass directory=PosixPath('/tmp/pytest-of-tkloczko/pytest-83/test_saves_source_from_file0/spam.gv') as keyword arg(s) source = graphviz.Source.from_file(path) tests/test_saving.py::test_saves_source_from_file /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/graphviz/sources.py:70: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='graph spam { spam }' as keyword arg(s) return cls(source, tests/test_sources.py::test_init_filename /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_sources.py:32: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='' as keyword arg(s) assert graphviz.Source('').filename == 'Source.gv' tests/test_sources.py::test_init_filename /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_sources.py:33: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='' as keyword arg(s) assert type('Subcls', (graphviz.Source,), tests/test_sources.py::test_source_iter /home/tkloczko/rpmbuild/BUILD/graphviz-0.20.2/tests/test_sources.py:75: PendingDeprecationWarning: The signature of __init__ will be reduced to 1 positional arg ['source']: pass filename='digraph { hello -> world }\ndigraph { hello -> world }' as keyword arg(s) source_without_newline = graphviz.Source(source.source + source.source.rstrip()) -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =================================================================================== slowest 10 durations ==================================================================================== 0.09s call graphviz/backend/rendering.py::graphviz.backend.rendering.render 0.09s call graphviz/piping.py::graphviz.piping.Pipe.pipe 0.08s call graphviz/jupyter_integration.py::graphviz.jupyter_integration.JupyterIntegration._repr_mimebundle_ 0.05s call tests/backend/test_rendering.py::test_render[dot-plain-dot-core-core.dot.plain] 0.05s call docs/piped_output.rst::piped_output.rst 0.05s call tests/backend/test_piping.py::test_pipe[sfdp-svg-None-None-(?s)^<\\?xml .+\\s*$] 0.04s setup tests/backend/test_execute.py::test_run_check_input_lines_mocked 0.04s call tests/backend/test_piping.py::test_pipe_invalid_data[quiet=False] 0.04s call tests/backend/test_piping.py::test_pipe_invalid_data[quiet=True] 0.04s call graphviz/graphs.py::graphviz.graphs ================================================================================== short test summary info ================================================================================== FAILED graphviz/jupyter_integration.py::graphviz.jupyter_integration.JupyterIntegration._repr_mimebundle_ FAILED tests/backend/test_piping.py::test_pipe[sfdp-svg-None-None-(?s)^<\\?xml .+\\s*$] - graphviz.backend.execute.CalledProcessError: Command '[PosixPath('dot'), '-Ksfdp', '-Tsvg']' returned non-zero exit status 1. [stderr: b'Error: remove_overlap: Graphviz not built with ... ======================================================================== 2 failed, 367 passed, 85 warnings in 4.55s ========================================================================= ```

Sorry for longer output but I cannot find where is enabled pytest verbose mode (I cannot find anytinig about that in pytest options in setup.cfg)

xflr6 commented 3 months ago

Looks like it is some conflict between tests/backend/conftest.py and tests/conftest.py

AFAICT this is due to a bug in pytest 8.1.1:

See https://github.com/xflr6/graphviz/blob/78daf45dfa779370c542375995d4e59d86d2c1bd/setup.py#L25

xflr6 commented 3 months ago

pytest passes scanning test units with --import-mode=importlib and it fails in two units

The FAILED tests hint at an issue with the upstream graphviz version you are using (or its build dependencies).

Built without jpeg support?

graphviz.backend.execute.CalledProcessError: Command '[PosixPath('dot'), '-Kdot', '-Tjpeg']' returned non-zero exit status 1.
[stderr: b'Format: "jpeg" not recognized. Use one of: canon cmap cmapx cmapx_np dot dot_json eps fig gv imap imap_np ismap json json0 kitty kittyz mp pdf pic plain plain-ext png pov ps ps2 svg svg_inline svgz tk vt vt-24bit webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib\n']

Built without triangulation library (seems to be the same as https://github.com/xflr6/graphviz/issues/190)?

CompletedProcess(args=[PosixPath('dot'), '-Ksfdp', '-Tsvg'], returncode=1, stdout=b'<?xml version="1.0" encoding="UTF-...">spam</text>\n</g>\n</g>\n</svg>\n',
stderr=b'Error: remove_overlap: Graphviz not built with triangulation library\n')

Both pass here under Ubuntu 22.04.4 with upstream graphviz version 2.43.0.

Side note: The upstream Windows version has had the triangulation issue for a while now:

https://github.com/xflr6/graphviz/blob/78daf45dfa779370c542375995d4e59d86d2c1bd/.github/workflows/build.yaml#L143

xflr6 commented 3 months ago

and shows some warnings

Thanks. I think pytest has got more strict about warnings recently. These are all our own warnings about arguments that should be turned into keyword-only arguments (we already check pytest.deprecated_call for them in some tests, but maybe have missed some or should start using the keyword-argument ourselves):

PendingDeprecationWarning: The signature of save will be reduced to 1 positional arg ['filename']:
pass directory='doctest-output/round-table.gv' as keyword arg(s)
    filepath = self.save(filename, directory=directory, skip_existing=None)

For now I have added a note to use -W ignore:"The signature of":PendingDeprecationWarning in https://graphviz.readthedocs.io/en/stable/release_process.html (7fab480418ebdf5f4b19b24c985b853542c97439).

Side note: I did not manage to specify the module for -W as wanted yet.

xflr6 commented 3 months ago

I think pytest has got more strict about warnings recently.

Hm, or maybe I messed up in e5578d39009469df2b7c6743458970643e228226?

Either way, opened #218 for this.

kloczek commented 3 months ago

Looks like it is some conflict between tests/backend/conftest.py and tests/conftest.py

AFAICT this is due to a bug in pytest 8.1.1:

See

https://github.com/xflr6/graphviz/blob/78daf45dfa779370c542375995d4e59d86d2c1bd/setup.py#L25

Ha .. good catch ๐Ÿ˜„ Thx to let me know ๐Ÿ‘

Either way, opened https://github.com/xflr6/graphviz/issues/218 for this.

Subscribed., Thx ๐Ÿ˜‹

EOT