Hello community,

here is the log from the commit of package python-pytools for openSUSE:Factory 
checked in at 2020-03-20 23:58:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pytools (Old)
 and      /work/SRC/openSUSE:Factory/.python-pytools.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-pytools"

Fri Mar 20 23:58:54 2020 rev:8 rq:786808 version:2020.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pytools/python-pytools.changes    
2019-05-15 12:34:26.576525443 +0200
+++ /work/SRC/openSUSE:Factory/.python-pytools.new.3160/python-pytools.changes  
2020-03-21 00:02:36.725139167 +0100
@@ -1,0 +2,6 @@
+Fri Mar 20 09:59:31 UTC 2020 - pgaj...@suse.com
+
+- version update to 2020.1
+  + No upstream changelog available
+ 
+-------------------------------------------------------------------

Old:
----
  pytools-2019.1.1.tar.gz

New:
----
  pytools-2020.1.tar.gz

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

Other differences:
------------------
++++++ python-pytools.spec ++++++
--- /var/tmp/diff_new_pack.NBLfrb/_old  2020-03-21 00:02:39.469140670 +0100
+++ /var/tmp/diff_new_pack.NBLfrb/_new  2020-03-21 00:02:39.509140692 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-pytools
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,21 +18,26 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-pytools
-Version:        2019.1.1
+Version:        2020.1
 Release:        0
 Summary:        A collection of tools for Python
 License:        MIT
 Group:          Development/Languages/Python
 URL:            https://pypi.python.org/pypi/pytools
 Source0:        
https://files.pythonhosted.org/packages/source/p/pytools/pytools-%{version}.tar.gz
-BuildRequires:  %{python_module appdirs} >= 1.4.0
+BuildRequires:  %{python_module appdirs >= 1.4.0}
 BuildRequires:  %{python_module base}
-BuildRequires:  %{python_module decorator} >= 3.2.0
-BuildRequires:  %{python_module numpy} >= 1.6.0
+BuildRequires:  %{python_module decorator >= 3.2.0}
+BuildRequires:  %{python_module numpy >= 1.6.0}
+BuildRequires:  %{python_module pytest}
 BuildRequires:  %{python_module setuptools}
-BuildRequires:  %{python_module six} >= 1.8.0
+BuildRequires:  %{python_module six >= 1.8.0}
 BuildRequires:  fdupes
+BuildRequires:  python-appdirs >= 1.4.0
+BuildRequires:  python-decorator >= 3.2.0
+BuildRequires:  python-numpy >= 1.6.0
 BuildRequires:  python-rpm-macros
+BuildRequires:  python-six >= 1.8.0
 BuildArch:      noarch
 %python_subpackages
 
@@ -57,13 +62,10 @@
 
 %install
 %python_install
-%python_expand %fdupes %{buildroot}%{python_sitelib}
+%python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
-# The tests are successful when run only with python2.
-# When run with python3, the tests require mpi4py and all the
-# necessary libraries and configuration that comes with MPI.
-python2 setup.py test
+%pytest
 
 %files %{python_files}
 %license LICENSE

++++++ pytools-2019.1.1.tar.gz -> pytools-2020.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/PKG-INFO new/pytools-2020.1/PKG-INFO
--- old/pytools-2019.1.1/PKG-INFO       2019-04-25 19:15:05.000000000 +0200
+++ new/pytools-2020.1/PKG-INFO 2020-01-15 01:23:36.000000000 +0100
@@ -1,12 +1,25 @@
 Metadata-Version: 1.1
 Name: pytools
-Version: 2019.1.1
+Version: 2020.1
 Summary: A collection of tools for Python
 Home-page: http://pypi.python.org/pypi/pytools
 Author: Andreas Kloeckner
 Author-email: inf...@tiker.net
 License: MIT
