Hello community,
here is the log from the commit of package python-HeapDict for openSUSE:Factory
checked in at 2019-09-26 20:40:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-HeapDict (Old)
and /work/SRC/openSUSE:Factory/.python-HeapDict.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-HeapDict"
Thu Sep 26 20:40:03 2019 rev:3 rq:732884 version:1.0.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-HeapDict/python-HeapDict.changes
2018-12-07 14:39:11.314789524 +0100
+++
/work/SRC/openSUSE:Factory/.python-HeapDict.new.2352/python-HeapDict.changes
2019-09-26 20:40:17.918692449 +0200
@@ -1,0 +2,6 @@
+Tue Sep 24 09:15:23 UTC 2019 - Tomáš Chvátal <[email protected]>
+
+- Update to 1.0.1:
+ * no upstream changelog
+
+-------------------------------------------------------------------
Old:
----
HeapDict-1.0.0.tar.gz
New:
----
HeapDict-1.0.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-HeapDict.spec ++++++
--- /var/tmp/diff_new_pack.jbHckN/_old 2019-09-26 20:40:18.662690461 +0200
+++ /var/tmp/diff_new_pack.jbHckN/_new 2019-09-26 20:40:18.666690451 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-HeapDict
#
-# 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
@@ -17,14 +17,8 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
-# required test package not available on SLE
-%if 0%{?is_opensuse}
-%bcond_without test
-%else
-%bcond_with test
-%endif
Name: python-HeapDict
-Version: 1.0.0
+Version: 1.0.1
Release: 0
Summary: A heap with decrease-key and increase-key operations
License: BSD-3-Clause
@@ -34,13 +28,11 @@
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
-BuildArch: noarch
-%if %{with test}
# These packages contain module test from stdlib,
# it has nothing to do with this package being noarch
BuildRequires: python2-devel
BuildRequires: python3-testsuite
-%endif
+BuildArch: noarch
%python_subpackages
%description
@@ -63,10 +55,8 @@
%python_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
-%if %{with test}
%check
%python_exec test_heap.py
-%endif
%files %{python_files}
%license LICENSE
++++++ HeapDict-1.0.0.tar.gz -> HeapDict-1.0.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/HeapDict.egg-info/PKG-INFO
new/HeapDict-1.0.1/HeapDict.egg-info/PKG-INFO
--- old/HeapDict-1.0.0/HeapDict.egg-info/PKG-INFO 2009-10-16
17:37:51.000000000 +0200
+++ new/HeapDict-1.0.1/HeapDict.egg-info/PKG-INFO 2019-09-09
20:56:37.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: HeapDict
-Version: 1.0.0
+Version: 1.0.1
Summary: a heap with decrease-key and increase-key operations
Home-page: http://stutzbachenterprises.com/
Author: Stutzbach Enterprises, LLC
@@ -15,21 +15,21 @@
::
- hd = heapdict()
- hd[obj1] = priority1
- hd[obj2] = priority2
- # ...
- obj = hd.pop()
+ hd = heapdict()
+ hd[obj1] = priority1
+ hd[obj2] = priority2
+ # ...
+ (obj, priority) = hd.popitem()
Compared to an ordinary dict, a heapdict has the following differences:
popitem():
- Remove and return the (key, priority) pair with the lowest
- priority, instead of a random object.
+ Remove and return the (key, priority) pair with the lowest
+ priority, instead of a random object.
peekitem():
- Return the (key, priority) pair with the lowest priority, without
- removing it.
+ Return the (key, priority) pair with the lowest priority, without
+ removing it.
Unlike the Python standard library's heapq module, the heapdict
supports efficiently changing the priority of an existing object
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/HeapDict.egg-info/SOURCES.txt
new/HeapDict-1.0.1/HeapDict.egg-info/SOURCES.txt
--- old/HeapDict-1.0.0/HeapDict.egg-info/SOURCES.txt 2009-10-16
17:37:51.000000000 +0200
+++ new/HeapDict-1.0.1/HeapDict.egg-info/SOURCES.txt 2019-09-09
20:56:37.000000000 +0200
@@ -1,7 +1,6 @@
LICENSE
MANIFEST.in
README.rst
-ez_setup.py
heapdict.py
setup.py
test_heap.py
@@ -9,5 +8,4 @@
HeapDict.egg-info/SOURCES.txt
HeapDict.egg-info/dependency_links.txt
HeapDict.egg-info/top_level.txt
-HeapDict.egg-info/zip-safe
-heapdict.egg-info/SOURCES.txt
\ No newline at end of file
+HeapDict.egg-info/zip-safe
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/MANIFEST.in
new/HeapDict-1.0.1/MANIFEST.in
--- old/HeapDict-1.0.0/MANIFEST.in 2009-10-16 16:18:02.000000000 +0200
+++ new/HeapDict-1.0.1/MANIFEST.in 2019-09-09 20:39:58.000000000 +0200
@@ -1,5 +1,4 @@
include heapdict.py
-include ez_setup.py
include LICENSE
include test_heap.py
include setup.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/PKG-INFO new/HeapDict-1.0.1/PKG-INFO
--- old/HeapDict-1.0.0/PKG-INFO 2009-10-16 17:37:51.000000000 +0200
+++ new/HeapDict-1.0.1/PKG-INFO 2019-09-09 20:56:38.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: HeapDict
-Version: 1.0.0
+Version: 1.0.1
Summary: a heap with decrease-key and increase-key operations
Home-page: http://stutzbachenterprises.com/
Author: Stutzbach Enterprises, LLC
@@ -15,21 +15,21 @@
::
- hd = heapdict()
- hd[obj1] = priority1
- hd[obj2] = priority2
- # ...
- obj = hd.pop()
+ hd = heapdict()
+ hd[obj1] = priority1
+ hd[obj2] = priority2
+ # ...
+ (obj, priority) = hd.popitem()
Compared to an ordinary dict, a heapdict has the following differences:
popitem():
- Remove and return the (key, priority) pair with the lowest
- priority, instead of a random object.
+ Remove and return the (key, priority) pair with the lowest
+ priority, instead of a random object.
peekitem():
- Return the (key, priority) pair with the lowest priority, without
- removing it.
+ Return the (key, priority) pair with the lowest priority, without
+ removing it.
Unlike the Python standard library's heapq module, the heapdict
supports efficiently changing the priority of an existing object
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/README.rst
new/HeapDict-1.0.1/README.rst
--- old/HeapDict-1.0.0/README.rst 2009-10-16 17:37:24.000000000 +0200
+++ new/HeapDict-1.0.1/README.rst 2019-09-09 19:47:12.000000000 +0200
@@ -11,7 +11,7 @@
hd[obj1] = priority1
hd[obj2] = priority2
# ...
- obj = hd.pop()
+ (obj, priority) = hd.popitem()
Compared to an ordinary dict, a heapdict has the following differences:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/ez_setup.py
new/HeapDict-1.0.1/ez_setup.py
--- old/HeapDict-1.0.0/ez_setup.py 2009-03-30 23:21:25.000000000 +0200
+++ new/HeapDict-1.0.1/ez_setup.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,276 +0,0 @@
-#!python
-"""Bootstrap setuptools installation
-
-If you want to use setuptools in your package's setup.py, just include this
-file in the same directory with it, and add this to the top of your setup.py::
-
- from ez_setup import use_setuptools
- use_setuptools()
-
-If you want to require a specific version of setuptools, set a download
-mirror, or use an alternate download directory, you can do so by supplying
-the appropriate options to ``use_setuptools()``.
-
-This file can also be run as a script to install or upgrade setuptools.
-"""
-import sys
-DEFAULT_VERSION = "0.6c9"
-DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" %
sys.version[:3]
-
-md5_data = {
- 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
- 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
- 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
- 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
- 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
- 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
- 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
- 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
- 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
- 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
- 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
- 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
- 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
- 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
- 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
- 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
- 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
- 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
- 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
- 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
- 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
- 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
- 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
- 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
- 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
- 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
- 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
- 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
- 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
- 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
- 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
- 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
- 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
- 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
-}
-
-import sys, os
-try: from hashlib import md5
-except ImportError: from md5 import md5
-
-def _validate_md5(egg_name, data):
- if egg_name in md5_data:
- digest = md5(data).hexdigest()
- if digest != md5_data[egg_name]:
- print >>sys.stderr, (
- "md5 validation of %s failed! (Possible download problem?)"
- % egg_name
- )
- sys.exit(2)
- return data
-
-def use_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- download_delay=15
-):
- """Automatically find/download setuptools and make it available on sys.path
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end with
- a '/'). `to_dir` is the directory where setuptools will be downloaded, if
- it is not already available. If `download_delay` is specified, it should
- be the number of seconds that will be paused before initiating a download,
- should one be required. If an older version of setuptools is installed,
- this routine will print a message to ``sys.stderr`` and raise SystemExit in
- an attempt to abort the calling script.
- """
- was_imported = 'pkg_resources' in sys.modules or 'setuptools' in
sys.modules
- def do_download():
- egg = download_setuptools(version, download_base, to_dir,
download_delay)
- sys.path.insert(0, egg)
- import setuptools; setuptools.bootstrap_install_from = egg
- try:
- import pkg_resources
- except ImportError:
- return do_download()
- try:
- pkg_resources.require("setuptools>="+version); return
- except pkg_resources.VersionConflict, e:
- if was_imported:
- print >>sys.stderr, (
- "The required version of setuptools (>=%s) is not available, and\n"
- "can't be installed while this script is running. Please install\n"
- " a more recent version first, using 'easy_install -U setuptools'."
- "\n\n(Currently using %r)"
- ) % (version, e.args[0])
- sys.exit(2)
- else:
- del pkg_resources, sys.modules['pkg_resources'] # reload ok
- return do_download()
- except pkg_resources.DistributionNotFound:
- return do_download()
-
-def download_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
- delay = 15
-):
- """Download setuptools from a specified location and return its filename
-
- `version` should be a valid setuptools version number that is available
- as an egg for download under the `download_base` URL (which should end
- with a '/'). `to_dir` is the directory where the egg will be downloaded.
- `delay` is the number of seconds to pause before an actual download
attempt.
- """
- import urllib2, shutil
- egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
- url = download_base + egg_name
- saveto = os.path.join(to_dir, egg_name)
- src = dst = None
- if not os.path.exists(saveto): # Avoid repeated downloads
- try:
- from distutils import log
- if delay:
- log.warn("""
----------------------------------------------------------------------------
-This script requires setuptools version %s to run (even to display
-help). I will attempt to download it for you (from
-%s), but
-you may need to enable firewall access for this script first.
-I will start the download in %d seconds.
-
-(Note: if this machine does not have network access, please obtain the file
-
- %s
-
-and place it in this directory before rerunning this script.)
----------------------------------------------------------------------------""",
- version, download_base, delay, url
- ); from time import sleep; sleep(delay)
- log.warn("Downloading %s", url)
- src = urllib2.urlopen(url)
- # Read/write all in one block, so we don't create a corrupt file
- # if the download is interrupted.
- data = _validate_md5(egg_name, src.read())
- dst = open(saveto,"wb"); dst.write(data)
- finally:
- if src: src.close()
- if dst: dst.close()
- return os.path.realpath(saveto)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-def main(argv, version=DEFAULT_VERSION):
- """Install or upgrade setuptools and EasyInstall"""
- try:
- import setuptools
- except ImportError:
- egg = None
- try:
- egg = download_setuptools(version, delay=0)
- sys.path.insert(0,egg)
- from setuptools.command.easy_install import main
- return main(list(argv)+[egg]) # we're done here
- finally:
- if egg and os.path.exists(egg):
- os.unlink(egg)
- else:
- if setuptools.__version__ == '0.0.1':
- print >>sys.stderr, (
- "You have an obsolete version of setuptools installed. Please\n"
- "remove it from your system entirely before rerunning this script."
- )
- sys.exit(2)
-
- req = "setuptools>="+version
- import pkg_resources
- try:
- pkg_resources.require(req)
- except pkg_resources.VersionConflict:
- try:
- from setuptools.command.easy_install import main
- except ImportError:
- from easy_install import main
- main(list(argv)+[download_setuptools(delay=0)])
- sys.exit(0) # try to force an exit
- else:
- if argv:
- from setuptools.command.easy_install import main
- main(argv)
- else:
- print "Setuptools version",version,"or greater has been installed."
- print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
-
-def update_md5(filenames):
- """Update our built-in md5 registry"""
-
- import re
-
- for name in filenames:
- base = os.path.basename(name)
- f = open(name,'rb')
- md5_data[base] = md5(f.read()).hexdigest()
- f.close()
-
- data = [" %r: %r,\n" % it for it in md5_data.items()]
- data.sort()
- repl = "".join(data)
-
- import inspect
- srcfile = inspect.getsourcefile(sys.modules[__name__])
- f = open(srcfile, 'rb'); src = f.read(); f.close()
-
- match = re.search("\nmd5_data = {\n([^}]+)}", src)
- if not match:
- print >>sys.stderr, "Internal error!"
- sys.exit(2)
-
- src = src[:match.start(1)] + repl + src[match.end(1):]
- f = open(srcfile,'w')
- f.write(src)
- f.close()
-
-
-if __name__=='__main__':
- if len(sys.argv)>2 and sys.argv[1]=='--md5update':
- update_md5(sys.argv[2:])
- else:
- main(sys.argv[1:])
-
-
-
-
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/heapdict.py
new/HeapDict-1.0.1/heapdict.py
--- old/HeapDict-1.0.0/heapdict.py 2009-10-16 16:52:50.000000000 +0200
+++ new/HeapDict-1.0.1/heapdict.py 2019-09-09 19:42:13.000000000 +0200
@@ -1,28 +1,22 @@
-import collections
+try:
+ from collections.abc import MutableMapping
+except ImportError:
+ from collections import MutableMapping
+
def doc(s):
if hasattr(s, '__call__'):
s = s.__doc__
+
def f(g):
g.__doc__ = s
return g
return f
-class heapdict(collections.MutableMapping):
+
+class heapdict(MutableMapping):
__marker = object()
- @staticmethod
- def _parent(i):
- return ((i - 1) >> 1)
-
- @staticmethod
- def _left(i):
- return ((i << 1) + 1)
-
- @staticmethod
- def _right(i):
- return ((i+1) << 1)
-
def __init__(self, *args, **kw):
self.heap = []
self.d = {}
@@ -30,7 +24,7 @@
@doc(dict.clear)
def clear(self):
- self.heap.clear()
+ del self.heap[:]
self.d.clear()
@doc(dict.__setitem__)
@@ -43,37 +37,47 @@
self._decrease_key(len(self.heap)-1)
def _min_heapify(self, i):
- l = self._left(i)
- r = self._right(i)
n = len(self.heap)
- if l < n and self.heap[l][0] < self.heap[i][0]:
- low = l
- else:
- low = i
- if r < n and self.heap[r][0] < self.heap[low][0]:
- low = r
+ h = self.heap
+ while True:
+ # calculate the offset of the left child
+ l = (i << 1) + 1
+ # calculate the offset of the right child
+ r = (i + 1) << 1
+ if l < n and h[l][0] < h[i][0]:
+ low = l
+ else:
+ low = i
+ if r < n and h[r][0] < h[low][0]:
+ low = r
+
+ if low == i:
+ break
- if low != i:
self._swap(i, low)
- self._min_heapify(low)
+ i = low
def _decrease_key(self, i):
while i:
- parent = self._parent(i)
- if self.heap[parent][0] < self.heap[i][0]: break
+ # calculate the offset of the parent
+ parent = (i - 1) >> 1
+ if self.heap[parent][0] < self.heap[i][0]:
+ break
self._swap(i, parent)
i = parent
def _swap(self, i, j):
- self.heap[i], self.heap[j] = self.heap[j], self.heap[i]
- self.heap[i][2] = i
- self.heap[j][2] = j
+ h = self.heap
+ h[i], h[j] = h[j], h[i]
+ h[i][2] = i
+ h[j][2] = j
@doc(dict.__delitem__)
def __delitem__(self, key):
wrapper = self.d[key]
while wrapper[2]:
- parentpos = self._parent(wrapper[2])
+ # calculate the offset of the parent
+ parentpos = (wrapper[2] - 1) >> 1
parent = self.heap[parentpos]
self._swap(wrapper[2], parent[2])
self.popitem()
@@ -92,11 +96,11 @@
if len(self.heap) == 1:
self.heap.pop()
else:
- self.heap[0] = self.heap.pop(-1)
+ self.heap[0] = self.heap.pop()
self.heap[0][2] = 0
self._min_heapify(0)
del self.d[wrapper[1]]
- return wrapper[1], wrapper[0]
+ return wrapper[1], wrapper[0]
@doc(dict.__len__)
def __len__(self):
@@ -106,5 +110,6 @@
"""D.peekitem() -> (k, v), return the (key, value) pair with lowest
value;\n but raise KeyError if D is empty."""
return (self.heap[0][1], self.heap[0][0])
+
del doc
__all__ = ['heapdict']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/setup.cfg new/HeapDict-1.0.1/setup.cfg
--- old/HeapDict-1.0.0/setup.cfg 2009-10-16 17:37:51.000000000 +0200
+++ new/HeapDict-1.0.1/setup.cfg 2019-09-09 20:56:38.000000000 +0200
@@ -1,5 +1,4 @@
[egg_info]
tag_build =
tag_date = 0
-tag_svn_revision = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/setup.py new/HeapDict-1.0.1/setup.py
--- old/HeapDict-1.0.0/setup.py 2009-10-16 17:37:24.000000000 +0200
+++ new/HeapDict-1.0.1/setup.py 2019-09-09 20:56:17.000000000 +0200
@@ -1,15 +1,9 @@
#!/usr/bin/env
-import sys
-if sys.version_info[0] <= 2:
- import ez_setup
- ez_setup.use_setuptools()
- from setuptools import setup, Extension
-else:
- from distutils.core import setup, Extension
+from setuptools import setup
setup(name='HeapDict',
- version='1.0.0',
+ version='1.0.1',
description='a heap with decrease-key and increase-key operations',
author='Stutzbach Enterprises, LLC',
author_email='[email protected]',
@@ -35,5 +29,4 @@
],
long_description=open('README.rst').read(),
-
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/HeapDict-1.0.0/test_heap.py
new/HeapDict-1.0.1/test_heap.py
--- old/HeapDict-1.0.0/test_heap.py 2009-10-16 17:13:56.000000000 +0200
+++ new/HeapDict-1.0.1/test_heap.py 2019-09-09 19:42:13.000000000 +0200
@@ -1,22 +1,29 @@
#!/usr/bin/python
from __future__ import print_function
-from heapdict import heapdict
import random
-import unittest
import sys
+import unittest
+from heapdict import heapdict
try:
- import test.support as test_support # Python 3
+ # Python 3
+ import test.support as test_support
except ImportError:
- import test.test_support as test_support # Python 2
+ # Python 2
+ import test.test_support as test_support
N = 100
+
class TestHeap(unittest.TestCase):
+
def check_invariants(self, h):
- for i in range(len(h)):
- self.assertEqual(h.heap[i][2], i)
- if i > 0:
- self.assertTrue(h.heap[h._parent(i)][0] <= h.heap[i][0])
+ # the 3rd entry of each heap entry is the position in the heap
+ for i, e in enumerate(h.heap):
+ self.assertEqual(e[2], i)
+ # the parent of each heap element must not be larger than the element
+ for i in range(1, len(h.heap)):
+ parent = (i - 1) >> 1
+ self.assertLessEqual(h.heap[parent][0], h.heap[i][0])
def make_data(self):
pairs = [(random.random(), random.random()) for i in range(N)]
@@ -28,9 +35,9 @@
pairs.sort(key=lambda x: x[1], reverse=True)
return h, pairs, d
-
+
def test_popitem(self):
- h, pairs, d = self.make_data()
+ h, pairs, _ = self.make_data()
while pairs:
v = h.popitem()
v2 = pairs.pop(-1)
@@ -42,12 +49,12 @@
for i in range(N):
h[i] = 0
for i in range(N):
- k, v = h.popitem()
+ _, v = h.popitem()
self.assertEqual(v, 0)
self.check_invariants(h)
def test_peek(self):
- h, pairs, d = self.make_data()
+ h, pairs, _ = self.make_data()
while pairs:
v = h.peekitem()[0]
h.popitem()
@@ -56,19 +63,19 @@
self.assertEqual(len(h), 0)
def test_iter(self):
- h, pairs, d = self.make_data()
+ h, _, d = self.make_data()
self.assertEqual(list(h), list(d))
def test_keys(self):
- h, pairs, d = self.make_data()
+ h, _, d = self.make_data()
self.assertEqual(list(sorted(h.keys())), list(sorted(d.keys())))
def test_values(self):
- h, pairs, d = self.make_data()
+ h, _, d = self.make_data()
self.assertEqual(list(sorted(h.values())), list(sorted(d.values())))
def test_del(self):
- h, pairs, d = self.make_data()
+ h, pairs, _ = self.make_data()
k, v = pairs.pop(N//2)
del h[k]
while pairs:
@@ -78,22 +85,24 @@
self.assertEqual(len(h), 0)
def test_change(self):
- h, pairs, d = self.make_data()
+ h, pairs, _ = self.make_data()
k, v = pairs[N//2]
h[k] = 0.5
pairs[N//2] = (k, 0.5)
- pairs.sort(key = lambda x: x[1], reverse=True)
+ pairs.sort(key=lambda x: x[1], reverse=True)
while pairs:
v = h.popitem()
v2 = pairs.pop(-1)
self.assertEqual(v, v2)
self.assertEqual(len(h), 0)
-#==============================================================================
+ def test_clear(self):
+ h, _, _ = self.make_data()
+ h.clear()
+ self.assertEqual(len(h), 0)
+
def test_main(verbose=None):
- from types import BuiltinFunctionType
-
test_classes = [TestHeap]
test_support.run_unittest(*test_classes)
@@ -101,11 +110,12 @@
if verbose and hasattr(sys, "gettotalrefcount"):
import gc
counts = [None] * 5
- for i in xrange(len(counts)):
+ for i in range(len(counts)):
test_support.run_unittest(*test_classes)
gc.collect()
counts[i] = sys.gettotalrefcount()
print(counts)
+
if __name__ == "__main__":
test_main(verbose=True)