Hello community,

here is the log from the commit of package python-pydot for openSUSE:Factory 
checked in at 2019-04-08 10:32:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pydot (Old)
 and      /work/SRC/openSUSE:Factory/.python-pydot.new.3908 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pydot"

Mon Apr  8 10:32:21 2019 rev:8 rq:691521 version:1.4.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pydot/python-pydot.changes        
2018-12-24 11:46:24.713185461 +0100
+++ /work/SRC/openSUSE:Factory/.python-pydot.new.3908/python-pydot.changes      
2019-04-08 10:32:27.511268002 +0200
@@ -1,0 +2,18 @@
+Thu Apr  4 12:58:15 UTC 2019 - Tomáš Chvátal <tchva...@suse.com>
+
+- Skip one failing test:
+  * pydot-skip-test.patch
+- Enable testsuite and add tests dependencies
+
+-------------------------------------------------------------------
+Tue Apr  2 12:56:07 UTC 2019 - Colleen Murphy <comur...@suse.com>
+
+- Update to 1.4.1:
+  * Make graph, edge, node attributes order deterministic
+  *  Fix string formatting after catching error (#201)
+  * Installation of pydot in conda env on Windows directly supported
+  * Fixed comparing of SHA hash in regression tests (which fail now)
+  * Dropped Python 2.6 support (#185)
+  * Move errno from os to builtin. Fixes #177 (#191, #182)
+
+-------------------------------------------------------------------

Old:
----
  pydot-1.2.4.tar.gz

New:
----
  pydot-1.4.1.tar.gz
  pydot-skip-test.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-pydot.spec ++++++
--- /var/tmp/diff_new_pack.btkXpb/_old  2019-04-08 10:32:28.723266461 +0200
+++ /var/tmp/diff_new_pack.btkXpb/_new  2019-04-08 10:32:28.727266455 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-pydot
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,19 +18,26 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-pydot
-Version:        1.2.4
+Version:        1.4.1
 Release:        0
 Summary:        Module to create (dot) graphs from Python
 License:        MIT
 Group:          Development/Libraries/Python
 URL:            https://github.com/erocarrera/pydot
 Source:         
https://files.pythonhosted.org/packages/source/p/pydot/pydot-%{version}.tar.gz
+# https://github.com/pydot/pydot/issues/204
+Patch0:         pydot-skip-test.patch
+BuildRequires:  %{python_module chardet}
 BuildRequires:  %{python_module pyparsing >= 2.1.4}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
+BuildRequires:  ghostscript-fonts-std
+BuildRequires:  graphviz
+BuildRequires:  graphviz-gd
 BuildRequires:  python-rpm-macros
 Requires:       graphviz
 Requires:       python-pyparsing >= 2.1.4
+Recommends:     graphviz-gd
 BuildArch:      noarch
 %python_subpackages
 
@@ -41,6 +48,7 @@
 
 %prep
 %setup -q -n pydot-%{version}
+%patch0 -p1
 
 %build
 %python_build
@@ -49,6 +57,9 @@
 %python_install
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
+%check
+%python_expand PYTHONPATH=%{buildroot}%{$python_sitelib} $python 
test/pydot_unittest.py --no-check
+
 %files %{python_files}
 %license LICENSE
 %doc README.md

++++++ pydot-1.2.4.tar.gz -> pydot-1.4.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/ChangeLog new/pydot-1.4.1/ChangeLog
--- old/pydot-1.2.4/ChangeLog   2017-12-25 17:36:05.000000000 +0100
+++ new/pydot-1.4.1/ChangeLog   2018-12-12 21:59:45.000000000 +0100
@@ -1,7 +1,29 @@
 # `pydot` changelog
 
 
-## 1.2.4 (2017-12-25)
+1.4.1 (2018-12-12)
+------------------
+
+- Make graph, edge, node attributes order deterministic
+- Fix string formatting after catching error (#201)
+
+
+1.4.0 (2018-12-01)
+------------------
+
+- Installation of pydot in conda env on Windows directly supported
+- Fixed comparing of SHA hash in regression tests (which fail now)
+
+
+1.3.0 (2018-11-19)
+------------------
+
+- Dropped Python 2.6 support (#185)
+- Move errno from os to builtin. Fixes #177 (#191, #182)
+
+
+1.2.4 (2017-12-25)
+------------------
 
 - ENH: propagate `LD_LIBRARY_PATH` when calling GraphViz
 - API: raise `OSError` when a GraphViz executable is not found
@@ -12,14 +34,16 @@
 - API: never ignore `src, dst`, overwrite if `points` defined in `obj_dict`
 
 
-## 1.2.3 (2016-10-06)
+1.2.3 (2016-10-06)
+------------------
 
 - support Python 2.6
 - several corrections
 - quote empty strings to avoid graphviz errors
 
 
-## 1.2.0 (2016-07-01)
+1.2.0 (2016-07-01)
+------------------
 
 - support Python 3
 - bumped dependency to `pyparsing >= 2.1.4`
@@ -61,7 +85,8 @@
 - rm attribute `pydot.Dot.progs`
 
 
-## 1.1.0 (2016-05-23)
+1.1.0 (2016-05-23)
+------------------
 
 - compatibility with `pyparsing >= 1.5.7`
 
@@ -72,7 +97,8 @@
   instead of `print`
 
 
-## 1.0.29 (2016-05-16)
+1.0.29 (2016-05-16)
+------------------
 
 - Maintenance release that keeps the same API
 - pin `pyparsing == 1.5.7`
@@ -97,7 +123,7 @@
 2004-04-24 13:26  carrer
 
        * ChangeLog, LICENSE, MANIFEST, README, setup.py: Adding
-         suplementary files to the distribution to the CVS.
+         supplementary files to the distribution to the CVS.
 
 2004-04-24 12:57  carrer
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/PKG-INFO new/pydot-1.4.1/PKG-INFO
--- old/pydot-1.2.4/PKG-INFO    2017-12-25 17:42:01.000000000 +0100
+++ new/pydot-1.4.1/PKG-INFO    2018-12-12 22:00:23.000000000 +0100
@@ -1,21 +1,71 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: pydot
-Version: 1.2.4
+Version: 1.4.1
 Summary: Python interface to Graphviz's Dot
-Home-page: https://github.com/erocarrera/pydot
-Author: Ioannis Filippidis
-Author-email: jfilippi...@gmail.com
+Home-page: https://github.com/pydot/pydot
+Author: Ero Carrera
+Author-email: e...@dkbza.org
+Maintainer: Sebastian Kalinowski
+Maintainer-email: sebast...@kalinowski.eu
 License: MIT
-Description-Content-Type: UNKNOWN
-Description: 
-        A Python interface to GraphViz and the DOT language.
+Description: [![Build 
Status](https://www.travis-ci.com/pydot/pydot.svg?branch=master)](https://www.travis-ci.com/pydot/pydot)
+        
[![PyPI](https://img.shields.io/pypi/v/pydot.svg)](https://pypi.org/project/pydot/)
         
-        This package includes an interface to GraphViz [1], with classes to 
represent
-        graphs and dump them in the DOT language [2], and a parser from DOT.
         
+        About
+        =====
         
-        [1] http://www.graphviz.org
-        [2] http://www.graphviz.org/doc/info/lang.html
+        `pydot`:
+        
+          - is an interface to [Graphviz][1]
+          - can parse and dump into the [DOT language][2] used by GraphViz,
+          - is written in pure Python,
+        
+        and [`networkx`][3] can convert its graphs to `pydot`.
+        Development occurs at [GitHub][11] (under branch `dev`),
+        where you can report issues and contribute code.
+        
+        
+        Installation
+        ============
+        
+        From [PyPI][4] using [`pip`][5]:
+        
+        `pip install pydot`
+        
+        From source:
+        
+        `python setup.py install`
+        
+        
+        Dependencies
+        ============
+        
+        - [`pyparsing`][6]: used only for *loading* DOT files,
+          installed automatically during `pydot` installation.
+        
+        - GraphViz: used to render graphs as PDF, PNG, SVG, etc.
+          Should be installed separately, using your system's
+          [package manager][7], something similar (e.g., [MacPorts][8]),
+          or from [its source][9].
+        
+        
+        License
+        =======
+        
+        Distributed under an [MIT license][10].
+        
+        [1]: https://www.graphviz.org
+        [2]: https://en.wikipedia.org/wiki/DOT_%28graph_description_language%29
+        [3]: https://github.com/networkx/networkx
+        [4]: https://pypi.python.org/pypi
+        [5]: https://github.com/pypa/pip
+        [6]: https://github.com/pyparsing/pyparsing
+        [7]: https://en.wikipedia.org/wiki/Package_manager
+        [8]: https://www.macports.org
+        [9]: https://github.com/ellson/graphviz
+        [10]: https://github.com/pydot/pydot/blob/master/LICENSE
+        [11]: https://github.com/pydot/pydot
         
 Keywords: graphviz dot graphs visualization
 Platform: UNKNOWN
@@ -25,7 +75,7 @@
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.4
@@ -34,3 +84,5 @@
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Topic :: Scientific/Engineering :: Visualization
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
+Description-Content-Type: text/markdown
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/README.md new/pydot-1.4.1/README.md
--- old/pydot-1.2.4/README.md   2017-12-25 17:35:47.000000000 +0100
+++ new/pydot-1.4.1/README.md   2018-11-30 22:23:39.000000000 +0100
@@ -1,4 +1,5 @@
-[![Build Status][build_img]][travis]
+[![Build 
Status](https://www.travis-ci.com/pydot/pydot.svg?branch=master)](https://www.travis-ci.com/pydot/pydot)
+[![PyPI](https://img.shields.io/pypi/v/pydot.svg)](https://pypi.org/project/pydot/)
 
 
 About
@@ -11,7 +12,7 @@
   - is written in pure Python,
 
 and [`networkx`][3] can convert its graphs to `pydot`.
-Development occurs at [github][11] (under branch `dev`),
+Development occurs at [GitHub][11] (under branch `dev`),
 where you can report issues and contribute code.
 
 
@@ -44,16 +45,14 @@
 
 Distributed under an [MIT license][10].
 
-[1]: http://www.graphviz.org
+[1]: https://www.graphviz.org
 [2]: https://en.wikipedia.org/wiki/DOT_%28graph_description_language%29
 [3]: https://github.com/networkx/networkx
 [4]: https://pypi.python.org/pypi
 [5]: https://github.com/pypa/pip
-[6]: http://pyparsing.wikispaces.com/
+[6]: https://github.com/pyparsing/pyparsing
 [7]: https://en.wikipedia.org/wiki/Package_manager
 [8]: https://www.macports.org
 [9]: https://github.com/ellson/graphviz
-[10]: https://github.com/erocarrera/pydot/blob/master/LICENSE
-[11]: https://github.com/erocarrera/pydot
-[build_img]: https://travis-ci.org/erocarrera/pydot.svg?branch=master
-[travis]: https://travis-ci.org/erocarrera/pydot
+[10]: https://github.com/pydot/pydot/blob/master/LICENSE
+[11]: https://github.com/pydot/pydot
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/pydot.egg-info/PKG-INFO 
new/pydot-1.4.1/pydot.egg-info/PKG-INFO
--- old/pydot-1.2.4/pydot.egg-info/PKG-INFO     2017-12-25 17:42:01.000000000 
+0100
+++ new/pydot-1.4.1/pydot.egg-info/PKG-INFO     2018-12-12 22:00:22.000000000 
+0100
@@ -1,21 +1,71 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: pydot
-Version: 1.2.4
+Version: 1.4.1
 Summary: Python interface to Graphviz's Dot
-Home-page: https://github.com/erocarrera/pydot
-Author: Ioannis Filippidis
-Author-email: jfilippi...@gmail.com
+Home-page: https://github.com/pydot/pydot
+Author: Ero Carrera
+Author-email: e...@dkbza.org
+Maintainer: Sebastian Kalinowski
+Maintainer-email: sebast...@kalinowski.eu
 License: MIT
-Description-Content-Type: UNKNOWN
-Description: 
-        A Python interface to GraphViz and the DOT language.
+Description: [![Build 
Status](https://www.travis-ci.com/pydot/pydot.svg?branch=master)](https://www.travis-ci.com/pydot/pydot)
+        
[![PyPI](https://img.shields.io/pypi/v/pydot.svg)](https://pypi.org/project/pydot/)
         
-        This package includes an interface to GraphViz [1], with classes to 
represent
-        graphs and dump them in the DOT language [2], and a parser from DOT.
         
+        About
+        =====
         
-        [1] http://www.graphviz.org
-        [2] http://www.graphviz.org/doc/info/lang.html
+        `pydot`:
+        
+          - is an interface to [Graphviz][1]
+          - can parse and dump into the [DOT language][2] used by GraphViz,
+          - is written in pure Python,
+        
+        and [`networkx`][3] can convert its graphs to `pydot`.
+        Development occurs at [GitHub][11] (under branch `dev`),
+        where you can report issues and contribute code.
+        
+        
+        Installation
+        ============
+        
+        From [PyPI][4] using [`pip`][5]:
+        
+        `pip install pydot`
+        
+        From source:
+        
+        `python setup.py install`
+        
+        
+        Dependencies
+        ============
+        
+        - [`pyparsing`][6]: used only for *loading* DOT files,
+          installed automatically during `pydot` installation.
+        
+        - GraphViz: used to render graphs as PDF, PNG, SVG, etc.
+          Should be installed separately, using your system's
+          [package manager][7], something similar (e.g., [MacPorts][8]),
+          or from [its source][9].
+        
+        
+        License
+        =======
+        
+        Distributed under an [MIT license][10].
+        
+        [1]: https://www.graphviz.org
+        [2]: https://en.wikipedia.org/wiki/DOT_%28graph_description_language%29
+        [3]: https://github.com/networkx/networkx
+        [4]: https://pypi.python.org/pypi
+        [5]: https://github.com/pypa/pip
+        [6]: https://github.com/pyparsing/pyparsing
+        [7]: https://en.wikipedia.org/wiki/Package_manager
+        [8]: https://www.macports.org
+        [9]: https://github.com/ellson/graphviz
+        [10]: https://github.com/pydot/pydot/blob/master/LICENSE
+        [11]: https://github.com/pydot/pydot
         
 Keywords: graphviz dot graphs visualization
 Platform: UNKNOWN
@@ -25,7 +75,7 @@
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.4
@@ -34,3 +84,5 @@
 Classifier: Programming Language :: Python :: 3.7
 Classifier: Topic :: Scientific/Engineering :: Visualization
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
+Description-Content-Type: text/markdown
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/pydot.egg-info/SOURCES.txt 
new/pydot-1.4.1/pydot.egg-info/SOURCES.txt
--- old/pydot-1.2.4/pydot.egg-info/SOURCES.txt  2017-12-25 17:42:01.000000000 
+0100
+++ new/pydot-1.4.1/pydot.egg-info/SOURCES.txt  2018-12-12 22:00:22.000000000 
+0100
@@ -5,6 +5,7 @@
 dot_parser.py
 pydot.py
 requirements.txt
+setup.cfg
 setup.py
 pydot.egg-info/PKG-INFO
 pydot.egg-info/SOURCES.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/pydot.py new/pydot-1.4.1/pydot.py
--- old/pydot-1.2.4/pydot.py    2017-12-25 17:35:47.000000000 +0100
+++ new/pydot-1.4.1/pydot.py    2018-12-12 21:59:45.000000000 +0100
@@ -3,6 +3,7 @@
 from __future__ import print_function
 import copy
 import io
+import errno
 import os
 import re
 import subprocess
@@ -19,7 +20,7 @@
 
 
 __author__ = 'Ero Carrera'
-__version__ = '1.2.4'
+__version__ = '1.4.1'
 __license__ = 'MIT'
 
 
@@ -30,7 +31,7 @@
     str_type = basestring
 
 
-GRAPH_ATTRIBUTES = set( ['Damping', 'K', 'URL', 'aspect', 'bb', 'bgcolor',
+GRAPH_ATTRIBUTES = { 'Damping', 'K', 'URL', 'aspect', 'bb', 'bgcolor',
     'center', 'charset', 'clusterrank', 'colorscheme', 'comment', 'compound',
     'concentrate', 'defaultdist', 'dim', 'dimen', 'diredgeconstraints',
     'dpi', 'epsilon', 'esep', 'fontcolor', 'fontname', 'fontnames',
@@ -45,10 +46,10 @@
     'showboxes', 'size', 'smoothing', 'sortv', 'splines', 'start',
     'stylesheet', 'target', 'truecolor', 'viewport', 'voro_margin',
     # for subgraphs
-    'rank' ] )
+    'rank'  }
 
 
-EDGE_ATTRIBUTES = set( ['URL', 'arrowhead', 'arrowsize', 'arrowtail',
+EDGE_ATTRIBUTES = { 'URL', 'arrowhead', 'arrowsize', 'arrowtail',
     'color', 'colorscheme', 'comment', 'constraint', 'decorate', 'dir',
     'edgeURL', 'edgehref', 'edgetarget', 'edgetooltip', 'fontcolor',
     'fontname', 'fontsize', 'headURL', 'headclip', 'headhref', 'headlabel',
@@ -59,10 +60,10 @@
     'nojustify', 'penwidth', 'pos', 'samehead', 'sametail', 'showboxes',
     'style', 'tailURL', 'tailclip', 'tailhref', 'taillabel', 'tailport',
     'tailtarget', 'tailtooltip', 'target', 'tooltip', 'weight',
-    'rank' ] )
+    'rank'  }
 
 
-NODE_ATTRIBUTES = set( ['URL', 'color', 'colorscheme', 'comment',
+NODE_ATTRIBUTES = { 'URL', 'color', 'colorscheme', 'comment',
     'distortion', 'fillcolor', 'fixedsize', 'fontcolor', 'fontname',
     'fontsize', 'group', 'height', 'id', 'image', 'imagescale', 'label',
     'labelloc', 'layer', 'margin', 'nojustify', 'orientation', 'penwidth',
@@ -70,19 +71,79 @@
     'shape', 'shapefile', 'showboxes', 'sides', 'skew', 'sortv', 'style',
     'target', 'tooltip', 'vertices', 'width', 'z',
     # The following are attributes dot2tex
-    'texlbl',  'texmode' ] )
+    'texlbl',  'texmode'  }
 
 
-CLUSTER_ATTRIBUTES = set( ['K', 'URL', 'bgcolor', 'color', 'colorscheme',
+CLUSTER_ATTRIBUTES = { 'K', 'URL', 'bgcolor', 'color', 'colorscheme',
     'fillcolor', 'fontcolor', 'fontname', 'fontsize', 'label', 'labeljust',
     'labelloc', 'lheight', 'lp', 'lwidth', 'nojustify', 'pencolor',
-    'penwidth', 'peripheries', 'sortv', 'style', 'target', 'tooltip'] )
+    'penwidth', 'peripheries', 'sortv', 'style', 'target', 'tooltip' }
+
+
+DEFAULT_PROGRAMS = {
+    'dot',
+    'twopi',
+    'neato',
+    'circo',
+    'fdp',
+    'sfdp',
+}
+
+
+def is_windows():
+    # type: () -> bool
+    return os.name == 'nt'
+
+
+def is_anacoda():
+    # type: () -> bool
+    return os.path.exists(os.path.join(sys.prefix, 'conda-meta'))
+
+
+def get_executable_extension():
+    # type: () -> str
+    if is_windows():
+        return '.bat' if is_anacoda() else '.exe'
+    else:
+        return ''
+
+
+def call_graphviz(program, arguments, working_dir, **kwargs):
+    # explicitly inherit `$PATH`, on Windows too,
+    # with `shell=False`
+
+    if program in DEFAULT_PROGRAMS:
+        extension = get_executable_extension()
+        program += extension
+
+    if arguments is None:
+        arguments = []
+
+    env = {
+        'PATH': os.environ.get('PATH', ''),
+        'LD_LIBRARY_PATH': os.environ.get('LD_LIBRARY_PATH', ''),
+    }
+
+    program_with_args = [program, ] + arguments
+
+    process = subprocess.Popen(
+        program_with_args,
+        env=env,
+        cwd=working_dir,
+        shell=False,
+        stderr=subprocess.PIPE,
+        stdout=subprocess.PIPE,
+        **kwargs
+    )
+    stdout_data, stderr_data = process.communicate()
+
+    return stdout_data, stderr_data, process
 
 
 #
-# Extented version of ASPN's Python Cookbook Recipe:
+# Extended version of ASPN's Python Cookbook Recipe:
 # Frozen dictionaries.
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/414283
+# https://code.activestate.com/recipes/414283/
 #
 # This version freezes dictionaries used as values within dictionaries.
 #
@@ -600,7 +661,7 @@
 
         node_attr = list()
 
-        for attr in self.obj_dict['attributes']:
+        for attr in sorted(self.obj_dict['attributes']):
             value = self.obj_dict['attributes'][attr]
             if value == '':
                 value = '""'
@@ -642,7 +703,7 @@
     All the attributes defined in the Graphviz dot language should
     be supported.
 
-       Attributes can be set through the dynamically generated methods:
+        Attributes can be set through the dynamically generated methods:
 
      set_[attribute name], i.e. set_label, set_fontname
 
@@ -795,7 +856,7 @@
 
         edge_attr = list()
 
-        for attr in self.obj_dict['attributes']:
+        for attr in sorted(self.obj_dict['attributes']):
             value = self.obj_dict['attributes'][attr]
             if value == '':
                 value = '""'
@@ -1433,7 +1494,7 @@
             name=self.obj_dict['name'])
         graph.append(s)
 
-        for attr in self.obj_dict['attributes']:
+        for attr in sorted(self.obj_dict['attributes']):
 
             if self.obj_dict['attributes'].get(attr, None) is not None:
 
@@ -1758,7 +1819,6 @@
                 f.write(s)
         return True
 
-
     def create(self, prog=None, format='ps', encoding=None):
         """Creates and returns a binary image for the graph.
 
@@ -1817,24 +1877,23 @@
           then you may want to give the absolute path to the
           executable (for example, to `dot.exe`) in `prog`.
         """
-        default_names = set([
-            'dot', 'twopi', 'neato',
-            'circo', 'fdp', 'sfdp'])
+
         if prog is None:
             prog = self.prog
+
         assert prog is not None
+
         if isinstance(prog, (list, tuple)):
             prog, args = prog[0], prog[1:]
         else:
             args = []
-        if os.name == 'nt' and prog in default_names:
-            if not prog.endswith('.exe'):
-                prog += '.exe'
+
         # temp file
         tmp_fd, tmp_name = tempfile.mkstemp()
         os.close(tmp_fd)
         self.write(tmp_name, encoding=encoding)
         tmp_dir = os.path.dirname(tmp_name)
+
         # For each of the image files...
         for img in self.shape_files:
             # Get its data
@@ -1846,40 +1905,43 @@
             f = open(os.path.join(tmp_dir, os.path.basename(img)), 'wb')
             f.write(f_data)
             f.close()
-        # explicitly inherit `$PATH`, on Windows too,
-        # with `shell=False`
-        env = dict()
-        env['PATH'] = os.environ.get('PATH', '')
-        env['LD_LIBRARY_PATH'] = os.environ.get('LD_LIBRARY_PATH', '')
-        cmdline = [prog, '-T' + format] + args + [tmp_name]
+
+        arguments = ['-T{}'.format(format), ] + args + [tmp_name]
+
         try:
-            p = subprocess.Popen(
-                cmdline,
-                env=env,
-                cwd=tmp_dir,
-                shell=False,
-                stderr=subprocess.PIPE, stdout=subprocess.PIPE)
+            stdout_data, stderr_data, process = call_graphviz(
+                program=prog,
+                arguments=arguments,
+                working_dir=tmp_dir,
+            )
         except OSError as e:
-            if e.errno == os.errno.ENOENT:
+            if e.errno == errno.ENOENT:
                 args = list(e.args)
                 args[1] = '"{prog}" not found in path.'.format(
                     prog=prog)
                 raise OSError(*args)
             else:
                 raise
-        stdout_data, stderr_data = p.communicate()
+
         # clean file litter
         for img in self.shape_files:
             os.unlink(os.path.join(tmp_dir, os.path.basename(img)))
+
         os.unlink(tmp_name)
-        # print(stdout_data)
-        if p.returncode != 0:
-            print(
-                ('{cmdline} return code: {c}\n\n'
-                 'stdout, stderr:\n {out}\n{err}\n').format(
-                     cmdline=cmdline,
-                     c=p.returncode,
-                     out=stdout_data,
-                     err=stderr_data))
-        assert p.returncode == 0, p.returncode
+
+        if process.returncode != 0:
+            message = (
+                '"{prog}" with args {arguments} returned code: {code}\n\n'
+                'stdout, stderr:\n {out}\n{err}\n'
+            ).format(
+                prog=prog,
+                arguments=arguments,
+                code=process.returncode,
+                out=stdout_data,
+                err=stderr_data,
+            )
+            print(message)
+
+        assert process.returncode == 0, process.returncode
+
         return stdout_data
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/requirements.txt 
new/pydot-1.4.1/requirements.txt
--- old/pydot-1.2.4/requirements.txt    2017-12-25 17:35:47.000000000 +0100
+++ new/pydot-1.4.1/requirements.txt    2018-12-05 22:07:40.000000000 +0100
@@ -1,4 +1,2 @@
 # dev
 chardet
-coveralls
-nose
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/setup.cfg new/pydot-1.4.1/setup.cfg
--- old/pydot-1.2.4/setup.cfg   2017-12-25 17:42:01.000000000 +0100
+++ new/pydot-1.4.1/setup.cfg   2018-12-12 22:00:23.000000000 +0100
@@ -1,3 +1,13 @@
+[bdist_wheel]
+universal = 1
+
+[zest.releaser]
+python-file-with-version = pydot.py
+release = no
+push-changes = no
+create-wheel = yes
+tag-format = v{version}
+
 [egg_info]
 tag_build = 
 tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/setup.py new/pydot-1.4.1/setup.py
--- old/pydot-1.2.4/setup.py    2017-12-25 17:41:37.000000000 +0100
+++ new/pydot-1.4.1/setup.py    2018-12-05 22:07:40.000000000 +0100
@@ -4,32 +4,43 @@
     from setuptools import setup
 except ImportError:
     from distutils.core import setup
-import pydot
 
+import ast
+import codecs
+import os
+import re
 
-long_description = '''
-A Python interface to GraphViz and the DOT language.
 
-This package includes an interface to GraphViz [1], with classes to represent
-graphs and dump them in the DOT language [2], and a parser from DOT.
+CURRENT_DIR = os.path.dirname(__file__)
 
 
-[1] http://www.graphviz.org
-[2] http://www.graphviz.org/doc/info/lang.html
-'''
+def get_long_description():
+    readme_path = os.path.join(CURRENT_DIR, "README.md")
+    with codecs.open(readme_path, encoding="utf8") as ld_file:
+        return ld_file.read()
+
+
+def get_version():
+    pydot_py = os.path.join(CURRENT_DIR, 'pydot.py')
+    _version_re = re.compile(r'__version__\s+=\s+(?P<version>.*)')
+    with codecs.open(pydot_py, 'r', encoding='utf8') as f:
+        match = _version_re.search(f.read())
+        version = match.group('version') if match is not None else '"unknown"'
+    return str(ast.literal_eval(version))
 
 
 setup(
     name='pydot',
-    version=pydot.__version__,
+    version=get_version(),
     description="Python interface to Graphviz's Dot",
     author='Ero Carrera',
     author_email='e...@dkbza.org',
-    maintainer='Ioannis Filippidis',
-    maintainer_email='jfilippi...@gmail.com',
-    url='https://github.com/erocarrera/pydot',
+    maintainer='Sebastian Kalinowski',
+    maintainer_email='sebast...@kalinowski.eu',
+    url='https://github.com/pydot/pydot',
     license='MIT',
     keywords='graphviz dot graphs visualization',
+    python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*',
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Intended Audience :: Developers',
@@ -37,7 +48,7 @@
         'License :: OSI Approved :: MIT License',
         'Natural Language :: English',
         'Operating System :: OS Independent',
-        'Programming Language :: Python :: 2.6',
+        'Programming Language :: Python :: 2',
         'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
         'Programming Language :: Python :: 3.4',
@@ -46,7 +57,8 @@
         'Programming Language :: Python :: 3.7',
         'Topic :: Scientific/Engineering :: Visualization',
         'Topic :: Software Development :: Libraries :: Python Modules'],
-    long_description=long_description,
+    long_description=get_long_description(),
+    long_description_content_type="text/markdown",
     py_modules=['pydot', 'dot_parser'],
     install_requires=['pyparsing>=2.1.4'],
     tests_require=['chardet'])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/test/graphs/url.dot 
new/pydot-1.4.1/test/graphs/url.dot
--- old/pydot-1.2.4/test/graphs/url.dot 2017-12-25 17:35:47.000000000 +0100
+++ new/pydot-1.4.1/test/graphs/url.dot 2018-11-26 21:31:46.000000000 +0100
@@ -1,25 +1,25 @@
 digraph G {
 
-  URL="http://www.graphviz.org/doc/info/output.html";
+  URL="https://www.graphviz.org/doc/info/output.html";
   label=output
-  lang [ URL="http://www.graphviz.org/doc/info/lang.html"; ]
+  lang [ URL="https://www.graphviz.org/doc/info/lang.html"; ]
    colors [
   style=filled
   fillcolor=lightblue
-  URL="http://www.graphviz.org/doc/info/output.html";
-label=<<table href="http://www.graphviz.org/doc/info/colors.html";><tr><td 
BGCOLOR="green">colors</td></tr></table>>];
+  URL="https://www.graphviz.org/doc/info/output.html";
+label=<<table href="https://www.graphviz.org/doc/info/colors.html";><tr><td 
BGCOLOR="green">colors</td></tr></table>>];
 
   subgraph cluster0 {
      style=filled
      fillcolor=yellow
-     URL="http://www.graphviz.org/doc/info/arrows.html";
+     URL="https://www.graphviz.org/doc/info/arrows.html";
      label=arrows
      command [ style=filled
         fillcolor=grey
-        URL="http://www.graphviz.org/doc/info/command.html"; ]
+        URL="https://www.graphviz.org/doc/info/command.html"; ]
      name [ URL="\G \N"]
   }
-  lang ->  command [ URL="http://www.graphviz.org/doc/info/shapes.html"; 
+  lang ->  command [ URL="https://www.graphviz.org/doc/info/shapes.html";
   ]
   lang -> colors [ URL="\E" edgetooltip=self ]
   lang -> size [ URL="headurl" edgetooltip=headurl headlabel=size 
headULR=headsize]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pydot-1.2.4/test/pydot_unittest.py 
new/pydot-1.4.1/test/pydot_unittest.py
--- old/pydot-1.2.4/test/pydot_unittest.py      2017-12-25 17:35:47.000000000 
+0100
+++ new/pydot-1.4.1/test/pydot_unittest.py      2018-12-10 09:01:14.000000000 
+0100
@@ -21,7 +21,7 @@
 import unittest
 
 
-DOT_BINARY_PATH = 'dot'
+TEST_PROGRAM = 'dot'
 TESTS_DIR_1 = 'my_tests'
 TESTS_DIR_2 = 'graphs'
 
@@ -72,9 +72,8 @@
         g.add_node(node)
         node.set('label', 'mine')
         s = g.to_string()
-        s_0 = 'digraph G {\nlegend [label=mine, shape=box];\n}\n'
-        s_1 = 'digraph G {\nlegend [shape=box, label=mine];\n}\n'
-        assert s == s_0 or s == s_1, (s, s_0)
+        expected = 'digraph G {\nlegend [label=mine, shape=box];\n}\n'
+        assert s == expected
 
     def test_attribute_with_implicit_value(self):
 
@@ -141,19 +140,16 @@
 
 
     def test_graph_with_shapefiles(self):
-
-        shapefile_dir = os.path.join(test_dir,
-                                     'from-past-to-future')
+        shapefile_dir = os.path.join(test_dir, 'from-past-to-future')
         # image files are omitted from sdist
         if not os.path.isdir(shapefile_dir):
             warnings.warn('Skipping tests that involve images, '
                           'they can be found in the `git` repository.')
             return
-        dot_file = os.path.join(shapefile_dir,
-                                'from-past-to-future.dot')
+        dot_file = os.path.join(shapefile_dir, 'from-past-to-future.dot')
 
 
-        pngs = dot_files = [
+        pngs = [
             os.path.join(shapefile_dir, fname) for
             fname in os.listdir(shapefile_dir)
             if fname.endswith('.png')]
@@ -185,20 +181,22 @@
 
     def _render_with_graphviz(self, filename, encoding):
         with io.open(filename, 'rt', encoding=encoding) as stdin:
-            p = subprocess.Popen(
-                [DOT_BINARY_PATH, '-Tjpe'],
-                cwd=os.path.dirname(filename),
+            stdout_data, stderr_data, process = pydot.call_graphviz(
+                program=TEST_PROGRAM,
+                arguments=['-Tjpe', ],
+                working_dir=os.path.dirname(filename),
                 stdin=stdin,
-                stdout=subprocess.PIPE,
-                stderr=subprocess.PIPE)
-        stdout_data, stderr_data = p.communicate()
+            )
+
+        assert process.returncode == 0, stderr_data
+
         return sha256(stdout_data).hexdigest()
 
     def _render_with_pydot(self, filename, encoding):
         c = pydot.graph_from_dot_file(filename, encoding=encoding)
         sha = ''
         for g in c:
-            jpe_data = g.create(format='jpe', encoding=encoding)
+            jpe_data = g.create(prog=TEST_PROGRAM, format='jpe', 
encoding=encoding)
             sha += sha256(jpe_data).hexdigest()
         return sha
 
@@ -228,8 +226,8 @@
             os.sys.stdout.write('#')
             os.sys.stdout.flush()
             pydot_sha = self._render_with_pydot(fpath, encoding)
-            pydot_sha = self._render_with_graphviz(fpath, encoding)
-            assert pydot_sha == pydot_sha, (pydot_sha, pydot_sha)
+            graphviz_sha = self._render_with_graphviz(fpath, encoding)
+            assert pydot_sha == graphviz_sha, (pydot_sha, graphviz_sha)
 
     def test_numeric_node_id(self):
 
@@ -295,15 +293,15 @@
 
         self._reset_graphs()
 
-        names = set([ 'node_%05d' % i for i in range(10**3) ])
+        names = { 'node_%05d' % i for i in range(10**3) }
 
         for name in names:
 
             self.graph_directed.add_node( pydot.Node(name, label=name) )
 
         self.assertEqual(
-            set([n.get_name()
-                 for n in self.graph_directed.get_nodes()]), names)
+            {n.get_name()
+                 for n in self.graph_directed.get_nodes()}, names)
 
 
     def test_executable_not_found_exception(self):
@@ -375,7 +373,4 @@
     check_path()
     test_dir = os.path.dirname(sys.argv[0])
     print('The tests are using `pydot` from:  {pd}'.format(pd=pydot))
-    if sys.version_info >= (2, 7):
-        unittest.main(verbosity=2)
-    else:
-        unittest.main()
+    unittest.main(verbosity=2)

++++++ pydot-skip-test.patch ++++++
Index: pydot-1.4.1/test/pydot_unittest.py
===================================================================
--- pydot-1.4.1.orig/test/pydot_unittest.py
+++ pydot-1.4.1/test/pydot_unittest.py
@@ -205,6 +205,7 @@ class TestGraphAPI(unittest.TestCase):
         self._render_and_compare_dot_files(path)
 
 
+    @unittest.skip("fails even in git on travis")
     def test_graphviz_regression_tests(self):
         path = os.path.join(test_dir, TESTS_DIR_2)
         self._render_and_compare_dot_files(path)

Reply via email to