-Description: Pytools is a big bag of things that are "missing" from the Python 
standard
+Description: Pytools: Lots of Little Utilities
+        =================================
+        
+        .. image:: 
https://gitlab.tiker.net/inducer/pytools/badges/master/pipeline.svg
+            :alt: Gitlab Build Status
+            :target: https://gitlab.tiker.net/inducer/pytools/commits/master
+        .. image:: 
https://dev.azure.com/ak-spam/inducer/_apis/build/status/inducer.pytools?branchName=master
+            :alt: Azure Build Status
+            :target: 
https://dev.azure.com/ak-spam/inducer/_build/latest?definitionId=2&branchName=master
+        .. image:: https://badge.fury.io/py/pytools.png
+            :alt: Python Package Index Release Page
+            :target: https://pypi.org/project/pytools/
+        
+        Pytools is a big bag of things that are "missing" from the Python 
standard
         library. This is mainly a dependency of my other software packages, 
and is
         probably of little interest to you unless you use those. If you're 
curious
         nonetheless, here's what's on offer:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/README.rst 
new/pytools-2020.1/README.rst
--- old/pytools-2019.1.1/README.rst     2017-06-14 23:42:47.000000000 +0200
+++ new/pytools-2020.1/README.rst       2019-10-02 00:43:52.000000000 +0200
@@ -1,3 +1,16 @@
+Pytools: Lots of Little Utilities
+=================================
+
+.. image:: https://gitlab.tiker.net/inducer/pytools/badges/master/pipeline.svg
+    :alt: Gitlab Build Status
+    :target: https://gitlab.tiker.net/inducer/pytools/commits/master
+.. image:: 
https://dev.azure.com/ak-spam/inducer/_apis/build/status/inducer.pytools?branchName=master
+    :alt: Azure Build Status
+    :target: 
https://dev.azure.com/ak-spam/inducer/_build/latest?definitionId=2&branchName=master
+.. image:: https://badge.fury.io/py/pytools.png
+    :alt: Python Package Index Release Page
+    :target: https://pypi.org/project/pytools/
+
 Pytools is a big bag of things that are "missing" from the Python standard
 library. This is mainly a dependency of my other software packages, and is
 probably of little interest to you unless you use those. If you're curious
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/pytools/__init__.py 
new/pytools-2020.1/pytools/__init__.py
--- old/pytools-2019.1.1/pytools/__init__.py    2019-04-25 19:14:13.000000000 
+0200
+++ new/pytools-2020.1/pytools/__init__.py      2020-01-12 17:44:21.000000000 
+0100
@@ -149,6 +149,12 @@
 .. autoclass:: ProcessLogger
 .. autoclass:: DebugProcessLogger
 .. autoclass:: log_process
+
+Sorting in natural order
+------------------------
+
+.. autofunction:: natorder
+.. autofunction:: natsorted
 """
 
 
@@ -1045,10 +1051,15 @@
 
 # {{{ cartesian products etc.
 
-def cartesian_product(list1, list2):
-    for i in list1:
-        for j in list2:
-            yield (i, j)
+def cartesian_product(*args):
+    if len(args) == 1:
+        for arg in args[0]:
+            yield (arg,)
+        return
+    first = args[:-1]
+    for prod in cartesian_product(*first):
+        for i in args[-1]:
+            yield prod + (i,)
 
 
 def distinct_pairs(list1, list2):
@@ -1447,12 +1458,12 @@
         col_widths = [max(len(row[i]) for row in self.rows)
                       for i in range(columns)]
 
-        lines = [
-            "|".join([cell.ljust(col_width)
-                      for cell, col_width in zip(row, col_widths)])
+        lines = [" | ".join([cell.ljust(col_width)
+            for cell, col_width in zip(row, col_widths)])
             for row in self.rows]
-        lines[1:1] = ["+".join("-"*col_width
-                              for col_width in col_widths)]
+        lines[1:1] = ["+".join("-" * (col_width + 1 + (i > 0))
+            for i, col_width in enumerate(col_widths))]
+
         return "\n".join(lines)
 
     def latex(self, skip_lines=0, hline_after=None):
@@ -2182,7 +2193,11 @@
         # feature for interactive use, do not do it unless there is (weak)
         # evidence of interactive use.
         import sys
-        use_late_start_logging = sys.stdin.isatty()
+        if sys.stdin is None:
+            # Can happen, e.g., if pudb is controlling the console.
+            use_late_start_logging = False
+        else:
+            use_late_start_logging = sys.stdin.isatty()
 
         import os
         if os.environ.get("PYTOOLS_LOG_NO_THREADS", ""):
@@ -2274,6 +2289,59 @@
 
 # }}}
 
+
+# {{{ sorting in natural order
+
+def natorder(item):
+    """Return a key for natural order string comparison.
+
+    See :func:`natsorted`.
+
+    .. versionadded:: 2020.1
+    """
+    import re
+    result = []
+    for (int_val, string_val) in re.findall(r"(\d+)|(\D+)", item):
+        if int_val:
+            result.append(int(int_val))
+            # Tie-breaker in case of leading zeros in *int_val*.  Longer values
+            # compare smaller to preserve order of numbers in decimal notation,
+            # e.g., "1.001" < "1.01"
+            # (cf. https://github.com/sourcefrog/natsort)
+            result.append(-len(int_val))
+        else:
+            result.append(string_val)
+    return result
+
+
+def natsorted(iterable, key=None, reverse=False):
+    """Sort using natural order [1]_, as opposed to lexicographic order.
+
+    Example::
+
+        >>> sorted(["_10", "_1", "_9"]) == ["_1", "_10", "_9"]
+        True
+        >>> natsorted(["_10", "_1", "_9"]) == ["_1", "_9", "_10"]
+        True
+
+    :arg iterable: an iterable to be sorted. It must only have strings, unless
+        *key* is specified.
+    :arg key: if provided, a key function that returns strings for ordering
+        using natural order.
+    :arg reverse: if *True*, sorts in descending order.
+
+    :returns: a sorted list
+
+    .. [1] https://en.wikipedia.org/wiki/Natural_sort_order
+
+    .. versionadded:: 2020.1
+    """
+    if key is None:
+        key = lambda x: x
+    return sorted(iterable, key=lambda y: natorder(key(y)), reverse=reverse)
+
+# }}}
+
 
 def _test():
     import doctest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/pytools/convergence.py 
new/pytools-2020.1/pytools/convergence.py
--- old/pytools-2019.1.1/pytools/convergence.py 2015-10-25 20:25:53.000000000 
+0100
+++ new/pytools-2020.1/pytools/convergence.py   2019-10-02 00:43:52.000000000 
+0200
@@ -50,7 +50,13 @@
     def max_error(self):
         return max(err for absc, err in self.history)
 
-    def pretty_print(self, abscissa_label="h", error_label="Error", 
gliding_mean=2):
+    def pretty_print(self,
+            abscissa_label="h",
+            error_label="Error",
+            gliding_mean=2,
+            abscissa_format="%s",
+            error_format="%s",
+            eoc_format="%s"):
         from pytools import Table
 
         tbl = Table()
@@ -58,14 +64,18 @@
 
         gm_eoc = self.estimate_order_of_convergence(gliding_mean)
         for i, (absc, err) in enumerate(self.history):
+            absc_str = abscissa_format % absc
+            err_str = error_format % err
             if i < gliding_mean-1:
-                tbl.add_row((str(absc), str(err), ""))
+                eoc_str = ""
             else:
-                tbl.add_row((str(absc), str(err), str(gm_eoc[i-gliding_mean+1, 
1])))
+                eoc_str = eoc_format % (gm_eoc[i - gliding_mean + 1, 1])
+
+            tbl.add_row((absc_str, err_str, eoc_str))
 
         if len(self.history) > 1:
-            return str(tbl) + "\n\nOverall EOC: %s" \
-                    % self.estimate_order_of_convergence()[0, 1]
+            return "%s\n\nOverall EOC: %s" % (str(tbl),
+                    self.estimate_order_of_convergence()[0, 1])
         else:
             return str(tbl)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/pytools/debug.py 
new/pytools-2020.1/pytools/debug.py
--- old/pytools-2019.1.1/pytools/debug.py       2019-01-21 04:23:24.000000000 
+0100
+++ new/pytools-2020.1/pytools/debug.py 2019-10-02 00:43:52.000000000 +0200
@@ -1,7 +1,9 @@
 from __future__ import absolute_import, print_function
+import sys
 
 import six
 from six.moves import input
+
 from pytools import memoize
 
 
@@ -216,4 +218,27 @@
 
 # }}}
 
+
+# {{{ estimate memory usage
+
+def estimate_memory_usage(root, seen_ids=None):
+    if seen_ids is None:
+        seen_ids = set()
+
+    id_root = id(root)
+    if id_root in seen_ids:
+        return 0
+
+    seen_ids.add(id_root)
+
+    result = sys.getsizeof(root)
+
+    from gc import get_referents
+    for ref in get_referents(root):
+        result += estimate_memory_usage(ref, seen_ids=seen_ids)
+
+    return result
+
+# }}}
+
 # vim: foldmethod=marker
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/pytools/prefork.py 
new/pytools-2020.1/pytools/prefork.py
--- old/pytools-2019.1.1/pytools/prefork.py     2019-01-21 04:23:24.000000000 
+0100
+++ new/pytools-2020.1/pytools/prefork.py       2019-10-22 22:42:36.000000000 
+0200
@@ -53,7 +53,7 @@
             if error_on_nonzero and popen.returncode:
                 raise ExecError("status %d invoking '%s': %s"
                                 % (popen.returncode, " ".join(cmdline),
-                                   stderr_data))
+                                   stderr_data.decode("utf-8", 
errors="replace")))
 
             return popen.returncode, stdout_data, stderr_data
         except OSError as e:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/pytools/py_codegen.py 
new/pytools-2020.1/pytools/py_codegen.py
--- old/pytools-2019.1.1/pytools/py_codegen.py  2019-01-21 04:23:24.000000000 
+0100
+++ new/pytools-2020.1/pytools/py_codegen.py    2019-10-02 00:43:52.000000000 
+0200
@@ -23,12 +23,19 @@
 """
 
 import marshal
-import imp
 from types import FunctionType, ModuleType
 
 import six
 
 
+try:
+    from importlib.util import MAGIC_NUMBER as BYTECODE_VERSION
+except ImportError:
+    # Pre-3.4
+    import imp
+    BYTECODE_VERSION = imp.get_magic()
+
+
 # loosely based on
 # http://effbot.org/zone/python-code-generator.htm
 
@@ -140,7 +147,7 @@
             elif k not in _empty_module_dict:
                 nondefault_globals[k] = v
 
-        return (1, imp.get_magic(), functions, modules, nondefault_globals)
+        return (1, BYTECODE_VERSION, functions, modules, nondefault_globals)
 
     def __setstate__(self, obj):
         if obj[0] == 0:
@@ -151,10 +158,10 @@
         else:
             raise ValueError("unknown version of PicklableModule")
 
-        if magic != imp.get_magic():
+        if magic != BYTECODE_VERSION:
             raise ValueError("cannot unpickle function binary: "
-                    "incorrect magic value (got: %s, expected: %s)"
-                    % (magic, imp.get_magic()))
+                    "incorrect magic value (got: %r, expected: %r)"
+                    % (magic, BYTECODE_VERSION))
 
         mod_globals = _empty_module_dict.copy()
         mod_globals.update(nondefault_globals)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/pytools/version.py 
new/pytools-2020.1/pytools/version.py
--- old/pytools-2019.1.1/pytools/version.py     2019-04-25 19:14:37.000000000 
+0200
+++ new/pytools-2020.1/pytools/version.py       2020-01-12 17:44:21.000000000 
+0100
@@ -1,3 +1,3 @@
-VERSION = (2019, 1, 1)
+VERSION = (2020, 1)
 VERSION_STATUS = ""
 VERSION_TEXT = ".".join(str(x) for x in VERSION) + VERSION_STATUS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/pytools.egg-info/PKG-INFO 
new/pytools-2020.1/pytools.egg-info/PKG-INFO
--- old/pytools-2019.1.1/pytools.egg-info/PKG-INFO      2019-04-25 
19:15:05.000000000 +0200
+++ new/pytools-2020.1/pytools.egg-info/PKG-INFO        2020-01-15 
01:23:35.000000000 +0100
@@ -1,12 +1,25 @@
 Metadata-Version: 1.1
 Name: pytools
-Version: 2019.1.1
+Version: 2020.1
 Summary: A collection of tools for Python
 Home-page: http://pypi.python.org/pypi/pytools
 Author: Andreas Kloeckner
 Author-email: inf...@tiker.net
 License: MIT
-Description: Pytools is a big bag of things that are "missing" from the Python 
standard
+Description: Pytools: Lots of Little Utilities
+        =================================
+        
+        .. image:: 
https://gitlab.tiker.net/inducer/pytools/badges/master/pipeline.svg
+            :alt: Gitlab Build Status
+            :target: https://gitlab.tiker.net/inducer/pytools/commits/master
+        .. image:: 
https://dev.azure.com/ak-spam/inducer/_apis/build/status/inducer.pytools?branchName=master
+            :alt: Azure Build Status
+            :target: 
https://dev.azure.com/ak-spam/inducer/_build/latest?definitionId=2&branchName=master
+        .. image:: https://badge.fury.io/py/pytools.png
+            :alt: Python Package Index Release Page
+            :target: https://pypi.org/project/pytools/
+        
+        Pytools is a big bag of things that are "missing" from the Python 
standard
         library. This is mainly a dependency of my other software packages, 
and is
         probably of little interest to you unless you use those. If you're 
curious
         nonetheless, here's what's on offer:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pytools-2019.1.1/test/test_pytools.py 
new/pytools-2020.1/test/test_pytools.py
--- old/pytools-2019.1.1/test/test_pytools.py   2019-04-25 19:14:13.000000000 
+0200
+++ new/pytools-2020.1/test/test_pytools.py     2020-01-12 17:44:21.000000000 
+0100
@@ -170,6 +170,24 @@
     assert next(gen) == (7, "b_6")
 
 
+def test_cartesian_product():
+    from pytools import cartesian_product
+
+    expected_outputs = [
+        (0, 2, 4),
+        (0, 2, 5),
+        (0, 3, 4),
+        (0, 3, 5),
+        (1, 2, 4),
+        (1, 2, 5),
+        (1, 3, 4),
+        (1, 3, 5),
+    ]
+
+    for i, output in enumerate(cartesian_product([0, 1], [2, 3], [4, 5])):
+        assert output == expected_outputs[i]
+
+
 def test_find_module_git_revision():
     import pytools
     print(pytools.find_module_git_revision(pytools.__file__, n_levels_up=1))
@@ -199,6 +217,50 @@
         sleep(0.3)
 
 
+def test_table():
+    import math
+    from pytools import Table
+
+    tbl = Table()
+    tbl.add_row(("i", "i^2", "i^3", "sqrt(i)"))
+
+    for i in range(8):
+        tbl.add_row((i, i ** 2, i ** 3, math.sqrt(i)))
+
+    print(tbl)
+    print()
+    print(tbl.latex())
+
+
+def test_eoc():
+    from pytools.convergence import EOCRecorder
+    eoc = EOCRecorder()
+
+    for i in range(1, 8):
+        eoc.add_data_point(1.0 / i, 10 ** (-i))
+
+    p = eoc.pretty_print()
+    print(p)
+    print()
+
+    p = eoc.pretty_print(
+            abscissa_format="%.5e",
+            error_format="%.5e",
+            eoc_format="%5.2f")
+    print(p)
+
+
+def test_natsorted():
+    from pytools import natsorted, natorder
+
+    assert natorder("1.001") < natorder("1.01")
+
+    assert natsorted(["x10", "x1", "x9"]) == ["x1", "x9", "x10"]
+    assert natsorted(map(str, range(100))) == list(map(str, range(100)))
+    assert natsorted(["x10", "x1", "x9"], reverse=True) == ["x10", "x9", "x1"]
+    assert natsorted([10, 1, 9], key=lambda d: "x%d" % d) == [1, 9, 10]
+
+
 if __name__ == "__main__":
     if len(sys.argv) > 1:
         exec(sys.argv[1])


Reply via email to